7.ROS2接口介绍及RCLCPY实战、RCLCPP实战【问题未整理完毕】

1.1 什么是接口
ROS2中定义了一个统一的接口叫做sensor_msgs/msg/LaserScan,现在几乎每个雷达的厂家都会编写程序将自己雷达的数据变成sensor_msgs/msg/LaserScan格式,提供给用户使用。
1.3 ROS2自带的接口
前面话题通信时std_msgs功能包是我们安装ROS2的时候ROS2为我们自动安装的,除了std_msgs之外,ROS2还定义了很多做机器人常用的接口。

2.接口文件内容
ROS2提供了四种通信方式:话题-Topics、服务-Services、动作-Action、参数-Parameters。
除了参数之外,话题、服务和动作(Action)都支持自定义接口,每一种通信方式所适用的场景各不相同,所定义的接口也被分为话题接口、服务接口、动作接口三种。
2.2接口形式
话题接口格式:xxx.msg 示例:int64 num
服务接口格式:xxx.srv 示例:xxx.srv
动作接口格式:xxx.action 示例:xxx.action int32 order int32[] sequence int32[] partial_sequence
2.3 接口数据类型
根据引用方式不同可以分为基础类型和包装类型两类。
基础类型有(同时后面加上[]可形成数组)

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

包装类型:即在已有的接口类型上进行包含,比如

uint32 id
string image_name
sensor_msgs/Image

2.4 接口如何生成代码
其实这里有一个转换的过程:将msg、srv、action文件转换为Python和C++的头文件。

通过ROS2的IDL模块 产生了头文件,有了头文件,我们就可以在程序里导入并使用这个消息模块。
3.自定义接口实践
3.1 场景定义
给定一个机器人开发中的常见控制场景,我们设计满足要求的服务接口和话题接口。
设计两个节点
一个机器人节点,对外提供移动指定距离服务,移动完成后返回当前位置,同时对外发布机器人的位置和状态(是否在移动)。
机器人控制节点,通过服务控制机器人移动指定距离,并实时获取机器人的当前位置和状态。
假设机器人在坐标轴上,只能前后移动。
3.2 定义接口
3.3 创建接口功能包编接口
创建功能包
ros2 pkg create example_ros2_interfaces --build-type ament_cmake --dependencies rosidl_default_generators geometry_msgs
注意功能包类型必须为:ament_cmake
依赖rosidl_default_generators必须添加,geometry_msgs视内容情况添加(我们这里有geometry_msgs/Pose pose所以要添加)。
接着创建文件夹和文件将3.2中文件写入,注意话题接口放到msg文件夹下,以.msg结尾。服务接口放到srv文件夹下,以srv结尾。


自定义接口RCLPY实战
1.创建功能包
这里我们依然设计两个节点
example_interfaces_robot_02,机器人节点,对外提供控制机器人移动服务并发布机器人的状态。
example_interfaces_control_02,控制节点,发送机器人移动请求,订阅机器人状态话题。

ros2 pkg create example_interfaces_rclpy --build-type ament_python --dependencies rclpy example_ros2_interfaces --destination-directory src --node-name example_interfaces_robot_02 --maintainer-name "fishros" --maintainer-email "fishros@foxmail.com"

posted @ 2025-06-08 19:26  长恨水长东  阅读(91)  评论(0)    收藏  举报