当前位置:   article > 正文

ROS2_ros2学习手册

ros2学习手册

第一章  初识ROS

ROS2入门教程

 一、基本概念

1. ROS2 VS ROS1

  • 在ROS1中,应用层里Master这个节点管理器的角色至关重要,所有节点都得听它指挥,类似是一个公司的CEO,有且只有一个,如果这个CEO突然消失,公司肯定会成一团乱麻。ROS2把这个最不稳定的角色请走了,节点可以通过另外一套discovery——自发现机制,找到彼此,从而建立稳定的通信连接。
  • 中间层是ROS封装好的标准通信接口,我们写程序的时候,会频繁和这些通信接口打交道,比如发布一个图像的数据,接收一个雷达的信息,客户端库会再调用底层复杂的驱动和通信协议,让我们的开发变得更加简单明了。
  • 在ROS1中,ROS通信依赖底层的TCP和UDP协议,而在ROS2中,通信协议更换成了更加复杂但也更加完善的DDS系统
  • 如果是在进程内需要进行大量数据的通信,ROS1和ROS2都提供了基于共享内存的通信方法,只不过名字不太一样而已。
  • 最下边是系统层,也就是可以将ROS安装在哪些操作系统上,ROS1主要安装在Linux上,ROS2的可选项就很多了,Linux、windows、MacOS、RTOS都可以。

2. 终端命令行

Linux常用命令:路径:pwd  cd../  文件夹:mkdir cp rm mv  ls  文件:touch  cp rm mv  gedit

ROS2命令行:ROS1中的命令行相对分散,而ROS2对命令行做了大幅度的集成,所有操作都集成在一个ros2的总命令中,第一个参数表示不同的操作目的,具体操作干什么,还可以在后边继续跟一系列参数内容。

ROS常用命令_ros命令_EngineerX_的博客-CSDN博客

二、环境配置

1. 设置编码

  1. $ sudo apt update && sudo apt install locales
  2. $ sudo locale-gen en_US en_US.UTF-8

 英文环境(可不设置)

  1. $ sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
  2. $ export LANG=en_US.UTF-8

 改为中文:语言支持-将汉语拖动到最上方-应用到整个系统    火狐浏览器-设置-语言-中文

 ubuntu系统从英文修改为中文界面

2. 添加源

$ sudo gedit /etc/hosts

添加 185.199.108.133 raw.githubusercontent.com

  1. $ sudo apt update && sudo apt install curl gnupg lsb-release
  2. $ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
  3. $ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

3. 安装ROS2

  1. $ sudo apt update
  2. $ sudo apt upgrade
  3. $ sudo apt install ros-humble-desktop

4. 设置环境变量

  1. $ source /opt/ros/humble/setup.bash
  2. $ echo " source /opt/ros/humble/setup.bash" >> ~/.bashrc

5.测试

示例一 : 启动两个终端,分别运行数据的发布者节点和订阅者节点,一发一收

  1. $ ros2 run demo_nodes_cpp talker
  2. $ ros2 run demo_nodes_py listener

ctrl+c 暂停运行

示例二 :启动两个终端,分别运行海龟仿真节点和键盘控制节点,上下左右键控制运动

  1. $ ros2 run turtlesim turtlesim_node
  2. $ ros2 run turtlesim turtle_teleop_key

Vscode插件:C/C++、Python、CMake、vscode-icons、ROS、Msg Language Support、URDF


第二章  ROS组成

一、工作空间与功能包

1.创建功能包

在工作空间WorkSpace的src文件下新建功能包

  1. $ mkdir -p ~/dev_ws/src # 新建文件夹
  2. $ cd ~/dev_ws/src
  3. $ ros2 pkg create --build-type ament_cmake learning_pkg_c # C++
  4. $ ros2 pkg create --build-type ament_python learning_pkg_python # Python

功能包不是普通的文件夹,必然存在package.xml,它包含功能包的版权描述和各种依赖的声明。

C++类型功能包:CMakerLists.txt是编译规则,要在该文件中设置如何编译,使用CMake语法。

Python类型功能包:setup.py包含一些版权信息,要在该文件中的“entry_points”配置程序入口。

2.自动安装依赖

src里的代码多少都会有一些依赖,我们可以手动一个一个安装,也可以使用rosdep工具自动安装

  1. $ sudo apt install -y python3-pip
  2. $ sudo pip3 install rosdepc
  1. $ sudo rosdepc init
  2. $ rosdepc update
  3. $ cd ..
  4. $ rosdepc install -i --from-path src --rosdistro humble -y

3.编译工作空间

ROS1中使用的rosbuild和catkin问题诸多,ROS2重新优化后的编译系统叫做ament和colcon。

$ sudo apt install python3-colcon-ros

 在工作空间目录下编译,编译成功后就可看到自动生产的build、log、install文件夹了。

$ colcon build

4.设置环境变量

  1. $ source install/local_setup.sh # 仅在当前终端生效
  2. $ echo " source ~/dev_ws/install/local_setup.sh" >> ~/.bashrc # 所有终端均生效
  3. # ~/dev_ws修改为自己的工作空间完整路径

二、节点

节点类似于XXX模块,执行具体任务的进程,每个节点都是独立运行的可执行文件,可使用不同的编程语言,可分布式运行在不同主机,通过节点名称进行管理。

1.创建节点流程

  • 编程接口初始化
  • 新建节点并初始化
  • 实现节点功能(面向对象 / 面向过程
  • 销毁节点并关闭接口

完成代码的编写后需要配置功能包:更改setup.py程序入口或者CMakerLists.txt配置

2.节点命令的常用操作

  1. $ ros2 node list # 查看节点列表
  2. $ ros2 node info <node_name> # 查看节点信息
  3. $ ros2 run [功能包名称] [节点名称] # 运行节点
  4. # 运行前需要先 colcon build 重新编译

三、通信接口

ROS有三种常用的通信机制,分别是话题、服务、动作,通过每一种通信种定义的接口,各种节点才能有机的联系到一起。

在机器人开发过程中,类似的通信应用比比皆是,ROS针对绝大部分通用场景,都设计了标准的话题和服务数据类型, 在ROS安装路径 /opt/ros/humble/share文件夹中涵盖众多标准定义。很多时候这些标准定义也无法满足我们的需求,这个时候,我们就要自定义通信接口了。

  • 话题使用的是.msg文件,由于是单向传输,只需要描述传输的每一帧数据是什么就行

  • 服务使用的是.srv文件,包含请求和应答两部分定义,通过中间的“---”区分

  • 动作使用的是.action文件,分成三个部分来描述机器人的一个运动过程,动作的目标比如是开始运动,运动的结果比如最终旋转的90度是否完成,反馈比如每隔1s反馈一下当前转动角度

接口命令行操作:

  1. $ ros2 interface list # 查看系统接口列表
  2. $ ros2 interface show <interface_name> # 查看某个接口的详细定义
  3. $ ros2 interface package <package_name> # 查看某个功能包中的接口定义

1. 话题

话题是节点间传递数据的桥梁,发布/订阅模型、发布者和订阅者的数量不唯一(注意区分发布优先级)、异步通信机制(发布者不知订阅者何时收到)、.msg文件定义通信的消息结构。

(1)发布者流程总结

  • 创建发布者对象      (消息类型、话题名、队列长度)
  • 创建定时器,回调函数里发布话题消息          

(2)订阅者流程总结

  • 创建订阅者对象     (消息类型、话题名、订阅者回调函数、队列长度)
  • 回调函数里处理话题数据

(3)话题命令行操作

  1. $ ros2 topic list # 查看话题列表
  2. $ ros2 topic info <topic_name> # 查看话题信息
  3. $ ros2 topic hz <topic_name> # 查看话题发布频率
  4. $ ros2 topic bw <topic_name> # 查看话题传输带宽
  5. $ ros2 topic echo <topic_name> # 查看话题数据
  6. $ ros2 topic pub <topic_name> <msg_type> <msg_data> # 发布话题消息
  7. $ rqt_graph # 查看话题示意图

(4)应用场景

话题类似订阅公众号、报纸等,适合传感器、控制指令等周期性(定时器)、单向传输的数据。

2. 服务

服务是节点间的你问我答,客户端/服务器模型服务器唯一,客户端可以不唯一同步通信机制.srv文件定义请求和应答的数据结构。

(1)客户端流程总结

  • 创建客户端对象     (接口类型、服务名)
  • 创建并发送请求数据
  • 等待服务器端应答数据

(2)服务器流程总结

  • 创建服务器端对象  (接口类型、服务名、服务器回调函数)
  • 通过回调函数进行服务
  • 向客户端反馈应答结果

(3)服务命令行操作

  1. $ ros2 service list # 查看服务列表
  2. $ ros2 service type <service_name> # 查看服务数据类型
  3. $ ros2 service call <service_name> <service_type> <service_data> # 发送服务请求

(4)应用场景

服务类似浏览网页,适合一问一答,同步性要求更高的数据。

3. 动作

动作是完整行为的流程管理,客户端/服务器模型服务器唯一,客户端可以不唯一同步通信机制、.action文件定义请求和应答的数据结构。

(1)客户端流程总结

  • 创建动作客户端对象     (接口类型、动作名)
  • 创建并发送请求数据
  • 设置动作服务器收到目标反馈的回调函数
  • 设置动作服务器周期反馈消息的回调函数
  • 设置动作服务器最终执行结果的回调函数

(2)服务器流程总结

  • 创建动作服务器端对象  (接口类型、动作名、服务器回调函数)
  • 通过回调函数进行服务
  • 向客户端反馈状态及结果

(3)动作命令行操作

  1. $ ros2 action list # 查看服务列表
  2. $ ros2 action info <action_name> # 查看服务数据类型
  3. $ ros2 action send_goal <action_name> <action_type> <action_data> <--feedback> # 发送服务请求

(4)应用场景

客户端发送给一个动作目标,服务器控制机器人开始运动,并周期反馈,结束后反馈结束信息。

4.参数

参数是ROS机器人系统中的全局字典,可以多个节点中共享数据,可实现动态监控。

(1)参数操作

  • 创建参数   (参数名、初始值)
  • 读取参数值
  • 修改参数值(参数名、参数类型、修改值)

(2)参数命令行操作

  1. $ ros2 param list # 查看节点参数列表
  2. $ ros2 param describe <节点名> <参数名> # 查看某个参数的描述信息
  3. $ ros2 param get <节点名> <参数名> # 查询某个参数的值
  4. $ ros2 param set <节点名> <参数名> <参数值> # 修改某个参数的值
  5. $ ros2 param dump <节点名> >> <节点名>.yaml # 将某个节点的参数保存到参数文件中
  6. $ ros2 param load <节点名> <节点名>.yaml # 一次性加载某一个文件中的所有参数

四、分布式通信

1.分布式数据传输

只要两个计算机安装好ROS2,并且处于同一网络中,他们就可以实现通信。

2.分布式网络分组

ROS2提供了一个DOMAIN的机制,就类似分组一样,处于同一个DOMAIN中的计算机才能通信。

  1. $ gedit .bashrc
  2. $ export ROS_DOMAIN_ID=<your_domain_id> # 添加至末尾
  3. $ source .bashrc

五、DDS

DDS的全称是Data Distribution Service,也就是数据分发服务,是一种通信的标准。DDS是机器人的神经网络,它的加入让ROS2的通信系统焕然一新,多众多样的通信模式配置,可以更好的满足不同场景下的机器人应用。

DDS中的基本结构是Domain,Domain将各个应用程序绑定在一起进行通信,回忆下之前我们配置树莓派和电脑通信的时候,配置的那个DOMAIN ID,就是对全局数据空间的分组定义,只有处于同一个DOMAIN小组中的节点才能互相通信。这样可以避免无用数据占用的资源。

DDS中另外一个重要特性就是质量服务策略,QoS。它是一种网络传输策略,应用程序指定所需要的网络传输质量行为,QoS服务实现这种行为要求,尽可能地满足客户对通信质量的需求。具体会有哪些策略?比如:

  • DEADLINE策略,表示通信数据必须要在每次截止时间内完成一次通信;
  • HISTORY策略,表示针对历史数据的一个缓存大小;
  • RELIABILITY策略,表示数据通信的模式,模式一样才可二者通信:
    • 配置成BEST_EFFORT,就是尽力传输模式,网络情况不好的时候,也要保证数据流畅,此时可能会导致数据丢失,
    • 配置成RELIABLE,就是可信赖模式,可以在通信中尽量保证图像的完整性,我们可以根据应用功能场景选择合适的通信模式;
  • DURABILITY策略,可以配置针对晚加入的节点,也保证有一定的历史数据发送过去,可以让新节点快速适应系统。

1.命令行中配置DDS

启动第一个终端,我们使用best_effor创建一个发布者节点,循环发布任意数据。

在另外一个终端中,如果我们使用reliable模型订阅同一话题,无法实现数据通信。

如果修改为同样的best_effort,才能实现数据传输。

  1. $ ros2 topic pub /chatter std_msgs/msg/Int32 "data: 42" --qos-reliability best_effort
  2. $ ros2 topic echo /chatter --qos-reliability reliable
  3. $ ros2 topic echo /chatter --qos-reliability best_effort

查看ROS2系统中每一个发布者或者订阅者的QoS策略:

$ ros2 topic info /chatter --verbose

2.DDS编程示例

(1)发布者流程总结

  • 创建一个QoS原则
  • 创建发布者对象      (消息类型、话题名、QoS原则)
  • 创建定时器,回调函数里发布话题消息          

(2)订阅者流程总结

  • 创建一个QoS原则
  • 创建订阅者对象     (消息类型、话题名、订阅者回调函数、QoS原则)
  • 回调函数里处理话题数据 

第三章 常用工具

一、Launch

Launch启动文件,它是ROS系统中多节点启动与配置的一种脚本。

1.多节点启动

$ ros2 launch <功能包名> <launch文件>
  1. from launch import LaunchDescription # launch文件的描述类
  2. from launch_ros.actions import Node # 节点启动的描述类
  3. def generate_launch_description(): # 自动生成launch文件的函数
  4. return LaunchDescription([ # 返回launch文件的描述信息
  5. Node( # 配置一个节点的启动
  6. package='learning_topic', # 节点所在的功能包
  7. executable='topic_helloworld_pub', # 节点的可执行文件
  8. ),
  9. Node( # 配置一个节点的启动
  10. package='learning_topic', # 节点所在的功能包
  11. executable='topic_helloworld_sub', # 节点的可执行文件名
  12. ),
  13. ])

相当于一个launch文件替代执行了启动两个终端,分别运行话题的发布者节点&订阅者节点:

$ ros2 run learning_topic topic_helloworld_pub
$ ros2 run learning_topic topic_helloworld_sub

2.命令行参数配置

ros2命令后可配置一些传入程序的参数,使用launch文件一样可以做到。

  1. Node( # 配置一个节点的启动
  2. package='rviz2', # 节点所在的功能包
  3. executable='rviz2', # 节点的可执行文件名
  4. name='rviz2', # 对节点重新命名
  5. arguments=['-d', rviz_config] # 加载命令行参数
  6. )

3.资源重映射

为了提高软件的复用性,ROS提供了资源重映射的机制,解决对资源重新命名的问题。

  1. Node( # 配置一个节点的启动
  2. package='turtlesim', # 节点所在的功能包
  3. executable='mimic', # 节点的可执行文件名
  4. name='mimic', # 对节点重新命名
  5. remappings=[ # 资源重映射列表
  6. ('/input/pose', '/turtlesim1/turtle1/pose'), # 将/input/pose话题名修改为/turtlesim1/turtle1/pose
  7. ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'), # 将/output/cmd_vel话题名修改为/turtlesim2/turtle1/cmd_vel
  8. ]
  9. )

4.ROS参数设置

ROS系统中的参数,也可以在Launch文件中设置。

  1. Node( # 配置一个节点的启动
  2. package='turtlesim', # 节点所在的功能包
  3. executable='turtlesim_node', # 节点的可执行文件名
  4. namespace='turtlesim2', # 节点所在的命名空间
  5. name='sim', # 对节点重新命名
  6. parameters=[config] # 加载参数文件
  7. )

5.Launch文件包含

在复杂的机器人系统中,launch文件也会有很多,此时我们可以使用类似编程中的include机制,让launch文件互相包含。

  1. def generate_launch_description(): # 自动生成launch文件的函数
  2. parameter_yaml = IncludeLaunchDescription( # 包含指定路径下的另外一个launch文件
  3. PythonLaunchDescriptionSource([os.path.join(
  4. get_package_share_directory('learning_launch'), 'launch'),
  5. '/parameters_nonamespace.launch.py'])
  6. )
  7. parameter_yaml_with_namespace = GroupAction( # 对指定launch文件中启动的功能加上命名空间
  8. actions=[
  9. PushRosNamespace('turtlesim2'),
  10. parameter_yaml]
  11. )
  12. return LaunchDescription([ # 返回launch文件的描述信息
  13. parameter_yaml_with_namespace
  14. ])

6.功能包编译配置

  1. ...
  2. data_files=[
  3. ('share/ament_index/resource_index/packages',
  4. ['resource/' + package_name]),
  5. ('share/' + package_name, ['package.xml']),
  6. (os.path.join('share', package_name, 'launch'), glob(os.path.join('launch', '*.launch.py'))),
  7. (os.path.join('share', package_name, 'config'), glob(os.path.join('config', '*.*'))),
  8. (os.path.join('share', package_name, 'rviz'), glob(os.path.join('rviz', '*.*'))),
  9. ],
  10. ...

二、TF

机器人坐标系管理神器

  1. $ sudo apt install ros-humble-turtle-tf2-py ros-humble-tf2-tools
  2. $ sudo pip3 install transforms3d

查看TF树

$ ros2 run tf2_tools view_frames 

订阅5s内的坐标结构,默认在当前终端路径下生成一个frames.pdf文件

查询坐标变换信息

$ ros2 run tf2_ros tf2_echo turtle2 turtle1

终端中就会循环打印坐标系的变换数值了,由平移和旋转两个部分组成,还有旋转矩阵。

坐标系可视化

$ ros2 run rviz2 rviz2 -d $(ros2 pkg prefix --share turtle_tf2_py)/rviz/turtle_rviz.rviz

静态TF变换

两者之间的相对位置不会发生改变,通过创建一个静态的TF广播器对象进行维护。

TF监听

创建坐标变换的监听器,查询两个坐标系之间的位置关系。

三、URDF

机器人一般是由硬件结构、驱动系统、传感器系统、控制系统四大部分组成,机器人建模的过程,其实就是按照类似的思路,通过建模语言,把机器人每一个部分都描述清楚,再组合起来的过程。

URDF全称是统一机器人描述格式,可清晰描述机器人自身的模型,还可描述机器人的外部环境。

URDF使用的是XML格式,关键是通过<link>和<joint>,理清楚每一个连杆和关节的描述信息。

<link>标签用来描述机器人某个刚体部分的外观和物理属性,外观包括尺寸、颜色、形状,物理属性包括质量、惯性矩阵、碰撞参数等。

<visual>,描述机器人的外观

  • <geometry>表示几何形状,里边使用<mesh>调用了一个在三维软件中提前设计好的蓝色外观,就是这个stl文件,看上去和真实机器人是一致的
  • <origin>表示坐标系相对初始位置的偏移,分别是x、y、z方向上的平移,和roll、pitch、raw旋转,不需要偏移的话,就全为0。

<collision>,描述碰撞参数

  • <visual>部分重在描述机器人看上去的状态,也就是视觉效果;(蓝色部分)
  • <collision>部分则是描述机器人运动过程中的状态,比如机器人与外界如何接触算作碰撞。(复杂模型在计算碰撞检测时要求的算力较高,为了简化计算改为描述绿色框)

2.关节Joint描述

  • parent标签:描述父连杆;
  • child标签:描述子连杆,子连杆会相对父连杆发生运动;
  • origin:表示两个连杆坐标系之间的关系,也就是图中红色的向量,可以理解为这两个连杆该如何安装到一起;
  • axis表示关节运动轴的单位向量,比如z等于1,就表示这个旋转运动是围绕z轴的正方向进行的;
  • limit就表示运动的一些限制了,比如最小位置,最大位置,和最大速度等。

ROS中关于平移的默认单位是m,旋转是弧度(不是度),所以这里的3.14就表示可以在-180度到180度之间运动,线速度是m/s,角速度是rad/s。 

3.建模过程

机器人的模型放置在功能包中,包含的文件夹如下:

  • urdf:存放机器人模型的URDF或xacro文件
  • meshes:放置URDF中引用的模型渲染文件
  • launch:保存相关启动文件
  • rviz:保存rviz的配置文件

模型可视化效果

Rviz中显示自己建立的机器人模型,可以使用鼠标拖拽观察。

$ ros2 launch learning_urdf display.launch.py

查看URDF模型结构

在模型的路径下,使用urdf_to_graphviz来分析URDF模型,运行成功后会产生一个pdf文件

$ urdf_to_graphviz mbot_base.urdf  # 在模型文件夹下运行

四、Gazebo

Gazebo是ROS系统中最为常用的三维物理仿真平台,支持动力学引擎,可以实现高质量的图形渲染,不仅可以模拟机器人及周边环境,还可以加入摩擦力、弹性系数等物理属性。

1.安装与运行

$ sudo apt install ros-humble-gazebo-*

将离线模型下载并放置到~/.gazebo/models路径下(开启查看隐藏文件):

GitHub - osrf/gazebo_models: Gazebo database of SDF models. This is a predecessor to https://app.gazebosim.org

$ ros2 launch gazebo_ros gazebo.launch.py

2.XACRO机器人模型优化

之前设计好的URDF模型此时还不能直接放到Gazebo中,需要我们做一些优化。

XACRO文件——URDF文件格式的升级版本,建模过程就像写代码一样,功能更为丰富了。

$ sudo apt install ros-humble-xacro

3.Ignition

随着技术的进步,Gazebo仿真平台也在不断迭代,新一代的Gazebo命名为Ignition

  1. $ sudo apt install ros-humble-ros-ign
  2. $ ros2 launch ros_ign_gazebo_demos rgbd_camera_bridge.launch.py

五、Rviz

Rviz是可视化平台,核心功能是显示数据

1.运行

$ ros2 run rviz2 rviz2

 2.仿真插件配置

关于传感器的仿真,都需要使用Gazebo提供的插件。插件需要先配置,再运行。

六、RQT

ROS提供的另外一种模块化可视化工具——rqt,简单的模块化的可视化工具。

安装与运行

  1. $ sudo apt install ros-humble-rqt
  2. $ rqt
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/665932
推荐阅读
相关标签
  

闽ICP备14008679号