6.2.1 ROS2 MIPI Camera 使用
本章节提供了基于JDK 库的摄像头驱动和一系列 ROS 2 节点,用于获取和处理 MIPI CSI 摄像头数据。JDK 库包含了对摄像头(JdkCamera
)、视频编码(JdkEncoder
)、解码(JdkDecoder
)、视频输出(JdkVo
)等硬件功能的封装,ROS 2 节点则调用这些功能,将数据通过自定义消息在 ROS 2 中发布。系统架构如下:摄像头数据由 camera_node
节点采集并发布到 /camera_frames
;可以通过 venc_node
对原始帧进行 H.264 编码,输出到 /encoded_frames
;vdec_node
可对编码帧解码并发布到 /decoded_frames
;vo_node
节点订阅相机帧并在屏幕上显示(使用硬件加速输出);infer_node
节点对相机帧进行目标检测推理(默认使用 YOLOv8 模型)。用户通过订阅对应话题即可获取帧数据并进一步处理。本说明涵盖了系统背景、安装依赖、编译方式、节点启动及参数、接口说明和示例等内容,帮助用户快速集成使用该包。
1.背景介绍
- 硬件环境:本驱动面向支持 MIPI CSI 摄像头接口的嵌入式系统,典型场景为 Spacemit kx 系列开发板。JDK 库(JDK SDK)直接操作 V4L2 接口,可高效访问摄像头及视频编解码硬件。
- 系统架构:基于 JDK SDK 的功能,本套件定义了 ROS 2 包和节点结构。主要组件包括:
- JDK 库组件:提供对摄像头采集(
JdkCamera
)、帧封装(JdkFrame
)、硬件编码(JdkEncoder
)、解码(JdkDecoder
)、视频输出(JdkVo
)、以及帧的 DMA 传输(JdkDma
)等功能的 C++ 接口。 - ROS 2 接口包:
jdk_interfaces
包定义了用于传递帧数据的自定义消息类型JdkFrameMsg
。 - FD 传输包:
jdk_fd_transmitter
包实现了基于 UNIX Socket 的零拷贝帧传输机制,使多个节点间可以通过共享 DMA 缓冲避免复制开销。 - 功能节点:
jdk_camera_node
、jdk_venc_node
、jdk_vdec_node
、jdk_vo_node
、jdk_infer_node
等节点分别负责采集、编码、解码、显示和推理。摄像头采集节点将帧发布到/camera_frames
,编码节点输出到/encoded_frames
,解码节点输出到/decoded_frames
,显示节点通过硬件直出画面,推理节点对/camera_frames
进行目标检测,使用 YOLOv8 模型进行识别。
- JDK 库组件:提供对摄像头采集(
下面各节将详细介绍安装环境、编译流程、节点启动参数、接口定义及使用示例。
2.安装与依赖说明
- 操作系统:推荐使用 Bianbu 2.2,并安装 ROS 2 Humble(Humble Hawksbill)版本。ROS 2 Humble 官方参考[docs.ros.org](https://docs.ros.org/en/humble/Installation.html#:~:text=* Ubuntu Linux ,04)。确保系统更新并安装 ROS 2 桌面版(
sudo apt install ros-humble-desktop
)。 - 硬件驱动:需有支持 MIPI CSI 摄像头的驱动(例如 bianbu 内核默认支持多路 CSI 接口)。可通过
v4l2-ctl --list-devices
确认摄像头设备节点(如/dev/video0
,/dev/video50
等)。 - 依赖库:安装构建和运行所需的工具及库,例如:
- C/C++ 编译工具:
build-essential
、cmake
等。 - UUID 库:
uuid-dev
(用于生成帧 ID)[docs.ros.org](https://docs.ros.org/en/foxy/Tutorials/Beginner-Client-Libraries/Creating-Your-First-ROS2-Package.html#:~:text=To run the executable you,package creation%2C enter the command)。 - V4L2 相关:
libv4l-dev
(可选,用于 V4L2 头文件)。 - ROS 2 依赖:
ament_cmake
构建工具、rclcpp
、std_msgs
、rosidl_default_generators
等一般 ROS 2 包(通过安装 ROS 2 桌面版已包括)。
2.1安装命令示例(Bianbu 2.2)
sudo apt update
sudo apt install -y ros-humble-desktop build-essential cmake libuuid1 uuid-dev libv4l-dev
安装完成后,按照 ROS 2 官方文档设置软件源、密钥等步骤,可参考文档[docs.ros.org](https://docs.ros.org/en/humble/Installation.html#:~:text=* Ubuntu Linux ,04)。
2.2工作空间准备
在安装好 ROS 2 后,创建一个 ROS 2 工作空间,如 ~/ros2_ws
,并将本 项目的代码(jdk
文件夹)放入 src
目录下。例如:
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
cp -r path_to_jdk_folder ./jdk
cd ~/ros2_ws
2.3 JDK SDK 编译(可选)
如果需要将 JDK 库安装到系统中,可参照项目内 jdk_sdk
目录说明,将库安装到 /opt/jdk
。例如:
cd jdk/jdk_ros2_ws/jdk_sdk
cmake -DCMAKE_INSTALL_PREFIX=/opt/jdk .
make install
然后设置环境变量:
export CMAKE_PREFIX_PATH=/opt/jdk:$CMAKE_PREFIX_PATH
export LD_LIBRARY_PATH=/opt/jdk/lib:$LD_LIBRARY_PATH
这样其他程序可通过 find_package(jdk REQUIRED)
链接 JDK 库。
2.4依赖检查
确认已安装的依赖后,即可进行编译。下面列出了常见依赖包,用户可根据需要安装:
ros-humble-rclcpp
、ros-humble-std-msgs
:ROS 2 C++ 客户端库。ros-humble-rosidl-default-generators
:生成自定义消息类型。ros-humble-rcl-interfaces
(已随 ROS 2 安装)。libssl-dev
(根据推理插件可能需要,若使用加密或特定后端)。
3.构建与编译方式
将代码放入工作空间后,使用 colcon
构建所有 ROS 2 包。一般步骤如下:
3.1配置 ROS 2 环境
在新的终端中,先执行
source /opt/ros/humble/setup.bash
以加载已安装的 ROS 2 环境变量。
3.2进入工作空间
进入包含 src
的工作空间根目录:
cd ~/ros2_ws