在Ubuntu 20.04实现ROS1 Noetic 与 ROS2 Foxy 多版本共存及切换

  1. 系统准备

首先,确保Ubuntu 20.04系统已经更新并且安装了必要依赖项:

$ sudo apt update && sudo apt upgrade -y

///sudo apt install -y software-properties-common

///sudo add-apt-repository universe

  1. 安装ROS1 Noetic

ROS1具体安装过程简单,忽略。

  1. 安装ROS2 Foxy

-1-更新系统并安装基础工具

$ sudo apt update && sudo apt install curl gnupg lsb-release

-2-添加ROS2 GPG密钥

///$ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

国内推荐清华大学镜像源:

$ sudo curl -sSL https://mirrors.tuna.tsinghua.edu.cn/rosdistro/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

-3-添加ROS2软件源

/// echo "deb \[arch=(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

国内推荐清华大学镜像:

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/null

-4-验证文件是否创建

$ cat /etc/apt/sources.list.d/ros2.list

-5-初始化rosdep

rosdep 是一个独立的Python工具用于安装ROS包的依赖项,无论ROS1还是ROS2都使用同一个rosdep工具。如果之前已经为ROS1 Noetic运行过 sudo rosdep init那么系统级的配置文件已经存在,不需要再次运行。由于这个sudo rosdep init 命令在系统中只能执行一次因此如果再次执行会报错:ERROR: cannot download default sources list from: ...

///$ sudo rosdep init

不过rosdep update 是需要定期运行,特别是在安装新的ROS版本之前。因为上面rosdep init 只是创建了一个本地配置文件,而rosdep update 才会从ROS仓库(包括ROS2仓库)下载最新依赖数据库。所以安装ROS2之前需要运行 rosdep update 将Foxy的依赖信息添加到本地缓存。

$ rosdep update

-6-刷新系统的包列表

$ sudo apt update

-7-安装ROS2 Foxy

$ sudo apt install -y ros-foxy-desktop

-8-安装开发工具

$ sudo apt install -y python3-colcon-common-extensions /// python3-rosdep2

  1. 配置环境变量

注意不要在 .bashrc 里 source 任意一个 setup.bash,这会导致PATH变量混乱、Python路径冲突、命令执行带有不确定性。如果 .bashrc 里已经有了那一个source、则注释掉。

-1-我们通过以下这个 .ros_dual_env 脚本实现多版本ROS的切换。

$ vi ~/.ros_dual_env

#!/bin/bash

ROS双版本环境配置

alias ros_1='unset ROS_VERSION ROS_DISTRO; source /opt/ros/noetic/setup.bash; export ROS_VERSION=1; echo "Switched to ROS1 Noetic"'

alias ros_2='unset ROS_VERSION ROS_DISTRO; source /opt/ros/foxy/setup.bash; export ROS_VERSION=2; echo "Switched to ROS2 Foxy"'

alias ros_dual='unset ROS_VERSION ROS_DISTRO; source /opt/ros/noetic/setup.bash; source /opt/ros/foxy/setup.bash; source ~/bridge_ws/install/setup.bash; export ROS_VERSION=mixed; echo "Switched to ROS1+ROS2 mixed environment (for ros1_bridge only)"'

alias ros_dual='unset ROS_VERSION ROS_DISTRO; source ~/bridge_ws/install/setup.bash; export ROS_VERSION=mixed; echo "Switched to ROS1+ROS2 mixed environment (for ros1_bridge only)"'

提示信息

echo "ROS环境辅助命令已加载:"

echo " ros_1 - 切换到ROS1 Noetic环境"

echo " ros_2 - 切换到ROS2 Foxy环境"

echo " ros_dual - 同时加载两个环境(仅仅用于ros1_bridge、请勿在该环境下运行普通节点)"

-2-提升权限

$ chmod 744 ~/.ros_dual_env

-3-打开.bashrc,在后面添加脚本

$ vi .bashrc

ROS双版本环境配置

if [ -f ~/.ros_dual_env ]; then

. ~/.ros_dual_env

fi

  1. 验证多版本效果

可以通过以下命令验证ROS1和ROS2是否成功安装:

-1-验证ROS1

source /opt/ros/noetic/setup.bash

rosversion -d # 应该输出 "noetic"

printenv ROS_DISTRO # 应该输出 "noetic"

which rosrun # 应输出 /opt/ros/noetic/bin/rosrun

which ros2 # 应输出 空(未找到)

-2-验证ROS2

source /opt/ros/foxy/setup.bash

ros2 version # 应该显示 "client 2.x.x"

printenv ROS_DISTRO # 应该输出 "foxy"

which ros2 # 应输出 /opt/ros/foxy/bin/ros2

which rosrun # 应输出 空(未找到)

  1. 实际使用ROS1和ROS2

可以通过前面定义的alias来选择ROS环境:

使用ROS1时,执行:ros1

使用ROS2时,执行:ros2

需要同时使用两个环境(例如编译ros1_bridge)时,执行:ros_dual

  1. 注意点

工作空间需要分开,例如建立三个空间:

ROS1工作空间

$ mkdir -p ~/ros1_ws/src

ROS2工作空间

$ mkdir -p ~/ros2_ws/src

混合工作空间(用于源代码安装ros1_bridge)

$ mkdir -p ~/bridge_ws/src

以下说明安装bridge过程。在 ~/bridge_ws/src 中应该有 ros1_bridge 的源代码,克隆Foxy分支

-1-跳转目录

$ ros_dual # 加载混合环境

$ cd ~/bridge_ws/src

-2-获取必要的 ROS2接口定义

git clone https://github.com/ros2/ros1_bridge.git -b foxy

克隆示例接口(非必须,用于测试)

git clone https://github.com/ros2/example_interfaces.git

克隆通用接口(包含许多标准消息类型)

git clone https://github.com/ros2/common_interfaces.git -b foxy

-3-编译

$ cd ~/bridge_ws

使用colcon编译(必须指定Release模式)

///$ colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release

或者可以更具体的只编译ros1_bridge包:

$ colcon build --packages-select ros1_bridge --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release

编译时间较长:首次编译需要20分钟。

ros1_bridge关键点在于它本身是ROS2的软件包,但安装过程不依赖任何ROS环境:无论二进制安装还是源代码安装,都不需要source;但是使用前必须同时加载ROS1和ROS2环境。

-4-测试 ros1_bridge

终端1 - 启动ROS 1核心:

$ ros_1

$ roscore

终端2 - 启动ROS 2 Daemon:

$ ros_2

终端3 - 启动ros1_bridge并测试:

$ ros_dual

$ ros2 run ros1_bridge dynamic_bridge --bridge-all-topics #运行动态桥接(桥接所有话题)

///$ ros2 run ros1_bridge dynamic_bridge #或者运行特定消息类型的桥接(更稳定)

-5-验证桥接是否工作

终端4 - ROS 2发布消息:

$ ros2

$ ros2 topic pub /chatter std_msgs/String "data: 'Hello from ROS2'"

终端5 - ROS 1接收消息:

$ ros1

$ rostopic echo /chatter

应该能在ROS 1终端看到来自ROS 2的消息。

8.ros1_bridge 的编译说明

-1-ros1_bridge 只是 ROS2 侧的包,不是 ROS1 / ROS2 都有一份。如果二进制安装只要:

$ sudo apt install ros-foxy-ros1-bridge

但是二进制安装仅支原生的几种有限的格式,如果已经有了很多自己定义的msg、service,就需要7.2那样源代码编译安装。

-2-编译 bridge_ws 工程时,必须用colcon build(ROS2 编译工具),且指定 cmake 参数:

$ ros_dual # 先加载混合环境

$ cd ~/bridge_ws

$ colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release --symlink-install

-3-ros1_bridge 的一些限制:

A. 运行 bridge 时必须先启动 ROS1 的roscore、再启动 ROS2 的/opt/ros/foxy/bin/ros2 daemon start、最后启动 bridge 节点。前述例中当首次执行 ros2 命令时DDS的发现机制会自动启动并不总是需要手动运行 daemon start。

B. 这个bridg仅支持特定消息类型例如std_msgs、sensor_msgs,自定义消息需先在 ROS1/ROS2 分别编译,再重新编译 bridge,总是需要三次编译哈。

也就是如果希望:不改代码、不重新编译、不整理消息包,那bridge 基本帮不上忙。因为能桥接的前提条件(缺一不可)是:消息/服务在 ROS1 中存在、同名消息/服务在 ROS2 中存在、字段名、字段类型、顺序完全一致、在编译 ros1_bridge 时,两侧都已被 colcon / catkin 正确识别。也就是ros1_bridge 可以桥接自己已经积累多年的自定义 topic / service,但是前提是愿意为这些自定义付出一次系统性整理和重编译的成本。

-4-sudo 环境下的 ROS 路径问题:如果使用sudo执行 ROS 节点时,环境变量会丢失(sudo 默认清空 PATH),此时需要手动传递:

ROS1示例

$ ros1

sudo -E env "PATH=PATH" rosrun xxx xxx_node

ROS2示例

$ ros2

sudo -E env "PATH=PATH" ros2 run xxx xxx_node

相关推荐
运维小斌3 小时前
ubuntu22.04.5配置ip并使用远程工具连接
linux·运维·网络·ubuntu
HIT_Weston3 小时前
74、【Ubuntu】【Hugo】搭建私人博客:VSCode 插件&配置
linux·vscode·ubuntu
石像鬼₧魂石18 小时前
HexStrike AI 理想操作流程清单(完整功能版)
linux·人工智能·windows·学习·ubuntu
春日见19 小时前
眼在手上外参标定保姆级教学(vscode + opencv)
linux·运维·服务器·数码相机·opencv·ubuntu·3d
飘忽不定的bug21 小时前
ubuntu22.04部署ROS2-humble
linux·ubuntu·ros2
stay_cloud1 天前
ubuntu UNEXPECTED INCONSYSTENCY问题解决记录
ubuntu
知识分享小能手1 天前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04的远程登录(6)
linux·学习·ubuntu
世转神风-1 天前
Ubuntu 24.04-国内镜像源替换
linux·ubuntu