ROS2接口定义

ROS2接口介绍

interface,即接口

1.ROS2接口介绍

1.1 什么是接口

接口其实是一种规范

以下两种数据类型分别代表字符串和32位二进制的整型数据,是ROS 2提前定义的一种规范。

std_msgs/msg/String
std_msgs/msg/UInt32

1.2 为什么使用接口

举一个雷达的例子,不同的厂家生产出不同的类型的激光雷达,每种雷达驱动方式、扫描速率等等都不相同。

当机器人进行导航时,需要激光雷达的扫描数据,假如没有统一接口,每次更换一个种类的雷达,都需要重新做程序适配。

于是ROS2中定义了一个统一的接口叫做sensor_msgs/msg/LaserScan,现在几乎每个雷达的厂家都会编写程序将自己雷达的数据变成sensor_msgs/msg/LaserScan格式,提供给用户使用。

如果雷达的例子不好理解,大家可以把雷达换成手机充电器,USB接口是不是也是一种规范,所有的厂家都按照这种接口进行充电器和连接线的生产。

1.3. ROS2自带的接口

前面话题通信时std_msgs功能包是我们安装ROS2的时候ROS2为我们自动安装的,除了std_msgs之外,ROS2还定义了很多做机器人常用的接口。

使用ros2 interface package sensor_msgs命令可以查看某一个接口包下所有的接口

比如:传感器类的消息包sensor_msgs

打开终端输入:ros2 interface package sensor_msgs
sensor_msgs/msg/JointState  #机器人关节数据
sensor_msgs/msg/Temperature #温度数据
sensor_msgs/msg/Imu #加速度传感器
sensor_msgs/msg/Image #图像
sensor_msgs/msg/LaserScan #雷达数据
......

虽然ROS2为我们定义了大量有手就行,拿来就用的接口,但有时候还是不能满足我们的变态想法,所以我们需要掌握自定义接口的方法。

2. 接口文件内容

2.1 可以定义的接口三种类型

提到过,ROS2提供了四种通信方式:

  • 话题-Topics
  • 服务-Services
  • 动作-Action
  • 参数-Parameters

除了参数之外,话题、服务和动作(Action)都支持自定义接口,每一种通信方式所适用的场景各不相同,所定义的接口也被分为话题接口、服务接口、动作接口三种。

2.2 接口形式

这三种接口定义起来有什么不一样的地方呢?小鱼先带大家直观感受一下:

话题接口格式:xxx.msg

int64 num

服务接口格式:xxx.srv

int64 a
int64 b
---
int64 sum

动作接口格式: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++的头文件。

graph LR
A[msg,srv,action] -->B[ROS2-IDL转换器]
B  --> C[Python的py,C++的.h头文件]

通过ROS2的IDL模块 产生了头文件,有了头文件,我们就可以在程序里导入并使用这个消息模块。

3.自定义接口实践

3.1 场景定义

给定一个机器人开发中的常见控制场景,我们设计满足要求的服务接口和话题接口。

设计两个节点

  • 一个机器人节点,对外提供移动指定距离服务,移动完成后返回当前位置,同时对外发布机器人的位置和状态(是否在移动)。
  • 机器人控制节点,通过服务控制机器人移动指定距离,并实时获取机器人的当前位置和状态。

假设机器人在坐标轴上,只能前后移动。

3.2 定义接口

服务接口MoveRobot.srv

# 前进后退的距离
float32 distance
---
# 当前的位置
float32 pose

话题接口,采用基础类型 RobotStatus.msg

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

话题接口,混合包装类型 RobotPose.msg

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

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结尾。

.
├── CMakeLists.txt
├── msg
│   ├── RobotPose.msg
│   └── RobotStatus.msg
├── package.xml
└── srv
    └── MoveRobot.srv

2 directories, 5 files

接着修改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
)

接着修改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>

保存即可编译

colcon build --packages-select example_ros2_interfaces

编译完成后在chapt3_ws/install/example_ros2_interfaces/include下你应该可以看到C++的头文件。在chapt3_ws/install/example_ros2_interfaces/local/lib/python3.10/dist-packages下应该可以看到Python版本的头文件。

接下来的代码里我们就可以通过头文件导入和使用我们定义的接口了。

4.ROS2接口常用CLI命令

最后给大家讲一下ROS2接口相关的常用命令有哪些。

4.1查看接口列表

ros2 interface list

4.2 查看某一个接口详细的内容

ros2 interface show std_msgs/msg/String
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容