3. ROS2与开发环境搭建

说实话,每次带新人入门SLAM,我都要花不少时间在环境搭建上。很多人觉得这是体力活,装个系统而已嘛。但我在项目里吃过太多亏了——版本不对、依赖冲突、编译报错,一折腾就是半天。所以这一章,咱们把基础打扎实。

3.1 为什么选ROS2 Humble?

ROS2有很多发行版,比如Foxy、Galactic、Humble、Iron。我个人习惯选Humble,原因很简单:长期支持(LTS)到2027年。你想想看,一个SLAM项目从开发到落地,少说半年一年。如果选了个非LTS版本,中途被迫升级,那滋味可不好受。

另外,Humble对Ubuntu 22.04的支持非常成熟。我在做多传感器融合项目时,需要同时跑激光雷达驱动、IMU驱动、视觉里程计,Humble的稳定性让我省了不少心。

核心结论: Ubuntu 22.04 + ROS2 Humble,是目前做激光雷达SLAM最稳妥的组合。

3.2 Ubuntu 22.04 安装要点

如果你已经装好了系统,可以跳过这节。但如果你正准备装,我提几个坑:

  • 分区建议: / 分区至少50GB,/home 分区留大一点。我遇到过因为 / 分区写满,rosbag记录到一半崩溃的情况。
  • 换源: 装完系统第一件事,换国内源(清华、阿里、中科大都行)。不然apt update能等到你怀疑人生。
  • 显卡驱动: 如果你用NVIDIA显卡,建议装470或525版本。我曾经用最新版驱动,结果rviz2渲染出问题,回退才解决。

3.3 ROS2 Humble 安装步骤

嗯,这里我直接给最稳的安装方式。别去网上找那些花里胡哨的脚本,官方步骤最靠谱。

# 1. 设置编码
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 $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# 3. 安装ROS2 Humble(桌面版,包含rviz2、tf2等)
sudo apt update
sudo apt install ros-humble-desktop

# 4. 安装开发工具
sudo apt install ros-dev-tools

# 5. 配置环境变量
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
小技巧: 如果你网络不好,可以先用 sudo apt install --download-only ros-humble-desktop 把包下载下来,再慢慢装。我在出差时经常用这招。

3.4 工作空间创建与功能包结构

工作空间(workspace)是ROS2项目的根目录。说白了,你所有的代码、配置文件、启动脚本都放在这里。我习惯用 ros2_ws 这个名字。

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

这里有个细节:colcon build 之后,会生成 build、install、log 三个目录。很多人搞不清它们的作用:

目录 作用
src 存放你的功能包源码
build 编译中间文件,不用管它
install 编译产物,运行时依赖这里
log 编译日志,报错时来这里查

功能包(package)是ROS2的最小组织单元。一个功能包包含节点、消息定义、配置文件等。创建功能包的命令:

cd ~/ros2_ws/src
ros2 pkg create my_slam_pkg --build-type ament_cmake --dependencies rclcpp std_msgs sensor_msgs tf2_ros

创建后,目录结构是这样的:

my_slam_pkg/
├── CMakeLists.txt    # 编译规则
├── package.xml       # 包信息与依赖
├── src/              # 源码
├── include/          # 头文件
├── launch/           # 启动文件
├── config/           # 配置文件
└── msg/              # 自定义消息(可选)
注意: 每次修改了 package.xml 或 CMakeLists.txt,都要重新 colcon build。我曾经忘了这一步,调试了半小时才发现节点没更新。

3.5 常用命令行工具

ROS2的命令行工具,说白了就是你的瑞士军刀。我每天至少用十几次。下面这三个是SLAM开发最常用的:

3.5.1 rviz2:可视化大脑

rviz2是ROS2的3D可视化工具。你可以把激光雷达点云、机器人位姿、地图都显示出来。启动方式:

rviz2

第一次打开是空白的,需要手动添加显示项。我个人习惯先加这几个:

  • LaserScan:显示激光雷达数据
  • PointCloud2:显示3D点云
  • TF:显示坐标系关系
  • Map:显示栅格地图

配置好后,记得保存为 .rviz 文件,下次直接加载。我一般放在功能包的 config 目录下。

3.5.2 tf2:坐标变换管家

tf2是ROS2的坐标变换库。在SLAM里,你需要知道激光雷达相对于机器人底盘的位置,地图坐标系相对于世界坐标系的关系。这些都由tf2管理。

常用命令:

# 查看所有坐标系关系
ros2 run tf2_tools view_frames

# 监听两个坐标系之间的变换
ros2 run tf2_ros tf2_echo base_link laser_frame

# 在rviz2中显示tf树
# 添加TF显示项即可

我在做多传感器融合时,经常用 tf2_echo 检查坐标变换是否正确。有一次IMU的安装角度写反了,就是靠这个命令发现的。

3.5.3 ros2 bag:数据记录与回放

做SLAM开发,离不开数据采集。ros2 bag就是用来记录和回放话题数据的。我每次去现场测试,第一件事就是录bag。

# 记录所有话题
ros2 bag record -a -o my_slam_data

# 记录指定话题
ros2 bag record /scan /odom /tf -o my_slam_data

# 查看bag信息
ros2 bag info my_slam_data

# 回放数据
ros2 bag play my_slam_data
经验之谈: 录bag时,建议同时记录 /tf_static 和 /tf。我遇到过回放时坐标变换丢失的情况,就是因为没录静态tf。

3.6 本章知识体系

下面这张图,帮你理清本章的核心逻辑:

ROS2与开发环境搭建 - 知识体系 Ubuntu 22.04 ROS2 Humble 开发工具链 工作空间 (ros2_ws) 功能包 (package):CMakeLists.txt + package.xml + src + launch + config rviz2(可视化) tf2(坐标变换) ros2 bag(数据录制)

这张图展示了从系统层到工具层的完整链路。说白了,Ubuntu是地基,ROS2是框架,工作空间是项目容器,功能包是代码单元,而命令行工具是你日常操作的利器。

好了,环境搭好,工具备齐,接下来就可以真正开始写SLAM代码了。记住:基础越扎实,后面踩坑越少。