第2章:环境搭建与工具链
说实话,做机器人导航调试,环境搭不好,后面全是坑。我见过太多人花了一周时间在编译上,结果还没开始调导航就崩溃了。这一章,咱们就把ROS2环境、Nav2源码、调试工具、仿真环境一次性搞定。
本章核心目标:让你能在30分钟内搭建一个可用的Nav2调试环境,而不是花三天去解决依赖冲突。
2.1 ROS2 Humble/Galactic 环境配置
先说说版本选择。我个人习惯用Humble,因为它支持到2025年,稳定性也最好。Galactic其实也不错,但2022年底就EOL了,除非你项目有特殊要求,否则我建议直接上Humble。
2.1.1 系统要求
| ROS2版本 | 推荐Ubuntu版本 | 支持周期 |
|---|---|---|
| Humble Hawksbill | Ubuntu 22.04 (Jammy) | 2025年5月 |
| Galactic Geochelone | Ubuntu 20.04 (Focal) | 2022年12月(已结束) |
注意:千万别在Ubuntu 22.04上装Galactic,依赖会炸。我曾经帮一个学员远程调试,他硬是在22.04上装Galactic,结果rosdep resolve报了一堆错,最后重装了系统。
2.1.2 安装步骤(以Humble为例)
嗯,这里我直接给最稳的安装方式。别去网上找那些花里胡哨的一键脚本,老老实实按官方来。
# 1. 设置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
# 2. 添加ROS2源
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
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
# 3. 安装ROS2 Humble桌面版(包含rviz2、rqt等)
sudo apt update
sudo apt install ros-humble-desktop
# 4. 安装开发工具
sudo apt install ros-dev-tools python3-colcon-common-extensions python3-rosdep
# 5. 初始化rosdep
sudo rosdep init
rosdep update
# 6. 配置环境变量
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
小技巧:装完后记得跑一下 ros2 run demo_nodes_cpp talker 和 ros2 run demo_nodes_py listener,能通信就说明环境没问题。我每次装完新环境都这么测,省得后面出问题到处找原因。
2.2 Nav2源码编译与安装
为什么非要编译源码?直接用apt安装不好吗?你想想看,调试导航问题时,你经常需要改Nav2内部的参数甚至代码,apt安装的二进制版本你根本改不了。所以,源码编译是必须的。
2.2.1 创建工作空间并拉取源码
# 创建workspace
mkdir -p ~/nav2_ws/src
cd ~/nav2_ws/src
# 克隆Nav2源码(建议用humble分支)
git clone https://github.com/ros-planning/navigation2.git -b humble
# 安装依赖
cd ~/nav2_ws
rosdep install -y --from-paths src --ignore-src --rosdistro humble
# 编译(第一次编译会比较慢,大概10-15分钟)
colcon build --symlink-install
# 配置环境
echo "source ~/nav2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc
避坑指南:我曾经在编译时遇到 nav2_behavior_tree 报错,原因是系统默认的gcc版本太高。解决办法是安装gcc-11:sudo apt install gcc-11 g++-11,然后设置 export CC=gcc-11 CXX=g++-11 再编译。
2.2.2 验证安装
编译完成后,跑一下Nav2自带的测试:
# 启动Nav2的bringup(需要先有仿真环境,我们后面会搭)
ros2 launch nav2_bringup navigation_launch.py
# 如果能看到类似下面的输出,说明安装成功
# [INFO] [launch]: Default logging verbosity is set to INFO
# [INFO] [lifecycle_manager-1]: lifecycle manager started
2.3 必备调试工具
调试导航问题,工具选对了能省一半时间。我平时最常用的就这四个:rqt、rviz2、tf2、ros2cli。别贪多,先把这几个玩熟。
2.3.1 rqt - 可视化调试面板
rqt是个大杂烩,里面集成了好多插件。我最常用的是 rqt_graph(看节点通信拓扑)和 rqt_reconfigure(动态调参)。
# 启动rqt
rqt
# 在Plugins菜单里选择需要的插件
# 比如:Plugins -> Visualization -> Plot(看数据曲线)
# 或者:Plugins -> Introspection -> Node Graph(看节点图)
个人经验:调导航参数时,我习惯把rqt_reconfigure和rviz2并排放在两个屏幕上。左边调参数,右边看效果,效率翻倍。
2.3.2 rviz2 - 3D可视化
rviz2是导航调试的核心工具。你看到的机器人模型、激光雷达数据、代价地图、路径规划,全在这里展示。
# 启动rviz2
rviz2
# 常用显示项(Add按钮添加):
# - RobotModel:显示机器人模型
# - LaserScan:显示激光雷达数据
# - Map:显示地图
# - Path:显示规划路径
# - TF:显示坐标系变换
2.3.3 tf2 - 坐标变换调试
导航出问题,十有八九是tf树没对。tf2就是用来查这个的。
# 查看tf树
ros2 run tf2_tools view_frames.py
# 或者实时查看tf变换
ros2 run tf2_ros tf2_monitor
# 查看特定坐标系之间的变换
ros2 run tf2_ros tf2_echo base_link odom
核心经验:导航启动后,第一件事就是看tf树。如果 map -> odom -> base_link 这条链路断了,机器人肯定动不了。我曾经花了两小时查路径规划失败的原因,最后发现是tf树里少了一个 base_footprint 到 base_link 的变换。
2.3.4 ros2cli - 命令行瑞士军刀
别小看命令行工具,很多时候比图形界面好用。我调试时几乎离不开这几个命令:
# 查看所有话题
ros2 topic list
# 查看话题数据(实时打印)
ros2 topic echo /scan
# 查看话题频率(看数据是否正常发布)
ros2 topic hz /scan
# 查看节点列表
ros2 node list
# 查看节点信息
ros2 node info /amcl
# 查看参数
ros2 param list /nav2_controller
# 动态设置参数
ros2 param set /nav2_controller max_vel_x 0.5
2.4 仿真环境搭建(Gazebo + TurtleBot3)
没有真机怎么办?仿真环境就是你的最佳调试场。我建议用TurtleBot3,因为它模型简单、文档齐全,而且Nav2官方示例就是基于它做的。
2.4.1 安装Gazebo和TurtleBot3
# 安装Gazebo(Humble自带Gazebo Fortress)
sudo apt install ros-humble-gazebo-ros2-pkgs
# 安装TurtleBot3相关包
sudo apt install ros-humble-turtlebot3*
sudo apt install ros-humble-cartographer
sudo apt install ros-humble-navigation2
sudo apt install ros-humble-nav2-bringup
2.4.2 配置环境变量
# 设置TurtleBot3模型
echo "export TURTLEBOT3_MODEL=waffle" >> ~/.bashrc
echo "export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/opt/ros/humble/share/turtlebot3_gazebo/models" >> ~/.bashrc
source ~/.bashrc
2.4.3 启动仿真环境
# 启动Gazebo世界(带TurtleBot3)
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
# 启动导航(在另一个终端)
ros2 launch nav2_bringup bringup_launch.py use_sim_time:=True
# 启动rviz2(在第三个终端)
rviz2 -d /opt/ros/humble/share/nav2_bringup/launch/nav2_default_view.rviz
调试技巧:启动后如果机器人不动,先检查 /odom 话题有没有数据。用 ros2 topic echo /odom 看一下,如果没数据,说明里程计没工作。这时候去查tf树,大概率是 odom -> base_link 的变换没发布。
2.5 本章知识体系
下面这张图是我自己整理的,把本章的核心内容串起来了。你照着这个思路去搭建环境,基本不会漏东西。
2.6 常见问题与避坑
最后,我把自己踩过的坑整理一下,你遇到了直接对照着查:
- 编译报错:先检查gcc版本,Nav2 Humble需要gcc-11以上。用
gcc --version查看。 - Gazebo启动黑屏:可能是显卡驱动问题。试试
export LIBGL_ALWAYS_SOFTWARE=1强制使用软件渲染。 - rviz2看不到机器人模型:检查
robot_description话题有没有发布。用ros2 topic echo /robot_description查看。 - 导航启动后机器人不动:先看
/cmd_vel话题有没有数据。如果没数据,说明规划器没输出速度指令,去查全局路径规划。
一句话总结:环境搭好了,调试就成功了一半。别急着跑导航,先把工具链玩熟,后面遇到问题才能快速定位。