Skip to content

Commit d9fb2bc

Browse files
committed
[netusb_camera_driver] add netusb_camera_driver package
* add nodes / launches / tests * auto installation of drivers * add netusb_camera_driver to meta package run_depend
1 parent 91dc22b commit d9fb2bc

18 files changed

+1386
-0
lines changed

jsk_mbzirc/package.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<!-- jsk_mbzirc_common-->
1919
<run_depend>jsk_mbzirc_common</run_depend>
2020
<run_depend>jsk_mbzirc_tasks</run_depend>
21+
<run_depend>netusb_camera_driver</run_depend>
2122

2223
<export>
2324
<metapackage/>

netusb_camera_driver/.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
*~
2+
.*~
3+
\#*
4+
.\#*

netusb_camera_driver/CMakeLists.txt

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
cmake_minimum_required(VERSION 2.8.3)
2+
project(netusb_camera_driver)
3+
4+
find_package(catkin REQUIRED COMPONENTS
5+
camera_info_manager
6+
dynamic_reconfigure
7+
image_transport
8+
nodelet
9+
roscpp
10+
sensor_msgs
11+
)
12+
13+
generate_dynamic_reconfigure_options(
14+
cfg/NETUSBCamera.cfg
15+
)
16+
17+
catkin_package(
18+
CATKIN_DEPENDS dynamic_reconfigure nodelet roscpp
19+
)
20+
21+
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
22+
find_package(udev REQUIRED)
23+
find_package(NETUSBCAM REQUIRED)
24+
25+
include_directories(
26+
include
27+
${catkin_INCLUDE_DIRS}
28+
)
29+
30+
add_library(NETUSBCamera src/NETUSBCamera.cpp)
31+
target_link_libraries(NETUSBCamera ${NETUSBCAM_LIBRARIES} ${catkin_LIBRARIES})
32+
33+
add_library(NETUSBCameraNodelet src/netusb_camera_nodelet.cpp)
34+
target_link_libraries(NETUSBCameraNodelet NETUSBCamera ${catkin_LIBRARIES})
35+
add_dependencies(NETUSBCameraNodelet ${PROJECT_NAME}_gencfg)
36+
37+
add_executable(netusb_camera_node src/netusb_camera_node.cpp)
38+
target_link_libraries(netusb_camera_node NETUSBCamera ${catkin_LIBRARIES})
39+
add_dependencies(netusb_camera_node ${PROJECT_NAME}_gencfg)
40+
41+
install(TARGETS
42+
NETUSBCamera
43+
NETUSBCameraNodelet
44+
netusb_camera_node
45+
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
46+
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
47+
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
48+
49+
install(FILES
50+
${NETUSBCAM_LIBRARIES}
51+
${LIBUDEV_LIBRARIES}
52+
DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION})
53+
54+
install(FILES
55+
nodelet_plugins.xml
56+
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})
57+
58+
install(DIRECTORY launch
59+
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})
60+

netusb_camera_driver/README.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# netusb_camera_driver
2+
- - -
3+
4+
The ROS Interface for NETUSB Camera with Driver
5+
6+
## Installation
7+
8+
0. Download package
9+
10+
```bash
11+
$ cd /path/to/catkin_ws
12+
$ wstool set netusb_camera_driver --git https://github.com/furushchev/netusb_camera_driver -t src
13+
$ wstool up netusb_camera_driver
14+
```
15+
16+
1. Install dependencies
17+
18+
```bash
19+
$ rosdep install --from-paths src --ignore-src -r -n -y
20+
```
21+
22+
2. Build this package
23+
24+
```bash
25+
$ catkin build netusb_camera_driver
26+
```
27+
28+
2. Install udev rules to recognize camera
29+
30+
```bash
31+
$ roscd netusb_camera_driver
32+
$ sudo cp udev/99-netusbcam.rules /etc/udev/rules.d
33+
```
34+
35+
## Launching Node
36+
37+
1. Launch roscore
38+
39+
```bash
40+
$ roscore
41+
```
42+
43+
2. Launch Driver
44+
45+
```bash
46+
$ rosrun netusb_camera_driver netusb_camera_node
47+
```
48+
49+
3. Launch viewer
50+
51+
```bash
52+
$ rosrun image_view image_view image:=/image_raw
53+
```
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#!/usr/bin/env python
2+
3+
PKG="netusb_camera_driver"
4+
5+
from dynamic_reconfigure.parameter_generator_catkin import *
6+
7+
gen = ParameterGenerator()
8+
9+
video_modes = gen.enum([gen.const("320x240", int_t, 0, "QVGA"),
10+
gen.const("640x480", int_t, 1, "VGA"),
11+
gen.const("752x480", int_t, 2, "WVGA"),
12+
gen.const("800x600", int_t, 3, "SVGA"),
13+
gen.const("1024x768", int_t, 4, "XGA"),
14+
gen.const("1280x1024", int_t, 5, "SXGA"),
15+
gen.const("1600x1200", int_t, 6, "UXGA"),
16+
gen.const("2048x1536", int_t, 7, "QXGA"),
17+
gen.const("2592x1944", int_t, 8, "QSXGA"),
18+
gen.const("3840x2748", int_t, 9, "WQUXGA"),],
19+
"Resolution of camera image")
20+
21+
shutter_modes = gen.enum([gen.const("Rolling", int_t, 0, "Rolling"),
22+
gen.const("GlobalReset", int_t, 1, "Global Reset"),
23+
gen.const("Global", int_t, 2, "Global"),],
24+
"Shutter mode")
25+
26+
#gen.add("auto_configure", bool_t, DeviceLevels.RUNNING, "Auto configure parameters", False)
27+
#gen.add("default_configure", bool_t, DeviceLevels.RUNNING, "Reset parameters to default", False)
28+
29+
# variable type level description default min max
30+
31+
gen.add("video_mode", int_t, 0, "Video mode", 1, edit_method=video_modes)
32+
gen.add("shutter", int_t, 0, "Shutter Mode", 2, edit_method=shutter_modes)
33+
gen.add("exposure", double_t, 0, "Exposure", 10.0, 0.00, 200.0)
34+
gen.add("brightness", int_t, 0, "Brightness", 100, 0, 255)
35+
gen.add("contrast", int_t, 0, "Contrast", 100, 0, 512)
36+
gen.add("gamma", int_t, 0, "Gamma", 100, 0, 141)
37+
gen.add("white_balance", int_t, 0, "White Balance", 1, 0, 100)
38+
gen.add("gain", int_t, 0, "Gain", 6, 0, 60)
39+
gen.add("red_gain", int_t, 0, "Red Gain", 100, 0, 512)
40+
gen.add("green_gain", int_t, 0, "Green Gain", 100, 0, 512)
41+
gen.add("blue_gain", int_t, 0, "Blue Gain", 100, 0, 512)
42+
gen.add("blacklevel", int_t, 0, "Sensor BlackLevel", 100, 0, 200)
43+
gen.add("pll", int_t, 0, "phase-locked loop oscillator", 10, 0, 100)
44+
gen.add("strobe_length", int_t, 0, "length of strobe pulse output (msec)", 10, 0, 1000)
45+
gen.add("strobe_delay", int_t, 0, "delay before strobe pulse is executed (msec)", 10, 0, 1000)
46+
gen.add("trigger_delay", int_t, 0, "delay before hardware trigger is executed (msec)", 10, 0, 1000)
47+
gen.add("measure_field_ae", int_t, 0, "measure field for auto exposure", 1, 0, 1000)
48+
49+
gen.add("color", bool_t, 0, "Color", True)
50+
gen.add("pixel_depth", bool_t, 0, "Pixel Depth", True)
51+
gen.add("flipped_v", bool_t, 0, "Flip Vertically", False)
52+
gen.add("flipped_h", bool_t, 0, "Flip Horizontally", False)
53+
gen.add("invert_pixel", bool_t, 0, "Invert Pixel (BW Only)", False)
54+
gen.add("defect_cor", bool_t, 0, "Defect Pixel Correction", False)
55+
gen.add("sw_trig_mode", bool_t, 0, "DELAYED_TRIGGER_RETURN (False) || IMMEDIATE_TRIGGER_RETURN", False)
56+
gen.add("callback_br_frames", bool_t, 0, "Broken frames also triggering the callback function", False)
57+
58+
exit(gen.generate(PKG, "netusb_camera_driver", "NETUSBCamera"))
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
function(download_netusbcam NETUSBCAM_LIB_VAR NETUSBCAM_INCLUDE_DIR_VAR)
2+
if(NOT UNIX)
3+
message(FATAL_ERROR "Downloading NETUSBCAM Library for non-linux system is currently not supported.")
4+
endif()
5+
6+
set(NETUSBCAM_LIB "${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_LIB_DESTINATION}/libNETUSBCAM.so")
7+
set(NETUSBCAM_INCLUDE_DIR "${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_INCLUDE_DESTINATION}")
8+
set(NETUSBCAM_DOWNLOAD_SCRIPT "${PROJECT_SOURCE_DIR}/cmake/download_netusbcam.py")
9+
execute_process(
10+
COMMAND ${NETUSBCAM_DOWNLOAD_SCRIPT} ${NETUSBCAM_LIB} ${NETUSBCAM_INCLUDE_DIR}
11+
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
12+
13+
set(${NETUSBCAM_LIB_VAR} ${NETUSBCAM_LIB} PARENT_SCOPE)
14+
set(${NETUSBCAM_INCLUDE_DIR_VAR} ${NETUSBCAM_INCLUDE_DIR} PARENT_SCOPE)
15+
endfunction()
16+
17+
set(NETUSBCAM_ROOT_DIR
18+
"${NETUSBCAM_ROOT_DIR}"
19+
CACHE PATH
20+
"Directory to search for NETUSBCAM")
21+
22+
find_library(NETUSBCAM_LIBRARY
23+
NAMES NETUSBCAM
24+
PATHS "${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_LIB_DESTINATION}" /usr/lib
25+
HINTS "${NETUSBCAM_ROOT_DIR}"
26+
PATH_SUFFIXES lib)
27+
28+
get_filename_component(_libdir "${NETUSBCAM_LIBRARY}" PATH)
29+
30+
find_path(NETUSBCAM_INCLUDE_DIR
31+
NAMES NETUSBCAM_API.h
32+
PATHS "${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_INCLUDE_DESTINATION}" /usr/include
33+
HINTS "${_libdir}" "${_libdir}/.." "${NETUSBCAM_ROOT_DIR}"
34+
PATH_SUFFIXES include)
35+
36+
if(NOT NETUSBCAM_LIBRARY)
37+
message(STATUS "NETUSBCAM Library Not Found in System Library Path")
38+
download_netusbcam(NETUSBCAM_LIBRARY NETUSBCAM_INCLUDE_DIR)
39+
else()
40+
set(NETUSBCAM_INCLUDE_DIR "${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_INCLUDE_DESTINATION}")
41+
endif()
42+
43+
include(FindPackageHandleStandardArgs)
44+
45+
find_package_handle_standard_args(NETUSBCAM
46+
DEFAULT_MSG NETUSBCAM_LIBRARY NETUSBCAM_INCLUDE_DIR)
47+
48+
if(NETUSBCAM_FOUND)
49+
list(APPEND NETUSBCAM_LIBRARIES ${NETUSBCAM_LIBRARY})
50+
list(APPEND NETUSBCAM_INCLUDE_DIRS ${NETUSBCAM_INCLUDE_DIR})
51+
mark_as_advanced(NETUSBCAM_ROOT_DIR)
52+
endif()
53+
mark_as_advanced(NETUSBCAM_INCLUDE_DIR NETUSBCAM_LIBRARY)
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# Variables
2+
# UDEV_INCLUDE_DIRS
3+
# UDEV_FOUND
4+
# UDEV_LIBRARIES
5+
6+
set(UDEV_ROOT_DIR
7+
"${UDEV_ROOT_DIR}"
8+
CACHE PATH
9+
"Directory to search for udev")
10+
11+
find_package(PkgConfig QUIET)
12+
if(PKG_CONFIG_FOUND)
13+
pkg_check_modules(PC_LIBUDEV libudev)
14+
endif()
15+
16+
find_library(UDEV_LIBRARY
17+
NAMES udev
18+
PATHS ${PC_LIBUDEV_LIBRARY_DIRS} ${PC_LIBUDEV_LIBDIR}
19+
HINTS "${UDEV_ROOT_DIR}"
20+
PATH_SUFFIXES lib)
21+
22+
get_filename_component(_libdir "${UDEV_LIBRARY}" PATH)
23+
24+
find_path(UDEV_INCLUDE_DIR
25+
NAMES libudev.h
26+
PATHS ${PC_LIBUDEV_INCLUDE_DIRS} ${PC_LIBUDEV_INCLUDEDIR}
27+
HINTS "${_libdir}" "${_libdir}/.." "${UDEV_ROOT_DIR}"
28+
PATH_SUFFIXES include)
29+
30+
include(FindPackageHandleStandardArgs)
31+
32+
find_package_handle_standard_args(UDEV
33+
DEFAULT_MSG UDEV_LIBRARY UDEV_INCLUDE_DIR)
34+
35+
if(UDEV_FOUND)
36+
list(APPEND UDEV_LIBRARIES ${UDEV_LIBRARY})
37+
list(APPEND UDEV_INCLUDE_DIRS ${UDEV_INCLUDE_DIR})
38+
mark_as_advanced(UDEV_ROOT_DIR)
39+
endif()
40+
41+
mark_as_advanced(UDEV_INCLUDE_DIR UDEV_LIBRARY)
42+
43+
# patch for version mismatch
44+
function(_patch_udev_version_mismatch)
45+
get_filename_component(UDEV_LIBRARY_DIR ${UDEV_LIBRARY} DIRECTORY)
46+
set(UDEV_LIB_DESTINATION "${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_LIB_DESTINATION}/libudev.so.0")
47+
if (EXISTS "${UDEV_LIBRARY_DIR}/libudev.so.0")
48+
message(STATUS "Found dynamic library at ${UDEV_LIBRARY_DIR}/libudev.so.0")
49+
elseif(EXISTS ${UDEV_LIB_DESTINATION})
50+
message(STATUS "Found dynamic library at ${UDEV_LIB_DESTINATION}")
51+
else()
52+
message(STATUS "Not found dynamic library libudev.so.0")
53+
execute_process(
54+
COMMAND ln -sf ${UDEV_LIBRARY} ${UDEV_LIB_DESTINATION}
55+
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
56+
OUTPUT_VARIABLE CREATE_SYMLINK_OUTPUT
57+
ERROR_VARIABLE CREATE_SYMLINK_ERROR)
58+
if(EXISTS ${UDEV_LIB_DESTINATION})
59+
message(STATUS "Created symlink to: ${UDEV_LIB_DESTINATION}")
60+
else()
61+
message(WARNING "Failed to create symlink: ${CREATE_SYMLINK_ERROR}")
62+
endif()
63+
endif()
64+
endfunction()
65+
_patch_udev_version_mismatch()
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
# Author: Yuki Furuta <[email protected]>
4+
5+
6+
import cStringIO
7+
import logging
8+
import os
9+
import platform
10+
import shutil
11+
import subprocess
12+
import sys
13+
import urllib2
14+
import zipfile
15+
16+
logging.basicConfig(level=logging.INFO)
17+
log = logging.getLogger(os.path.basename(__file__))
18+
19+
# global variables
20+
VERSION="1.39"
21+
if platform.machine() == "x86_64":
22+
ARCH="amd64"
23+
elif platform.machine() == "i386":
24+
ARCH="i386"
25+
else:
26+
log.fatal("architecture {arch} is not supported.".format(arch=platform.machine()))
27+
sys.exit(1)
28+
DRIVER_URL="http://www.mvision.co.jp/DL/net3/3iCube_Linux_{version}.zip".format(version=VERSION)
29+
DEB_PATH="3iCube_Linux_{version}/03_Driver/netusbcam_{version}-1_{arch}_libudev.deb".format(version=VERSION,
30+
arch=ARCH)
31+
SHARED_LIB_PATH="usr/lib/libNETUSBCAM.so"
32+
INCLUDE_DIR_PATH="usr/include"
33+
LIBRARY_DESTINATION = sys.argv[1]
34+
INCLUDE_DIR_DESTINATION = sys.argv[2]
35+
36+
log.info("Downloading driver")
37+
res = urllib2.urlopen(DRIVER_URL)
38+
if res.code != 200:
39+
log.fatal("failed to download from {url}: return code: {code}, msg: {msg}".format(url=res.url,
40+
code=res.code,
41+
msg=res.msg))
42+
sys.exit(1)
43+
44+
log.info("Unarchiving tarball")
45+
with zipfile.ZipFile(cStringIO.StringIO(res.read())) as z:
46+
z.extractall()
47+
subprocess.check_call(['dpkg', '--extract', DEB_PATH, '.'])
48+
49+
log.info("Copying library")
50+
src_dir = os.path.abspath(os.path.dirname(SHARED_LIB_PATH))
51+
dst_dir = os.path.abspath(os.path.dirname(LIBRARY_DESTINATION))
52+
for src_file in os.listdir(src_dir):
53+
src_path = os.path.join(src_dir, src_file)
54+
dst_path = os.path.join(dst_dir, src_file)
55+
if os.path.islink(src_path):
56+
link_dst = os.readlink(src_path)
57+
os.symlink(link_dst, dst_path)
58+
else:
59+
shutil.copy(src_path, dst_path)
60+
log.info(" %s => %s" % (src_path, dst_path))
61+
62+
log.info("Copying header files")
63+
for f in os.listdir(INCLUDE_DIR_PATH):
64+
if f.endswith(".h") or f.endswith(".hpp") or f.endswith(".hh"):
65+
if not os.path.exists(INCLUDE_DIR_DESTINATION):
66+
log.info(" make directory: %s" % INCLUDE_DIR_DESTINATION)
67+
os.makedirs(INCLUDE_DIR_DESTINATION)
68+
src_path = os.path.join(INCLUDE_DIR_PATH, f)
69+
dst_path = os.path.join(INCLUDE_DIR_DESTINATION, f)
70+
shutil.copy(src_path, dst_path)
71+
log.info(" %s => %s" % (src_path, dst_path))
72+

0 commit comments

Comments
 (0)