ROS2对比ROS1的一些变化与优势(全新安装ROS2以及编译错误处理)《1》

news2024/11/16 0:00:35

1、概述

我们在前面介绍的ROS,都是ROS1的版本,近期对机器狗进行学习的时候,发现版本是ROS2了,也发现平时习惯的一些命令都有了变化,改变还是挺大的,不过熟悉之后还是很习惯ROS2的写法。
ROS2不是在ROS1的基础上做的更新,而是重新构建的,这样避免ROS1的设计的很多不规范,尤其是在实时性,安全性等方面都满足不了现代工作的需求,而做一些底层修改又可能造成ROS1的不稳定,所以算是全新架构了。底层是用C语言编写,叫做RCL库(ROS客户端库Client Library,是一种API,提供ROS话题、服务、动作、参数等接口),在写上层程序中调用的rclcpprclpy是在RCL库上进行一次包装,这样带来的好处是让C++(默认使用cpp 11, cpp1A4,cpp17标准,比ROS1默认使用的cpp98标准更加现代化的)和Python(这里放弃了Python2,直接使用的是Python3)程序调用API更加统一相似,同时对ROS2进行功能更新时,直接更新RCL库,再新增C++和Python的支持。
虽然launch启动文件还是支持,不过在ROS2中建议使用Python文件写launch文件,更加的灵活。

2、历史版本 

我们先来看下ROS1有哪些历史版本: 

Ubuntu版本    ros版本
Ubuntu 20.04    noetic
Ubuntu18.04    melodic
Ubuntu16.04    kinetic
Ubuntu14.04    indigo

这个跟Ubuntu的版本对应着,到了ROS2的时候,基本每年都有新的版本发布,ROS2的历史版本列表:

Crystal: 2018年12月
Dashing: 2019年5月
Eloquent: 2019年11月
Foxy: 2020年6月
Galactic: 2021年5月 

本人的Ubuntu版本信息:lsb_release -a 

No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 20.04.4 LTS
Release:    20.04
Codename:    focal 

其余命令还有:cat /etc/issue 或者cat /etc/os-release或者cat /proc/version 

比如本人的ROS2版本:rosversion -d
foxy
或者:rosversion --distro
foxy 

3、命令变化 

命令也改变了,基本是将ros1中的rosxxx拆分成了ros2 xxx的形式,比如 rosrun 变成了 ros2 run,当然我们可以通过双击tab键来看提示是最好的,这个也是多次推荐的做法,如下图: 

可以看到这样的命令,个人感觉更合理了,每个单词都有其实际意义了,更加直观。 

我们来运行一个节点Demo看下效果,一个发布节点和一个订阅节点:

ros2 run demo_nodes_cpp talker
ros2 run demo_nodes_py listener

 截图如下:

这里运行上述两个节点之前,我并没有运行roscore,可以看到两个节点可以互相进行通信了,也就是说ROS2的去中心化设计让其适应更多工业应用和产品级应用场景的需求。
ROS1和ROS2可以并存于同⼀台电脑,你只需要source其对应的setup.bash即可完成环境的选择。
其余一些常见命令的变化如下:

编译指令,从 catkin_make 更改为 colcon build 
rosrun rqt_graph rqt_graph 更改为 rqt_graph
rosrun rqt_tf_tree rqt_tf_tree 更改为 ros2 run tf2_tools view_frames.py
rviz 更改为 rviz2

4、全新安装

本人安装环境:lsb_release -a 

No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 18.04.6 LTS
Release:    18.04
Codename:    bionic 

前面铺垫了一些ROS1到ROS2的部分变化,接下来我们来安装一个全新的ROS2,这样就会更加快速的熟悉它。

4.1、安装ROS2

首先更新软件库

sudo apt update
sudo apt upgrade

安装ROS2,推荐安装完整版

sudo apt install ros-foxy-desktop

如果不想安装完整版本,可以只安装核心软件包:sudo apt install ros-foxy-ros-base
不出意外的出了意外,报错如下:

E: Unable to locate package ros-foxy-desktop

所以需要指定软件安装源来安装:

sudo apt update && sudo apt install curl gnupg2 lsb-release
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo sh -c 'echo "deb [arch=$(dpkg --print-architecture)] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2-latest.list'

这里可以写死也可以获取变量值的写法:

dpkg --print-architecture ,本机:amd64

 lsb_release -c 可以给出自身的版本,本机: Codename:    bionic

写入之后,我们查看下源内容:cat /etc/apt/sources.list.d/ros2-latest.list

deb [arch=amd64,arm64] http://packages.ros.org/ros2/ubuntu bionic main

然后再次更新:sudo apt update

这里的Ubuntu18版本好像不能安装foxy?网上却很多安装成功的?这个暂时存疑,因为我也觉得这个ROS2应该跟Ubuntu版本没有对应关系了,那我们安装Dashing来体验下:

sudo apt install ros-dashing-desktop

安装好了之后,配置环境,追加到 ~/.bashrc,这样不需要每次source

echo "source /opt/ros/dashing/setup.bash" >> ~/.bashrc

由于本人在之前也安装了ROS1,所以我们在这里可以写一个判断,~/.bashrc文件追加如下内容:

echo "ROS melodic (1) or ROS2 dashing (2)?"
read edition
if [ "$edition" -eq "1" ];then
  source /opt/ros/melodic/setup.bash
  echo using ros melodic
else
  source /opt/ros/dashing/setup.bash
  echo using ros2 dashing
fi

这样就会在开启终端时,选择ROS1还是ROS2,输入1表示启动ROS1,输入2表示启动ROS2
如果启动ROS2时,出现下面警告:

ROS_DISTRO was set to 'melodic' before. Please make sure that the environment does not mix paths from different distributions.

翻译过来是,之前将ROS_DISTRO设置为“melodic”。请确保环境没有混合来自不同发行版的路径。
就将.bashrc里面的/opt/ros/melodic/setup.bash注释掉即可。 

如果双击tab键没有给出提示,需安装命令补全包:sudo apt install python3-argcomplete 

然后测试下,分别输入: 

ros2 run demo_nodes_cpp talker
ros2 run demo_nodes_py listener

ROS2安装之后测试没问题,如下图:

 一些常见的开发需要的包,自行按需选择安装: 

sudo apt install ros-dashing-turtlesim
sudo apt install ros-dashing-xacro
sudo apt install python3-pip
sudo apt install python3-colcon-common-extensions
sudo apt install python3-vcstool
sudo apt-get install ros-dashing-joint-state-publisher-gui

#卸载ROS2
sudo apt remove ros-dashing-* && sudo apt autoremove

4.2、安装Gazebo

Gazebo是一个强大的仿真平台,平时用的比较多,安装如下: 

sudo apt install ros-dashing-gazebo-ros-pkgs

导航相关的包

sudo apt install ros-dashing-cartographer
sudo apt install ros-dashing-cartographer-ros
sudo apt install ros-dashing-navigation2
sudo apt install ros-dashing-nav2-bringup 
sudo apt install ros-dashing-gazebo-ros2-control
sudo apt install ros-dashing-ros2-control ros-dashing-ros2-controllers

 4.3、编译

编译的过程相比ROS1,在ROS2中也发生了很大的改变,未来随着ROS1的慢慢淘汰,我们还是重点掌握ROS2的用法即可
创建工作空间

mkdir -p ~/myRobotDog_ws/src
cd ~/myRobotDog_ws/src

创建包(这里跟ROS1不一样)

ros2 pkg create --build-type ament_cmake mypkg --node-name mynode

同样会在mypkg这个包下面,生成以下目录与文件

CMakeLists.txt  include  package.xml  src

然后我们来看下节点mynode,在src里的一个c++文件:gedit mynode.cpp

#include <cstdio>

int main(int argc, char ** argv)
{
  (void) argc;
  (void) argv;

  printf("hello world mypkg package\n");
  return 0;
}

接下来就是编译,在编译之前确保已安装colcon编译器

​​​​​​​sudo apt install python3-colcon-common-extensions
cd ~/myRobotDog_ws
colcon build --symlink-install
echo 'source ~/myRobotDog_ws/install/setup.bash' >> ~/.bashrc

然后测试下

ros2 run mypkg mynode
#hello world mypkg package

如果想增加节点,修改CMakeLists.txt文件即可:

cd ~/myRobotDog_ws/src/mypkg
gedit CMakeLists.txt

新增即可:

add_executable(mynode src/mynode.cpp)
target_include_directories(mynode PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>)

install(TARGETS mynode
  DESTINATION lib/${PROJECT_NAME})

colcon的一些常用参数:

--symlink-install:使用符号链接比如,动态链接库,会在install目录中使用符号链接,指向build目录下生成的库文件(如 *.so),如果没有该选项,则两个目录都有该库文件。
--packages-select:只编译指定包,比如单独编译mypkg包:colcon build --packages-select mypkg
--packages-ignore: 忽略指定包,用法同上
--continue-on-error:编译出错继续编译其他模块
--cmake-args ,--ament-cmake-args, --catkin-cmake-args :传递参数给对应的package

最后需要注意的,ROS2在修改完任何文件后,需要重新编译 colcon build 

更多详情可以查阅:https://docs.ros.org/en/dashing/Installation/Ubuntu-Install-Debians.html 

5、编译Python 

对于Python的编译,有好几个点需要注意,以及一些配置文件的修改

mkdir -p ~/mypy_ws/src
cd ~/mypy_ws/src
ros2 pkg create --build-type ament_python my_py
cd ~/mypy_ws/src/my_py/my_py
touch PYNode.py
gedit PYNode.py
#!/usr/bin/env python3

import rclpy
from rclpy.node import Node

def main(args=None):
    rclpy.init(args=args)
    node = Node("ChyiChin_Node")
    node.get_logger().info("Python TEST")
    rclpy.spin(node)
    rclpy.shutdown()

if __name__ == '__main__':
    main()

加个可执行权限:chmod +x PYNode.py

cd ~/mypy_ws
colcon build --packages-select my_py
source install/setup.bash

运行ChyiChin_Node节点,看下能否正确输出日志信息:

ros2 run my_py ChyiChin_Node
[INFO] [ChyiChin_Node]: Python TEST

OK,没有问题,对C++和Python的编译就这么愉快的搞定了。接下来,将贴出在编译过程中遇到的一些错误,以及处理的方法

6、编译出错

6.1、setup.cfg

Usage of dash-separated 'script-dir' will not be supported in future version

短横线在未来版本不再支持,所以我们需要修改为下划线的形式:

cd ~/mypy_ws/src/my_py
gedit setup.cfg

将里面的script-dirinstall-scripts修改为script_dirinstall_scripts

6.2、Setuptools版本

SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.
  setuptools.SetuptoolsDeprecationWarning,

查看下setuptools的版本

python3

import setuptools
print(setuptools.__version__)
59.6.0

版本太新了,安装低版本的就可以了:

pip3 install setuptools==58.2.0 -i http://pypi.douban.com/simple/  --trusted-host pypi.douban.com

6.3、No executable found

ros2在运行python文件时,会报错:No executable found 

在前面的mypkg包里面,可以查询到所有可执行程序:ros2 pkg executables mypkg

mypkg mynode
mypkg mynode1 

然后在Python里面的my_py包,查询是空的:ros2 pkg executables my_py 

解决方案:在编译之前,需要修改setup.py,告知入口点位置,也就是Python文件的路径 

cd ~/mypy_ws/src/my_py
gedit setup.py

entry_points={
        'console_scripts': ["ChyiChin_Node=my_py.PYNode:main"],
    },

其中ChyiChin_Node为节点名称,my_py.PYNode为Python文件路径(包名.文件名),加:main入口函数

6.4、RuntimeError

RuntimeError: 'distutils.core.setup()' was never called -- perhaps 'setup.py' is not a Distutils setup script? 

翻译过来是:RuntimeError: ' Distutils .core.setup()'从未被调用-也许'setup.py'不是Distutils安装脚本?
这个属于运行时错误,所以需要一个rclpy的依赖,所以在创建包的时候,这样写即可:
ros2 pkg create my_py --build-type ament_python --dependencies rclpy
最后来看下运行Python写的这个节点

ros2 run my_pkg ChyiChin_Node

截图如下:

7、小结

ROS2的出现,让ROS真正成为了去中心化的分布式的操作系统,这个是其最主要的特点,因为在ROS1中,我们知道需要首先启动roscore,也就是MASTER管理节点,如果这个节点崩了,那整个ROS系统都崩了,这是一种不好的设计。
另外引入了数据分发服务通信协议(DDS),使用零拷贝的方式来传递消息,这大大节省了内存和传输所占用的资源,提高了通信的实时性。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1237184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM的公司仓库管理系统(有报告)。Javaee项目

演示视频&#xff1a; 基于SSM的公司仓库管理系统&#xff08;有报告&#xff09;。Javaee项目 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMvc …

Sulfo-CY5 DBCO的荧光特点、激发发射-星戈瑞

**Sulfo-CY5 DBCO是一种近红外荧光标记探针&#xff0c;具有以下荧光特点&#xff1a; 激发波长&#xff1a;**Sulfo-CY5 DBCO的激发波长位于近红外区域&#xff0c;通常在650-670纳米之间。近红外光在生物体内具有较好的组织穿透性&#xff0c;能够减少组织自发荧光的干扰&…

ArkTS声明式开发范式

装饰器 用来装饰类、结构体、方法以及变量&#xff0c;赋予其特殊的含义&#xff0c;如上述示例中 Entry 、 Component 、 State 都是装饰器。 Component 表示这是个自定义组件&#xff1b; Entry 则表示这是个入口组件&#xff1b; State 表示组件中的状态变量&#xff0c;…

MySql表中添加emoji表情

共五处需要修改。 语句执行修改&#xff1a; ALTER TABLE xxxxx CONVERT TO CHARACTER SET utf8mb4;

全志R128芯片RTOS调试指南

RTOS 调试指南 此文档介绍 FreeRTOS 系统方案支持的常用软件调试方法&#xff0c;帮助相关开发人员快速高效地进行软件调试&#xff0c;提高解决软件问题的效率。 栈回溯 栈回溯是指获取程序的调用链信息&#xff0c;通过栈回溯信息&#xff0c;能帮助开发者快速理清程序执行…

线性代数 - 几何原理

目录 序言向量的定义线性组合、张成空间与向量基线性变换和矩阵线性复合变换与矩阵乘法三维空间的线性变换行列式矩阵的秩和逆矩阵维度变换点乘叉乘基变换特征值和特征向量抽象向量空间 序言 欢迎阅读这篇关于线性代数的文章。在这里&#xff0c;我们将从一个全新的角度去探索线…

NX二次开发UF_CAM_PREF_ask_logical_value 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_PREF_ask_logical_value Defined in: uf_cam_prefs.h int UF_CAM_PREF_ask_logical_value(UF_CAM_PREF_t pref, logical * value ) overview 概述 This function provides …

DC电源模块检测故障步骤有哪些

BOSHIDA DC电源模块检测故障步骤有哪些 DC电源模块检测故障步骤如下&#xff1a; 1. 检查输入电压&#xff1a;用万用表测量输入电压&#xff0c;确保其在规定范围内。 2. 检查输出电压&#xff1a;用万用表或示波器测量输出电压&#xff0c;确保其在规定范围内。 3. 检查输…

HPC 集群计算类型的注意事项

HPC 集群计算类型的注意事项 HPC 工作负载在 CPU &#xff0c;内存&#xff0c;网络和存储资源需求方面有不同的要求。 您可以从以下内容开始: 核心计数每个核心的内存网络带宽和等待时间处理器时钟速度 目标是选取返回最佳性价比的计算配置。 HPC 工作负载可以与单个核心作…

markdown常用命令说明,自己常用的,用到其他的再添加

对于要标红的字体 <font color"red">标签中的字会显示为红色</font> 之后的字不会再显示为红色注意: <font color"red">或者<font colorred>或者<font colorred>三种写法都可以

汽车智能座舱/智能驾驶SOC -1

看到华为&小康的 AITO问界M6、M7各种广告营销、宣传、测评、好评如潮水般席卷网络各APP平台。翻看了中信和海通对特斯拉M3和比亚迪元的拆解报告&#xff0c;也好奇华为的汽车芯片平台又能做出哪些新花样&#xff0c;下面是Mark开头&#xff0c;也学习下智能座舱和智能驾驶芯…

Vatee万腾的数字化掌舵:Vatee科技解决方案的全面引领

随着数字化时代的到来&#xff0c;Vatee万腾凭借其卓越的科技实力和全面的解决方案&#xff0c;成功地在数字化探索的航程中掌舵引领。 首先&#xff0c;Vatee万腾以其强大的数字化科技实力成为行业的引领者。vatee万腾不仅在人工智能、大数据分析、云计算等前沿领域取得了显著…

数据集笔记:Pems 自行下载数据+python处理

以下载District 4的各station每5分钟的车速为例 1 PEMS网站下载数据 点击红色的 选择需要的station和区域&#xff0c;点击search&#xff0c;就是对应的数据&#xff0c;点击数据即可下载 &#xff08;这个是station每5分钟的速度数据&#xff09; 2 pems 速度数据 2.1 每一…

DDD之六边形架构(Hexagonal Architecture)

领域驱动设计系列文章&#xff0c;点击上方合集↑ 六边形架构&#xff08;Hexagonal Architecture&#xff09;&#xff0c;也被称为端口和适配器架构&#xff08;Ports and Adapters Architecture&#xff09;&#xff0c;是一种软件架构模式&#xff0c;用于构建可测试、可维…

Ajax基础(应用场景|jquery实现Ajax|注意事项|Ajax发送json数据|Ajax携带文件数据)

文章目录 一、Ajax简介二、基于jquery实现Ajax三、使用Ajax注意的问题1.Ajax不要与form表单同时提交2.后端响应格式问题3、使用了Ajax作为请求后的注意事项 四、前后端数据传输的编码格式(content-Type)1.urlencoded2.formdata3.application/json 五、Ajax携带文件数据六、Ajax…

稳定性保障8个锦囊,建议收藏!

稳定性保障&#xff0c;是一切技术工作的出发点和落脚点&#xff0c;也是 IT 工作最核心的价值体现&#xff0c;当然也是技术人员最容易“翻车”的阴沟。8个稳定性保障锦囊&#xff0c;分享给各位技术人员择机使用。 #1 设定可量化的、业务可理解的可用性目标 没有度量就没有改…

快来瞧瞧这样制作出来的电子画册,还便于分享宣传呢!

说起电子画册制作&#xff0c;很多人都不知道从何入手。与传统纸质画册相比&#xff0c;电子画册最大的优点是便于传阅&#xff0c;通过微信、QQ等社交平台都能进行转发和分享。而且内容的排版基本上和纸质画册一致&#xff0c;不同的是&#xff0c;无论图片还是文字都可以赋予…

【数据结构算法(二)】链表总结

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 普通单向链表 双向链表 带哨兵的链表 环形链表 ⭐双向带头带环链表的实现⭐ ⭐链表基础OJ⭐ 普通单向链表 结点结构&#xff1a;只有val 和 next指针 初始时&#xff1a;head null; 双向链表 指针&…

特征工程完整指南 - 第一部分

苏米特班迪帕迪亚 一、说明 特征工程是利用领域知识从原始数据中提取特征的过程。这些功能可用于提高机器学习算法的性能。本篇叙述在特征选择过程的若干数据处理。 一般来说&#xff0c;特征工程有以下子步骤&#xff1a; 特征转换特征构建特征选择特征提取 二、特征转换的缺…

12.文档中添加Appendix

要在 LaTeX 文档中添加附录&#xff0c;您可以使用 \appendix 命令&#xff0c;它会告诉 LaTeX 后续部分是附录。以下是添加附录的步骤&#xff1a; 在文档的导言部分&#xff08;在 \begin{document} 之前&#xff09;导入 appendix 宏包。您可以使用以下命令&#xff1a; \…