From 27e8e883ffacb09a60f081b393ae74c243d9fb64 Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Mon, 13 Nov 2023 17:02:22 -0500 Subject: [PATCH 01/25] add flir submodule --- .gitmodules | 3 +++ src/pi/flir_camera_driver | 1 + 2 files changed, 4 insertions(+) create mode 160000 src/pi/flir_camera_driver diff --git a/.gitmodules b/.gitmodules index f693d1eb..309a344b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "src/surface/ros2_video_streamer"] path = src/surface/ros2_video_streamer url = git@github.com:cwruRobotics/ros2_video_streamer.git +[submodule "src/pi/flir_camera_driver"] + path = src/pi/flir_camera_driver + url = git@github.com:ros-drivers/flir_camera_driver.git diff --git a/src/pi/flir_camera_driver b/src/pi/flir_camera_driver new file mode 160000 index 00000000..dbb5f16e --- /dev/null +++ b/src/pi/flir_camera_driver @@ -0,0 +1 @@ +Subproject commit dbb5f16eb20ebc539a591b5d2bd6b27205fb0b75 From 3df554eec565d25e76f97fb557bf3219e3ad26df Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Thu, 16 Nov 2023 10:38:39 -0500 Subject: [PATCH 02/25] move flir cameras to surface --- .gitmodules | 4 ++-- src/pi/flir_camera_driver | 1 - src/surface/flir_camera_driver | 1 + 3 files changed, 3 insertions(+), 3 deletions(-) delete mode 160000 src/pi/flir_camera_driver create mode 160000 src/surface/flir_camera_driver diff --git a/.gitmodules b/.gitmodules index 309a344b..3a734208 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "src/surface/ros2_video_streamer"] path = src/surface/ros2_video_streamer url = git@github.com:cwruRobotics/ros2_video_streamer.git -[submodule "src/pi/flir_camera_driver"] - path = src/pi/flir_camera_driver +[submodule "src/surface/flir_camera_driver"] + path = src/surface/flir_camera_driver url = git@github.com:ros-drivers/flir_camera_driver.git diff --git a/src/pi/flir_camera_driver b/src/pi/flir_camera_driver deleted file mode 160000 index dbb5f16e..00000000 --- a/src/pi/flir_camera_driver +++ /dev/null @@ -1 +0,0 @@ -Subproject commit dbb5f16eb20ebc539a591b5d2bd6b27205fb0b75 diff --git a/src/surface/flir_camera_driver b/src/surface/flir_camera_driver new file mode 160000 index 00000000..e75bdf0b --- /dev/null +++ b/src/surface/flir_camera_driver @@ -0,0 +1 @@ +Subproject commit e75bdf0b949309adc69ff691e0a51316f5282f3a From 1673a8abddb0a1cadd1dffa07227b6b4f5a6e815 Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Mon, 20 Nov 2023 16:07:39 -0500 Subject: [PATCH 03/25] start rov_flir --- .gitmodules | 3 -- src/surface/flir_camera_driver | 1 - src/surface/ros2_video_streamer | 2 +- src/surface/rov_flir/README.md | 32 +++++++++++++++++++ .../rov_flir/launch/controller_launch.py | 17 ++++++++++ src/surface/rov_flir/package.xml | 20 ++++++++++++ src/surface/rov_flir/resource/rov_flir | 0 src/surface/rov_flir/rov_flir/__init__.py | 0 src/surface/rov_flir/setup.cfg | 4 +++ src/surface/rov_flir/setup.py | 28 ++++++++++++++++ src/surface/rov_flir/test/test_flake8.py | 25 +++++++++++++++ src/surface/rov_flir/test/test_pep257.py | 23 +++++++++++++ 12 files changed, 150 insertions(+), 5 deletions(-) delete mode 160000 src/surface/flir_camera_driver create mode 100644 src/surface/rov_flir/README.md create mode 100644 src/surface/rov_flir/launch/controller_launch.py create mode 100644 src/surface/rov_flir/package.xml create mode 100644 src/surface/rov_flir/resource/rov_flir create mode 100644 src/surface/rov_flir/rov_flir/__init__.py create mode 100644 src/surface/rov_flir/setup.cfg create mode 100644 src/surface/rov_flir/setup.py create mode 100644 src/surface/rov_flir/test/test_flake8.py create mode 100644 src/surface/rov_flir/test/test_pep257.py diff --git a/.gitmodules b/.gitmodules index 3a734208..f693d1eb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ [submodule "src/surface/ros2_video_streamer"] path = src/surface/ros2_video_streamer url = git@github.com:cwruRobotics/ros2_video_streamer.git -[submodule "src/surface/flir_camera_driver"] - path = src/surface/flir_camera_driver - url = git@github.com:ros-drivers/flir_camera_driver.git diff --git a/src/surface/flir_camera_driver b/src/surface/flir_camera_driver deleted file mode 160000 index e75bdf0b..00000000 --- a/src/surface/flir_camera_driver +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e75bdf0b949309adc69ff691e0a51316f5282f3a diff --git a/src/surface/ros2_video_streamer b/src/surface/ros2_video_streamer index ec1f6d97..ec5f178b 160000 --- a/src/surface/ros2_video_streamer +++ b/src/surface/ros2_video_streamer @@ -1 +1 @@ -Subproject commit ec1f6d976500e97dbe7acee57ca42a029a29d72f +Subproject commit ec5f178bcc56df34f83aa157e6f691c2ef45503c diff --git a/src/surface/rov_flir/README.md b/src/surface/rov_flir/README.md new file mode 100644 index 00000000..a248e598 --- /dev/null +++ b/src/surface/rov_flir/README.md @@ -0,0 +1,32 @@ +# rov_flir + + + +## Overview + +This is a boilerplate package which launches the joy_node from the joy package. + +## Usage + +Run the main node with + +```bash +ros2 launch ps5-controller controller_launch.py +``` + +## Launch files + +* **controller_launch.py:** Launches the joy_node from the joy package to read PS5 controller input. + +## Published Topics + +* **`/joy`** ([sensor_msgs/Joy]) + + Outdated ROV movement instructions + +## Subscribed Topics + +* **`/joy/set_feedback`** ([sensor_msgs/JoyFeedback]) + +[sensor_msgs/Joy]: https://docs.ros.org/en/noetic/api/sensor_msgs/html/msg/Joy.html +[sensor_msgs/JoyFeedback]: https://docs.ros.org/en/noetic/api/sensor_msgs/html/msg/JoyFeedback.html \ No newline at end of file diff --git a/src/surface/rov_flir/launch/controller_launch.py b/src/surface/rov_flir/launch/controller_launch.py new file mode 100644 index 00000000..7fd16ba8 --- /dev/null +++ b/src/surface/rov_flir/launch/controller_launch.py @@ -0,0 +1,17 @@ +from launch.launch_description import LaunchDescription +from launch_ros.actions import Node + + +def generate_launch_description() -> LaunchDescription: + + # launches node to capture joystick data + controller_node: Node = Node( + package='joy', + executable='joy_node', + emulate_tty=True, + output='screen' + ) + + return LaunchDescription([ + controller_node, + ]) diff --git a/src/surface/rov_flir/package.xml b/src/surface/rov_flir/package.xml new file mode 100644 index 00000000..6b8c53aa --- /dev/null +++ b/src/surface/rov_flir/package.xml @@ -0,0 +1,20 @@ + + + + rov_flir + 1.0.0 + Biolerplate for calling flir launch file. + Michael Carlstrom + Apache License 2.0 + + ament_flake8 + ament_pep257 + python3-pytest + + ros2launch + joy + + + ament_python + + diff --git a/src/surface/rov_flir/resource/rov_flir b/src/surface/rov_flir/resource/rov_flir new file mode 100644 index 00000000..e69de29b diff --git a/src/surface/rov_flir/rov_flir/__init__.py b/src/surface/rov_flir/rov_flir/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/surface/rov_flir/setup.cfg b/src/surface/rov_flir/setup.cfg new file mode 100644 index 00000000..812ad80b --- /dev/null +++ b/src/surface/rov_flir/setup.cfg @@ -0,0 +1,4 @@ +[develop] +script_dir=$base/lib/rov_flir +[install] +install_scripts=$base/lib/rov_flir diff --git a/src/surface/rov_flir/setup.py b/src/surface/rov_flir/setup.py new file mode 100644 index 00000000..11b36089 --- /dev/null +++ b/src/surface/rov_flir/setup.py @@ -0,0 +1,28 @@ +import os +from glob import glob + +from setuptools import setup + +package_name = 'rov_flir' + +setup( + name=package_name, + version='1.0.0', + packages=[package_name], + data_files=[ + ('share/ament_index/resource_index/packages', + ['resource/' + package_name]), + ('share/' + package_name, ['package.xml']), + # Include all launch files. + (os.path.join('share', package_name, 'launch'), + glob('launch/*launch.[pxy][yma]*')) + ], + install_requires=['setuptools'], + zip_safe=True, + maintainer='Michael Carlstrom', + maintainer_email='rmc170@case.edu', + description='Biolerplate for calling standard flir launch file.', + license='Apache License 2.0', + tests_require=['pytest'], + entry_points={}, +) diff --git a/src/surface/rov_flir/test/test_flake8.py b/src/surface/rov_flir/test/test_flake8.py new file mode 100644 index 00000000..27ee1078 --- /dev/null +++ b/src/surface/rov_flir/test/test_flake8.py @@ -0,0 +1,25 @@ +# Copyright 2017 Open Source Robotics Foundation, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ament_flake8.main import main_with_errors +import pytest + + +@pytest.mark.flake8 +@pytest.mark.linter +def test_flake8(): + rc, errors = main_with_errors(argv=[]) + assert rc == 0, \ + 'Found %d code style errors / warnings:\n' % len(errors) + \ + '\n'.join(errors) diff --git a/src/surface/rov_flir/test/test_pep257.py b/src/surface/rov_flir/test/test_pep257.py new file mode 100644 index 00000000..b234a384 --- /dev/null +++ b/src/surface/rov_flir/test/test_pep257.py @@ -0,0 +1,23 @@ +# Copyright 2015 Open Source Robotics Foundation, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ament_pep257.main import main +import pytest + + +@pytest.mark.linter +@pytest.mark.pep257 +def test_pep257(): + rc = main(argv=['.', 'test']) + assert rc == 0, 'Found code style errors / warnings' From 2f9d082e9c8657ac54e6b6a2ba1e1a73bf492c46 Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Mon, 20 Nov 2023 16:28:08 -0500 Subject: [PATCH 04/25] update package.xml --- .../rov_flir/launch/{controller_launch.py => flir_launch.py} | 0 src/surface/rov_flir/package.xml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/surface/rov_flir/launch/{controller_launch.py => flir_launch.py} (100%) diff --git a/src/surface/rov_flir/launch/controller_launch.py b/src/surface/rov_flir/launch/flir_launch.py similarity index 100% rename from src/surface/rov_flir/launch/controller_launch.py rename to src/surface/rov_flir/launch/flir_launch.py diff --git a/src/surface/rov_flir/package.xml b/src/surface/rov_flir/package.xml index 6b8c53aa..fe01ea42 100644 --- a/src/surface/rov_flir/package.xml +++ b/src/surface/rov_flir/package.xml @@ -12,7 +12,7 @@ python3-pytest ros2launch - joy + spinnaker_camera_driver ament_python From 649ea19ff29e43ab1a20daf39094b1a7beac10a8 Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Mon, 20 Nov 2023 16:56:22 -0500 Subject: [PATCH 05/25] update flir_launch file --- src/surface/rov_flir/launch/flir_launch.py | 25 ++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/surface/rov_flir/launch/flir_launch.py b/src/surface/rov_flir/launch/flir_launch.py index 7fd16ba8..93cde733 100644 --- a/src/surface/rov_flir/launch/flir_launch.py +++ b/src/surface/rov_flir/launch/flir_launch.py @@ -4,14 +4,27 @@ def generate_launch_description() -> LaunchDescription: - # launches node to capture joystick data - controller_node: Node = Node( - package='joy', - executable='joy_node', + # launches node to run front flir camera + front_cam: Node = Node( + package='spinnaker_camera_driver', + executable='camera_driver_node', emulate_tty=True, - output='screen' + name='front_cam', + output='screen', + parameters={'serial_number': 33} + ) + + # launches node to run bottom flir camera + bottom_cam: Node = Node( + package='spinnaker_camera_driver', + executable='camera_driver_node', + emulate_tty=True, + name='bottom_Cam', + output='screen', + parameters={'serial_number': 34} ) return LaunchDescription([ - controller_node, + front_cam, + bottom_cam ]) From a1afb72b07a5405eaf7994486f93f83e9a4ccc2d Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Mon, 20 Nov 2023 17:14:48 -0500 Subject: [PATCH 06/25] got serial_number stuff --- src/surface/rov_flir/launch/flir_launch.py | 24 ++++++++++++---------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/surface/rov_flir/launch/flir_launch.py b/src/surface/rov_flir/launch/flir_launch.py index 93cde733..2776ab53 100644 --- a/src/surface/rov_flir/launch/flir_launch.py +++ b/src/surface/rov_flir/launch/flir_launch.py @@ -1,5 +1,6 @@ from launch.launch_description import LaunchDescription from launch_ros.actions import Node +from launch_ros.parameter_descriptions import Parameter def generate_launch_description() -> LaunchDescription: @@ -11,20 +12,21 @@ def generate_launch_description() -> LaunchDescription: emulate_tty=True, name='front_cam', output='screen', - parameters={'serial_number': 33} + parameters=[Parameter('serial_number', '34'), + Parameter('serial_number', '34')] ) - # launches node to run bottom flir camera - bottom_cam: Node = Node( - package='spinnaker_camera_driver', - executable='camera_driver_node', - emulate_tty=True, - name='bottom_Cam', - output='screen', - parameters={'serial_number': 34} - ) + # # launches node to run bottom flir camera + # bottom_cam: Node = Node( + # package='spinnaker_camera_driver', + # executable='camera_driver_node', + # emulate_tty=True, + # name='bottom_Cam', + # output='screen', + # parameters=[Parameter('serial_number', '35')] + # ) return LaunchDescription([ front_cam, - bottom_cam + # bottom_cam ]) From a1532baac66e666df6f4975a91f343c224ed20a1 Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Mon, 20 Nov 2023 22:10:02 -0500 Subject: [PATCH 07/25] update test files --- src/surface/rov_flir/test/test_flake8.py | 2 +- src/surface/rov_flir/test/test_pep257.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/surface/rov_flir/test/test_flake8.py b/src/surface/rov_flir/test/test_flake8.py index 27ee1078..eac16eef 100644 --- a/src/surface/rov_flir/test/test_flake8.py +++ b/src/surface/rov_flir/test/test_flake8.py @@ -18,7 +18,7 @@ @pytest.mark.flake8 @pytest.mark.linter -def test_flake8(): +def test_flake8() -> None: rc, errors = main_with_errors(argv=[]) assert rc == 0, \ 'Found %d code style errors / warnings:\n' % len(errors) + \ diff --git a/src/surface/rov_flir/test/test_pep257.py b/src/surface/rov_flir/test/test_pep257.py index b234a384..b6808e1d 100644 --- a/src/surface/rov_flir/test/test_pep257.py +++ b/src/surface/rov_flir/test/test_pep257.py @@ -18,6 +18,6 @@ @pytest.mark.linter @pytest.mark.pep257 -def test_pep257(): +def test_pep257() -> None: rc = main(argv=['.', 'test']) assert rc == 0, 'Found code style errors / warnings' From 692f1dc4804665163fa8884813523f320f8e5195 Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Tue, 21 Nov 2023 15:37:31 -0500 Subject: [PATCH 08/25] pain --- src/surface/rov_flir/launch/flir_launch.py | 31 +++++++++++++--------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/surface/rov_flir/launch/flir_launch.py b/src/surface/rov_flir/launch/flir_launch.py index 2776ab53..69bac1e3 100644 --- a/src/surface/rov_flir/launch/flir_launch.py +++ b/src/surface/rov_flir/launch/flir_launch.py @@ -1,10 +1,16 @@ from launch.launch_description import LaunchDescription +from launch.substitutions import PathJoinSubstitution from launch_ros.actions import Node from launch_ros.parameter_descriptions import Parameter +from launch_ros.substitutions import FindPackageShare def generate_launch_description() -> LaunchDescription: + parameter_file = PathJoinSubstitution( + [FindPackageShare('spinnaker_camera_driver'), 'config', + 'blackfly_s' + '.yaml']) + # launches node to run front flir camera front_cam: Node = Node( package='spinnaker_camera_driver', @@ -12,21 +18,22 @@ def generate_launch_description() -> LaunchDescription: emulate_tty=True, name='front_cam', output='screen', - parameters=[Parameter('serial_number', '34'), - Parameter('serial_number', '34')] + parameters=[Parameter('serial_number', '23473577'), + Parameter('parameter_file', parameter_file)] ) - # # launches node to run bottom flir camera - # bottom_cam: Node = Node( - # package='spinnaker_camera_driver', - # executable='camera_driver_node', - # emulate_tty=True, - # name='bottom_Cam', - # output='screen', - # parameters=[Parameter('serial_number', '35')] - # ) + # launches node to run bottom flir camera + bottom_cam: Node = Node( + package='spinnaker_camera_driver', + executable='camera_driver_node', + emulate_tty=True, + name='bottom_cam', + output='screen', + parameters=[Parameter('serial_number', '23473566'), + Parameter('parameter_file', parameter_file)] + ) return LaunchDescription([ front_cam, - # bottom_cam + bottom_cam ]) From 6d3344b2e0a17158333e129381ba4a1202af8471 Mon Sep 17 00:00:00 2001 From: NoahMollerstuen Date: Sat, 2 Dec 2023 14:56:30 -0500 Subject: [PATCH 09/25] Enable binning --- src/surface/rov_flir/launch/flir_launch.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/surface/rov_flir/launch/flir_launch.py b/src/surface/rov_flir/launch/flir_launch.py index 69bac1e3..932a4e45 100644 --- a/src/surface/rov_flir/launch/flir_launch.py +++ b/src/surface/rov_flir/launch/flir_launch.py @@ -19,6 +19,7 @@ def generate_launch_description() -> LaunchDescription: name='front_cam', output='screen', parameters=[Parameter('serial_number', '23473577'), + Parameter('binning', '2'), Parameter('parameter_file', parameter_file)] ) @@ -30,6 +31,7 @@ def generate_launch_description() -> LaunchDescription: name='bottom_cam', output='screen', parameters=[Parameter('serial_number', '23473566'), + Parameter('binning', '2'), Parameter('parameter_file', parameter_file)] ) From f7e5dab4cf1e4548f3ca08097b6337eeaf27eff8 Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Sat, 2 Dec 2023 16:33:03 -0500 Subject: [PATCH 10/25] pain --- src/surface/rov_flir/launch/flir_launch.py | 24 ++++++++++------------ 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/surface/rov_flir/launch/flir_launch.py b/src/surface/rov_flir/launch/flir_launch.py index 932a4e45..84d43b4f 100644 --- a/src/surface/rov_flir/launch/flir_launch.py +++ b/src/surface/rov_flir/launch/flir_launch.py @@ -16,26 +16,24 @@ def generate_launch_description() -> LaunchDescription: package='spinnaker_camera_driver', executable='camera_driver_node', emulate_tty=True, - name='front_cam', output='screen', parameters=[Parameter('serial_number', '23473577'), Parameter('binning', '2'), Parameter('parameter_file', parameter_file)] ) - # launches node to run bottom flir camera - bottom_cam: Node = Node( - package='spinnaker_camera_driver', - executable='camera_driver_node', - emulate_tty=True, - name='bottom_cam', - output='screen', - parameters=[Parameter('serial_number', '23473566'), - Parameter('binning', '2'), - Parameter('parameter_file', parameter_file)] - ) + # # launches node to run bottom flir camera + # bottom_cam: Node = Node( + # package='spinnaker_camera_driver', + # executable='camera_driver_node', + # emulate_tty=True, + # output='screen', + # parameters=[Parameter('serial_number', '23473566'), + # Parameter('binning', '2'), + # Parameter('parameter_file', parameter_file)] + # ) return LaunchDescription([ front_cam, - bottom_cam + # bottom_cam ]) From 1f66f0f03a7cab54bd1c18ca11429b7885efcdfb Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Mon, 4 Dec 2023 16:53:38 -0500 Subject: [PATCH 11/25] merge --- src/surface/ros2_video_streamer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/surface/ros2_video_streamer b/src/surface/ros2_video_streamer index 783c1bbb..0c7d9a1c 160000 --- a/src/surface/ros2_video_streamer +++ b/src/surface/ros2_video_streamer @@ -1 +1 @@ -Subproject commit 783c1bbb574829780c09c13401a6268b15cce045 +Subproject commit 0c7d9a1cb9d15abb115282939e66d1f92d2fdad5 From 077bcf8ea3d8ea4ddfc0074fae74f6938e9735be Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Tue, 5 Dec 2023 14:12:59 -0500 Subject: [PATCH 12/25] add parameters like in the flir_launch example --- src/surface/rov_flir/launch/flir_launch.py | 58 +++++++++++++++++----- 1 file changed, 46 insertions(+), 12 deletions(-) diff --git a/src/surface/rov_flir/launch/flir_launch.py b/src/surface/rov_flir/launch/flir_launch.py index 84d43b4f..7c892a85 100644 --- a/src/surface/rov_flir/launch/flir_launch.py +++ b/src/surface/rov_flir/launch/flir_launch.py @@ -1,3 +1,4 @@ +from typing import Any from launch.launch_description import LaunchDescription from launch.substitutions import PathJoinSubstitution from launch_ros.actions import Node @@ -11,6 +12,37 @@ def generate_launch_description() -> LaunchDescription: [FindPackageShare('spinnaker_camera_driver'), 'config', 'blackfly_s' + '.yaml']) + parameters = {'debug': False, + 'compute_brightness': False, + 'adjust_timestamp': True, + 'dump_node_map': False, + # set parameters defined in blackfly_s.yaml + 'gain_auto': 'Continuous', + # 'pixel_format': 'BayerRG8', + 'exposure_auto': 'Continuous', + # These are useful for GigE cameras + 'device_link_throughput_limit': 380000000, + 'gev_scps_packet_size': 9000, + # ---- to reduce the sensor width and shift the crop + # 'image_width': 1408, + # 'image_height': 1080, + # 'offset_x': 16, + # 'offset_y': 0, + 'frame_rate_auto': 'Off', + # 'frame_rate': 40.0, + 'frame_rate_enable': True, + 'buffer_queue_size': 1, + 'trigger_mode': 'Off', + 'chunk_mode_active': True, + 'chunk_selector_frame_id': 'FrameID', + 'chunk_enable_frame_id': True, + 'chunk_selector_exposure_time': 'ExposureTime', + 'chunk_enable_exposure_time': True, + 'chunk_selector_gain': 'Gain', + 'chunk_enable_gain': True, + 'chunk_selector_timestamp': 'Timestamp', + 'chunk_enable_timestamp': True} + # launches node to run front flir camera front_cam: Node = Node( package='spinnaker_camera_driver', @@ -19,21 +51,23 @@ def generate_launch_description() -> LaunchDescription: output='screen', parameters=[Parameter('serial_number', '23473577'), Parameter('binning', '2'), - Parameter('parameter_file', parameter_file)] + Parameter('parameter_file', parameter_file), + parameters] ) - # # launches node to run bottom flir camera - # bottom_cam: Node = Node( - # package='spinnaker_camera_driver', - # executable='camera_driver_node', - # emulate_tty=True, - # output='screen', - # parameters=[Parameter('serial_number', '23473566'), - # Parameter('binning', '2'), - # Parameter('parameter_file', parameter_file)] - # ) + # launches node to run bottom flir camera + bottom_cam: Node = Node( + package='spinnaker_camera_driver', + executable='camera_driver_node', + emulate_tty=True, + output='screen', + parameters=[Parameter('serial_number', '23473566'), + Parameter('binning', '2'), + Parameter('parameter_file', parameter_file), + parameters] + ) return LaunchDescription([ front_cam, - # bottom_cam + bottom_cam ]) From deeb5a58889338f929503632cfc0b407ec55cb8c Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Tue, 5 Dec 2023 14:29:21 -0500 Subject: [PATCH 13/25] remove unused import --- src/surface/rov_flir/launch/flir_launch.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/surface/rov_flir/launch/flir_launch.py b/src/surface/rov_flir/launch/flir_launch.py index 7c892a85..825d5172 100644 --- a/src/surface/rov_flir/launch/flir_launch.py +++ b/src/surface/rov_flir/launch/flir_launch.py @@ -1,4 +1,3 @@ -from typing import Any from launch.launch_description import LaunchDescription from launch.substitutions import PathJoinSubstitution from launch_ros.actions import Node From a9631bb6f01d5c087a09d29627f27942f8f1041b Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Thu, 7 Dec 2023 17:02:09 -0500 Subject: [PATCH 14/25] added binning --- src/surface/ros2_video_streamer | 2 +- src/surface/rov_flir/config/blackfly_s.yaml | 154 ++++++++++++++++++++ src/surface/rov_flir/launch/flir_launch.py | 22 +-- src/surface/rov_flir/setup.py | 4 +- 4 files changed, 170 insertions(+), 12 deletions(-) create mode 100644 src/surface/rov_flir/config/blackfly_s.yaml diff --git a/src/surface/ros2_video_streamer b/src/surface/ros2_video_streamer index 0c7d9a1c..e1a8d332 160000 --- a/src/surface/ros2_video_streamer +++ b/src/surface/ros2_video_streamer @@ -1 +1 @@ -Subproject commit 0c7d9a1cb9d15abb115282939e66d1f92d2fdad5 +Subproject commit e1a8d332467ed3109117a19db74c2385b59f116a diff --git a/src/surface/rov_flir/config/blackfly_s.yaml b/src/surface/rov_flir/config/blackfly_s.yaml new file mode 100644 index 00000000..608bc806 --- /dev/null +++ b/src/surface/rov_flir/config/blackfly_s.yaml @@ -0,0 +1,154 @@ +# +# config file for blackfly S cameras (USB3 and GigE) +# +# This file maps the ros parameters to the corresponding Spinnaker "nodes" in the camera. +# For more details on how to modify this file, see the README on camera configuration files. + + +parameters: + # + # -------- image format control + # + - name: pixel_format + type: enum + # Check available values with SpinView. Not all are supported by ROS! + # Some formats are e.g. "Mono8", "BayerRG8", "BGR8", "BayerRG16" + # default is "BayerRG8" + node: ImageFormatControl/PixelFormat + - name: image_width + type: int + node: ImageFormatControl/Width + - name: image_height + type: int + node: ImageFormatControl/Height + - name: offset_x # offset must come after image width reduction! + type: int + node: ImageFormatControl/OffsetX + - name: offset_y + type: int + node: ImageFormatControl/OffsetY + # Added by ROV + - name: binning_x + type: int + node: ImageFormatControl/BinningHorizontal + - name: binning_y + type: int + node: ImageFormatControl/BinningVertical + # + # -------- analog control + # + - name: gain_auto + type: enum + # valid values are "Continuous", "Off" + node: AnalogControl/GainAuto + - name: gain + type: float + node: AnalogControl/Gain + # + # -------- device link throughput limiting + # + - name: device_link_throughput_limit + type: int + node: DeviceControl/DeviceLinkThroughputLimit + # + # -------- transport layer control (GigE) + # + - name: gev_scps_packet_size + type: int + # default is 1400. Set to 9000 to enable jumbo frames, ensure NIC MTU set >= 9000 + node: TransportLayerControl/GigEVision/GevSCPSPacketSize + # + # -------- digital IO control + # + - name: line0_selector # black wire: opto-isolated input + type: enum + node: DigitalIOControl/LineSelector + - name: line1_selector # white wire: opto-isolated output + type: enum + node: DigitalIOControl/LineSelector + - name: line1_linemode # valid values: "Input", "Output" + type: enum + node: DigitalIOControl/LineMode + - name: line2_selector # red wire: non-isolated input/output + type: enum + node: DigitalIOControl/LineSelector + - name: line2_v33enable # red wire: 3.3V power + type: bool + node: DigitalIOControl/V3_3Enable + - name: line3_selector # green wire: aux voltage input and non-isolated input + type: enum + node: DigitalIOControl/LineSelector + - name: line3_linemode # valid values: "Input", "Output" + type: enum + node: DigitalIOControl/LineMode + # + # -------- acquisition control + # + - name: exposure_auto + type: enum + # valid values are "Off", "Continuous" + node: AcquisitionControl/ExposureAuto + - name: exposure_time + type: float + node: AcquisitionControl/ExposureTime + - name: frame_rate_enable + type: bool + node: AcquisitionControl/AcquisitionFrameRateEnable + - name: frame_rate + type: float + node: AcquisitionControl/AcquisitionFrameRate + - name: trigger_selector + type: enum + # valid values are e.g. "FrameStart", "AcquisitionStart", "FrameBurstStart" + node: AcquisitionControl/TriggerSelector + - name: trigger_mode + type: enum + # valid values are "On" and "Off" + node: AcquisitionControl/TriggerMode + - name: trigger_source + type: enum + # valid values are "Line<0,1,2>", "UserOutput<0,1,2>", "Counter<0,1>", + # "LogicBlock<0,1> + node: AcquisitionControl/TriggerSource + - name: trigger_delay + # value >= 9 + type: float + node: AcquisitionControl/TriggerDelay + - name: trigger_overlap + type: enum + # valid values: "Off" and "ReadOut" + node: AcquisitionControl/TriggerOverlap + # + # --------- chunk control + # + - name: chunk_mode_active + type: bool + node: ChunkDataControl/ChunkModeActive + - name: chunk_selector_frame_id + type: enum + # valid values: "FrameID" + node: ChunkDataControl/ChunkSelector + - name: chunk_enable_frame_id + type: bool + node: ChunkDataControl/ChunkEnable + - name: chunk_selector_exposure_time + type: enum + # valid values: "ExposureTime" + node: ChunkDataControl/ChunkSelector + - name: chunk_enable_exposure_time + type: bool + node: ChunkDataControl/ChunkEnable + - name: chunk_selector_gain + type: enum + # valid values: "Gain" + node: ChunkDataControl/ChunkSelector + - name: chunk_enable_gain + type: bool + node: ChunkDataControl/ChunkEnable + - name: chunk_selector_timestamp + type: enum + # valid values: "Timestamp" + node: ChunkDataControl/ChunkSelector + - name: chunk_enable_timestamp + type: bool + node: ChunkDataControl/ChunkEnable diff --git a/src/surface/rov_flir/launch/flir_launch.py b/src/surface/rov_flir/launch/flir_launch.py index 825d5172..d0775b06 100644 --- a/src/surface/rov_flir/launch/flir_launch.py +++ b/src/surface/rov_flir/launch/flir_launch.py @@ -1,15 +1,15 @@ +import os + +from ament_index_python.packages import get_package_share_directory from launch.launch_description import LaunchDescription -from launch.substitutions import PathJoinSubstitution from launch_ros.actions import Node from launch_ros.parameter_descriptions import Parameter -from launch_ros.substitutions import FindPackageShare def generate_launch_description() -> LaunchDescription: - parameter_file = PathJoinSubstitution( - [FindPackageShare('spinnaker_camera_driver'), 'config', - 'blackfly_s' + '.yaml']) + parameter_file = os.path.join(get_package_share_directory('rov_flir'), 'config', + 'blackfly_s.yaml') parameters = {'debug': False, 'compute_brightness': False, @@ -23,12 +23,14 @@ def generate_launch_description() -> LaunchDescription: 'device_link_throughput_limit': 380000000, 'gev_scps_packet_size': 9000, # ---- to reduce the sensor width and shift the crop - # 'image_width': 1408, - # 'image_height': 1080, + # 'image_width': 1280, + # 'image_height': 720, # 'offset_x': 16, # 'offset_y': 0, + 'binning_x': 2, + 'binning_y': 2, 'frame_rate_auto': 'Off', - # 'frame_rate': 40.0, + 'frame_rate': 60.0, 'frame_rate_enable': True, 'buffer_queue_size': 1, 'trigger_mode': 'Off', @@ -46,10 +48,10 @@ def generate_launch_description() -> LaunchDescription: front_cam: Node = Node( package='spinnaker_camera_driver', executable='camera_driver_node', + name='front_camera', emulate_tty=True, output='screen', parameters=[Parameter('serial_number', '23473577'), - Parameter('binning', '2'), Parameter('parameter_file', parameter_file), parameters] ) @@ -58,10 +60,10 @@ def generate_launch_description() -> LaunchDescription: bottom_cam: Node = Node( package='spinnaker_camera_driver', executable='camera_driver_node', + name='bottom_camera', emulate_tty=True, output='screen', parameters=[Parameter('serial_number', '23473566'), - Parameter('binning', '2'), Parameter('parameter_file', parameter_file), parameters] ) diff --git a/src/surface/rov_flir/setup.py b/src/surface/rov_flir/setup.py index 11b36089..1644bad8 100644 --- a/src/surface/rov_flir/setup.py +++ b/src/surface/rov_flir/setup.py @@ -15,7 +15,9 @@ ('share/' + package_name, ['package.xml']), # Include all launch files. (os.path.join('share', package_name, 'launch'), - glob('launch/*launch.[pxy][yma]*')) + glob('launch/*launch.[pxy][yma]*')), + (os.path.join('share', package_name, 'config'), + glob('config/*')) ], install_requires=['setuptools'], zip_safe=True, From a8d4ae3620ce2a8402589d05f7b17b8929b09136 Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Thu, 7 Dec 2023 17:20:08 -0500 Subject: [PATCH 15/25] fix warnign --- src/surface/rov_flir/launch/flir_launch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/surface/rov_flir/launch/flir_launch.py b/src/surface/rov_flir/launch/flir_launch.py index d0775b06..18d09bfd 100644 --- a/src/surface/rov_flir/launch/flir_launch.py +++ b/src/surface/rov_flir/launch/flir_launch.py @@ -20,7 +20,7 @@ def generate_launch_description() -> LaunchDescription: # 'pixel_format': 'BayerRG8', 'exposure_auto': 'Continuous', # These are useful for GigE cameras - 'device_link_throughput_limit': 380000000, + 'device_link_throughput_limit': 125000000, 'gev_scps_packet_size': 9000, # ---- to reduce the sensor width and shift the crop # 'image_width': 1280, From 7ab3a0cdf0cd246f4d2c5d53da93845c697e25ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Dec 2023 07:04:36 +0000 Subject: [PATCH 16/25] Bump src/surface/ros2_video_streamer from `bf082b0` to `e1a8d33` Bumps [src/surface/ros2_video_streamer](https://github.com/cwruRobotics/ros2_video_streamer) from `bf082b0` to `e1a8d33`. - [Commits](https://github.com/cwruRobotics/ros2_video_streamer/compare/bf082b0929ed12949558ede6b6a1b82f82a939a8...e1a8d332467ed3109117a19db74c2385b59f116a) --- updated-dependencies: - dependency-name: src/surface/ros2_video_streamer dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- src/surface/ros2_video_streamer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/surface/ros2_video_streamer b/src/surface/ros2_video_streamer index bf082b09..e1a8d332 160000 --- a/src/surface/ros2_video_streamer +++ b/src/surface/ros2_video_streamer @@ -1 +1 @@ -Subproject commit bf082b0929ed12949558ede6b6a1b82f82a939a8 +Subproject commit e1a8d332467ed3109117a19db74c2385b59f116a From da08122f1d426329f39ef1b5c04ecf68e942d45e Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Fri, 8 Dec 2023 16:59:10 -0500 Subject: [PATCH 17/25] composable --- .../rov_flir/launch/flir_composable_launch.py | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/surface/rov_flir/launch/flir_composable_launch.py diff --git a/src/surface/rov_flir/launch/flir_composable_launch.py b/src/surface/rov_flir/launch/flir_composable_launch.py new file mode 100644 index 00000000..e56cd5d5 --- /dev/null +++ b/src/surface/rov_flir/launch/flir_composable_launch.py @@ -0,0 +1,115 @@ +import os + +from ament_index_python.packages import get_package_share_directory +from launch.actions import OpaqueFunction +from launch.launch_description import LaunchDescription +from launch_ros.actions import ComposableNodeContainer +from launch_ros.descriptions import ComposableNode +from launch_ros.parameter_descriptions import Parameter +from launch.launch_context import LaunchContext + +parameters = {'debug': False, + 'compute_brightness': False, + 'adjust_timestamp': True, + 'dump_node_map': False, + # set parameters defined in blackfly_s.yaml + 'gain_auto': 'Continuous', + # 'pixel_format': 'BayerRG8', + 'exposure_auto': 'Continuous', + # These are useful for GigE cameras + 'device_link_throughput_limit': 125000000, + 'gev_scps_packet_size': 9000, + # ---- to reduce the sensor width and shift the crop + # 'image_width': 1280, + # 'image_height': 720, + # 'offset_x': 16, + # 'offset_y': 0, + 'binning_x': 2, + 'binning_y': 2, + 'frame_rate_auto': 'Off', + 'frame_rate': 60.0, + 'frame_rate_enable': True, + 'buffer_queue_size': 1, + 'trigger_mode': 'Off', + 'chunk_mode_active': True, + 'chunk_selector_frame_id': 'FrameID', + 'chunk_enable_frame_id': True, + 'chunk_selector_exposure_time': 'ExposureTime', + 'chunk_enable_exposure_time': True, + 'chunk_selector_gain': 'Gain', + 'chunk_enable_gain': True, + 'chunk_selector_timestamp': 'Timestamp', + 'chunk_enable_timestamp': True} + + +parameter_file = os.path.join(get_package_share_directory('rov_flir'), 'config', 'blackfly_s.yaml') + + +def make_camera_node(name: str, serial: str) -> ComposableNode: + """ + Generate Camera Node. + + Parameters + ---------- + name : str + Name of the camera. + serial : str + Serial number of the camera. + + Returns + ------- + ComposableNode + The composable camera node. + """ + + return ComposableNode( + package='spinnaker_camera_driver', + plugin='spinnaker_camera_driver::CameraDriver', + name=name, + extra_arguments=[{'use_intra_process_comms': True}], + # parameters=[Parameter('serial_number', serial), + # Parameter('parameter_file', parameter_file), + # parameters] + parameters=[{'serial_number': serial}, + {'parameter_file': parameter_file}, + parameters] + ) + + +def launch_setup(_: LaunchContext) -> list[ComposableNodeContainer]: + """ + Launch setup for rov flir launch. + Returns + ------- + list[ComposableNodeContainer] + List of composed nodes. + """ + + container = ComposableNodeContainer( + name='flir_cameras', + namespace='', + package='rclcpp_components', + executable='component_container', + composable_node_descriptions=[ + make_camera_node('front_camera', '23473577'), + make_camera_node('bottom_camera', '23473566') + ], + output='screen', + emulate_tty=True + ) + + return [container] + + +def generate_launch_description() -> LaunchDescription: + """ + Generates LaunchDescription. + + Returns + ------- + LaunchDescription + Flir launch Description. + """ + return LaunchDescription([ + OpaqueFunction(function=launch_setup) + ]) From cee8ca8da70b90ab1ceedfedb191ad8ef9e25ade Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Fri, 8 Dec 2023 17:22:03 -0500 Subject: [PATCH 18/25] delete composable --- .../rov_flir/launch/flir_composable_launch.py | 115 ------------------ 1 file changed, 115 deletions(-) delete mode 100644 src/surface/rov_flir/launch/flir_composable_launch.py diff --git a/src/surface/rov_flir/launch/flir_composable_launch.py b/src/surface/rov_flir/launch/flir_composable_launch.py deleted file mode 100644 index e56cd5d5..00000000 --- a/src/surface/rov_flir/launch/flir_composable_launch.py +++ /dev/null @@ -1,115 +0,0 @@ -import os - -from ament_index_python.packages import get_package_share_directory -from launch.actions import OpaqueFunction -from launch.launch_description import LaunchDescription -from launch_ros.actions import ComposableNodeContainer -from launch_ros.descriptions import ComposableNode -from launch_ros.parameter_descriptions import Parameter -from launch.launch_context import LaunchContext - -parameters = {'debug': False, - 'compute_brightness': False, - 'adjust_timestamp': True, - 'dump_node_map': False, - # set parameters defined in blackfly_s.yaml - 'gain_auto': 'Continuous', - # 'pixel_format': 'BayerRG8', - 'exposure_auto': 'Continuous', - # These are useful for GigE cameras - 'device_link_throughput_limit': 125000000, - 'gev_scps_packet_size': 9000, - # ---- to reduce the sensor width and shift the crop - # 'image_width': 1280, - # 'image_height': 720, - # 'offset_x': 16, - # 'offset_y': 0, - 'binning_x': 2, - 'binning_y': 2, - 'frame_rate_auto': 'Off', - 'frame_rate': 60.0, - 'frame_rate_enable': True, - 'buffer_queue_size': 1, - 'trigger_mode': 'Off', - 'chunk_mode_active': True, - 'chunk_selector_frame_id': 'FrameID', - 'chunk_enable_frame_id': True, - 'chunk_selector_exposure_time': 'ExposureTime', - 'chunk_enable_exposure_time': True, - 'chunk_selector_gain': 'Gain', - 'chunk_enable_gain': True, - 'chunk_selector_timestamp': 'Timestamp', - 'chunk_enable_timestamp': True} - - -parameter_file = os.path.join(get_package_share_directory('rov_flir'), 'config', 'blackfly_s.yaml') - - -def make_camera_node(name: str, serial: str) -> ComposableNode: - """ - Generate Camera Node. - - Parameters - ---------- - name : str - Name of the camera. - serial : str - Serial number of the camera. - - Returns - ------- - ComposableNode - The composable camera node. - """ - - return ComposableNode( - package='spinnaker_camera_driver', - plugin='spinnaker_camera_driver::CameraDriver', - name=name, - extra_arguments=[{'use_intra_process_comms': True}], - # parameters=[Parameter('serial_number', serial), - # Parameter('parameter_file', parameter_file), - # parameters] - parameters=[{'serial_number': serial}, - {'parameter_file': parameter_file}, - parameters] - ) - - -def launch_setup(_: LaunchContext) -> list[ComposableNodeContainer]: - """ - Launch setup for rov flir launch. - Returns - ------- - list[ComposableNodeContainer] - List of composed nodes. - """ - - container = ComposableNodeContainer( - name='flir_cameras', - namespace='', - package='rclcpp_components', - executable='component_container', - composable_node_descriptions=[ - make_camera_node('front_camera', '23473577'), - make_camera_node('bottom_camera', '23473566') - ], - output='screen', - emulate_tty=True - ) - - return [container] - - -def generate_launch_description() -> LaunchDescription: - """ - Generates LaunchDescription. - - Returns - ------- - LaunchDescription - Flir launch Description. - """ - return LaunchDescription([ - OpaqueFunction(function=launch_setup) - ]) From aa64abf35a85043937b731d3e95a76bf1ebdcad9 Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Fri, 8 Dec 2023 17:57:32 -0500 Subject: [PATCH 19/25] Update documentaiton --- src/surface/ps5_controller/README.md | 2 +- src/surface/rov_flir/README.md | 56 +++++++++++++++++++++++----- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/src/surface/ps5_controller/README.md b/src/surface/ps5_controller/README.md index 6ad63bc1..689d96bd 100644 --- a/src/surface/ps5_controller/README.md +++ b/src/surface/ps5_controller/README.md @@ -20,7 +20,7 @@ ros2 launch ps5-controller controller_launch.py * **`/joy`** ([sensor_msgs/Joy]) - Outdated ROV movement instructions + Information about the controller input. ## Subscribed Topics diff --git a/src/surface/rov_flir/README.md b/src/surface/rov_flir/README.md index a248e598..c005b4b6 100644 --- a/src/surface/rov_flir/README.md +++ b/src/surface/rov_flir/README.md @@ -1,32 +1,68 @@ # rov_flir - - ## Overview -This is a boilerplate package which launches the joy_node from the joy package. +This is a boilerplate package which launches the camera_driver_node from the flir_launch package. + +## Installation + +Run the install file from spinnaker_camera_driver + +```bash +ros2 run spinnaker_camera_driver linux_setup_flir +``` ## Usage Run the main node with ```bash -ros2 launch ps5-controller controller_launch.py +ros2 launch rov_flir flir_launch.py ``` +## Settings + +The settings are dynamically generated by nodelets from the spinnaker API. This means to modify the settings from ROS we need to add a mapping between them in the config directory. Then we can add the parameter into the parameter list in the flir_launch.py file. + ## Launch files -* **controller_launch.py:** Launches the joy_node from the joy package to read PS5 controller input. +* **flir_launch.py:** Launches the camera_driver_node for the two flir cameras. ## Published Topics -* **`/joy`** ([sensor_msgs/Joy]) +* **`/front_camera/image_raw`** ([sensor_msgs/msg/Image]) + + Image feed for front camera. + +* **`/front_camera/meta`** ([flir_camera_msgs/msg/ImageMetaData]) - Outdated ROV movement instructions + Front camera image meta data. + +* **`/front_camera/camera_info`** ([sensor_msgs/msg/CameraInfo]) + + Front camera info. + +* **`/bottom_camera/image_raw`** ([sensor_msgs/msg/Image]) + + Image feed for bottom camera. + +* **`/bottom_camera/meta`** ([flir_camera_msgs/msg/ImageMetaData]) + + Bottom camera image meta data. + +* **`/bottom_camera/camera_info`** ([sensor_msgs/msg/CameraInfo]) + + Bottom camera info. ## Subscribed Topics -* **`/joy/set_feedback`** ([sensor_msgs/JoyFeedback]) +* **`/front_camera/control`** ([flir_camera_msgs/msg/CameraControl]) + Controls exposure and gain. + +* **`/bottom_camera/control`** ([flir_camera_msgs/msg/CameraControl]) + Controls exposure and gain. -[sensor_msgs/Joy]: https://docs.ros.org/en/noetic/api/sensor_msgs/html/msg/Joy.html -[sensor_msgs/JoyFeedback]: https://docs.ros.org/en/noetic/api/sensor_msgs/html/msg/JoyFeedback.html \ No newline at end of file +[sensor_msgs/msg/Image]: https://docs.ros2.org/latest/api/sensor_msgs/msg/Image.html +[flir_camera_msgs/msg/ImageMetaData]: https://github.com/ros-drivers/flir_camera_driver/blob/humble-devel/flir_camera_msgs/msg/ImageMetaData.msg +[sensor_msgs/msg/CameraInfo]: https://docs.ros2.org/latest/api/sensor_msgs/msg/CameraInfo.html +[flir_camera_msgs/msg/CameraControl]: https://github.com/ros-drivers/flir_camera_driver/blob/humble-devel/flir_camera_msgs/msg/CameraControl.msg \ No newline at end of file From d897f97f53af190613fd7b5c48401340cd0bd976 Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Sat, 9 Dec 2023 13:13:03 -0500 Subject: [PATCH 20/25] mypy updated docs --- src/surface/rov_flir/README.md | 6 +- src/surface/rov_flir/launch/flir_launch.py | 66 +++++++++++----------- src/surface/rov_flir/test/test_mypy.py | 15 +++++ 3 files changed, 52 insertions(+), 35 deletions(-) create mode 100644 src/surface/rov_flir/test/test_mypy.py diff --git a/src/surface/rov_flir/README.md b/src/surface/rov_flir/README.md index c005b4b6..69316653 100644 --- a/src/surface/rov_flir/README.md +++ b/src/surface/rov_flir/README.md @@ -4,9 +4,9 @@ This is a boilerplate package which launches the camera_driver_node from the flir_launch package. -## Installation +## Setup -Run the install file from spinnaker_camera_driver +Run the setup file from spinnaker_camera_driver ```bash ros2 run spinnaker_camera_driver linux_setup_flir @@ -22,7 +22,7 @@ ros2 launch rov_flir flir_launch.py ## Settings -The settings are dynamically generated by nodelets from the spinnaker API. This means to modify the settings from ROS we need to add a mapping between them in the config directory. Then we can add the parameter into the parameter list in the flir_launch.py file. +In the config folder are the nodes froms the spinnaker api, these are different from ROS nodes. They are basically settings of the cameras. The name on top of the name is the name of the ROS parameter that affects it. ## Launch files diff --git a/src/surface/rov_flir/launch/flir_launch.py b/src/surface/rov_flir/launch/flir_launch.py index 18d09bfd..a77a9ce1 100644 --- a/src/surface/rov_flir/launch/flir_launch.py +++ b/src/surface/rov_flir/launch/flir_launch.py @@ -11,38 +11,40 @@ def generate_launch_description() -> LaunchDescription: parameter_file = os.path.join(get_package_share_directory('rov_flir'), 'config', 'blackfly_s.yaml') - parameters = {'debug': False, - 'compute_brightness': False, - 'adjust_timestamp': True, - 'dump_node_map': False, - # set parameters defined in blackfly_s.yaml - 'gain_auto': 'Continuous', - # 'pixel_format': 'BayerRG8', - 'exposure_auto': 'Continuous', - # These are useful for GigE cameras - 'device_link_throughput_limit': 125000000, - 'gev_scps_packet_size': 9000, - # ---- to reduce the sensor width and shift the crop - # 'image_width': 1280, - # 'image_height': 720, - # 'offset_x': 16, - # 'offset_y': 0, - 'binning_x': 2, - 'binning_y': 2, - 'frame_rate_auto': 'Off', - 'frame_rate': 60.0, - 'frame_rate_enable': True, - 'buffer_queue_size': 1, - 'trigger_mode': 'Off', - 'chunk_mode_active': True, - 'chunk_selector_frame_id': 'FrameID', - 'chunk_enable_frame_id': True, - 'chunk_selector_exposure_time': 'ExposureTime', - 'chunk_enable_exposure_time': True, - 'chunk_selector_gain': 'Gain', - 'chunk_enable_gain': True, - 'chunk_selector_timestamp': 'Timestamp', - 'chunk_enable_timestamp': True} + parameters = { + 'debug': False, + 'compute_brightness': False, + 'adjust_timestamp': True, + 'dump_node_map': False, + # set parameters defined in blackfly_s.yaml + 'gain_auto': 'Continuous', + # 'pixel_format': 'BayerRG8', + 'exposure_auto': 'Continuous', + # These are useful for GigE cameras + 'device_link_throughput_limit': 125000000, + 'gev_scps_packet_size': 9000, + # ---- to reduce the sensor width and shift the crop + # 'image_width': 1280, + # 'image_height': 720, + # 'offset_x': 16, + # 'offset_y': 0, + 'binning_x': 2, + 'binning_y': 2, + 'frame_rate_auto': 'Off', + 'frame_rate': 60.0, + 'frame_rate_enable': True, + 'buffer_queue_size': 1, + 'trigger_mode': 'Off', + 'chunk_mode_active': True, + 'chunk_selector_frame_id': 'FrameID', + 'chunk_enable_frame_id': True, + 'chunk_selector_exposure_time': 'ExposureTime', + 'chunk_enable_exposure_time': True, + 'chunk_selector_gain': 'Gain', + 'chunk_enable_gain': True, + 'chunk_selector_timestamp': 'Timestamp', + 'chunk_enable_timestamp': True + } # launches node to run front flir camera front_cam: Node = Node( diff --git a/src/surface/rov_flir/test/test_mypy.py b/src/surface/rov_flir/test/test_mypy.py new file mode 100644 index 00000000..79fc51ad --- /dev/null +++ b/src/surface/rov_flir/test/test_mypy.py @@ -0,0 +1,15 @@ +"""Test mypy on this module.""" +import os + +import pytest +from ament_mypy.main import main + + +@pytest.mark.mypy +@pytest.mark.linter +def test_mypy() -> None: + """Tests mypy on this module.""" + file_path = __file__.replace(f'{__name__}.py', '') + config_file = os.path.join(file_path, '..', '..', '..', '..', 'mypy.ini') + error_code = main(argv=['--config', config_file]) + assert error_code == 0, 'Found code style errors / warnings' From ac1a2d7ebe111e17891405e756df7c378df05ecf Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Sat, 9 Dec 2023 13:26:14 -0500 Subject: [PATCH 21/25] grammar --- src/surface/rov_flir/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/surface/rov_flir/README.md b/src/surface/rov_flir/README.md index 69316653..9e57b51c 100644 --- a/src/surface/rov_flir/README.md +++ b/src/surface/rov_flir/README.md @@ -22,7 +22,7 @@ ros2 launch rov_flir flir_launch.py ## Settings -In the config folder are the nodes froms the spinnaker api, these are different from ROS nodes. They are basically settings of the cameras. The name on top of the name is the name of the ROS parameter that affects it. +In the config folder are the nodes from the spinnaker api, these are different from ROS nodes. They are basically settings of the cameras. The name on top of the name is the name of the ROS parameter that affects it. ## Launch files From 4cc08729772a1e12e706f9085868cc45215e7191 Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Sat, 9 Dec 2023 13:29:02 -0500 Subject: [PATCH 22/25] Boilerplate --- src/surface/ps5_controller/package.xml | 2 +- src/surface/ps5_controller/setup.py | 2 +- src/surface/rov_flir/package.xml | 2 +- src/surface/rov_flir/setup.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/surface/ps5_controller/package.xml b/src/surface/ps5_controller/package.xml index a638b592..838d8120 100644 --- a/src/surface/ps5_controller/package.xml +++ b/src/surface/ps5_controller/package.xml @@ -3,7 +3,7 @@ ps5_controller 1.0.0 - Biolerplate for calling standard joystick launch file. + Boilerplate for calling standard joystick launch file. Michael Carlstrom Apache License 2.0 diff --git a/src/surface/ps5_controller/setup.py b/src/surface/ps5_controller/setup.py index 1e774264..93730f1d 100644 --- a/src/surface/ps5_controller/setup.py +++ b/src/surface/ps5_controller/setup.py @@ -22,7 +22,7 @@ zip_safe=True, maintainer='Michael Carlstrom', maintainer_email='rmc170@case.edu', - description='Biolerplate for calling standard joystick launch file.', + description='Boilerplate for calling standard joystick launch file.', license='Apache License 2.0', tests_require=['pytest'], entry_points={}, diff --git a/src/surface/rov_flir/package.xml b/src/surface/rov_flir/package.xml index fe01ea42..be941b00 100644 --- a/src/surface/rov_flir/package.xml +++ b/src/surface/rov_flir/package.xml @@ -3,7 +3,7 @@ rov_flir 1.0.0 - Biolerplate for calling flir launch file. + Boilerplate for calling flir launch file. Michael Carlstrom Apache License 2.0 diff --git a/src/surface/rov_flir/setup.py b/src/surface/rov_flir/setup.py index 1644bad8..6717701e 100644 --- a/src/surface/rov_flir/setup.py +++ b/src/surface/rov_flir/setup.py @@ -23,7 +23,7 @@ zip_safe=True, maintainer='Michael Carlstrom', maintainer_email='rmc170@case.edu', - description='Biolerplate for calling standard flir launch file.', + description='Boilerplate for calling standard flir launch file.', license='Apache License 2.0', tests_require=['pytest'], entry_points={}, From 58575f451e7e290a7bd661c97b464a69dff29dff Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Sat, 9 Dec 2023 13:37:34 -0500 Subject: [PATCH 23/25] more word more better --- src/surface/rov_flir/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/surface/rov_flir/README.md b/src/surface/rov_flir/README.md index 9e57b51c..b7156070 100644 --- a/src/surface/rov_flir/README.md +++ b/src/surface/rov_flir/README.md @@ -22,7 +22,7 @@ ros2 launch rov_flir flir_launch.py ## Settings -In the config folder are the nodes from the spinnaker api, these are different from ROS nodes. They are basically settings of the cameras. The name on top of the name is the name of the ROS parameter that affects it. +In the config folder are the nodes from the spinnaker api, these are different from ROS nodes. They are basically settings of the cameras. Each setting in the config file has a name which is the name of the ROS parameter, a type which is the data type of the field, and finally each setting has a node which is the name of the setting in spinnaker. ## Launch files From 8353d38d79b3e5e44780aa7ed5d4aaaf7d98d2a4 Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Sat, 9 Dec 2023 13:38:47 -0500 Subject: [PATCH 24/25] =?UTF-8?q?backticks=20=F0=9F=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/surface/rov_flir/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/surface/rov_flir/README.md b/src/surface/rov_flir/README.md index b7156070..703fa59e 100644 --- a/src/surface/rov_flir/README.md +++ b/src/surface/rov_flir/README.md @@ -22,7 +22,7 @@ ros2 launch rov_flir flir_launch.py ## Settings -In the config folder are the nodes from the spinnaker api, these are different from ROS nodes. They are basically settings of the cameras. Each setting in the config file has a name which is the name of the ROS parameter, a type which is the data type of the field, and finally each setting has a node which is the name of the setting in spinnaker. +In the config folder are the nodes from the spinnaker api, these are different from ROS nodes. They are basically settings of the cameras. Each setting in the config file has a `name` which is the name of the ROS parameter, a `type` which is the data type of the field, and finally each setting has a `node` which is the name of the setting in spinnaker. ## Launch files From 755bc236299aa2202372ca3c18ed5072fabd12c7 Mon Sep 17 00:00:00 2001 From: ROV Laptop Date: Sat, 9 Dec 2023 14:19:28 -0500 Subject: [PATCH 25/25] Add debugging info to readme --- src/surface/ros2_video_streamer | 2 +- src/surface/rov_flir/README.md | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/surface/ros2_video_streamer b/src/surface/ros2_video_streamer index e1a8d332..ec5f178b 160000 --- a/src/surface/ros2_video_streamer +++ b/src/surface/ros2_video_streamer @@ -1 +1 @@ -Subproject commit e1a8d332467ed3109117a19db74c2385b59f116a +Subproject commit ec5f178bcc56df34f83aa157e6f691c2ef45503c diff --git a/src/surface/rov_flir/README.md b/src/surface/rov_flir/README.md index 703fa59e..6a9bba29 100644 --- a/src/surface/rov_flir/README.md +++ b/src/surface/rov_flir/README.md @@ -12,6 +12,12 @@ Run the setup file from spinnaker_camera_driver ros2 run spinnaker_camera_driver linux_setup_flir ``` +## Debugging + +You can install the Spinnaker SDK & Spinview GUI for debugging [here](https://www.flir.com/products/spinnaker-sdk/). + +If you get errors about cameras on the wrong subnet, install this and open Spinview. Write click the entries for each camera and select "Auto Force IPs". + ## Usage Run the main node with