ROS2_机器人节点模板01_(万字?)_基于动作的实现

事先声明
在typora上做笔记时曾发生过数据丢失的问题,同时在转传到csdn上的时候也有轻微的问题,图片以及mermaid图。如果看的不够清晰可以留言,我将视情况提供原版markdown文件。
一些建议

  • 请在阅读这份笔记时充分利用目录

  • 本笔记包含非常多拓展内容衍生知识,你可以先阅读重要内容,再阅读这些其他内容,当然,充分了解这些内容是很有必要的,它们能帮助你了解这个对象和方法来源于哪里,我将如何使用它们.

  • 本文基于markdown,你可以拷贝他们到自己的阅读器上,使用查找功能定位功能的表述部分(一般,我在介绍过一次之后不会再重复完整地提及,比如说GoalHandleMoveRobot)

  • 充分利用mermaid图表,这是我倾注心血最多的地方.

  • 尽量结合官方文档,本文可能含有错漏之处,请指出!

支持文档与教程

官方文档

ROS2机器人节点的实现

动作(action)是什么?

action背景

  • 话题:适用于节点间单向的、频繁的传输
  • 服务:适用于节点间的双向的数据传输
  • 参数:用于动态调整节点的设置
  • 动作:智能地进行某一项复杂的任务(话题和服务的融合,同时可添加一些参数)

更详细点

我们在实际的机器人运动中。当我们希望控制机器人从一个出发点移动到一个重点,会存在以下的问题:

  1. 你不知道机器人有没有处理移动到目标点的请求(不清楚服务端是否接收到了信号,同时进行处理)

  2. 假设机器人收到了请求,但是你不知道机器人此时的位置和距离目标点的距离(没有反馈)

    • 我们之后可以基于反馈,添加更多的逻辑,譬如说躲避障碍
  3. 假设机器人移动了一半,你想让机器人停下来,也没有办法通知机器人(单线程的服务,会阻塞程序的进行,此时我们要加入多线程)

更多的例子

  • 控制导航程序,控制机械臂运动、控制小海龟旋转

action组成

Action的三大组成部分:目标反馈结果

  • 目标:Client告诉Server 需要做什么,Server需要对请求有响应,解决了通信问题
  • 反馈:Server告诉Client 此时进度如何,解决了没有反馈的问题
  • 结果:Server告诉Client 执行结果,结果最后从Client输出,用于表示任务的最终结果

话题、服务、参数、动作之间的关系

你可以这么认为

话题和服务是构成完整节点的基石

  • 参数是有服务构建出来的
  • 动作是由话题和服务构建出来的

一个动作 = 三个服务+两个话题

  • 服务

    1. 目标传递服务
    2. 结果传递服务
    3. 取消执行服务
  • 话题

    1. 反馈话题(服务发布、客户端订阅)
    2. 状态话题(服务端发布、客户端订阅)
Node - Action Server
Action
Node - Action Client
发送请求
接收响应
订阅
发送请求
接收响应
处理目标请求
发布反馈
处理结果请求
Goal Service Server
Feedback Publisher
Result Service Server
Goal Service
Request
Response
Feedback Topic
Result Service
Request
Response
Goal Service Client
Feedback Subscriber
Result Service Client
用类似于这个的方式

开始启动

程序结构

  • 自定义通信接口 robot_control_interfaces
action
MoveRobot.action
robot_control_interfaces
include
src
CMakeLists.txt
LICENSE
package.xml
demo
  • 机器人节点 example_action_rclcpp
src
action_control_01.cpp
action_robot_01.cpp
robot.cpp
include
example_action_rclcpp
robot.h
example_action_rclcpp
CMakeLists.txt
package.xml

example_action_rclcpp中包含的其他依赖

  1. rclcpp_action rclcpp_action/rclcpp_action.hpp
  2. 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>
参数详细说明
  1. <package_name>
    包名称。作为 ROS 2 中的唯一标识符。

  2. --build-type <build_type>
    指定包的构建系统类型。

    • ament_cmake:C++ 项目使用。
    • ament_python:Python 项目使用。
  3. --dependencies <dependency1> <dependency2> ...
    包的依赖项列表,用空格分隔。常用依赖:

    • rclcpp:C++ 客户端库。
    • rclpy:Python 客户端库。
    • std_msgs:标准消息包。
    • sensor_msgs:传感器消息包。
  4. --destination-directory <directory>
    新包的创建目录。通常为工作空间的 src 目录。

  5. --node-name <node_name>
    创建一个基础节点的源文件,文件名称与节点名称相同。适用于 C++ 和 Python。

  6. --maintainer-name "<maintainer_name>"
    指定维护者姓名,将记录在 package.xml 文件中。

  7. --maintainer-email "<maintainer_email>"
    指定维护者的电子邮箱地址,用于联系维护者。

  8. --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
    
  9. --description "<description>"
    包的描述信息,简要说明包的用途和功能。该描述将出现在 package.xml 中的 <description> 标签中。

    例如:

    --description "This package demonstrates parameter handling in ROS 2."
    
  10. --version <version>
    指定包的版本号。默认版本为 0.0.0,可以通过此参数自定义。

    --version 1.0.0
    
  11. --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 节点源文件,用于快速启动开发。

  • 其他文件
    包的标准结构文件,如 includesrc 文件夹(如果为 C++ 项目),launch 文件夹(用于存放启动文件)等。

创建接口文件

action
MoveRobot.action
robot_control_interfaces
include
src
CMakeLists.txt
LICENSE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值