#ROS2初学

##了解ROS2的版本迭代
ROS历史图标

Year Version
2014 ROSCon
2015 Alpha
2016 Beta
2017 Ardent
2018 Bouncy&Crystal
2019 Dashing&Eloquent
2020 Foxy
2021 Galactic
2022 Humble

#ROS2的优点

  • ROS2可以跨平台运行于Linux、Windows、MacOS、RTOS,甚至是没有任何系统的微控制器(MCU)上

  • 无论在怎样的网络环境下,ROS2都可以尽量保障机器人大量数据的完整性和安全性

  • 系统架构进行了颠覆性的变化

  • 编译系统进行了升级


#与ROS的区别
* ROS1中所有节点都需要在节点管理器ROS Master下进行工作,ROS2实现了真正的分布式,借助一种全新的通信框架DDS,为所有节点的通信提供可靠保障。
* ROS2结合C++最新标准和Python3语言特性,设计了更具通用性的API。
* ROS1中使用的rosbuild和catkin问题诸多,重新优化后的编译系统叫做ament和colcon。

#工作空间

  • 工作空间是一个存放项目开发相关文件的文件夹,在ROS1中,工作空间的子文件夹是由src,devel,build,include等,而ROS中简化分类,由src,install,build,log构成。具体如下:
  • src,代码空间,未来编写的代码、脚本,都需要人为的放置到这里;
    build,编译空间,保存编译过程中产生的中间文件;
    install,安装空间,放置编译得到的可执行文件和脚本;
    log,日志空间,编译和运行过程中,保存各种警告、错误、信息等日志。

##编译工作空间

1
2
$ cd ~/dev_ws/
$ colcon build #ROS1中是catkin_make

##设置环境变量
1
2
$ source install/local_setup.sh # 仅在当前终端生效
$ echo " source ~/dev_ws/install/local_setup.sh" >> ~/.bashrc

#功能包
##功能包的创建
1
2
3
$ cd ~/dev_ws/src
$ ros2 pkg create --build-type ament_cmake learning_pkg_c # C++
$ ros2 pkg create --build-type ament_python learning_pkg_python # Python

##功能包的必要文件
* 对于c++,其中必然存在两个文件:package.xml和CMakeLists.txt。package.xml文件包含功能包的版权描述,和各种依赖的声明。CmakeLists.比ROS1简化,主要在于find_package可以从package.xml里寻找依赖.
* 对于python,由于不需要编译,含有两个文件:package.xml和setup.py.
setup.py文件里边也包含一些版权信息,除此之外,还有“entry_points”配置的程序入口。

#ROS2相关指令
1
2
3
4
5
6
7
8
9
$ ros2 run learning_node node_helloworld
$ ros2 node list # 查看节点列表
$ ros2 node info <node_name> # 查看节点信息
$ ros2 topic list # 查看话题列表
$ ros2 topic info <topic_name> # 查看话题信息
$ ros2 topic hz <topic_name> # 查看话题发布频率
$ ros2 topic bw <topic_name> # 查看话题传输带宽
$ ros2 topic echo <topic_name> # 查看话题数据
$ ros2 topic pub <topic_name> <msg_type> <msg_data> # 发布话题消息

#ROS2消息结构
ROS2消息
* 话题通信接口的定义使用的是.msg文件.
* 服务通信接口的定义使用的是.srv文件,包含请求和应答两部分定义,通过中间的“—”区分.
* 动作是另外一种通信机制,用来描述机器人的一个运动过程,使用.action文件定义,此时接口的定义分成了三个部分,分别是动作的目标,比如是开始运动,运动的结果,最终旋转的90度是否完成,还有一个周期反馈,比如每隔1s反馈一下当前转到第10度、20度还是30度了,让我们知道运动的进度。
* 标准接口位于ROS安装路径中的share.

#对动作的理解
* 动作的三个通信模块,有两个是服务,一个是话题,当客户端发送运动目标时,使用的是服务的请求调用,服务器端也会反馈一个应带,表示收到命令。动作的反馈过程,其实就是一个话题的周期发布,服务器端是发布者,客户端是订阅者。
* 通信模型是客户端发送给一个动作目标,服务器控制机器人开始运动,并周期反馈,结束后反馈结束信息。

#数据传输方式——参数
* 类似C++编程中的全局变量,可以便于在多个程序中共享某些数据
* 在ROS2中,参数的特性非常丰富,比如某一个节点共享了一个参数,其他节点都可以访问,如果某一个节点对参数进行了修改,其他节点也有办法立刻知道,从而获取最新的数值。
* 通过yaml文件实现参数传递。

#通信模式
* ROS1采用的是Broker模型。由Broker集中处理所有人的请求,并进一步找到真正能响应该服务的角色。这样客户端就不用关心服务器的具体地址了,但处理速度受限。
* ROS2采用以数据为中心的DDS模型了,这种模型与广播模型有些类似,所有节点都可以在DataBus上发布和订阅消息。但它的先进之处在于,通信中包含了很多并行的通路,每个节点可以只关心自己感兴趣的消息,忽略不感兴趣的消息。

#Launch文件
* ros2的launch文件上有很大的变化,采取了基于python语法的文件格式,使启动节点方式更为多样。具体语法在具体项目实践中掌握。

TF坐标系

  • 一个移动机器人的中心点是基坐标系Base Link,雷达所在的位置叫做雷达坐标系laser link,机器人要移动,里程计会累积位置,这个位置的参考系叫做里程计坐标系odom,里程计又会有累积误差和漂移,绝对位置的参考系叫做地图坐标系map。

有待更新。。。