ROS中有三种通讯机制: 发布订阅(异步),请求响应(同步),动作反馈(异步,全双工,类似websocket)。使用这些通讯机制时,除了基本数据类型(int/float/string...基本类型数组等)和ROS common_msg中预先定义好的数据类型(std_msg/geometry_msg...),还允许自定义数据类型。

一. 发布订阅数据类型定义

//file: myworkcell/msg/pubsub.msg

string name

uint8 age

uint8 sex

uint32 id

string family[]

uint8 UNKNOWN=0

uint8 MALE=1

uint8 FEMALE=2

 msg文件中还可以定义常量,UNKNOWN=0, MALE=1,FEMALE=2。

定义了msg文件,需要借助ROS的message_generation工具,编译生成相应的代码文件。配置编译文件package.xml和CMakeLists.txt,即可通过catkin完成编译。

(1) 修改myworkcell/package.xml

<!--增加下面两个节点,配置编译和运行依赖-->

<build_depend>message_generation</build_depend>

<exec_depend>message_runtime</exec_depend> <!--有的版本为run_depend-->

(2)修改myworkcell/CMakeLists.txt

 ①找到find_package,添加message_generation

find_package(catkin REQUIRED COMPONENTS

...

message_generation

...

)

②找到catkin_package,添加message_runtime

catkin_package(

...

message_runtime

...

)

③导入需要编译的msg文件

add_message_files(

FILES

...

pubsub.msg

...

)

# 由于用到了std_msgs,所以这里增加对应的依赖

generate_meaasges(

DEPENDENCIES

...

std_msgs

...

)

通过catkin编译完成后,可以查看定义的数据类型:

rosmsg show pubsub

二. 请求响应数据类型定义

请求响应数据通讯,包含请求与响应两个数据域,每个数据域中的数据类型与发布订阅中的数据一样,可以使用基本数据类型,也可以使用ROS中预定义的数据类型。两个数据域之间要用"---"进行分隔(请求域在前,应答域在后)。

//file: myworkcell/srv/service.srv

string reqType

geometry_msgs/Pose reqData

---

uint8 repCode

uint8 repSequence[]

 同理,定义完数据类型后,也需要在功能包的package.xml和CMakeLists.txt中配置编译依赖项,以便将该描述文件编译成代码。

(1) 修改myworkcell/package.xml,和发布订阅中一样,添加message_generation编译依赖和message_runtime运行依赖,如果已经有了,就可以不必再次添加。

(2)修改myworkcell/CMakeLists.txt

①添加message_generation编译依赖,见一.①,如果已有,则不再添加

②message_runtime运行依赖,见一.②,如果已有,则不再添加

③导入需要编译的srv文件

add_service_files(

FILES

...

service.srv

...

)

# 由于用到了geometry_msgs,所以这里增加对应的依赖

generate_meaasges(

DEPENDENCIES

...

geometry_msgs

...

)

 通过catkin完成编译。

三. 动作反馈数据定义

类似于请求响应通讯,但是服务端在接到请求后,会连续向客户端反馈任务执行状态,同时客户端也可以随时发送终止请求以停止当前任务。当任务执行完毕或者提前终止时,服务端会向客户端发送任务执行结果。所以数据定义时,请求域有一个,响应域有两个。

//myworkcell/action/act.action

#定义请求数据

uint8 taskType

uint8 taskId

---

#定义任务执行结果

uint8 resCode

---

#定义任务连续反馈数据

uint32 status[6]

在功能包的package.xml和CMakeLists.txt中配置编译依赖项。

(1)修改package.xml,添加actionlib, actionlib_msgs的编译依赖项和运行依赖项

<build_depend>actionlib</build_depend>
<build_depend>actionlib_msgs</build_depend>
<exec_depend>actionlib</exec_depend>
<exec_depend>actionlib_msgs</exec_depend>

(2)修改CMakeLists.txt

①找到find_package,添加genmsg,actionlib_msgs,actionlib依赖

find_package(catkin REQUIRED COMPONENTS

...

genmsg

actionlib_msgs

actionlib

...

)

 ②导入需要编译的action文件

add_action_files(DIRECTORY action

FILES

...

act.action

...

)

generate_messages(

DEPENDENCIES

...

actionlib_msgs

...

)

通过catkin完成编译。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐