ROS自定义接口解析

一、自定义接口创建

1.接口的理解

接口(Interface) 是一种用于节点间通信的数据结构,是各节点之间进行交流的统一标准。如使用加速度传感器时,用其定义好的规范的数据接口,用温度传感器时,使用其定义好的规范的数据接口。

2.接口分类

ROS 2 提供了三种主要的接口类型:
消息(Message):用于发布 和 订阅。文件为.msg
服务(Service):用于客户端-服务端的请求/响应。 文件为.srv
动作(Action):用于长时间执行的任务,具有反馈和结果。 文件为.action

3.数据类型

基础的数据类型为:可以加上[]成为数组

bool
byte
char
float32,float64
int8,uint8
int16,uint16
int32,uint32
int64,uint64
string

也可以在已有的接口类型上进行包含,

uint32 id
string image_name
sensor_msgs/Image  #系统自带的消息接口

通过ROS2的IDL模块,将.msg .srv .action文件变为Python和C++的头文件,有了头文件,我们就可以在程序里导入并使用这个接口模块。

4.自定义接口

机器人节点:移动指定距离,移动完成后返回当前位置,对外发布机器人的位置和状态

控制机器人节点:控制机器人移动指定距离,获取机器人的当前位置和状态,通过服务完成

1.MoveRobot.src文件

# 请求部分(客户端发送给服务端)
float32 distance

---

# 响应部分(服务端返回给客户端)
float32 pose

这里一定要用---进行分隔。

该接口主要是控制节点控制机器人移动时使用,控制节点作为客户端发送指令给服务端机器人,要求机器人移动指定的距离。

机器人节点接收到request后执行操作,并将移动完成后的当前位置返回给客户端控制节点。

2.RobotStatus.msg文件

uint32 STATUS_MOVEING = 1
uint32 STATUS_STOP = 2
uint32 status
float32 pose

该文件使用基础数据类型,主要用于话题通信中,该文件就是话题topic的消息类型。

机器人节点发布机器人的实时状态和当前位置到话题topic中,控制节点订阅该topic并获取机器人的状态和位置。

3.RobotPose.msg文件

uint32 STATUS_MOVEING = 1
uint32 STATUS_STOP = 2
uint32 status
geometry_msgs/Pose pose

该文件使用混合数据类型,也是用于 话题通信,但它使用了标准消息类型 geometry_msgs/Pose 来提供机器人当前位置的详细信息,包括 位置 和 方向,状态信息则是我们使用基础数据类型来表示。

该文件的使用和上一个文件一致。

4.自定义接口文件的转换

1.cmakelists.txt文件

find_package(rosidl_default_generators REQUIRED)
find_package(geometry_msgs REQUIRED)
# 添加下面的内容
rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/RobotPose.msg"
  "msg/RobotStatus.msg"
  "srv/MoveRobot.srv"
  DEPENDENCIES geometry_msgs
)

我们需要使用rosidl_default_generators该工具,即IDL转换器。

rosidl_default_generators 是 ROS 2 中的一个包,提供了 ROS 接口定义语言(IDL) 生成工具,它负责将 .msg 和 .srv 文件转换为不同语言(如 C++、Python)可以使用的代码。

接着我们使用rosidl_generate_interfaces来告诉 CMake 要生成哪些接口。

${PROJECT_NAME}:当前的 ROS 2 包名,这里是.msg .src .msg这三个文件。

DEPENDENCIES 指定外部依赖包,这里我们的.msg文件使用混合数据类型,使用了标准消息类型 geometry_msgs/Pose,因此我们需要依赖这个包。

整体流程为:

.msg 和 .srv 文件 → rosidl_generate_interfaces → 生成代码(C++、Python) → 节点中使用

2.package.xml文件

  <buildtool_depend>ament_cmake</buildtool_depend>

  <depend>rosidl_default_generators</depend>
  <depend>geometry_msgs</depend>
  
  <member_of_group>rosidl_interface_packages</member_of_group> #添加这一行

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

添加这一行

<member_of_group>rosidl_interface_packages</member_of_group>

将当前包声明为 rosidl_interface_packages 组的成员,用于标记当前这个功能包主要是一个 接口定义包,通过这种方式,工具链可以针对接口包进行特殊处理,比如优化接口生成过程。

二、节点使用自定义消息接口

机器人节点example_interfaces_robot_01

控制节点example_interfaces_contr

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值