当前位置: 首页 > news >正文

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

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" ];thensource /opt/ros/melodic/setup.bashecho using ros melodic
elsesource /opt/ros/dashing/setup.bashecho 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 mynodeDESTINATION 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 python3import rclpy
from rclpy.node import Nodedef 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的版本

python3import 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.pyentry_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),使用零拷贝的方式来传递消息,这大大节省了内存和传输所占用的资源,提高了通信的实时性。 

相关文章:

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

1、概述 我们在前面介绍的ROS&#xff0c;都是ROS1的版本&#xff0c;近期对机器狗进行学习的时候&#xff0c;发现版本是ROS2了&#xff0c;也发现平时习惯的一些命令都有了变化&#xff0c;改变还是挺大的&#xff0c;不过熟悉之后还是很习惯ROS2的写法。 ROS2不是在ROS1的基…...

基于单片机PM2.5监测系统仿真设计

**单片机设计介绍&#xff0c; 基于单片机PM2.5监测系统仿真设计 文章目录 一 概要简介设计目标系统组成工作流程仿真设计结论 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 # 基于单片机PM2.5监测系统仿真设计介绍 简介 PM2.5&#xff08;可吸…...

CRM系统中的联系人是什么?如何进行联系人管理?

上手CRM系统前掌握专业术语是必要的功课&#xff0c;在第一次使用CRM系统时小编和大家一样&#xff0c;分不清楚线索、联系人、客户、商机之间的关系&#xff0c;今天我们就来着重分享一下CRM中联系人是什么&#xff1f;如何进行联系人管理&#xff1f; CRM系统联系人是指能够…...

uniapp:如何实现点击图片可以全屏展示预览

这个需要使用uniapp中的api&#xff1a;uni.previewImage&#xff0c;使用方法如下 1、html <template><view><image src"图片路径" click"preview"></image></view> </template> 2、JavaScript <script> e…...

python运行hhsearch二进制命令的包装器类

hhsearch 是 HMM-HMM&#xff08;Hidden Markov Model to Hidden Markov Model&#xff09;比对方法的一部分&#xff0c;属于 HMMER 软件套件。它用于进行蛋白质序列的高效比对&#xff0c;特别适用于检测远缘同源性。 以下是 hhsearch 的一些主要特点和用途&#xff1a; HMM…...

Java 网络编程、e-mail、多线程编程

一、Java 网络编程&#xff1a; 网络编程时指编写运行在多个设备的程序&#xff0c;这些设备通过网络连接起来。 Java.net包中的J2SE的API包含有类和接口&#xff0c;提供低层次的通信细节。 java.net 包中提供了两种常见的网络协议的支持&#xff1a; TCP&#xff1a;TCP&…...

为虚幻引擎开发者准备的Unity指南

目录 1.前言2.编辑器2.1 Scene 视图&#xff08;视口&#xff09;2.2 Game 视图 (Play in Editor)2.3.Hierarchy 窗口 (World Outliner)2.4 Project 窗口(Content Browser)2.5 Inspector (Details)2.6 Console&#xff08;消息视图/输出日志&#xff09;2.7 Modes 面板在哪里&a…...

Vue 2使用element ui 表格不显示

直接修改package.json文件 把这两个依赖修改成对应的 删除node_modules 重新安装依赖 重启...

C++学习 --文件

文件操作步骤&#xff1a; 1&#xff0c; 包含头文件#include<fstream> 2&#xff0c; 创建流对象&#xff1a;ofstream ofs 3&#xff0c; 打开文件&#xff1a;ofs.open("文件路径"&#xff0c; 打开方式) 4&#xff0c; 写数据&#xff1a;ofs <<…...

java/Android:将字符串按数量分割

分割成数组 import java.util.Arrays;/*** Java将字符串按照指定长度分割成字符串数组*/ public class StringUtils {public static void main(String[] args){String data "227d77a7a244c7b2be3180f2d46be352f56ddf92866692f2cac797358097e5a3e90f6d20bb96bc516a4ab9c0…...

JVM 监控命令详解

文章目录 JDK 中与常用命令行工具jpsjstatjinfojmap导出 dump 文件查看堆内存信息 jstack JVM 可视化分析工具 JDK 中与常用命令行工具 jps 查看当前服务器正在执行的 Java 进程 $> jps 7584 Application 16433 AdminApplication 14209 Jps 5813 Bootstrap 5575 TestApplic…...

TEE威胁评分与评级

目录 一、攻击潜力 1.1 攻击潜力网格 1、实际经过的时间: 2、访问TOE(目标设备)...

-bash: ./deploy.sh: /bin/bash^M: bad interpreter: No such file or directory

文章目录 场景解决 场景 jenkins 发布失败, 报错ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [126]], 这说明远程服务器的deploy.sh执行失败, 首先检查权限&#xff0c;没有发现问题&#xff0c;然后手动执行一遍又报错"-ba…...

【文末送书】十大排序算法C++代码实现

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…...

vue-waterfall2 实现瀑布流,及总结的问题

注意&#xff1a;引入需要在主界面引入&#xff0c;直接在组件中引用会有问题 1.安装 npm install vue-waterfall21.8.20 --save &#xff08;提示&#xff1a;一定要安装1.8.20&#xff0c;最新版会有一部分问题&#xff09; 2.打开main.js文件 import waterfall from v…...

grafana二次启动失败

背景 安装grafana后启动使用正常&#xff0c;但是关机后再启动显示启动失败&#xff0c;但是看日志又没有报错信息&#xff0c;但是就是启动不了 原因分析 其实是/var/lib/grafana/grafana.db文件损坏了&#xff0c;所以需要把这个文件删掉之后重新启动就正常了&#xff0c;…...

C/C++杂谈-printf的可变参数机制

C/C杂谈-printf的可变参数机制 文章目录 C/C杂谈-printf的可变参数机制printf的使用printf的源码源码剖析 多参数实现机制原理 C11引入了可变参数模板机制&#xff0c;对模板参数进行了高度泛化&#xff0c;但是对于可变参数其实C语言学习中早已遇到过&#xff0c;那就是printf…...

es基本语法 (kibana)

#添加 (不添加id默认会生成id) POST /cj/test {"name":"jack","sex":"1","age":12 } #添加 (id为第5个的) POST /cj/test/5 {"name":"jackson","sex":"1","age":12 } #条…...

Tesco EDI需求分析

Tesco&#xff0c;成立于1919年&#xff0c;是一家全球领先的综合性零售企业&#xff0c;总部位于英国。公司致力于提供高质量、多样化的商品和服务&#xff0c;以满足客户的需求。Tesco的使命是通过创新和卓越的客户服务&#xff0c;为客户创造更美好的生活。多年来&#xff0…...

html常用的标签

基本结构标签 <!DOCTYPE>&#xff1a; 定义 HTML 文档类型。<html>&#xff1a; HTML 文档的根元素。<head>&#xff1a; 文档的头部&#xff0c;包含了元数据和引用的外部资源。<title>&#xff1a; 定义网页标题&#xff0c;显示在浏览器标签上。&l…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...