From 66db9822a4351c05c6fdb5b0f0af8e1469ea9ae7 Mon Sep 17 00:00:00 2001 From: Cameron Basara Date: Sun, 9 Aug 2026 01:11:43 -0700 Subject: [PATCH 01/10] cli args for cameras support added --- .../launch/jetson_compressor.launch.py | 57 ++++++++++++------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/src/cameras_cpp/launch/jetson_compressor.launch.py b/src/cameras_cpp/launch/jetson_compressor.launch.py index e01af75c..9dfc4719 100644 --- a/src/cameras_cpp/launch/jetson_compressor.launch.py +++ b/src/cameras_cpp/launch/jetson_compressor.launch.py @@ -2,8 +2,9 @@ import os from ament_index_python.packages import get_package_share_directory from launch import LaunchDescription +from launch.actions import DeclareLaunchArgument, OpaqueFunction from launch_ros.actions import Node -from rclpy.qos import QoSProfile, ReliabilityPolicy, HistoryPolicy +from launch.substitutions import LaunchConfiguration DEFAULT_PARAMS = [ {'image_raw.ffmpeg.encoder': 'hevc_nvmpi'}, @@ -16,8 +17,26 @@ ] -def generate_launch_description(): - nodes = [] +def create_camera_node(camera_name, camera_params_path): + params = DEFAULT_PARAMS.copy() + params.append(camera_params_path) + + return Node( + package='v4l2_camera', + executable='v4l2_camera_node', + name=camera_name, + output='screen', + parameters=params, + remappings=[ + ('/image_raw', f'/{camera_name}/image_raw'), + ('/image_raw/ffmpeg', f'/{camera_name}/image_raw/ffmpeg'), + ], + ) + + +def choose_cameras(context, *args, **kwargs): + camera_args = LaunchConfiguration('cameras').perform(context) + camera_args_list = camera_args.split() cameras_config_path = os.path.join( get_package_share_directory('cameras_cpp'), @@ -25,9 +44,14 @@ def generate_launch_description(): ) with open(cameras_config_path, 'r') as f: cameras_json = json.load(f) + all_cameras = cameras_json.get('cameras', []) - cameras = cameras_json.get('cameras', []) + if len(camera_args_list) == 0: + cameras = all_cameras + else: + cameras = [c for c in all_cameras if c['name'] in camera_args_list] + nodes = [] for camera in cameras: camera_name = camera['name'] camera_params_file = camera['params_file'] @@ -35,24 +59,13 @@ def generate_launch_description(): get_package_share_directory('cameras_cpp'), 'config', camera_params_file ) - camera_node = create_camera_node(camera_name, camera_params_path) - nodes.append(camera_node) + nodes.append(create_camera_node(camera_name, camera_params_path)) - return LaunchDescription(nodes) + return nodes -def create_camera_node(camera_name, camera_params): - - params = DEFAULT_PARAMS.copy() - params.append(camera_params) - return Node( - package='v4l2_camera', - executable='v4l2_camera_node', - name=camera_name, - output='screen', - parameters=params, - remappings=[ - ('/image_raw', f'/{camera_name}/image_raw'), - ('/image_raw/ffmpeg', f'/{camera_name}/image_raw/ffmpeg'), - ], - ) \ No newline at end of file +def generate_launch_description(): + return LaunchDescription([ + DeclareLaunchArgument('cameras', default_value=''), + OpaqueFunction(function=choose_cameras), + ]) From 1bd84bab50cb0eae2852379ed1779ef08cae3d66 Mon Sep 17 00:00:00 2001 From: Cameron Basara Date: Sun, 9 Aug 2026 02:01:36 -0700 Subject: [PATCH 02/10] Added heart to track pid of compression nodes --- src/rover_manager/config/heart.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/rover_manager/config/heart.yaml b/src/rover_manager/config/heart.yaml index 861cb397..ce0cdb98 100644 --- a/src/rover_manager/config/heart.yaml +++ b/src/rover_manager/config/heart.yaml @@ -81,6 +81,10 @@ ros__parameters: subsystems: camera: "ros2 launch cameras_cpp jetson_compressor.launch.py" + realsense435i: 'ros2 launch cameras_cpp jetson_compressor.launch.py "cameras:=realsense435i"' + logitech: 'ros2 launch cameras_cpp jetson_compressor.launch.py "cameras:=logitech"' + suyin: 'ros2 launch cameras_cpp jetson_compressor.launch.py "cameras:=suyin"' + science_fisheye: 'ros2 launch cameras_cpp jetson_compressor.launch.py "cameras:=science_fisheye"' request_topic: "/heart/request" heart_feedback_topic: "/heart/running_subsystems" heartbeat_rate: 1.0 #how often the heart beats, every beat sends a feedback msg with what subsystems are online or offline From f14c0db092054ddcbca3b975460736db69ef85dc Mon Sep 17 00:00:00 2001 From: Cameron Basara Date: Sun, 9 Aug 2026 02:07:05 -0700 Subject: [PATCH 03/10] Selection of decompressors, same pattern as compressors --- .../launch/jetson_decompressor.launch.py | 62 ++++++++++++------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/src/cameras_cpp/launch/jetson_decompressor.launch.py b/src/cameras_cpp/launch/jetson_decompressor.launch.py index 0f90553a..147799f4 100644 --- a/src/cameras_cpp/launch/jetson_decompressor.launch.py +++ b/src/cameras_cpp/launch/jetson_decompressor.launch.py @@ -2,38 +2,56 @@ import json from ament_index_python.packages import get_package_share_directory from launch import LaunchDescription +from launch.actions import DeclareLaunchArgument, OpaqueFunction from launch_ros.actions import Node +from launch.substitutions import LaunchConfiguration -def generate_launch_description(): - broadcastor_nodes = [] + +def create_broadcaster_node(camera_name): + return Node( + package='image_transport', + executable='republish', + name=f'{camera_name}_decoder_node', + remappings=[ + ('in/ffmpeg', f'/{camera_name}/image_raw/ffmpeg'), + ('out', f'/{camera_name}/image_raw_decoded'), + ], + parameters=[ + {'in.ffmpeg.decoders.hevc': 'hevc'}, + {'in.ffmpeg.decoders.h264': 'h264'}, + ], + output='screen', + arguments=['ffmpeg', 'raw'] + ) + + +def choose_cameras(context, *args, **kwargs): + camera_args = LaunchConfiguration('cameras').perform(context) + camera_args_list = camera_args.split() cameras_config_path = os.path.join( get_package_share_directory('cameras_cpp'), 'config', 'cameras.json' ) - with open(cameras_config_path, 'r') as f: cameras_json = json.load(f) + all_cameras = cameras_json.get('cameras', []) - cameras = cameras_json.get('cameras', []) + if len(camera_args_list) == 0: + cameras = all_cameras + else: + cameras = [c for c in all_cameras if c['name'] in camera_args_list] + nodes = [] for camera in cameras: camera_name = camera['name'] - broadcastor_node = Node( - package='image_transport', - executable='republish', - name=f'{camera_name}_decoder_node', - remappings=[ - ('in/ffmpeg', f'/{camera_name}/image_raw/ffmpeg'), - ('out', f'/{camera_name}/image_raw_decoded'), - ], - parameters=[ - {'in.ffmpeg.decoders.hevc': 'hevc'}, - {'in.ffmpeg.decoders.h264': 'h264'}, - ], - output='screen', - arguments=['ffmpeg', 'raw'] - ) - broadcastor_nodes.append(broadcastor_node) - - return LaunchDescription(broadcastor_nodes) \ No newline at end of file + nodes.append(create_broadcaster_node(camera_name)) + + return nodes + + +def generate_launch_description(): + return LaunchDescription([ + DeclareLaunchArgument('cameras', default_value=''), + OpaqueFunction(function=choose_cameras), + ]) \ No newline at end of file From 2f5ab14efaf78f390c46375744b1ec648a51d841 Mon Sep 17 00:00:00 2001 From: Cameron Basara Date: Sun, 9 Aug 2026 02:45:57 -0700 Subject: [PATCH 04/10] added heart for decompress, need to talk to Ben if correct pattern --- src/rover_manager/config/heart.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/rover_manager/config/heart.yaml b/src/rover_manager/config/heart.yaml index ce0cdb98..cf0ef6e2 100644 --- a/src/rover_manager/config/heart.yaml +++ b/src/rover_manager/config/heart.yaml @@ -52,6 +52,11 @@ subsystems: # drive_control: "ros2 launch drive_control drive_control_base_bringup.launch.py" drive_control: "ros2 run joy joy_node" + camera: "ros2 launch cameras_cpp jetson_decompressor.launch.py" + realsense435i: 'ros2 launch cameras_cpp jetson_decompressor.launch.py "cameras:=realsense435i"' + logitech: 'ros2 launch cameras_cpp jetson_decompressor.launch.py "cameras:=logitech"' + suyin: 'ros2 launch cameras_cpp jetson_decompressor.launch.py "cameras:=suyin"' + science_fisheye: 'ros2 launch cameras_cpp jetson_decompressor.launch.py "cameras:=science_fisheye"' request_topic: "/heart/request" heart_feedback_topic: "/heart/running_subsystems" heartbeat_rate: 1.0 #how often the heart beats, every beat sends a feedback msg with what subsystems are online or offline From 593b35f5f646e2c99b964b24d004a3ebc3bc0c31 Mon Sep 17 00:00:00 2001 From: Cameron Basara Date: Sun, 9 Aug 2026 03:23:09 -0700 Subject: [PATCH 05/10] more --- src/rover_manager/config/heart.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/rover_manager/config/heart.yaml b/src/rover_manager/config/heart.yaml index cf0ef6e2..6b25dbe5 100644 --- a/src/rover_manager/config/heart.yaml +++ b/src/rover_manager/config/heart.yaml @@ -53,6 +53,7 @@ # drive_control: "ros2 launch drive_control drive_control_base_bringup.launch.py" drive_control: "ros2 run joy joy_node" camera: "ros2 launch cameras_cpp jetson_decompressor.launch.py" + realsense415: 'ros2 launch cameras_cpp jetson_decompressor.launch.py "cameras:=realsense415"' realsense435i: 'ros2 launch cameras_cpp jetson_decompressor.launch.py "cameras:=realsense435i"' logitech: 'ros2 launch cameras_cpp jetson_decompressor.launch.py "cameras:=logitech"' suyin: 'ros2 launch cameras_cpp jetson_decompressor.launch.py "cameras:=suyin"' @@ -86,6 +87,7 @@ ros__parameters: subsystems: camera: "ros2 launch cameras_cpp jetson_compressor.launch.py" + realsense415: 'ros2 launch cameras_cpp jetson_compressor.launch.py "cameras:=realsense415"' realsense435i: 'ros2 launch cameras_cpp jetson_compressor.launch.py "cameras:=realsense435i"' logitech: 'ros2 launch cameras_cpp jetson_compressor.launch.py "cameras:=logitech"' suyin: 'ros2 launch cameras_cpp jetson_compressor.launch.py "cameras:=suyin"' From 14884527148318aa4460e9178ded010a89ccd486 Mon Sep 17 00:00:00 2001 From: BenUBC Date: Sun, 9 Aug 2026 13:42:33 -0700 Subject: [PATCH 06/10] cam script --- setup_scripts/add_camera.py | 90 +++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 setup_scripts/add_camera.py diff --git a/setup_scripts/add_camera.py b/setup_scripts/add_camera.py new file mode 100644 index 00000000..0cac9fb2 --- /dev/null +++ b/setup_scripts/add_camera.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +"""Add a new camera to cameras_cpp/config: registers it in cameras.json and +creates a params yaml file with its /dev/v4l/by-id device id. + +Usage: + python3 add_camera.py + + can be given as: + - a full path, e.g. /dev/v4l/by-id/usb-046d_081d_374D8990-video-index0 + - just the by-id fragment, e.g. usb-046d_081d_374D8990-video-index0 +The device id can be found by running: ls -l /dev/v4l/by-id/ +""" +import argparse +import json +from pathlib import Path + +CONFIG_DIR = Path(__file__).resolve().parent.parent / "src" / "cameras_cpp" / "config" +CAMERAS_JSON = CONFIG_DIR / "cameras.json" + +YAML_TEMPLATE = '''/**: + ros__parameters: + video_device: "{video_device}" + #image_width: 640 + #image_height: 480 + #framerate: 30.0 + #pixel_format: "yuyv" + #image_raw: + #ffmpeg: + #encoder: "h264_nvmpi" + #bit_rate: 2000000 + #gop_size: 20 # Set the Group of Pictures (GOP) size for the encoder. A smaller GOP size can improve error resilience but may increase file size, while a larger GOP size can reduce file size but may be less resilient to errors. + #qmax: 20 # Set the maximum quantization parameter (Q) for the encoder. Lower values result in higher quality but larger file sizes, while higher values result in lower quality but smaller file sizes. + #encoder_av_options: 'num_capture_buffers:4;profile:main;preset:ultrafast' +''' + + +def resolve_video_device(camera_id: str) -> str: + if camera_id.startswith("/dev/"): + return camera_id + return f"/dev/v4l/by-id/{camera_id}" + + +def load_cameras_json() -> dict: + if CAMERAS_JSON.exists(): + with open(CAMERAS_JSON, "r") as f: + return json.load(f) + return {"cameras": []} + + +def add_camera(name: str, camera_id: str) -> None: + yaml_filename = f"{name}.yaml" + yaml_path = CONFIG_DIR / yaml_filename + + data = load_cameras_json() + cameras = data.setdefault("cameras", []) + existing = next((c for c in cameras if c.get("name") == name), None) + if existing is not None: + existing["params_file"] = yaml_filename + else: + cameras.append({"name": name, "params_file": yaml_filename}) + + video_device = resolve_video_device(camera_id) + + CONFIG_DIR.mkdir(parents=True, exist_ok=True) + with open(yaml_path, "w") as f: + f.write(YAML_TEMPLATE.format(video_device=video_device)) + + with open(CAMERAS_JSON, "w") as f: + json.dump(data, f, indent=4) + f.write("\n") + + print(f"Added camera '{name}' -> {video_device}") + print(f" Updated {CAMERAS_JSON}") + print(f" Wrote {yaml_path}") + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("name", help="Camera name, e.g. realsense415") + parser.add_argument( + "id", + help="by-id device fragment or full path, e.g. usb-046d_081d_374D8990-video-index0", + ) + args = parser.parse_args() + + add_camera(args.name, args.id) + + +if __name__ == "__main__": + main() From 68ec65065e78afad6c4e868d51c2552274ce0585 Mon Sep 17 00:00:00 2001 From: BenUBC Date: Sun, 9 Aug 2026 14:11:13 -0700 Subject: [PATCH 07/10] auto discover --- .../launch/jetson_decompressor.launch.py | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/src/cameras_cpp/launch/jetson_decompressor.launch.py b/src/cameras_cpp/launch/jetson_decompressor.launch.py index 147799f4..9b8f691a 100644 --- a/src/cameras_cpp/launch/jetson_decompressor.launch.py +++ b/src/cameras_cpp/launch/jetson_decompressor.launch.py @@ -1,11 +1,13 @@ -import os -import json -from ament_index_python.packages import get_package_share_directory +import time +import rclpy from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, OpaqueFunction from launch_ros.actions import Node from launch.substitutions import LaunchConfiguration +# Suffix published by jetson_compressor.launch.py for every camera, e.g. /realsense415/image_raw/ffmpeg +FFMPEG_TOPIC_SUFFIX = '/image_raw/ffmpeg' + def create_broadcaster_node(camera_name): return Node( @@ -25,29 +27,35 @@ def create_broadcaster_node(camera_name): ) -def choose_cameras(context, *args, **kwargs): - camera_args = LaunchConfiguration('cameras').perform(context) - camera_args_list = camera_args.split() +def discover_camera_names(timeout_sec=5.0): + """Poll the ROS graph and return the names of cameras currently publishing a compressed feed.""" + rclpy.init(args=None) + node = rclpy.create_node('jetson_decompressor_topic_discovery') + try: + camera_names = set() + deadline = time.time() + timeout_sec + while time.time() < deadline and not camera_names: + for topic_name, _ in node.get_topic_names_and_types(): + if topic_name.endswith(FFMPEG_TOPIC_SUFFIX): + camera_names.add(topic_name[:-len(FFMPEG_TOPIC_SUFFIX)].lstrip('/')) + if not camera_names: + rclpy.spin_once(node, timeout_sec=0.5) + return sorted(camera_names) + finally: + node.destroy_node() + rclpy.shutdown() - cameras_config_path = os.path.join( - get_package_share_directory('cameras_cpp'), - 'config', 'cameras.json' - ) - with open(cameras_config_path, 'r') as f: - cameras_json = json.load(f) - all_cameras = cameras_json.get('cameras', []) - if len(camera_args_list) == 0: - cameras = all_cameras - else: - cameras = [c for c in all_cameras if c['name'] in camera_args_list] +def choose_cameras(context, *args, **kwargs): + camera_args_list = LaunchConfiguration('cameras').perform(context).split() + discovered_cameras = discover_camera_names() - nodes = [] - for camera in cameras: - camera_name = camera['name'] - nodes.append(create_broadcaster_node(camera_name)) + if camera_args_list: + cameras = [name for name in discovered_cameras if name in camera_args_list] + else: + cameras = discovered_cameras - return nodes + return [create_broadcaster_node(camera_name) for camera_name in cameras] def generate_launch_description(): From 5e416e75d2daa151e09bd1a619792d054686fce9 Mon Sep 17 00:00:00 2001 From: BenUBC Date: Sun, 9 Aug 2026 14:43:18 -0700 Subject: [PATCH 08/10] Revert "auto discover" This reverts commit 68ec65065e78afad6c4e868d51c2552274ce0585. --- .../launch/jetson_decompressor.launch.py | 52 ++++++++----------- 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/src/cameras_cpp/launch/jetson_decompressor.launch.py b/src/cameras_cpp/launch/jetson_decompressor.launch.py index 9b8f691a..147799f4 100644 --- a/src/cameras_cpp/launch/jetson_decompressor.launch.py +++ b/src/cameras_cpp/launch/jetson_decompressor.launch.py @@ -1,13 +1,11 @@ -import time -import rclpy +import os +import json +from ament_index_python.packages import get_package_share_directory from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, OpaqueFunction from launch_ros.actions import Node from launch.substitutions import LaunchConfiguration -# Suffix published by jetson_compressor.launch.py for every camera, e.g. /realsense415/image_raw/ffmpeg -FFMPEG_TOPIC_SUFFIX = '/image_raw/ffmpeg' - def create_broadcaster_node(camera_name): return Node( @@ -27,35 +25,29 @@ def create_broadcaster_node(camera_name): ) -def discover_camera_names(timeout_sec=5.0): - """Poll the ROS graph and return the names of cameras currently publishing a compressed feed.""" - rclpy.init(args=None) - node = rclpy.create_node('jetson_decompressor_topic_discovery') - try: - camera_names = set() - deadline = time.time() + timeout_sec - while time.time() < deadline and not camera_names: - for topic_name, _ in node.get_topic_names_and_types(): - if topic_name.endswith(FFMPEG_TOPIC_SUFFIX): - camera_names.add(topic_name[:-len(FFMPEG_TOPIC_SUFFIX)].lstrip('/')) - if not camera_names: - rclpy.spin_once(node, timeout_sec=0.5) - return sorted(camera_names) - finally: - node.destroy_node() - rclpy.shutdown() - - def choose_cameras(context, *args, **kwargs): - camera_args_list = LaunchConfiguration('cameras').perform(context).split() - discovered_cameras = discover_camera_names() + camera_args = LaunchConfiguration('cameras').perform(context) + camera_args_list = camera_args.split() - if camera_args_list: - cameras = [name for name in discovered_cameras if name in camera_args_list] + cameras_config_path = os.path.join( + get_package_share_directory('cameras_cpp'), + 'config', 'cameras.json' + ) + with open(cameras_config_path, 'r') as f: + cameras_json = json.load(f) + all_cameras = cameras_json.get('cameras', []) + + if len(camera_args_list) == 0: + cameras = all_cameras else: - cameras = discovered_cameras + cameras = [c for c in all_cameras if c['name'] in camera_args_list] + + nodes = [] + for camera in cameras: + camera_name = camera['name'] + nodes.append(create_broadcaster_node(camera_name)) - return [create_broadcaster_node(camera_name) for camera_name in cameras] + return nodes def generate_launch_description(): From 7720f9992f7e4b4bf2b673afffc66974754e88b0 Mon Sep 17 00:00:00 2001 From: BenUBC Date: Sun, 9 Aug 2026 14:52:34 -0700 Subject: [PATCH 09/10] config --- .../{realsense415.yaml => arm_top.yaml} | 0 src/cameras_cpp/config/cameras.json | 24 +++++-------------- .../config/{realsense435i.yaml => front.yaml} | 0 src/cameras_cpp/config/logitech.yaml | 14 ----------- .../config/{suyin.yaml => pole.yaml} | 0 src/cameras_cpp/config/science_fisheye.yaml | 14 ----------- src/cameras_cpp/config/science_webcam.yaml | 14 ----------- 7 files changed, 6 insertions(+), 60 deletions(-) rename src/cameras_cpp/config/{realsense415.yaml => arm_top.yaml} (100%) rename src/cameras_cpp/config/{realsense435i.yaml => front.yaml} (100%) delete mode 100644 src/cameras_cpp/config/logitech.yaml rename src/cameras_cpp/config/{suyin.yaml => pole.yaml} (100%) delete mode 100644 src/cameras_cpp/config/science_fisheye.yaml delete mode 100644 src/cameras_cpp/config/science_webcam.yaml diff --git a/src/cameras_cpp/config/realsense415.yaml b/src/cameras_cpp/config/arm_top.yaml similarity index 100% rename from src/cameras_cpp/config/realsense415.yaml rename to src/cameras_cpp/config/arm_top.yaml diff --git a/src/cameras_cpp/config/cameras.json b/src/cameras_cpp/config/cameras.json index f119fa13..e4789489 100644 --- a/src/cameras_cpp/config/cameras.json +++ b/src/cameras_cpp/config/cameras.json @@ -1,28 +1,16 @@ { "cameras": [ { - "name": "realsense415", - "params_file": "realsense415.yaml" + "name": "arm_top", + "params_file": "arm_top.yaml" }, { - "name": "realsense435i", - "params_file": "realsense435i.yaml" + "name": "front", + "params_file": "front.yaml" }, { - "name": "logitech", - "params_file": "logitech.yaml" - }, - { - "name": "suyin", - "params_file": "suyin.yaml" - }, - { - "name": "science_webcam", - "params_file": "science_webcam.yaml" - }, - { - "name": "science_fisheye", - "params_file": "science_fisheye.yaml" + "name": "pole", + "params_file": "pole.yaml" } ] } \ No newline at end of file diff --git a/src/cameras_cpp/config/realsense435i.yaml b/src/cameras_cpp/config/front.yaml similarity index 100% rename from src/cameras_cpp/config/realsense435i.yaml rename to src/cameras_cpp/config/front.yaml diff --git a/src/cameras_cpp/config/logitech.yaml b/src/cameras_cpp/config/logitech.yaml deleted file mode 100644 index 16ab3f6e..00000000 --- a/src/cameras_cpp/config/logitech.yaml +++ /dev/null @@ -1,14 +0,0 @@ -/**: - ros__parameters: - video_device: "/dev/v4l/by-id/usb-046d_081d_374D8990-video-index0" - #image_width: 640 - #image_height: 480 - #framerate: 30.0 - #pixel_format: "yuyv" - #image_raw: - #ffmpeg: - #encoder: "h264_nvmpi" - #bit_rate: 2000000 - #gop_size: 20 # Set the Group of Pictures (GOP) size for the encoder. A smaller GOP size can improve error resilience but may increase file size, while a larger GOP size can reduce file size but may be less resilient to errors. - #qmax: 20 # Set the maximum quantization parameter (Q) for the encoder. Lower values result in higher quality but larger file sizes, while higher values result in lower quality but smaller file sizes. - #encoder_av_options: 'preset:ultrafast,profile:baseline' \ No newline at end of file diff --git a/src/cameras_cpp/config/suyin.yaml b/src/cameras_cpp/config/pole.yaml similarity index 100% rename from src/cameras_cpp/config/suyin.yaml rename to src/cameras_cpp/config/pole.yaml diff --git a/src/cameras_cpp/config/science_fisheye.yaml b/src/cameras_cpp/config/science_fisheye.yaml deleted file mode 100644 index a96c0e5f..00000000 --- a/src/cameras_cpp/config/science_fisheye.yaml +++ /dev/null @@ -1,14 +0,0 @@ -/**: - ros__parameters: - video_device: "/dev/v4l/by-id/usb-HD_Camera_Manufacturer_USB_2.0_Camera-video-index0" - #image_width: 640 - #image_height: 480 - #framerate: 30.0 - #pixel_format: "yuyv" - #image_raw: - #ffmpeg: - #encoder: "h264_nvmpi" - #bit_rate: 2000000 # Set the bit rate for the encoder. A higher bit rate results in better video quality but larger file sizes, while a lower bit rate results in lower video quality but smaller file sizes. - #gop_size: 20 # Set the Group of Pictures (GOP) size for the encoder. A smaller GOP size can improve error resilience but may increase file size, while a larger GOP size can reduce file size but may be less resilient to errors. - #qmax: 20 # Set the maximum quantization parameter (Q) for the encoder. Lower values result in higher quality but larger file sizes, while higher values result in lower quality but smaller file sizes. - #encoder_av_options: 'num_capture_buffers:4;profile:main;preset:ultrafast' diff --git a/src/cameras_cpp/config/science_webcam.yaml b/src/cameras_cpp/config/science_webcam.yaml deleted file mode 100644 index 89286099..00000000 --- a/src/cameras_cpp/config/science_webcam.yaml +++ /dev/null @@ -1,14 +0,0 @@ -/**: - ros__parameters: - video_device: "/dev/v4l/by-id/usb-046d_C270_HD_WEBCAM_C03D6F00-video-index0" - #image_width: 640 - #image_height: 480 - #framerate: 30.0 - #pixel_format: "yuyv" - #image_raw: - #ffmpeg: - #encoder: "h264_nvmpi" - #bit_rate: 2000000 # Set the bit rate for the encoder. A higher bit rate results in better video quality but larger file sizes, while a lower bit rate results in lower video quality but smaller file sizes. - #gop_size: 20 # Set the Group of Pictures (GOP) size for the encoder. A smaller GOP size can improve error resilience but may increase file size, while a larger GOP size can reduce file size but may be less resilient to errors. - #qmax: 20 # Set the maximum quantization parameter (Q) for the encoder. Lower values result in higher quality but larger file sizes, while higher values result in lower quality but smaller file sizes. - #encoder_av_options: 'num_capture_buffers:4;profile:main;preset:ultrafast' From 4152f3c18922f9e861969d8f2d1dadc31bfcd04b Mon Sep 17 00:00:00 2001 From: BenUBC Date: Sun, 9 Aug 2026 19:28:49 -0700 Subject: [PATCH 10/10] revert --- src/rover_manager/config/heart.yaml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/rover_manager/config/heart.yaml b/src/rover_manager/config/heart.yaml index 6b25dbe5..861cb397 100644 --- a/src/rover_manager/config/heart.yaml +++ b/src/rover_manager/config/heart.yaml @@ -52,12 +52,6 @@ subsystems: # drive_control: "ros2 launch drive_control drive_control_base_bringup.launch.py" drive_control: "ros2 run joy joy_node" - camera: "ros2 launch cameras_cpp jetson_decompressor.launch.py" - realsense415: 'ros2 launch cameras_cpp jetson_decompressor.launch.py "cameras:=realsense415"' - realsense435i: 'ros2 launch cameras_cpp jetson_decompressor.launch.py "cameras:=realsense435i"' - logitech: 'ros2 launch cameras_cpp jetson_decompressor.launch.py "cameras:=logitech"' - suyin: 'ros2 launch cameras_cpp jetson_decompressor.launch.py "cameras:=suyin"' - science_fisheye: 'ros2 launch cameras_cpp jetson_decompressor.launch.py "cameras:=science_fisheye"' request_topic: "/heart/request" heart_feedback_topic: "/heart/running_subsystems" heartbeat_rate: 1.0 #how often the heart beats, every beat sends a feedback msg with what subsystems are online or offline @@ -87,11 +81,6 @@ ros__parameters: subsystems: camera: "ros2 launch cameras_cpp jetson_compressor.launch.py" - realsense415: 'ros2 launch cameras_cpp jetson_compressor.launch.py "cameras:=realsense415"' - realsense435i: 'ros2 launch cameras_cpp jetson_compressor.launch.py "cameras:=realsense435i"' - logitech: 'ros2 launch cameras_cpp jetson_compressor.launch.py "cameras:=logitech"' - suyin: 'ros2 launch cameras_cpp jetson_compressor.launch.py "cameras:=suyin"' - science_fisheye: 'ros2 launch cameras_cpp jetson_compressor.launch.py "cameras:=science_fisheye"' request_topic: "/heart/request" heart_feedback_topic: "/heart/running_subsystems" heartbeat_rate: 1.0 #how often the heart beats, every beat sends a feedback msg with what subsystems are online or offline