教程:VENTUNO Q/ROS 2 激光雷达
概述
2D LiDAR 为机器人提供周围精确的一圈距离测量,是 2D SLAM 算法、障碍物检测与基础导航的主要输入。在 ROS 2 中,这些传感器数据以标准消息类型通过话题发布,因此系统中任何节点都可订阅并处理,而无需关心具体由哪一传感器产生。
本教程将在 Arduino® VENTUNO™ Q 上连接并配置 2D LiDAR,使用 RPLidar 或 LDLidar 驱动。
目标
- 连接 RPLidar 或 LDROBOT LiDAR,并将扫描数据发布为 ROS 2 话题。
- 在终端验证 LiDAR 数据速率,并用 RViz2 查看。
硬件与软件要求
硬件要求
- Arduino® VENTUNO™ Q(×1)
- Slamtec RPLidar / LDROBOT LiDAR(×1)
- Arduino® USB-C Hub (8in1)(×1)
- USB 键盘、鼠标与 HDMI 显示器
硬件连接
上图显示本教程全程使用的 VENTUNO Q 基础配置:开发板、电源、HDMI 显示器、USB 键盘与鼠标,在 SBC 模式下运行 Ubuntu。这是连接 LiDAR 之前的起点。除该基础配置外,LiDAR 连接到开发板的某个 USB-A 口。
VENTUNO Q 有两个 USB-A 口,在此基础配置中已被键盘和鼠标占用。由于 LiDAR 也需要 USB 口,建议将 USB-C 集线器接到开发板的 USB-C 口以提供额外 USB-A 口,这样每次连接传感器时不必拔掉键盘或鼠标。
说明:
本教程中,显示器通过开发板原生 HDMI 口连接,从而把 USB-C 口留给集线器。
软件要求
- VENTUNO Q 上已安装 ROS 2 Jazzy,并已设置位于
~/ros2_ws的 colcon 工作空间,参见 Getting Started with ROS 2 on VENTUNO Q。
警告:
继续本教程之前,请确认 VENTUNO Q 已安装最新系统镜像,且 ROS 2 Jazzy 工作正常。
LiDAR
2D LiDAR 为机器人提供周围精确的一圈距离测量。该数据是 Cartographer 等 2D SLAM 算法、障碍物检测与基础导航的主要输入。
在 ROS 2 中,LiDAR 数据以 sensor_msgs/LaserScan 消息发布在 /scan 话题上。
此处涵盖两种选择:Slamtec RPLidar 系列与 LDROBOT LiDAR 系列。二者均通过 USB 连接,并在 Linux 上表现为串口设备。
连接 LiDAR
两款 LiDAR 外壳上都有指示零度参考方向的小标记。/scan 话题中的扫描角度从此点起算,因此将传感器安装到机器人上时,使该标记与机器人前进方向对齐,可使扫描数据在 RViz2 及使用它的导航栈中按预期定向。
将 LiDAR 插入某个 USB-A 口,并确认已被检测:
ls /dev/ttyUSB*
你应看到 /dev/ttyUSB0。实际使用中确切设备名取决于系统如何挂载,不确定时请用 ls -l /dev 检查。可为当前会话手动设置读写权限:
sudo chmod 777 /dev/ttyUSB0
RPLidar 驱动包含一个创建持久 udev 规则的脚本,因此无需在每次重新连接后重复此步骤。详见下方 RPLidar 一节。
Slamtec RPLidar
RPLidar 是 Slamtec 的 2D LiDAR 系列。ROS 2 驱动维护在 rplidar_ros 仓库 的 ros2 分支,支持以下型号:A1、A2、A3、S1、S2、S2E、S3、T1 与 C1。
将仓库克隆到工作空间,务必使用 ros2 分支,因为默认分支面向 ROS 1:
cd ~/ros2_ws/src
git clone -b ros2 https://github.com/Slamtec/rplidar_ros.git
从工作空间根目录构建软件包:
cd ~/ros2_ws/
source /opt/ros/jazzy/setup.bash
colcon build --symlink-install
Source 工作空间:
source ./install/setup.bash
为避免每次手动 source,可将其永久添加到 shell 配置:
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc
设置 Udev 规则
运行 RPLidar 节点需要对串口设备的读写权限。与其每次手动设置,该包包含一个创建持久 udev 规则的脚本:
cd ~/ros2_ws/src/rplidar_ros/
source scripts/create_udev_rules.sh
启动 RPLidar 节点
每个 RPLidar 型号都有自己的 launch 文件,且必须与你的具体硬件完全匹配。选择 launch 文件前请查看机身印刷的型号,因为每个文件都针对特定型号配置。本教程以 RPLidar C1 为例:
ros2 launch rplidar_ros rplidar_c1_launch.py
对于其他型号,相应替换文件名中的型号部分,例如 rplidar_a1_launch.py、rplidar_a2m8_launch.py 或 rplidar_s1_launch.py。支持型号完整列表见 rplidar_ros 仓库。
连接成功后,节点会报告设备序列号、固件版本与健康状态,然后开始扫描:
[INFO] [rplidar_node]: RPLidar S/N: 945DFC8BC6E598D1B59598F817FF5763
[INFO] [rplidar_node]: Firmware Ver: 1.02
[INFO] [rplidar_node]: Hardware Rev: 18
[INFO] [rplidar_node]: RPLidar health status : OK.
[INFO] [rplidar_node]: Start
[INFO] [rplidar_node]: current scan mode: Standard, sample rate: 5 Khz, max_distance: 16.0 m, scan frequency:10.0 Hz,
每个型号还有对应的 view_ 变体,会与节点一起启动 RViz2 以便立即可视化,例如 view_rplidar_c1_launch.py。这需要将显示器连接到 VENTUNO Q。若无显示器,RViz2 会因 Qt 平台插件错误启动失败,而 LiDAR 节点本身仍会正常运行。
若通过 SSH 工作,请使用上方普通 launch 文件,并另行可视化数据,详见本教程稍后的「在 RViz2 中可视化传感器」一节。
说明:
不同 RPLidar 型号使用不同串口波特率。这已在各型号专用 launch 文件中正确配置,只要使用与硬件匹配的 launch 文件,就无需手动设置。
LDROBOT LiDAR
LDROBOT LiDAR 系列包括 LD14、LD14P、LD06 与 LD19 等型号。ROS 2 驱动维护在 ldlidar_ros2 仓库。
克隆驱动
创建专用工作空间并克隆仓库,然后进入其中获取子模块:
cd ~
mkdir -p ldlidar_ros2_ws/src
cd ldlidar_ros2_ws/src
git clone https://github.com/ldrobotSensorTeam/ldlidar_ros2.git
cd ldlidar_ros2
git submodule update --init --recursive
这会拉取 sdk/ 目录,该目录作为独立仓库维护,构建驱动时需要。
系统设置
通过板载串口或 USB 转串口适配器连接 LiDAR,然后为对应设备设置权限。若设备名不同,请用 ls -l /dev 检查系统上的确切名称。
cd ~/ldlidar_ros2_ws
sudo chmod 777 /dev/ttyUSB0
若设备在不同端口,需要修改与你的 LiDAR 型号匹配的 launch 文件中的 port_name 值,该文件位于克隆仓库的 launch/ 目录。例如在 ld06.launch.py 中,相关行如下:
{'port_name': '/dev/ttyUSB0'},
构建驱动
构建前,向 SDK 的日志模块添加 pthread.h 头文件,这有助于在 Linux 上干净编译:
sed -i '/#include <stdlib.h>/a #include <pthread.h>' ~/ldlidar_ros2_ws/src/ldlidar_ros2/sdk/src/log_module.cpp
cd ~/ldlidar_ros2_ws
colcon build
Source 工作空间:
source install/local_setup.bash
为避免每次手动 source,可将其添加到 shell 配置:
echo "source ~/ldlidar_ros2_ws/install/local_setup.bash" >> ~/.bashrc
source ~/.bashrc
启动 LiDAR 节点
使用与具体 LiDAR 型号匹配的 launch 文件。以 LD06 为例:
ros2 launch ldlidar_ros2 ld06.launch.py
对于 LD14、LD14P 或 LD19,相应替换型号名,例如 ld14.launch.py 或 ld19.launch.py。
启动时,节点会打印所用参数、验证已连接模块并报告连接成功:
[INFO] [ldlidar_publisher_ld06]: LDLIDAR SDK Pack Version is:3.3.1
[INFO] [ldlidar_publisher_ld06]: ROS2 param input:
[INFO] [ldlidar_publisher_ld06]: <product_name>: LDLiDAR_LD06
[INFO] [ldlidar_publisher_ld06]: <laser_scan_topic_name>: scan
[INFO] [ldlidar_publisher_ld06]: <frame_id>: base_laser
[INFO] [ldlidar_publisher_ld06]: <port_name>: /dev/ttyUSB0
[INFO] [ldlidar_publisher_ld06]: <serial_baudrate>: 230400
[INFO] [ldlidar_publisher_ld06]: <range_min>: 0.020000
[INFO] [ldlidar_publisher_ld06]: <range_max>: 12.000000
[INFO] [ldlidar_publisher_ld06]: ldlidar serial connect is success
[INFO] [ldlidar_publisher_ld06]: ldlidar communication is normal.
[INFO] [ldlidar_publisher_ld06]: ldlidar driver start is success.
[INFO] [ldlidar_publisher_ld06]: start normal, pub lidar data
请注意,LDROBOT 驱动发布在 base_laser 坐标系上,与 RPLidar 驱动使用的普通 laser 坐标系不同,在 RViz2 中设置 Fixed Frame 时需记住这一点。
若未连接 LiDAR,节点会立即失败而非重试,退出前打印错误日志:
[ERROR] [ldlidar_publisher_ld06]: ldlidar serial connect is fail
[LOG][ERROR][.../serial_interface_linux.cpp][Open][41][Open open error,No such file or directory]
[LOG][ERROR][.../ldlidar_driver_linux.cpp][Connect][78][serial is not open:/dev/ttyUSB0]
这可验证节点、其参数与 ROS 2 launch 文件均工作正常。看到此输出后,连接 LiDAR 并重新运行 launch 命令。
若要与已配置好的 RViz2 可视化一起启动节点,请改用对应的 viewer launch 文件:
ros2 launch ldlidar_ros2 viewer_ld06.launch.py
其他型号同样适用,例如 viewer_ld14.launch.py 或 viewer_ld19.launch.py。这需要将显示器连接到 VENTUNO Q。若无显示器,RViz2 会因 Qt 平台插件错误启动失败,而 LiDAR 节点自身的连接尝试会独立继续。若通过 SSH 工作,请使用上方普通 launch 文件。
viewer launch 文件还会自动启动静态变换发布者,将 base_laser 坐标系连接到 base_link 坐标系,使 RViz2 立即拥有完整的变换树。
验证扫描数据
在任一驱动运行时,打开第二个终端并用以下命令确认 /scan 话题正在发布:
ros2 topic list | grep scan
检查发布速率:
ros2 topic hz /scan
在 RPLidar C1 上,速率稳定在 10 Hz,与节点启动时报告的扫描频率一致。在 LDROBOT LD06 上,速率会稳定在 7 到 9 Hz 范围。
在 RViz2 中可视化扫描:
ros2 run rviz2 rviz2
在 Global Options 下将 Fixed Frame 设为与驱动匹配:RPLidar 用 laser,LDROBOT LiDAR 用 base_laser;需要时核对确切坐标系名称:
ros2 topic echo /scan --no-arr | grep frame_id
添加 LaserScan 显示(不是 PointCloud2),因为扫描数据与点云数据是不同消息类型,并将其 Topic 设为 /scan。
你应看到扫描渲染为描绘附近障碍物与墙壁轮廓的彩色点组成的平面环或弧,并随环境或传感器移动实时更新。
故障排除
若 RPLidar 驱动无法打开串口,请确认已在 rplidar_ros 包目录内运行 udev 规则脚本,然后尝试重新连接传感器。
若 RPLidar 驱动的 colcon build 失败,请确认克隆的是 ros2 分支,因为默认分支面向 ROS 1,无法用 ROS 2 工具构建。
若 LDLidar 驱动构建失败或缺少文件,请确认克隆后运行了 git submodule update --init --recursive,因为仓库依赖子模块提供底层 SDK。
若任一 LiDAR 的 /scan 话题未发布,请检查电机是否在转。多数 LiDAR 电机运转时会发出轻微声音。若无声,请检查传感器电源连接。
总结
在本教程中,你已使用 RPLidar 或 LDROBOT 系列将 2D LiDAR 连接到 VENTUNO Q,并将其扫描数据发布为 ROS 2 话题。该话题是标准 ROS 2 消息类型,可直接供本系列其余教程中的 SLAM、导航与 AI 节点使用。
后续步骤
扫描数据在 ROS 2 话题上流动后,你可以继续使用其他感知传感器或进行 2D 建图:
- RGB Cameras with ROS 2 on VENTUNO Q,涵盖 USB 网络摄像头与 CSI 相机。
- RGBD Cameras with ROS 2 on VENTUNO Q,涵盖用于 3D 感知的 RealSense 深度相机。
致谢
ROS 是 Open Source Robotics Foundation 的商标。本教程仅用于教育目的,帮助用户在 Arduino 硬件上学习 ROS 2。本内容并不意味着 Arduino 与 Open Source Robotics Foundation 之间存在背书、合作或隶属关系。
支持
在使用 VENTUNO Q 过程中如遇问题或有疑问,我们提供多种支持资源帮助你找到答案与解决方案。
帮助中心
浏览我们的帮助中心,其中提供大量面向 VENTUNO Q 的文章与指南。Arduino 帮助中心旨在提供深入的技术支持,帮助你充分发挥设备潜力。
论坛
加入我们的社区论坛,与其他用户交流、分享经验并提问。
联系我们
若需要个性化协助,或有上述帮助与支持资源未涵盖的问题,请联系我们的支持团队。
原文:https://docs.arduino.cc/tutorials/ventuno-q/ros2-perception-lidar/ 本页为 Arduino 官方教程的中文翻译,供内部查阅。命令与代码保持原文。