diff --git a/.gitignore b/.gitignore index 335fe364..b24d71e2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,33 +1,50 @@ -# Specific files -src/VimbaCPP/ - -# Build objects -lib/ -bin/ -build/ -docs/ - -# Auto generated code -cfg/cpp/ -cfg/*.cfgc - msg_gen/ - msg/lisp/ - -# CMake files -CMakeCache.txt -cmake_install.cmake -CMakeFiles/ -src/*/Makefile -src/*/cmake_install.cmake -src/*/CMakeFiles/ - -# Eclipse temporary files -.cproject -.project -.pydevproject - -# ctags -.tags* -*/.tags* +# These are some examples of commonly ignored file patterns. +# You should customize this list as applicable to your project. +# Learn more about .gitignore: +# https://www.atlassian.com/git/tutorials/saving-changes/gitignore +# Node artifact files +node_modules/ +dist/ + +# Compiled Java class files +*.class + +# Compiled Python bytecode +*.py[cod] + +# Log files +*.log + +# Package files +*.jar + +# Maven +target/ +dist/ + +# JetBrains IDE +.idea/ + +# Unit test reports +TEST*.xml + +# Generated by MacOS +.DS_Store + +# Generated by Windows +Thumbs.db + +# Applications +*.app +*.exe +*.war + +# Large media files +*.mp4 +*.tiff +*.avi +*.flv +*.mov +*.wmv diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 940e1b62..f56dadae 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,6 +2,33 @@ Changelog for package avt_vimba_camera ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.0.12 (2020-06-05) +------------------- +* Fix MonoCamera nodelet (`#16 `_) +* Launch File Updates (`#13 `_) + + * Standardize launch file formatting, remove commented code + * Provide args for all parameters + * Launch file for Mako G-319 + +* Remove duplicated launch file installs (`#15 `_) +* Brief README (`#10 `_) +* Add more pixelformats, thanks to @jmoreau-hds (`#3 `_) +* Contributors: icolwell-as + +0.0.11 (2019-08-19) +------------------- +* Merge pull request `#35 `_ from willcbaker/feature/nodelet + Feature/nodelet +* Update nodelet launch files +* Add nodelet +* Fix `#31 `_ +* Merge pull request `#30 `_ from chewwt/armv8 + add support for armv8 +* add support for armv8 +* Change frame observer to shared ptr +* Contributors: Miquel Massot, Will Baker, ruth + 0.0.10 (2017-08-16) ------------------- * Merge pull request `#26 `_ from 130s/k/add_ci @@ -30,9 +57,11 @@ Changelog for package avt_vimba_camera * Change variable scope * Fix `#15 `_: do not depend on turbot_configurations * Merge pull request `#14 `_ from josepqp/kinetic -* 1) Added ARM 32 bits libraries - 2) Modified CMakeList.txt to compile with ARM 32 bits - 3) Added Iris Parameter + + * Added ARM 32 bits libraries + * Modified CMakeList.txt to compile with ARM 32 bits + * Added Iris Parameter + * kinetization * Fix sync problems after camera tests * Add a sync timer diff --git a/CMakeLists.txt b/CMakeLists.txt index ffc947ba..ab5c1d08 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -117,6 +117,7 @@ add_dependencies_and_linkings(sync_node) add_library(avt_camera_nodelets src/nodes/mono_camera_nodelet.cpp src/nodes/stereo_camera_nodelet.cpp + src/mono_camera.cpp src/stereo_camera.cpp src/avt_vimba_camera.cpp src/frame_observer.cpp) @@ -143,10 +144,6 @@ install(DIRECTORY include ## Mark other files for installation (e.g. launch and bag files, etc.) install(FILES plugins.xml - launch/mono_camera.launch - launch/mono_camera_nodelet.launch - launch/stereo_camera_one_node.launch - launch/stereo_camera_two_nodes.launch DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} ) diff --git a/README.md b/README.md new file mode 100644 index 00000000..b2dd6224 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# avt_vimba_camera + +This repo contains a ROS driver for cameras manufactured by [Allied Vision Technologies](https://www.alliedvision.com). +The driver relies on libraries provided by AVT as part of their [Vimba SDK](https://www.alliedvision.com/en/products/software.html). + +## Installing the driver + +You can install via ROS package repos: +``` +sudo apt install ros-$ROS_DISTRO-avt-vimba-camera +``` diff --git a/cfg/AvtVimbaCamera.cfg b/cfg/AvtVimbaCamera.cfg index 5115a16c..0b4915db 100755 --- a/cfg/AvtVimbaCamera.cfg +++ b/cfg/AvtVimbaCamera.cfg @@ -31,15 +31,39 @@ acquisition_mode_enum = gen.enum( [ gen.const("Continuous", str_t, "Continuous" gen.const("SingleFrame", str_t, "SingleFrame", "The camera will only deliver a single frame trigger event"), gen.const("MultiFrame", str_t, "MultiFrame", "The camera will acquire the number of images specified by `~AcquisitionFrameCount`. Further trigger events will be ignored"), gen.const("Recorder", str_t, "Recorder", "The camera will continuously record images into the camera on-board memory")], "Set Trigger Mode") -# Monochrome cameras have mono8,12 and 12Packed. Color cameras have only mono8. -pixelformat_enum = gen.enum([ gen.const("Mono8", str_t, "Mono8", ""), - gen.const("Mono12", str_t, "Mono12", ""), - gen.const("Mono12Packed", str_t, "Mono12Packed", ""), - gen.const("BayerRG8", str_t, "BayerRG8", ""), - gen.const("BayerRG12Packed", str_t, "BayerRG12Packed", ""), - gen.const("BayerGR12", str_t, "BayerGR12", ""), - gen.const("RGB8Packed", str_t, "RGB8Packed", ""), - gen.const("BGR8Packed", str_t, "BGR8Packed", "")], "Set Pixel Format") + +# NOTE: Your AVT camera model likely doesn't support all these formats, +# check the datasheet to confirm which formats are supported. +pixelformat_enum = gen.enum([ + gen.const("Mono8", str_t, "Mono8", ""), + gen.const("Mono10", str_t, "Mono10", ""), + gen.const("Mono10Packed", str_t, "Mono10Packed", ""), + gen.const("Mono12", str_t, "Mono12", ""), + gen.const("Mono12Packed", str_t, "Mono12Packed", ""), + gen.const("BayerGR8", str_t, "BayerGR8", ""), + gen.const("BayerRG8", str_t, "BayerRG8", ""), + gen.const("BayerGB8", str_t, "BayerGB8", ""), + gen.const("BayerBG8", str_t, "BayerBG8", ""), + gen.const("BayerGR10", str_t, "BayerGR10", ""), + gen.const("BayerRG10", str_t, "BayerRG10", ""), + gen.const("BayerGB10", str_t, "BayerGB10", ""), + gen.const("BayerBG10", str_t, "BayerBG10", ""), + gen.const("BayerGR12", str_t, "BayerGR12", ""), + gen.const("BayerRG12", str_t, "BayerRG12", ""), + gen.const("BayerGB12", str_t, "BayerGB12", ""), + gen.const("BayerBG12", str_t, "BayerBG12", ""), + gen.const("BayerGR10Packed", str_t, "BayerGR10Packed", ""), + gen.const("BayerRG10Packed", str_t, "BayerRG10Packed", ""), + gen.const("BayerGB10Packed", str_t, "BayerGB10Packed", ""), + gen.const("BayerBG10Packed", str_t, "BayerBG10Packed", ""), + gen.const("BayerGR12Packed", str_t, "BayerGR12Packed", ""), + gen.const("BayerRG12Packed", str_t, "BayerRG12Packed", ""), + gen.const("BayerGB12Packed", str_t, "BayerGB12Packed", ""), + gen.const("BayerBG12Packed", str_t, "BayerBG12Packed", ""), + gen.const("RGB8Packed", str_t, "RGB8Packed", ""), + gen.const("BGR8Packed", str_t, "BGR8Packed", "") +], "Set Pixel Format") + auto_enum = gen.enum([ gen.const("Off", str_t, "Off", ""), gen.const("Once", str_t, "Once", ""), gen.const("Auto", str_t, "Continuous", "")], "Set Automatic Control") @@ -79,7 +103,7 @@ gen.add("frame_id", str_t, SensorLevels.RECONFIGURE_RUNNING, "The gen.add("trig_timestamp_topic", str_t, SensorLevels.RECONFIGURE_STOP, "Sets the topic from which an externally trigged camera receives its trigger timestamps.", "") # ACQUISITION gen.add("acquisition_mode", str_t, SensorLevels.RECONFIGURE_STOP, "Camera acquisition mode", "Continuous", edit_method = acquisition_mode_enum) -gen.add("acquisition_rate", double_t, SensorLevels.RECONFIGURE_RUNNING, "Sets the expected triggering rate in externally triggered mode.", 2, 1, 30) +gen.add("acquisition_rate", double_t, SensorLevels.RECONFIGURE_RUNNING, "Sets the expected triggering rate in externally triggered mode.", 2, 0.001, 30) # TRIGGER gen.add("trigger_source", str_t, SensorLevels.RECONFIGURE_STOP, "Camera trigger source", "FixedRate", edit_method = trigger_source_enum) gen.add("trigger_mode", str_t, SensorLevels.RECONFIGURE_STOP, "Camera trigger mode", "On", edit_method = trigger_mode_enum) @@ -117,7 +141,7 @@ gen.add("binning_y", int_t, SensorLevels.RECONFIGURE_RUNNING, "Num gen.add("decimation_x", int_t, SensorLevels.RECONFIGURE_RUNNING, "Number of decimation operations in x.", 1, 1, 8) gen.add("decimation_y", int_t, SensorLevels.RECONFIGURE_RUNNING, "Number of decimation operations in y.", 1, 1, 8) # ROI -gen.add("width", int_t, SensorLevels.RECONFIGURE_RUNNING, "Width of the region of interest (0 for automatic).", 4096, 1, 4096) +gen.add("width", int_t, SensorLevels.RECONFIGURE_RUNNING, "Width of the region of interest (0 for automatic).", 4112, 1, 4112) gen.add("height", int_t, SensorLevels.RECONFIGURE_RUNNING, "Height of the region of interest (0 for automatic).", 4096, 1, 4096) gen.add("roi_width", int_t, SensorLevels.RECONFIGURE_RUNNING, "X offset of the region of interest.", 0, 0, 4095) gen.add("roi_height", int_t, SensorLevels.RECONFIGURE_RUNNING, "X offset of the region of interest.", 0, 0, 4095) diff --git a/include/avt_vimba_camera/avt_vimba_api.h b/include/avt_vimba_camera/avt_vimba_api.h index 22c2e67b..65ae7f73 100644 --- a/include/avt_vimba_camera/avt_vimba_api.h +++ b/include/avt_vimba_camera/avt_vimba_api.h @@ -128,7 +128,8 @@ class AvtVimbaApi { else if (pixel_format == VmbPixelFormatBayerGB10 ) encoding = sensor_msgs::image_encodings::TYPE_16SC1; else if (pixel_format == VmbPixelFormatBayerBG10 ) encoding = sensor_msgs::image_encodings::TYPE_16SC1; else if (pixel_format == VmbPixelFormatBayerGR12 ) encoding = sensor_msgs::image_encodings::TYPE_16SC1; - else if (pixel_format == VmbPixelFormatBayerRG12 ) encoding = sensor_msgs::image_encodings::TYPE_16SC1; + // dcasa: fixed BayerRG8 image encoding + else if (pixel_format == VmbPixelFormatBayerRG12 ) encoding = sensor_msgs::image_encodings::BAYER_RGGB16; else if (pixel_format == VmbPixelFormatBayerGB12 ) encoding = sensor_msgs::image_encodings::TYPE_16SC1; else if (pixel_format == VmbPixelFormatBayerBG12 ) encoding = sensor_msgs::image_encodings::TYPE_16SC1; else if (pixel_format == VmbPixelFormatBayerGR12Packed) encoding = sensor_msgs::image_encodings::TYPE_32SC4; @@ -153,12 +154,20 @@ class AvtVimbaApi { VmbErrorType err = vimba_frame_ptr->GetImage(buffer_ptr); bool res = false; if ( VmbErrorSuccess == err ) { + // dcasa: scale 12 bit image to 16 bit container + if (pixel_format == VmbPixelFormatBayerRG12) { + unsigned short *buffer_ptr_uint16 = (unsigned short *)buffer_ptr; + for (unsigned int i=0; i + + + + + + + + + + + + + + + + + + + + + + diff --git a/launch/calibration.launch b/launch/calibration.launch index 5c882137..b26c05b0 100644 --- a/launch/calibration.launch +++ b/launch/calibration.launch @@ -1,9 +1,9 @@ - - - - - - - - \ No newline at end of file + + + + + + + + diff --git a/launch/mono_camera.launch b/launch/mono_camera.launch index 529ab358..b795662f 100644 --- a/launch/mono_camera.launch +++ b/launch/mono_camera.launch @@ -1,74 +1,59 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launch/mono_camera_nodelet.launch b/launch/mono_camera_nodelet.launch index e114ad8d..bed642d9 100644 --- a/launch/mono_camera_nodelet.launch +++ b/launch/mono_camera_nodelet.launch @@ -3,46 +3,62 @@ + + + + + + + + + + + + + + + + + + + + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launch/record.launch b/launch/record.launch index 2727d6aa..1d06d51c 100644 --- a/launch/record.launch +++ b/launch/record.launch @@ -1,8 +1,10 @@ - - - + + + - - - \ No newline at end of file + + diff --git a/launch/stereo_camera_nodelet.launch b/launch/stereo_camera_nodelet.launch index 1fa96f02..9efeeeba 100644 --- a/launch/stereo_camera_nodelet.launch +++ b/launch/stereo_camera_nodelet.launch @@ -22,5 +22,4 @@ - diff --git a/launch/stereo_camera_one_node.launch b/launch/stereo_camera_one_node.launch index e3577d8a..e03cef02 100644 --- a/launch/stereo_camera_one_node.launch +++ b/launch/stereo_camera_one_node.launch @@ -1,21 +1,17 @@ - - - - - + + + - + - - - - - - - - - + + + + + + + + - diff --git a/launch/stereo_camera_two_nodes.launch b/launch/stereo_camera_two_nodes.launch index 0fdf7152..ef7e57db 100644 --- a/launch/stereo_camera_two_nodes.launch +++ b/launch/stereo_camera_two_nodes.launch @@ -1,63 +1,51 @@ + + - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - diff --git a/package.xml b/package.xml index d286fd91..95ad7831 100644 --- a/package.xml +++ b/package.xml @@ -1,7 +1,7 @@ avt_vimba_camera - 0.0.10 + 0.0.12 Wrapper of the Allied Vision Technologies (AVT) VIMBA Ethernet and Firewire SDK. Miquel Massot diff --git a/src/avt_vimba_camera.cpp b/src/avt_vimba_camera.cpp index 0096dfb7..7e614505 100644 --- a/src/avt_vimba_camera.cpp +++ b/src/avt_vimba_camera.cpp @@ -59,11 +59,30 @@ static const char* AcquisitionMode[] = { "Recorder"}; static const char* PixelFormatMode[] = { "Mono8", + "Mono10", + "Mono10Packed", "Mono12", "Mono12Packed", + "BayerGR8", "BayerRG8", - "BayerRG12Packed", + "BayerGB8", + "BayerBG8", + "BayerGR10", + "BayerRG10", + "BayerGB10", + "BayerBG10", + "BayerGR12", "BayerRG12", + "BayerGB12", + "BayerBG12", + "BayerGR10Packed", + "BayerRG10Packed", + "BayerGB10Packed", + "BayerBG10Packed", + "BayerGR12Packed", + "BayerRG12Packed", + "BayerGB12Packed", + "BayerBG12Packed", "RGB8Packed", "BGR8Packed"}; static const char* BalanceRatioMode[] = { @@ -104,8 +123,6 @@ AvtVimbaCamera::AvtVimbaCamera(std::string name) { show_debug_prints_ = false; name_ = name; - signal(SIGINT, intHandler); - camera_state_ = OPENING; updater_.setHardwareID("unknown"); @@ -173,7 +190,8 @@ void AvtVimbaCamera::start(std::string ip_str, std::string guid_str, bool debug_ if (trigger_source_int == Freerun || trigger_source_int == FixedRate || - trigger_source_int == SyncIn1) { + trigger_source_int == SyncIn1 || + trigger_source_int == SyncIn2) { // Create a frame observer for this camera SP_SET(frame_obs_ptr_, new FrameObserver(vimba_camera_ptr_, boost::bind(&avt_vimba_camera::AvtVimbaCamera::frameCallback, this, _1))); @@ -290,6 +308,9 @@ CameraPtr AvtVimbaCamera::openCamera(std::string id_str) { CameraPtr camera; VimbaSystem& vimba_system(VimbaSystem::GetInstance()); + // set handler to catch ctrl+c presses + sighandler_t oldHandler = signal(SIGINT, intHandler); + // get camera VmbErrorType err = vimba_system.GetCameraByID(id_str.c_str(), camera); while (err != VmbErrorSuccess) { @@ -322,6 +343,9 @@ CameraPtr AvtVimbaCamera::openCamera(std::string id_str) { } } + // set previous handler back + signal(SIGINT, oldHandler); + std::string cam_id, cam_name, cam_model, cam_sn, cam_int_id; VmbInterfaceType cam_int_type; VmbAccessModeType accessMode; // = VmbAccessModeNone; @@ -956,17 +980,17 @@ void AvtVimbaCamera::updateGainConfig(Config& config) { } if (config.gain_auto_outliers != config_.gain_auto_outliers || on_init_) { changed = true; - setFeatureValue("GainAutoMin", + setFeatureValue("GainAutoOutliers", static_cast(config.gain_auto_outliers)); } if (config.gain_auto_rate != config_.gain_auto_rate || on_init_) { changed = true; - setFeatureValue("GainAutoOutliers", + setFeatureValue("GainAutoRate", static_cast(config.gain_auto_rate)); } if (config.gain_auto_target != config_.gain_auto_target || on_init_) { changed = true; - setFeatureValue("GainAutoRate", static_cast(config.gain_auto_target)); + setFeatureValue("GainAutoTarget", static_cast(config.gain_auto_target)); } if(changed && show_debug_prints_){ ROS_INFO_STREAM("New Gain config (" << config.frame_id << ") : "