Ubuntu 20.04上ROS1和ROS2双版本共存:一个脚本搞定环境切换(附完整.bashrc配置)
Ubuntu 20.04上ROS1与ROS2双版本智能切换方案
在机器人开发领域,ROS1和ROS2的并行使用已成为许多开发者的日常需求。Ubuntu 20.04作为长期支持版本,同时支持ROS Noetic(ROS1的最终版)和ROS Foxy(ROS2的稳定版),这为开发者提供了绝佳的测试和迁移环境。然而,频繁手动切换两个版本的环境变量不仅效率低下,还容易引发配置错误。本文将介绍一种优雅的解决方案——通过智能脚本实现一键切换,让开发工作流更加顺畅。
1. 环境准备与基础配置
在开始配置双版本共存环境前,需要确保系统已正确安装ROS1 Noetic和ROS2 Foxy。以下是基础检查步骤:
验证ROS1安装:
source /opt/ros/noetic/setup.bash roscore &正常启动ROS Master服务表明ROS1安装成功。
验证ROS2安装:
source /opt/ros/foxy/setup.bash ros2 topic list无错误输出表明ROS2环境正常。
关键目录结构:
/opt/ros/ ├── noetic/ # ROS1核心安装目录 ├── foxy/ # ROS2核心安装目录 ~/ ├── catkin_ws/ # ROS1工作空间(可选) └── colcon_ws/ # ROS2工作空间(可选)
提示:建议在配置前备份原有
~/.bashrc文件,执行cp ~/.bashrc ~/.bashrc.bak。
2. 智能切换脚本设计原理
传统方法需要手动注释/取消注释.bashrc中的环境变量行,而我们的解决方案通过交互式脚本自动完成这一过程。核心设计思路如下:
- 用户友好交互:终端启动时提示选择ROS版本
- 环境隔离:确保每次只加载一个ROS版本的环境
- 可扩展性:支持后续添加更多ROS版本或工作空间
基础脚本逻辑结构:
显示版本选择菜单 → 用户输入选择 → 加载对应环境 → 设置提示符标识3. 完整实现方案
将以下代码添加到~/.bashrc文件末尾,实现开箱即用的切换功能:
# ROS版本选择器 - 自动生成 function select_ros_version() { echo "请选择要使用的ROS版本:" echo " 1) ROS1 Noetic" echo " 2) ROS2 Foxy" echo -n "输入数字选择 (1/2): " read ros_edition # 清除所有现有ROS环境变量 unset ROS_DISTRO unset ROS_VERSION unset ROS_PACKAGE_PATH unset ROS_ETC_DIR case $ros_edition in 1) source /opt/ros/noetic/setup.bash [[ -f "$HOME/catkin_ws/devel/setup.bash" ]] && source "$HOME/catkin_ws/devel/setup.bash" export PS1="\[\e[32m\][ROS1]\[\e[0m\] ${PS1}" echo "已切换到 ROS1 Noetic 环境" ;; 2) source /opt/ros/foxy/setup.bash [[ -f "$HOME/colcon_ws/install/local_setup.sh" ]] && source "$HOME/colcon_ws/install/local_setup.sh" export PS1="\[\e[34m\][ROS2]\[\e[0m\] ${PS1}" echo "已切换到 ROS2 Foxy 环境" ;; *) echo "无效选择,保持环境不变" ;; esac } # 首次启动时自动调用 select_ros_version3.1 脚本功能增强
对于需要更复杂工作环境的开发者,可以扩展脚本功能:
多工作空间支持:
# 在ROS1 case块中添加: [[ -f "$HOME/catkin_ws2/devel/setup.bash" ]] && source "$HOME/catkin_ws2/devel/setup.bash" # 在ROS2 case块中添加: [[ -f "$HOME/colcon_ws2/install/local_setup.sh" ]] && source "$HOME/colcon_ws2/install/local_setup.sh"环境变量持久化:
# 添加以下函数来记忆上次选择 function persist_ros_selection() { echo "export LAST_ROS_EDITION=$ros_edition" >> ~/.ros_version } # 在select_ros_version末尾调用 persist_ros_selection自动化测试:
# 验证环境切换是否成功 function verify_ros_env() { if [[ $ros_edition -eq 1 ]]; then rosnode list &>/dev/null && echo "ROS1环境验证成功" || echo "ROS1环境异常" else ros2 topic list &>/dev/null && echo "ROS2环境验证成功" || echo "ROS2环境异常" fi }
4. 高级配置与优化
4.1 终端提示符定制
通过修改PS1环境变量,可以直观显示当前ROS版本:
# 更醒目的提示符方案 export BASE_PS1="${PS1}" export ROS1_PS1="\[\e[32m\][ROS1]\[\e[0m\] ${BASE_PS1}" export ROS2_PS1="\[\e[34m\][ROS2]\[\e[0m\] ${BASE_PS1}" # 在切换函数中相应修改 export PS1="$ROS1_PS1" # ROS1 case export PS1="$ROS2_PS1" # ROS2 case4.2 性能优化方案
频繁加载环境变量可能影响终端启动速度,可以采用以下优化策略:
| 优化方法 | 实现方式 | 优点 | 缺点 |
|---|---|---|---|
| 懒加载 | 将source命令移至函数中按需调用 | 启动快 | 首次使用需要等待 |
| 缓存机制 | 将环境变量保存到临时文件 | 二次启动快 | 需要维护缓存 |
| 后台加载 | 使用子进程预加载环境 | 用户体验好 | 实现复杂 |
推荐懒加载实现示例:
function ros1_env() { source /opt/ros/noetic/setup.bash source ~/catkin_ws/devel/setup.bash export PS1="$ROS1_PS1" } function ros2_env() { source /opt/ros/foxy/setup.bash source ~/colcon_ws/install/local_setup.sh export PS1="$ROS2_PS1" }4.3 错误处理与调试
完善的错误处理机制能显著提升使用体验:
# 增强的错误检查 function safe_source() { if [[ -f "$1" ]]; then source "$1" else echo "警告: 文件 $1 不存在,跳过加载" fi } # 修改脚本中的source命令为 safe_source "/opt/ros/noetic/setup.bash"常见问题排查表:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 选择后无变化 | .bashrc未重新加载 | 执行source ~/.bashrc |
| 提示命令不存在 | 路径未正确设置 | 检查安装目录是否存在 |
| 切换后功能异常 | 环境变量冲突 | 重启终端或添加unset语句 |
5. 实际工作流集成
5.1 CI/CD管道适配
在自动化构建环境中,可以通过非交互模式调用脚本:
# 在CI脚本中强制使用特定版本 echo "1" | select_ros_version >/dev/null # 强制使用ROS15.2 多项目管理策略
针对同时涉及ROS1和ROS2的项目,推荐以下目录结构:
~/projects/ ├── ros1_ws/ # ROS1项目 ├── ros2_ws/ # ROS2项目 └── hybrid_ws/ # 混合项目配套的切换脚本增强版:
function select_project() { case $1 in ros1) select_ros_version 1 cd ~/projects/ros1_ws ;; ros2) select_ros_version 2 cd ~/projects/ros2_ws ;; *) echo "可用项目: ros1, ros2" ;; esac }5.3 IDE环境配置
主流IDE如VSCode和CLion的配置建议:
VSCode配置:
{ "terminal.integrated.env.linux": { "ROS_VERSION": "1", // 或 "2" "ROS_DISTRO": "noetic" // 或 "foxy" } }CLion配置:
- 在CMake配置中添加环境变量
- 使用不同的Toolchain对应不同ROS版本
6. 扩展应用场景
6.1 多版本并行测试
脚本可扩展支持更多ROS版本,如:
echo "请选择ROS版本:" echo " 1) ROS1 Noetic" echo " 2) ROS2 Foxy" echo " 3) ROS2 Humble" echo -n "输入选择 (1/2/3): "6.2 团队协作方案
将配置脚本版本化,便于团队统一环境:
- 创建团队共享的
.ros_env文件 - 在个人
.bashrc中引入共享配置[[ -f "/team/shared/.ros_env" ]] && source "/team/shared/.ros_env"
6.3 容器化部署
在Docker环境中使用类似方案:
# Dockerfile示例 COPY ros_selector.sh /etc/profile.d/ RUN echo "source /etc/profile.d/ros_selector.sh" >> /root/.bashrc配套的容器启动命令:
docker run -it --env ROS_EDITION=2 my_ros_image