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 [arch=amd64] 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 --network=host --privileged \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e DISPLAY=$DISPLAY \ osrf/ros:noetic-desktop-full对于ROS2 Iron,官方也提供了对应镜像:
docker run -it --network=host --privileged \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e DISPLAY=$DISPLAY \ osrf/ros:iron-desktop6. 一键切换技巧
6.1 Bash别名配置
在~/.bashrc中添加以下内容,可以快速切换环境:
alias ros1env='source ~/ros1_venv/bin/activate && source ~/ros1_ws/devel/setup.bash' alias ros2env='source /opt/ros/iron/setup.bash'6.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这个脚本会自动检测并配置所需环境,大大降低了团队协作的成本。