在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

相关推荐
朝阳5811 天前
Ubuntu 22.04 安装 Fcitx5 中文输入法完整指南
linux·运维·ubuntu
永远在Debug的小殿下1 天前
wsl安装Ubuntu and ROS2
linux·运维·ubuntu
Ephemeral Memories1 天前
ubuntu安装软件失败以及运行闪退
linux·ubuntu
linweidong1 天前
在Ubuntu新版本安装gcc4.8等老版本环境
linux·运维·ubuntu
知识分享小能手1 天前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04 中安装 Docker 容器 —— 知识点详解(26)
学习·ubuntu·docker
老前端的功夫1 天前
TypeScript索引访问类型深度解析:类型系统的动态访问与模式匹配
前端·javascript·ubuntu·架构·typescript·前端框架
oMcLin1 天前
如何在Ubuntu 20.04上配置并调优Kubernetes集群,确保在多租户环境下的高可用性与资源分配?
linux·ubuntu·kubernetes
爱吃大芒果1 天前
openJiuwen(Windows端)大模型添加及AI Agent创建教程
人工智能·ubuntu·openjiuwen
云qq1 天前
x86操作系统23——进程相关系统调用
linux·c语言·汇编·ubuntu
`林中水滴`1 天前
Linux系列:Ubuntu 防火墙命令
linux·ubuntu