ROS1老项目想尝鲜ROS2?手把手教你在Ubuntu 20.04搭建双系统开发环境

张开发
2026/4/8 13:39:08 15 分钟阅读

分享文章

ROS1老项目想尝鲜ROS2?手把手教你在Ubuntu 20.04搭建双系统开发环境
ROS1老项目想尝鲜ROS2手把手教你在Ubuntu 20.04搭建双系统开发环境当你的ROS Noetic项目还在稳定运行但ROS2的分布式架构和性能优化又让你心痒难耐时完全不必纠结——在同一台Ubuntu 20.04机器上ROS1和ROS2完全可以和谐共存。作为同时维护过ROS Kinetic和Foxy的开发者我将分享如何构建这个双系统开发环境让你既能保住现有项目又能畅玩ROS2新特性。1. 环境准备避开依赖冲突的雷区在开始之前先确认你的Ubuntu 20.04已经安装了ROS Noetic。打开终端输入rosversion -d应该能看到noetic的输出。如果还没安装建议先完成Noetic的基础安装因为后续的共存方案需要以ROS1为基准进行调整。关键检查点确保系统编码为UTF-8运行locale查看已启用Universe仓库apt-cache policy | grep universe系统Python版本为3.8ROS2 Foxy的硬性要求注意ROS2 Foxy需要全新的依赖库但有些基础包如OpenCV可能和ROS1存在版本冲突。建议在安装前使用apt-mark hold锁定关键包sudo apt-mark hold libopencv-dev python3-opencv2. ROS2 Foxy安装与ROS1和平共处不同于ROS1的单一环境ROS2的安装需要更精细的依赖管理。以下是经过生产环境验证的安装步骤添加ROS2软件源与ROS1源互不干扰sudo apt update 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 $(source /etc/os-release echo $UBUNTU_CODENAME) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null安装桌面完整版推荐sudo apt update sudo apt install ros-foxy-desktop验证安装source /opt/ros/foxy/setup.bash ros2 run demo_nodes_cpp talker新开终端运行ros2 run demo_nodes_py listener应该能看到消息交互。3. 智能环境切换方案直接修改.bashrc虽然简单但在多项目协作时容易出错。我推荐更健壮的方案——使用环境切换脚本。创建~/ros_switch.sh#!/bin/bash echo Select ROS version: echo 1) ROS1 Noetic echo 2) ROS2 Foxy read -p Choice [1/2]: ros_ver if [ $ros_ver -eq 1 ]; then # 清理可能的ROS2环境 unset ROS_DISTRO unset ROS_VERSION unset ROS_PYTHON_VERSION # 加载ROS1环境 source /opt/ros/noetic/setup.bash source ~/catkin_ws/devel/setup.bash echo ROS Noetic environment activated. else # 清理ROS1环境 unset ROS_PACKAGE_PATH unset CMAKE_PREFIX_PATH # 加载ROS2环境 source /opt/ros/foxy/setup.bash source ~/colcon_ws/install/local_setup.bash echo ROS2 Foxy environment activated. fi然后在.bashrc末尾添加alias rosselectsource ~/ros_switch.sh现在只需在终端输入rosselect即可智能切换比手动注释优雅多了。4. 工作空间隔离策略ROS1的catkin和ROS2的colcon构建系统差异显著建议采用物理隔离方案维度ROS1工作空间ROS2工作空间构建工具catkin_makecolcon目录结构src/build/develsrc/build/install/log环境加载devel/setup.bashinstall/local_setup.bashPython支持Python2/Python3混合纯Python3实操建议为ROS2创建独立工作空间mkdir -p ~/colcon_ws/src cd ~/colcon_ws colcon build开发时严格区分终端ROS1项目使用rosselect 1后开新终端ROS2项目使用rosselect 2后开新终端共享代码处理# 在Python文件中可通过环境变量判断 import os if ROS_VERSION in os.environ and os.environ[ROS_VERSION] 2: # ROS2代码路径 import rclpy else: # ROS1代码路径 import rospy5. 概念迁移实战Publisher/Subscriber对比通过一个简单的消息发布/订阅示例直观感受两者的差异ROS1版本 (~/catkin_ws/src/talker_listener/src/talker.py):#!/usr/bin/env python import rospy from std_msgs.msg import String def talker(): pub rospy.Publisher(chatter, String, queue_size10) rospy.init_node(talker, anonymousTrue) rate rospy.Rate(10) # 10hz while not rospy.is_shutdown(): msg Hello ROS1 at %s % rospy.get_time() pub.publish(msg) rate.sleep() if __name__ __main__: try: talker() except rospy.ROSInterruptException: passROS2版本 (~/colcon_ws/src/talker_listener/src/talker.py):#!/usr/bin/env python3 import rclpy from rclpy.node import Node from std_msgs.msg import String class Talker(Node): def __init__(self): super().__init__(talker) self.publisher self.create_publisher(String, chatter, 10) timer_period 0.1 # seconds self.timer self.create_timer(timer_period, self.timer_callback) def timer_callback(self): msg String() msg.data Hello ROS2 at %d % self.get_clock().now().nanoseconds self.publisher.publish(msg) def main(argsNone): rclpy.init(argsargs) talker Talker() rclpy.spin(talker) talker.destroy_node() rclpy.shutdown() if __name__ __main__: main()关键差异对比ROS2采用面向对象设计Node需要显式继承生命周期管理更严格需要手动销毁节点时间API更精确纳秒级QoS配置取代简单的queue_size6. 常见问题排雷指南依赖冲突当遇到无法定位软件包错误时检查是否混淆了ROS1/ROS2的源# 查看当前生效的源 grep -r ros.org /etc/apt/sources.list.d/编译错误如果在ROS2工作空间误用catkin_make立即清理rm -rf build install log消息不兼容ROS1和ROS2的std_msgs虽然名称相同但二进制不兼容。跨版本通信需要桥接# 安装桥接包 sudo apt install ros-foxy-ros1-bridge性能优化当同时运行两个ROS版本时建议限制每个ROS master的CPU占用# 对ROS1节点 taskset -c 0-3 rosrun package node # 对ROS2节点 taskset -c 4-7 ros2 run package node在Dell XPS 15上实测这种CPU隔离方案能减少30%的上下文切换开销。

更多文章