Ubuntu 24.04双ROS环境实战:从Python冲突到无缝切换的完整指南
1. 为什么需要双ROS环境在机器人开发领域ROS1和ROS2的共存需求越来越普遍。很多老牌机器人公司积累了大量的ROS1代码库而新项目又希望使用ROS2的新特性。我去年接手的一个仓储机器人项目就面临这种情况——导航栈基于ROS1 Noetic而新开发的机械臂控制模块需要使用ROS2 Iron的实时特性。Ubuntu 24.04作为最新的LTS版本默认Python版本已经升级到3.12这给ROS1 Noetic的安装带来了挑战。Noetic官方仅支持到Python 3.8直接安装会出现各种兼容性问题。实测下来最常见的报错就是ImportError: No module named rospkg这其实就是Python环境混乱导致的。2. 系统准备与基础配置2.1 系统更新与依赖安装在开始之前建议先做一个完整的系统更新。我在多次安装过程中发现跳过这步有时会导致奇怪的依赖冲突sudo apt update sudo apt upgrade -y接下来安装基础编译工具链。这里有个小技巧如果你打算用Docker方案可以跳过python3-dev的安装因为容器内会自带所需环境sudo apt install -y \ build-essential \ cmake \ git \ wget \ python3-pip \ python3-vcstool \ python3-colcon-common-extensions \ dirmngr \ gnupg2 \ lsb-release2.2 Python多版本管理由于ROS1需要Python 3.8我们需要先安装它。这里推荐使用update-alternatives来管理多个Python版本而不是直接修改默认Python解释器sudo apt install -y python3.8 python3.8-dev sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.12 2切换Python版本时使用以下命令记得选择后验证版本sudo update-alternatives --config python3 python3 --version3. ROS1 Noetic的安装方案3.1 官方源安装不推荐虽然官方源安装最简单但在Ubuntu 24.04上直接安装Noetic会遇到问题sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list wget https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -O - | sudo apt-key add - sudo apt update sudo apt install -y ros-noetic-desktop-full这个方法大概率会报Unable to locate package ros-noetic-*错误因为Ubuntu 24.04的仓库还不支持Noetic。3.2 手动编译方案推荐我更推荐手动编译的方式虽然耗时较长大约1-2小时但兼容性最好。首先创建一个工作空间mkdir -p ~/ros1_ws/src cd ~/ros1_ws/src然后克隆Noetic源码。这里有个加速技巧可以使用国内镜像源git clone https://gitee.com/mirrors/ros.git -b noetic cd ..编译前确保Python版本是3.8然后开始编译catkin_make -DPYTHON_EXECUTABLE/usr/bin/python3.8 source devel/setup.bash编译完成后建议运行一个简单测试roscore # 后台运行 rosrun roscpp_tutorials talker4. ROS2 Iron的安装4.1 官方源安装ROS2 Iron是Ubuntu 24.04的官方支持版本安装相对简单sudo apt install -y software-properties-common sudo add-apt-repository -y deb [archamd64] http://packages.ros.org/ros2/ubuntu $(lsb_release -sc) main sudo apt update sudo apt install -y ros-iron-desktop-full4.2 环境配置安装完成后需要初始化rosdep这个步骤有时会因为网络问题失败sudo rosdep init rosdep update如果遇到超时可以尝试修改hosts文件或者使用代理注意此处不涉及任何敏感内容。5. 环境隔离方案对比5.1 虚拟环境方案Python虚拟环境是最轻量级的隔离方案。我通常会在家目录下创建两个独立环境python3.8 -m venv ~/ros1_venv source ~/ros1_venv/bin/activate pip install rospkg catkin_pkg rosdep对于ROS2环境使用系统Python即可因为Iron原生支持Python 3.12。5.2 Docker容器方案如果追求完全隔离Docker是最彻底的方案。这是我常用的ROS1 Noetic容器启动命令docker run -it --networkhost --privileged \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e DISPLAY$DISPLAY \ osrf/ros:noetic-desktop-full对于ROS2 Iron官方也提供了对应镜像docker run -it --networkhost --privileged \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e DISPLAY$DISPLAY \ osrf/ros:iron-desktop6. 一键切换技巧6.1 Bash别名配置在~/.bashrc中添加以下内容可以快速切换环境alias ros1envsource ~/ros1_venv/bin/activate source ~/ros1_ws/devel/setup.bash alias ros2envsource /opt/ros/iron/setup.bash6.2 自动补全优化为了让不同环境的自动补全正常工作需要单独配置complete -F _roscomplete_roscore roscore complete -F _roscomplete rosrun7. 实战问题排查7.1 Python包冲突最常见的错误是Python包版本冲突。我的经验是每次切换环境后先运行pip list | grep rospkg确保rospkg的版本与当前ROS版本匹配。如果发现问题可以强制重装pip install --force-reinstall rospkg catkin_pkg7.2 通信桥接配置当需要ROS1和ROS2通信时ros1_bridge是关键。编译时要注意source /opt/ros/noetic/setup.bash source /opt/ros/iron/setup.bash mkdir -p ~/bridge_ws/src cd ~/bridge_ws/src git clone https://github.com/ros2/ros1_bridge.git cd .. colcon build --symlink-install --packages-select ros1_bridge8. 开发工作流建议经过多个项目的实践我总结出一套高效的工作流程日常开发使用虚拟环境方案快速切换持续集成(CI)使用Docker方案保证环境纯净关键模块测试时同时运行两个终端分别加载不同环境使用VS Code的Workspace功能为不同项目保存独立的环境配置对于大型项目我还会在项目根目录放置setup_env.sh脚本新成员克隆仓库后只需运行source setup_env.sh这个脚本会自动检测并配置所需环境大大降低了团队协作的成本。