ROS中阶笔记(十一):ROS 2.0

本文深入探讨了ROS2.0的诞生背景、架构改进、通信模型与编译系统,对比了ROS1与ROS2的关键差异,并介绍了ROS2的安装步骤及与ROS1的集成方法。

ROS中阶笔记(十一):ROS 2.0

1 为什要有ROS 2

1.1 ROS 1的特点

image-20200526145001702

  • 独立的机器人(PR2)
  • 工作站级别的计算资源
  • 没有实时性的需求
  • 良好的网络连接
  • 主要应用于研究

1.2 ROS 1的困境

  • 多机器人系统——没有构建多机器人系统的标准方法
  • 跨平台——无法适用于windows、RTOS等系统
  • 实时性——缺少实时性方面的设计
  • 网络连接——需要良好的网络环境保证数据的完整性
  • 产品化——从科学研究到消费产品的过渡欠佳
  • 项目管理——无法胜任完整生命周期下项目管理

1.3 ROS 2的曙光

​ ROS已经走过十个年头,伴随着机器人技术的大发展,ROS也得到了极大的推广和应用。尽管ROS还存在不少局限性,但无法掩盖ROS的锋芒,社区内的功能包还是呈指数级逐年上涨,为机器人开发带来了巨大的便利。不少开发者和研究机构还针对ROS的局限性进行了改良,但这些局部功能的改善往往很难带来整体性能的提升,机器人开发者对新一-代ROS的呼声越来越大,ROS2.0的消息也不绝于耳。

​ 终于在ROSCon 2014上,正式公布了新一代ROS的设计架构(Next-generation ROS:Building on DDS),2015年8月 第一个ROS2.0的alpha版本落地,2016年12月19日,ROS2.0的beta版本正式发布,2017年12月8日,万众瞩目的ROS2.0终于发布了第一个正式版——Ardent Apalone。众多新技术和新概念应用到了新一代的ROS之中,不仅带来了整体架构的颠覆,更是增强了ROS2.0的综合性能。

1.4 ROS 2的版本进化

image-20200526142442803

1.5 ROS 2 VS ROS 1(重点)

1、架构的颠覆

  • ROS1的架构下,所有节点需要使用Master进行管理
  • ROS2使用基于DDS的Discovery机制,和Master说拜拜

2、API的重新设计

  • ROS1中的大部分代码都基于2009年2月设计的API
  • ROS2重新设计了用户API,但使用方法类似

3、编译系统的升级

  • ROS 1使用rosbuild、catkin管理项 目
  • ROS2使用升级版的ament

2 什么是ROS2

2.1 ROS 2的架构

image-20200526143637136

image-20200526145224127

2.2 DDS(ROS 2.0 的优势)

DDS,Data Distribution Service,即数据分发服务

  • 2004年由对象管理组织0MG(Object Management Group)发布
  • 专门为实时系统设计的数据分发/订阅标准
  • 最早应用于美国海军,解决舰船复杂网络环境中大量软件升级的兼容性问题,目前已经成为美国国防部的强制标准,同时广泛应用于国防、民航、工业控制等领域,成为分布式实时系统中数据发布/订阅的标准解决方案。
  • 技术核心是以数据为核心的发布订阅模型(Data-Centric Publish-Subscribe,DCPS),这种DCPS模型创建了一个“全局数据空间”(global data space)的概念,所有独立的应用都可以去访问。
  • 在DDS中,每一个发布者或者订阅者都称为参与者(participant),类似于ROS中节点的概念。每一个参与者都可以使用某种定义好的数据类型来读写全局数据空间。

2.3 ROS2的通信模型

image-20200526150417312

2.4 ROS2的质量服务原则QoS

2.4.1 QoS的工作模型

image-20200526150838574

2.4.2 QoS的数据结构

typedef struct RMW_PUBLIC_TYPE rmw_qos_profile_t 
{
enum rmw_qos_history_policy_t history; 
size_t depth; 
enum rmw_qos_reliability_policy_t reliability; 
enum rmw_qos_durability_policy_t durability;
}rmw_qos_profile_t;
  • 每个原则都有对应的系统默认值
  • 可以使用DDS厂商提供的配置工具修改QoS的设置
  • 多商家的DDS可以并存

2.5 ROS2的编译系统(重点)

2.5.1 ROS2的编译系统简介

1、功能
ament是一种元编译系统,用来构建组成应用程序的多个独立功能包,catkin编译系统进一步演化的版本。

2、组成

  • 编译系统:配置、编译、安装独立的功能包
  • 构建工具:将多个独立的功能包按照一定的拓扑结构进行链接

ament还处于开发中,目前并不稳定,也不提供并行构建的能力,将来应该会加入

2.5.1 ROS2的编译系统的特点

1、CMake centric catkin

系统以CMake为中心,所以只包含python代码的功能包也需要由CMake进行处理,但是CMake并不支持Python setuptools中的所有功能,而且也很难在Window上进行移植。

2、Devel space

在catkin系统构建完成后,会在工作目录下生成一个devel文件夹,里边是编译好的功能包,以及环境变量的设置等等,基本上等同于ROS安装完成后的目录结构和作用。但是相信很多初学者因为devel中的环境变量而苦恼过,这确实为用户带来了一些不必要的麻烦。

3、catkin_simple catkin_simple

是一个用于改善用户catkin体验的工具包,可以减少复杂的CMake代码,但是会存在不稳定的情况。ament也是实现了类似的功能,但是可靠性更强。

4、Building within a single CMake context

使用catkin_make命令可以一次性编译工作空间中的所有功能包,虽然方便,但如果存在相同命名的功能包时,会编译失败,ament在这方面也进行了改善。

3 安装ROS2

ROS2只支持Ubuntu 16.04以上的系统

因为ROS2更新迭代快,根据时效性,看官网安装。另外对于ROS的实时性没有特别要求,建议用ROS1。

官网:https://index.ros.org/doc/ros2/Installation/Crystal/Linux-Install-Binary/#system-requirements

分别打开两个终端运行以下命令:

$ ros2 run demo_nodes_cpp talker
$ ros2 run demo_nodes_cpp listener

4 话题与服务编程

4.1 ament工作空间的创建

1、创建工作空间

$ mkdir-p ~/ros2_ ws/src
$ cd ~/ros2_ ws/src

2、创建功能包

手动创建:my_package/

CMakeLists.txt
package.xml

3、编译(以ament为例)

$ ament build

image-20200526164716587

4.2 两代ROS的代码对比

  • ROS2中的API相比ROS1中发生了较大的变化,ROS2并不是在ROS1的基础上查漏补缺,而是完全从新设计。
    关于ROS2的API说明,可以参考API文档:http://docs.ros2.org/ardent/api/rclcpp/index.html
  • 使用了更多C++的特性,比如auto、make_shared等。
  • 加入了QoS配置,从上边的代码中,我们可以看到QoS有默认的配置rmw_qos_profile_default,而且talker将QoS的depth配置设置为“7”。
  • 代码的总体架构还是与ROS1极为相似的。

image-20200526165330858

5 ROS2与ROS1的集成

5.1 ROS1与ROS2之间的桥梁

image-20200526171228911

image-20200526171434099

ROS环境下安装和配置OpenCV可以通过多种方式进行,具体取决于需求的版本以及是否需要与ROS自带的版本共存。以下是几种常见的安装方法: ### 安装与ROS自带版本共存的OpenCV 如果ROS已经安装了默认版本的OpenCV(如3.2.0),但项目需要更高版本(例如3.4.10或4.5.4),可以不卸载原有版本,直接安装新版本,并实现多版本共存。 - **下载OpenCV源码**:从OpenCV官方GitHub仓库获取所需版本的源代码。 - **创建构建目录并编译**:使用CMake进行配置,并选择自定义安装路径(如`/usr/local/opencv4`)以避免与系统默认版本冲突。 - **环境变量设置**:通过设置`PKG_CONFIG_PATH`和`LD_LIBRARY_PATH`来指定使用的OpenCV版本。 参考详细教程: - ubuntu20.04下多版本opencv共存和切换 - ubuntu20安装opencv4和opencv_contrib 多版本共存视觉学习笔记10——opencv的卸载、安装与多版本管理[^2]。 ### 使用ROS中的OpenCV库 在ROS中使用OpenCV时,可以通过以下方式集成OpenCV到ROS包中: - **修改package.xml文件**:在`package.xml`中添加对OpenCV的依赖,例如: ```xml <build_depend>opencv3</build_depend> <run_depend>opencv3</run_depend> ``` 这样ROS会自动链接系统中已安装的OpenCV库[^3]。 - **在C++代码中引入OpenCV头文件**: ```cpp #include <cv_bridge/cv_bridge.h> #include <sensor_msgs/image_encodings.h> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> ``` - **图像转换与处理**:使用`cv_bridge`将ROS图像消息转换为OpenCV的`cv::Mat`格式,以便进行进一步处理。示例代码如下: ```cpp void Cam_RGB_Callback(const sensor_msgs::Image msg) { cv_bridge::CvImagePtr cv_ptr; try { cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8); } catch (cv_bridge::Exception& e) { ROS_ERROR("cv_bridge exception: %s", e.what()); return; } Mat imgOriginal = cv_ptr->image; imshow("RGB", imgOriginal); waitKey(1); } ``` ### 手动编译安装OpenCV 对于更高级的需求,可以选择手动编译安装特定版本的OpenCV: - **安装依赖项**:确保安装必要的编译工具和依赖库,如`cmake`, `g++`, `libgtk2.0-dev`等。 - **配置与编译**:运行`cmake`命令并根据需要调整选项,然后使用`make`进行编译。 - **安装与测试**:执行`sudo make install`将OpenCV安装到目标路径,并编写简单程序验证安装是否成功。 ### 总结 - 如果只需要使用ROS自带的OpenCV版本,可以直接通过`package.xml`配置依赖即可。 - 如果需要使用其他版本,则建议采用多版本共存策略,避免影响ROS核心功能。 - 对于深度学习或特殊需求,可以考虑手动编译安装最新版本的OpenCV。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少云清

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值