一、自定义接口创建
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

最低0.47元/天 解锁文章
1102

被折叠的 条评论
为什么被折叠?



