【ROS2】海康相机ROS2设备服务节点开发

在Ubuntu系统下进行ROS2开发海康工业相机的设备服务节点,

1、安装过程

1、确认你的系统组成

输入下面指令,查看系统版本

bash 复制代码
uname -a

2、安装ROS2环境,可以使用一键安装

3、安装海康机器人MVS

3.1 下载使用linux版本

若系统内核版本显示有 x86_64 x86_64 x86_64 GNU/Linux

复制代码
安装包对应的操作系统
x86架构64位系统:
    MVS-x.x.x_x86_64_xxxxxxxx.deb
    MVS-x.x.x_x86_64_xxxxxxxx.tar.gz
x86架构32位系统:
    MVS-x.x.x_i386_xxxxxxxx.deb
    MVS-x.x.x_i386_xxxxxxxx.tar.gz
   
说明:
1. 根据系统名称选择相对应的安装包:在终端中输入"uname -a"命令,根据输出的信息选择安装包,例如:输出的信息包含x86_64就选择x86架构64位的安装包;
2. .deb安装包通过dpkg命令安装,主要应用于ubuntu等系统;如sudo dpkg -i MVS-4.6.1_x86_64_20251113.deb
3. .tar.gz安装包是一个压缩包,通tar命令解压后,再执行setup.sh脚本进行安装。
如 
		tar -zxvf MVS-4.6.1_x86_64_20251113.tar.gz       
		cd MVS-4.6.1_x86_64_20251113   
		sudo ./setup.sh

3.2 下载安装ARM版本

若系统内核版本显示aarch64 aarch64 aarch64 GNU/Linux,则系统是ARM 64 位架构,适配 Jetson 嵌入式平台。

复制代码
安装包对应的操作系统
 arm架构64位系统:
    MVS-x.x.x_aarch64_xxxxxxxx.deb
    MVS-x.x.x_aarch64_xxxxxxxx.tar.gz
 arm架构32位系统:
    MVS-x.x.x_armhf_xxxxxxxx.deb
    MVS-x.x.x_armhf_xxxxxxxx.tar.gz
    MVS-x.x.x_arm-none_xxxxxxxx.tar.gz
   
说明:
1. 根据系统名称选择相对应的安装包:在终端中输入"uname -a"命令,根据输出的信息选择安装包,例如:输出的信息包含aarch64就选择aarch64的安装包;
2. .deb安装包通过dpkg命令安装,主要应用于ubuntu等系统;如 sudo dpkg -i MVS-3.0.1_aarch64_20251113.deb
3. .tar.gz安装包是一个压缩包,通tar命令解压后,再执行setup.sh脚本进行安装。
如
		tar -zxvf MVS-3.0.1_aarch64_20251113.tar.gz       
		cd MVS-3.0.1_aarch64_20251113    
		sudo ./setup.sh

3.3 若MVS安装过程中提示【依赖未满足】错误

使用下面指令

bash 复制代码
# 自动安装缺失的依赖,并修复破损的安装包
sudo apt-get install -f

3.4 安装完成后,验证

bash 复制代码
 cd /opt/MVS/bin
./MVS.sh

如果能打开MVS交互界面,则安装成功

4、安装ROS2组件

下载ROS2的demo包,然后使用Colcon 编译

4.1 创建工作目录

bash 复制代码
mkdir -p ~/project_hkcam/src

4.2. 将示例程序复制到工作目录

bash 复制代码
cp -r ./mvcc_camera_ros2 ~/project_hkcam/src
cp -r ./mvcc_camera_ros2_interface ~/project_hkcam/src

4.3. 进入工作目录并编译

bash 复制代码
cd ~/project_hkcam
colcon build

4.4. 打开终端设置环境

bash 复制代码
source ./install/setup.bash

4.5. 在当前终端下启动程序

5、程序说明

5.1 发布模式

hik_camera_image_pub
  • 支持传入配置文件并将参数配置到相机中
  • 回调方式从SDK中获取图像,发布图像
    • 发布标准图像:/mvcc_camera/Image /mvcc_camera/ImageInfo(图像格式 mono8,rgb8)
    • 发布自定义图像:/mvcc_camera/FrameInfo(仅当检测有外部客户端订阅时发布)(图像格式 mono8,rgb8)
  • 创建参数配置服务端
    • 支持客户端参数配置/读取命令
      • 支持 float 类型:get_float_value set_float_value
      • 支持 string 类型:get_string_value set_string_value
      • 支持 command 类型:execute_command
      • 支持 enum 类型:get_enum_value set_enum_value
      • 支持 int 类型:get_integer_value set_integer_value
      • 支持 bool 类型:get_bool_value set_bool_value

5.2 订阅模式

hik_camera_image_sub

搭配 hik_camera_image_pub 使用

  • 接收图像
    • 订阅并接收标准图像:/mvcc_camera/Image /mvcc_camera/ImageInfo
    • 订阅并接收自定义图像:/mvcc_camera/FrameInfo
  • 参数配置(若服务端支持,则配置)
    • 创建参数配置客户端,进行部分相机参数配置
hik_camera_params_test

搭配 hik_camera_image_pub 使用

bash 复制代码
 ros2 run mvcc_camera_ros2 hik_camera_params_test
  • 参数配置客户端
    • 发送读取/配置命令到服务端(配置相机),接收响应结果

6、启动程序

6.1 直接启动 (单个组件)

6.1.1 默认参数直接启动
bash 复制代码
ros2 run mvcc_camera_ros2 hik_camera_image_pub
6.1.2 带序列号启动

若序列号是纯数字,需要添加string以确保ROS2将其识别为字符串类型

bash 复制代码
ros2 run mvcc_camera_ros2 hik_camera_image_pub --ros-args -p cam_sn:='string:00775075482'
ros2 run mvcc_camera_ros2 hik_camera_image_pub --ros-args -p cam_sn:='J72215431'
6.1.3 指定配置文件路径启动

路径要是相对路径,或者绝对路径

bash 复制代码
ros2 run mvcc_camera_ros2 hik_camera_image_pub --ros-args --params-file  ./src/mvcc_camera_ros2/config/hik_camera_config.yaml

6.2通过 launch 文件启动 (推荐)

launch中可以配置多个组件启动

6.2.1默认启动(第一个相机)
bash 复制代码
ros2 launch mvcc_camera_ros2 connect_by_config.xml
6.2.2指定相机序列号
bash 复制代码
ros2 launch mvcc_camera_ros2 connect_by_config.xml cam_sn:="J72215431"

6.3 配置文件说明

文件名 功能说明
connect_by_config.xml 支持传入 cam_sn(可选),加载配置文件 config/hik_camera_config.yaml,启动 hik_camera_image_pub 和 hik_camera_image_sub

7、启动方式说明

7.1 单独启动

bash 复制代码
# 启动订阅者
ros2 run mvcc_camera_ros2 hik_camera_image_sub

# 启动发布者
ros2 run mvcc_camera_ros2 hik_camera_image_pub

7.2 一起启动

bash 复制代码
# 启动订阅者和发布者  
ros2 launch mvcc_camera_ros2 connect_by_config.xml

8、注意事项

  1. 相机序列号需要加引号,若序列号是纯数字,需要添加string以确保ROS2将其识别为字符串类型

    • 示例:cam_sn:='string:00775075482'cam_sn:='A75075482'
  2. 可以使用launch文件更方便地设置参数

  3. 参数文件来设置参数,参数文件位于config/hik_camera_config.yaml

    • 参数文件中的节点名称必须与实际运行的节点名称完全相同,否则参数将无法正确应用
    • 可以手动增加/删除配置文件中的节点,实现对新功能的配置
    • 当前示例 hik_camera_image_pub 是连接相机后,加载配置文件参数,并配置到相机中,之后取流,发布图像

9、包说明

xml 复制代码
mvcc_camera_ros2/                                      # 相机组件
├── common/                                            #  接口文件
│   ├── camera_parameter_service_manager.h             #  参数配置接口 头文件 (.srv 通信接口文件)
│   └── hik_camera.h                                   #  相机SDK接口封装 头文件
├── config/                                            #  配置文件
│   └── hik_camera_config.yaml                         #  ROS组件加载的配置文件
├── launch/                                            #  launch 启动脚本
│   └── connect_by_config.xml                           
├── src/                                               # 源文件
│   ├── camera_parameter_service_manager.cpp           #  .srv 通信接口 实现
│   ├── hik_camera.cpp                                 #  相机SDK接口封装 实现
│   ├── create_camera_image_pub.cpp                    #  相机ROS组件 发布端
│   ├── create_camera_image_sub.cpp                    #  相机ROS组件 接收端
│   └── camera_params_test.cpp                         #  相机ROS组件 参数配置服务
├── CMakeLists.txt                                     # 编译脚本
└── package.xml                                        # 包配置


mvcc_camera_ros2_interface/                            # 相机组件接口文件
├── msg/                                               #  .msg接口文件
│   ├── ChunkDataContent.msg                           #  chunk接口文件
│   └── FrameInfo.msg                                  #  自定义FrameInfo接口文件
├── srv/                                               #  .srv 配置文件
│   ├── ExecuteCommand.srv                             #  execute_command 接口定义
│   ├── GetBoolValue.srv                               #  get_bool_value 接口定义
│   ├── SetBoolValue.srv                               #  set_bool_value 接口定义
│   ├── GetEnumValue.srv                               #  get_enum_value 接口定义
│   ├── SetEnumValue.srv                               #  set_enum_value 接口定义
│   ├── GetFloatValue.srv                              #  get_float_value 接口定义
│   ├── SetFloatValue.srv                              #  set_float_value 接口定义
│   ├── GetIntegerValue.srv                            #  get_integer_value 接口定义
│   ├── SetIntegerValue.srv                            #  set_integer_value 接口定义
│   ├── GetStringValue.srv                             #  get_string_value 接口定义
│   └── SetStringValue.srv                             #  set_string_value 接口定义
├── CMakeLists.txt                                     # 编译脚本
└── package.xml                                        # 包配置
相关推荐
Bruce_kaizy2 小时前
2025年年度总结!!!!!!!!!!!!!!!!!!!!!!!!!!!
开发语言·c++
聆风吟º2 小时前
【顺序表习题|图解|双指针】合并两个有序数组 + 训练计划 I
c语言·数据结构·c++·经验分享·算法
东城绝神2 小时前
《Linux运维总结:Ubuntu 22.04配置chrony时间同步服务》
linux·运维·ubuntu·chrony
刘程佳2 小时前
Ubuntu 系统没有识别 Pixel 6 的 USB 设备权限
linux·运维·ubuntu
王老师青少年编程2 小时前
2025年12月GESP(C++一级): 手机电量显示
c++·认证·gesp·csp·一级·信奥赛·手机电量显示
wa的一声哭了2 小时前
矩阵分析 单元函数矩阵微积分和多元向量值的导数
linux·c语言·c++·线性代数·算法·矩阵·云计算
陈葛杰2 小时前
VMware 安装 Rocky Linux 9.6(Minimal 版)超详细图文教程|轻量 · 安全 · 生产级
linux·运维·服务器
爱装代码的小瓶子2 小时前
【c++进阶】c++11的魔法:从模板到可变模板.
android·开发语言·c++
曼巴UE52 小时前
UE GamePlayTag
c++·ue5·ue