告别roscore!从ROS1到ROS2,手把手教你用Ubuntu 20.04安装Galactic版本(附环境配置与首个Demo)
从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_ALLen_US.UTF-8 LANGen_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秒按CtrlC可优雅终止节点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对应命令变化说明节点管理rosnoderos2 node改为子命令模式话题查看rostopicros2 topic功能基本一致服务调用rosserviceros2 service新增类型检查参数管理rosparamros2 param支持动态修改启动文件roslaunchros2 launch语法有较大变化常用诊断命令示例# 查看节点列表 ros2 node list # 监视话题频率 ros2 topic hz /chatter # 图形化节点关系 rqt_graph7. 深入理解DDS通信配置ROS2允许通过QoS策略精细控制通信行为。查看默认QoS配置ros2 topic info /chatter --verbose典型QoS配置示例Python APIfrom rclpy.qos import QoSProfile, QoSReliabilityPolicy # 配置可靠通信类似TCP qos_reliable QoSProfile( depth10, reliabilityQoSReliabilityPolicy.RELIABLE ) # 配置尽力而为通信类似UDP qos_best_effort QoSProfile( depth10, reliabilityQoSReliabilityPolicy.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_sharedrclcpp::Node(teleop_node);使用colcon替代catkin_make构建构建命令对比# ROS1构建 catkin_make # ROS2构建 colcon build --symlink-install在完成第一个ROS2 Demo后建议尝试用ros2 pkg create创建新包体验现代化的构建流程。将原本需要roscore的架构改造为去中心化设计时最大的惊喜是发现节点间通信变得如此 resilient——即使任意节点崩溃其他通信对仍能继续工作。这种架构韧性正是产品级应用所需要的。