第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
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”不断输出,说明安装成功了。
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话题。
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.yaml和my_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和导航,每一步都环环相扣。
24.6 写在最后
ROS2 + Jetson这套组合,说实话,门槛不低。但一旦跑通了,你会觉得一切都值得。我记得第一次让机器人自主导航到目标点时,那种成就感真的难以形容。
如果你在搭建过程中遇到问题,别慌。先检查话题有没有数据,再看参数对不对。大部分问题都出在这两个地方。
好了,这一章的内容就到这里。希望你能亲手让你的机器人跑起来。
公众号:蓝海资料掘金营,微信deep3321