事先声明
在typora上做笔记时曾发生过数据丢失的问题,同时在转传到csdn上的时候也有轻微的问题,图片以及mermaid图。如果看的不够清晰可以留言,我将视情况提供原版markdown文件。
一些建议
-
请在阅读这份笔记时充分利用目录
-
本笔记包含非常多拓展内容和衍生知识,你可以先阅读重要内容,再阅读这些其他内容,当然,充分了解这些内容是很有必要的,它们能帮助你了解这个对象和方法来源于哪里,我将如何使用它们.
-
本文基于markdown,你可以拷贝他们到自己的阅读器上,使用查找功能定位功能的表述部分(一般,我在介绍过一次之后不会再重复完整地提及,比如说
GoalHandleMoveRobot
) -
充分利用
mermaid
图表,这是我倾注心血最多的地方. -
尽量结合官方文档,本文可能含有错漏之处,请指出!
支持文档与教程
- [ros 2 documentation] 编写动作服务器和客户端 (c ++) 待校准@6753
- [fishros] 动作(Action)通信与自定义接口
- [古月居] 古月·ROS2入门21讲 | 带你认识一个全新的机器人操作系统
- Mermaid(1)流程图(flowcharts)使用详解
- Developing a ROS 2 package
- 【CMake】CMakeLists.txt的超傻瓜手把手教程(附实例源码)
官方文档
ROS2机器人节点的实现
-
- 动作(action)是什么?
-
- 接口的建立
-
- 机器人节点的定义
-
- package.xml
- CMakelists
-
- robot.h
-
- Robot.cpp
-
- action_robot_01(服务端)
-
- action_control_01(客户端)
-
- `MoveRobot`接口 与 `robot`类
-
ROS2机器人节点的实现
- 动作(action)是什么?
- 接口的建立
- 机器人节点的定义
- package.xml
- CMakelists
- robot.h
- Robot.cpp
- action_robot_01(服务端)
- action_control_01(客户端)
- `MoveRobot`接口 与 `robot`类
动作(action)是什么?
action背景
- 话题:适用于节点间单向的、频繁的传输
- 服务:适用于节点间的双向的数据传输
- 参数:用于动态调整节点的设置
- 动作:智能地进行某一项复杂的任务(话题和服务的融合,同时可添加一些参数)
更详细点
我们在实际的机器人运动中。当我们希望控制机器人从一个出发点移动到一个重点,会存在以下的问题:
-
你不知道机器人有没有处理移动到目标点的请求(不清楚服务端是否接收到了信号,同时进行处理)
-
假设机器人收到了请求,但是你不知道机器人此时的位置和距离目标点的距离(没有反馈)
- 我们之后可以基于反馈,添加更多的逻辑,譬如说躲避障碍
-
假设机器人移动了一半,你想让机器人停下来,也没有办法通知机器人(单线程的服务,会阻塞程序的进行,此时我们要加入多线程)
更多的例子:
- 控制导航程序,控制机械臂运动、控制小海龟旋转
action组成
Action的三大组成部分:目标、反馈、结果
- 目标:Client告诉Server 需要做什么,Server需要对请求有响应,解决了通信问题
- 反馈:Server告诉Client 此时进度如何,解决了没有反馈的问题
- 结果:Server告诉Client 执行结果,结果最后从Client输出,用于表示任务的最终结果
话题、服务、参数、动作之间的关系
你可以这么认为
话题和服务是构成完整节点的基石
- 参数是有服务构建出来的
- 动作是由话题和服务构建出来的
一个动作 = 三个服务+两个话题
-
服务
- 目标传递服务
- 结果传递服务
- 取消执行服务
-
话题
- 反馈话题(服务发布、客户端订阅)
- 状态话题(服务端发布、客户端订阅)
开始启动
程序结构
- 自定义通信接口
robot_control_interfaces
- 机器人节点
example_action_rclcpp
在example_action_rclcpp
中包含的其他依赖
- rclcpp_action
rclcpp_action/rclcpp_action.hpp
- rclcpp
rclcpp/rclcpp.h
接口的建立
包的建立
使用下列命令来在chapt4_ws/src中建立自定义接口
cd chapt4_ws/
ros2 pkg create robot_control_interfaces --build-type ament_cmake --destination-directory src --maintainer-name "fishros" --maintainer-email "fishros@foxmail.com" --license Apache-2.0 --dependencies rosidl_default_generators
包建立的一般格式
ros2 pkg create <package_name> \
--build-type <build_type> \
--dependencies <dependency1> <dependency2> ... \
--destination-directory <directory> \
--node-name <node_name> \
--maintainer-name "<maintainer_name>" \
--maintainer-email "<maintainer_email>" \
--license <license_type> \
--description "<description>" \
--version <version> \
--url <url>
参数详细说明
-
<package_name>
包名称。作为 ROS 2 中的唯一标识符。 -
--build-type <build_type>
指定包的构建系统类型。ament_cmake
:C++ 项目使用。ament_python
:Python 项目使用。
-
--dependencies <dependency1> <dependency2> ...
包的依赖项列表,用空格分隔。常用依赖:rclcpp
:C++ 客户端库。rclpy
:Python 客户端库。std_msgs
:标准消息包。sensor_msgs
:传感器消息包。
-
--destination-directory <directory>
新包的创建目录。通常为工作空间的src
目录。 -
--node-name <node_name>
创建一个基础节点的源文件,文件名称与节点名称相同。适用于 C++ 和 Python。 -
--maintainer-name "<maintainer_name>"
指定维护者姓名,将记录在package.xml
文件中。 -
--maintainer-email "<maintainer_email>"
指定维护者的电子邮箱地址,用于联系维护者。 -
--license <license_type>
指定开源协议。常见的协议类型:Apache-2.0
:Apache 许可证 2.0。MIT
:MIT 许可证。BSD-3-Clause
:BSD 3-Clause 许可证。GPL-3.0
:GNU General Public License v3.0。
例如:
--license Apache-2.0
-
--description "<description>"
包的描述信息,简要说明包的用途和功能。该描述将出现在package.xml
中的<description>
标签中。例如:
--description "This package demonstrates parameter handling in ROS 2."
-
--version <version>
指定包的版本号。默认版本为0.0.0
,可以通过此参数自定义。--version 1.0.0
-
--url <url>
为包指定一个相关网址。例如:
--url "https://github.com/username/repo_name" \ --url "https://docs.example.com"
示例命令
以下是一个包含所有常用参数的示例命令:
ros2 pkg create example_parameters_rclcpp \
--build-type ament_cmake \
--dependencies rclcpp std_msgs sensor_msgs \
--destination-directory src \
--node-name parameters_basic \
--maintainer-name "John Doe" \
--maintainer-email "johndoe@example.com" \
--license Apache-2.0 \
--description "This package demonstrates parameter handling in ROS 2." \
--version 1.0.0 \
--url "https://github.com/johndoe/example_parameters_rclcpp" \
--url "https://johndoe.github.io/docs"
生成内容概述
运行上述命令后,ROS 2 将在指定目录中生成一个名为 example_parameters_rclcpp
的包,并自动包含以下内容:
-
package.xml
包含包的元数据信息,如包名称、版本、维护者、开源协议、依赖、描述和网址。 -
CMakeLists.txt
配置文件,用于 C++ 项目的构建,包括依赖链接等。 -
parameters_basic.cpp
基本的 ROS 2 节点源文件,用于快速启动开发。 -
其他文件
包的标准结构文件,如include
和src
文件夹(如果为 C++ 项目),launch
文件夹(用于存放启动文件)等。