从ROS1到ROS2实战迁移指南:Ubuntu 20.04安装Galactic与首个Demo全解析
当你在ROS1中熟练地启动roscore时,是否思考过这个中心化架构的局限性?ROS2带来的不仅是技术栈的革新,更是一场机器人开发范式的变革。本文将带你以实践者的视角,完成从ROS1到ROS2的关键跨越——在Ubuntu 20.04上安装Galactic版本,并通过经典talker/listener案例验证环境。不同于普通教程,我们特别关注ROS1用户的实际痛点,比如环境共存、命令差异等迁移细节。
1. 为什么ROS2值得你立即迁移
如果你曾在ROS1中遭遇过这些场景:
- 主节点崩溃导致整个系统瘫痪
- 网络波动造成通信中断
- 需要实时性保障的嵌入式部署困难
那么ROS2的设计改进将直击这些痛点。其核心变革在于采用去中心化的DDS通信中间件,这带来了三个革命性优势:
- 无单点故障:每个节点都具备自主发现能力
- QoS可配置:可根据场景平衡实时性与可靠性
- 跨平台支持:从x86到ARM架构的无缝移植
# ROS1 vs ROS2架构对比示意 ROS1: [Node A] --> [Master] <-- [Node B] ROS2: [Node A] <--DDS--> [Node B]典型应用场景对比:
| 特性 | ROS1适用场景 | ROS2优势场景 |
|---|---|---|
| 实时性 | 教学演示 | 工业控制 |
| 网络依赖 | 实验室稳定网络 | 车联网不稳定环境 |
| 系统规模 | 单机系统 | 多机器人协作 |
| 部署环境 | 开发原型 | 产品级应用 |
实践建议:即使暂时不需要ROS2的新特性,提前熟悉其架构也能为未来技术升级储备能力
2. 准备你的Ubuntu 20.04环境
在开始安装前,需要确保系统满足以下条件:
- 已安装Ubuntu 20.04.3 LTS或更新版本
- 至少15GB可用磁盘空间
- 稳定的网络连接(建议配置国内镜像源加速下载)
关键步骤解析:
2.1 配置APT软件源
执行以下命令添加ROS2官方源(含国内用户优化方案):
# 设置locale(避免潜在问题) sudo apt update && sudo apt install -y locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 # 添加ROS2 GPG密钥 sudo apt install -y curl gnupg lsb-release sudo curl -sSL https://mirrors.tuna.tsinghua.edu.cn/rosdistro/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] https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null2.2 解决常见依赖问题
ROS1用户需特别注意这些包冲突:
# 检查冲突包 dpkg -l | grep -E 'ros-melodic|ros-noetic' # 若存在冲突可选择性卸载(确保不影响现有ROS1工作区) sudo apt remove --purge ros-melodic-* ros-noetic-* # 慎用!3. 安装ROS2 Galactic完整版
推荐安装桌面完整版(包含GUI工具):
# 更新软件索引 sudo apt update # 安装完整版(含RViz、RQT等工具) sudo apt install -y ros-galactic-desktop # 安装开发工具 sudo apt install -y python3-colcon-common-extensions ros-dev-tools环境变量配置技巧:
# 永久生效配置 echo "source /opt/ros/galactic/setup.bash" >> ~/.bashrc # 临时测试用配置 source /opt/ros/galactic/setup.bash故障排查:若遇到
Unable to locate package错误,请检查/etc/apt/sources.list.d/ros2.list文件格式是否正确
4. 验证安装:第一个ROS2 Demo
让我们用经典的talker/listener测试安装结果:
步骤1:启动消息发布者
ros2 run demo_nodes_cpp talker你将看到持续输出的消息:
[INFO] [1620000000.000000000] [talker]: Publishing: 'Hello World: 1' [INFO] [1620000000.100000000] [talker]: Publishing: 'Hello World: 2'步骤2:启动消息订阅者
新终端中运行:
ros2 run demo_nodes_py listener成功订阅后会显示:
[INFO] [1620000000.100000000] [listener]: I heard: [Hello World: 1] [INFO] [1620000000.200000000] [listener]: I heard: [Hello World: 2]关键现象观察:
- 无需预先启动
roscore - 节点自动发现通常需要2-3秒
- 按Ctrl+C可优雅终止节点
5. ROS1与ROS2共存方案
对于需要同时使用两个版本的用户,推荐以下管理策略:
方案1:终端会话隔离
# ROS1环境 source /opt/ros/noetic/setup.bash # ROS2环境 source /opt/ros/galactic/setup.bash方案2:工作区隔离
创建独立的workspace并配置对应环境:
# 示例:ROS2工作区 mkdir -p ~/ros2_ws/src cd ~/ros2_ws source /opt/ros/galactic/setup.bash colcon build共存时的注意事项:
- 避免同时激活两个环境
- 使用
which rosrun检查当前生效版本 - RViz2/RQt2等工具需要对应版本支持
6. 必须掌握的ROS2核心命令
下表对比了ROS1用户需要适应的命令变化:
| 功能 | ROS1命令 | ROS2对应命令 | 变化说明 |
|---|---|---|---|
| 节点管理 | rosnode | ros2 node | 改为子命令模式 |
| 话题查看 | rostopic | ros2 topic | 功能基本一致 |
| 服务调用 | rosservice | ros2 service | 新增类型检查 |
| 参数管理 | rosparam | ros2 param | 支持动态修改 |
| 启动文件 | roslaunch | ros2 launch | 语法有较大变化 |
常用诊断命令示例:
# 查看节点列表 ros2 node list # 监视话题频率 ros2 topic hz /chatter # 图形化节点关系 rqt_graph7. 深入理解DDS通信配置
ROS2允许通过QoS策略精细控制通信行为。查看默认QoS配置:
ros2 topic info /chatter --verbose典型QoS配置示例(Python API):
from rclpy.qos import QoSProfile, QoSReliabilityPolicy # 配置可靠通信(类似TCP) qos_reliable = QoSProfile( depth=10, reliability=QoSReliabilityPolicy.RELIABLE ) # 配置尽力而为通信(类似UDP) qos_best_effort = QoSProfile( depth=10, reliability=QoSReliabilityPolicy.BEST_EFFORT )性能提示:在自动驾驶等实时场景中,适当调整QoS可降低端到端延迟30%以上
8. 迁移实践:将ROS1包转换为ROS2
以经典teleop_twist_keyboard为例,展示改造要点:
关键修改点:
- 将
package.xml格式升级为格式3 - 替换
roscpp依赖为rclcpp - 重写节点初始化逻辑:
// ROS1风格 ros::init(argc, argv, "teleop_node"); ros::NodeHandle nh; // ROS2风格 rclcpp::init(argc, argv); auto node = std::make_shared<rclcpp::Node>("teleop_node");- 使用
colcon替代catkin_make构建
构建命令对比:
# ROS1构建 catkin_make # ROS2构建 colcon build --symlink-install在完成第一个ROS2 Demo后,建议尝试用ros2 pkg create创建新包,体验现代化的构建流程。将原本需要roscore的架构改造为去中心化设计时,最大的惊喜是发现节点间通信变得如此 resilient——即使任意节点崩溃,其他通信对仍能继续工作。这种架构韧性正是产品级应用所需要的。