第24章 机器人操作系统集成:ROS2 Humble安装、Jetson硬件驱动、SLAM建图与导航

说到机器人操作系统,很多刚接触Jetson的朋友会问:为什么非要用ROS?我个人的理解是——ROS就像机器人的“神经系统”。没有它,你的传感器、电机、算法全是孤岛。有了ROS,它们才能协同工作。

这一章,我们聚焦三个核心任务:装好ROS2 Humble打通Jetson硬件驱动跑通SLAM建图与导航。嗯,每一步都有坑,我会把踩过的坑一一指出来。

24.1 ROS2 Humble的安装与配置

ROS2有很多发行版,为什么选Humble?因为它对Jetson的arm64架构支持最好。我之前试过Galactic,有些包在Jetson上编译不过去。Humble就稳得多。

24.1.1 安装前的准备

先确认你的JetPack版本。我建议用JetPack 5.1以上,它自带Ubuntu 20.04,和ROS2 Humble完美匹配。

# 检查Ubuntu版本
lsb_release -a

# 设置locale(这一步很多人忽略,但很重要)
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
注意:locale设置不对,后面编译时会报奇怪的编码错误。我曾经在这上面浪费了半天。

24.1.2 添加ROS2软件源

# 添加ROS2 GPG key
sudo apt install curl gnupg2 lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

# 添加软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

sudo apt update

24.1.3 安装ROS2 Humble

这里有两个选择:桌面版和基础版。如果你只是做导航和SLAM,基础版就够了。但如果你要可视化,比如用Rviz2,那就装桌面版。

# 桌面版安装(推荐)
sudo apt install ros-humble-desktop

# 或者基础版
# sudo apt install ros-humble-ros-base

安装过程大概10-15分钟。趁这个时间,你可以去泡杯咖啡。

24.1.4 环境配置

装完别忘了配置环境变量。我习惯把它写到.bashrc里,这样每次开终端自动加载。

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

# 验证安装
ros2 run demo_nodes_cpp talker

如果看到“Hello World”不断输出,说明安装成功了。

小技巧:如果你同时装了ROS1和ROS2,建议用别名区分。我在.bashrc里加了alias ros1='source /opt/ros/noetic/setup.bash',这样切换起来很方便。

24.2 Jetson硬件驱动集成

ROS2装好了,但要让机器人动起来,还得搞定硬件驱动。说白了,就是让Jetson能读取传感器数据,控制电机。

24.2.1 摄像头驱动

Jetson上最常用的摄像头是IMX219和IMX477。我推荐用ros2_humble_jetpack这个包,它封装了Jetson的CSI摄像头驱动。

# 安装摄像头驱动
sudo apt install ros-humble-camera-calibration-parsers
sudo apt install ros-humble-camera-info-manager
sudo apt install ros-humble-image-transport

# 创建ROS2工作空间
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src

# 克隆摄像头驱动包
git clone https://github.com/JetsonHacksNano/ros2_humble_jetpack.git

cd ~/ros2_ws
colcon build --packages-select jetpack_camera

编译完成后,启动摄像头节点:

source install/setup.bash
ros2 run jetpack_camera jetpack_camera_node

ros2 topic list应该能看到/camera/image_raw话题。

注意:Jetson的CSI摄像头默认是NV12格式,ROS2需要的是RGB8。驱动里会自动转换,但会消耗一些CPU资源。如果你对性能要求高,可以考虑用硬件编码器。

24.2.2 激光雷达驱动

SLAM建图离不开激光雷达。我用的是RPLIDAR A1,性价比高,驱动也成熟。

# 安装RPLIDAR驱动
cd ~/ros2_ws/src
git clone https://github.com/Slamtec/rplidar_ros2.git

cd ~/ros2_ws
colcon build --packages-select rplidar_ros2

# 启动雷达
source install/setup.bash
ros2 launch rplidar_ros2 rplidar_a1_launch.py

如果雷达转起来了,但没数据?别急,检查一下串口权限:

sudo chmod 666 /dev/ttyUSB0

嗯,这个问题我遇到过好几次。每次插拔雷达后,权限都会重置。我后来写了个udev规则,一劳永逸。

24.2.3 电机驱动(Micro-ROS)

电机驱动通常用STM32或Arduino。ROS2通过Micro-ROS和底层MCU通信。我习惯用串口转USB的方式。

# 安装Micro-ROS
sudo apt install ros-humble-micro-ros-*

在STM32端,你需要烧录Micro-ROS的固件。具体代码这里不展开,但核心思路是:Jetson发布/cmd_vel话题,STM32订阅并控制电机

24.3 SLAM建图实战

硬件都准备好了,接下来就是SLAM建图。说白了,就是让机器人一边走一边“画地图”。

24.3.1 安装SLAM工具箱

ROS2 Humble官方推荐用slam_toolbox。它比老牌的gmapping更稳定,支持重定位和地图保存。

sudo apt install ros-humble-slam-toolbox

24.3.2 启动SLAM节点

先启动雷达和里程计,再启动SLAM:

# 启动雷达
ros2 launch rplidar_ros2 rplidar_a1_launch.py

# 启动SLAM
ros2 run slam_toolbox async_slam_toolbox_node

用键盘控制机器人移动:

ros2 run teleop_twist_keyboard teleop_twist_keyboard

一边走,一边在Rviz2里看地图生成:

ros2 run rviz2 rviz2

在Rviz2里添加Map显示,选择/map话题。你会看到地图一点点被“画”出来。

关键参数调整:
  • 分辨率:默认0.05米/像素。室内场景够用,室外建议0.1。
  • 最小粒子数:默认500。如果环境复杂,可以调到1000。
  • 匹配阈值:默认0.5。如果地图容易漂移,可以调高到0.7。

24.3.3 保存地图

建完图记得保存:

ros2 run nav2_map_server map_saver_cli -f ~/my_map

会生成两个文件:my_map.yamlmy_map.pgm。下次导航时直接加载。

24.4 导航栈配置

地图有了,接下来让机器人自己导航到目标点。ROS2的导航栈叫Nav2,功能很强大。

24.4.1 安装Nav2

sudo apt install ros-humble-navigation2
sudo apt install ros-humble-nav2-bringup

24.4.2 配置导航参数

Nav2的配置都在YAML文件里。我直接给一个常用的配置模板:

# nav2_params.yaml
amcl:
  ros__parameters:
    use_sim_time: False
    base_frame_id: "base_footprint"
    odom_frame_id: "odom"
    scan_topic: "/scan"
    min_particles: 500
    max_particles: 2000
    update_min_a: 0.2
    update_min_d: 0.25
    resample_interval: 1

bt_navigator:
  ros__parameters:
    use_sim_time: False
    default_nav_through_poses_bt_xml: "/opt/ros/humble/share/nav2_bt_navigator/behavior_trees/navigate_through_poses_w_replanning_and_recovery.xml"
    default_nav_to_pose_bt_xml: "/opt/ros/humble/share/nav2_bt_navigator/behavior_trees/navigate_to_pose_w_replanning_and_recovery.xml"

24.4.3 启动导航

ros2 launch nav2_bringup navigation_launch.py use_sim_time:=False autostart:=True map:=~/my_map.yaml

在Rviz2里,用“2D Nav Goal”工具点击地图上的目标点。机器人就会自动规划路径并移动过去。

常见问题:
  • 机器人原地打转:检查里程计话题是否有数据。没有里程计,导航就是瞎子。
  • 路径规划失败:地图可能不完整。回到SLAM模式,把没探索的区域走一遍。
  • 碰撞障碍物:代价地图的膨胀半径设小了。默认0.2米,建议调到0.3。

24.5 知识体系总览

下面这张图总结了本章的核心流程。从ROS2安装,到硬件驱动,再到SLAM和导航,每一步都环环相扣。

ROS2机器人系统集成知识体系 ROS2 Humble安装 系统准备 → 软件源 → 安装 Jetson硬件驱动 摄像头 · 激光雷达 · 电机 SLAM建图 slam_toolbox · 地图保存 Nav2导航 路径规划 · 避障 关键组件与话题 /scan → 激光雷达数据 /odom → 里程计数据 /cmd_vel → 速度控制指令 /map → 栅格地图 /tf → 坐标变换 /goal_pose → 导航目标点 ⚠️ 常见避坑指南 1. 雷达串口权限:每次插拔后需要重新授权,建议写udev规则 2. 里程计漂移:使用IMU融合数据,或者提高轮式编码器精度 3. 地图不闭合:建图时走“8”字形路线,确保闭环检测成功 4. 导航卡死:检查代价地图参数,适当增加膨胀半径

24.6 写在最后

ROS2 + Jetson这套组合,说实话,门槛不低。但一旦跑通了,你会觉得一切都值得。我记得第一次让机器人自主导航到目标点时,那种成就感真的难以形容。

如果你在搭建过程中遇到问题,别慌。先检查话题有没有数据,再看参数对不对。大部分问题都出在这两个地方。

好了,这一章的内容就到这里。希望你能亲手让你的机器人跑起来。


公众号:蓝海资料掘金营,微信deep3321