在Ros中如何自定义话题消息和自定义服务数据

自定义话题消息:

        在ROS的元功能包common_msgs中提供了许多不同消息类型的功能包,例如std_msgs(标准数据类型)、geometry_msgs(几何学数据类型)、sensor_msgs(传感器数据类型)等,这些功能包中提供了大量常用的消息类型,足以满足我们在一般场景下的常用消息。例如我们之前做的例程中,chatter话题的消息类型就是ROS中预定义的String。但是在很多情况下,我们仍然需要针对自己的机器人应用设计特定的消息类型,ROS也提供了一套语言无关的消息类型定义方法。

        msg文件就是ROS中定义消息类型的文件,一般放置在功能包根目录下的msg文件夹中。在功能包编译过程中,可以使用msg文件生成不同编程语言使用的代码文件。在msg文件中还可以定义常量,这些常量在发布或者订阅消息数据时可以直接使用,相当于C++中的宏定义。

        很多ROS消息定义中还会包含一个标准格式的头信息std_msgs/Header:

#Standard metadata for higher-lever flow data types
unit32 seq
time stamp
string frame_id

         其中:seq是消息的顺序标识,不需要手动设置,Publisher在发布消息时会自动累加;stamp是消息中与数据相关联的时间戳,可以用于时间同步;frame_id是消息中与数据相关联的参考坐标系id。如果定义的消息类型较为简单,也可以不加头信息。

        首先在功能包(catkin_ws/src/learnning_communication)中创建一个msg文件夹,这里面是用来放所以所有自定义消息的文件的。然后在其中创建一个PersonMsg.msg的文件,可以直接创建也可以用下面的命令创建,然后在里面放置我们所需要的内容:

$ touch PersonMsg.msg

        如果要使用自定义的消息类型,还需要完成以下几步,对msg文件完成编译:

        1.在package.xml中添加功能包依赖,打开功能包的package.xml文件,添加以下命令确保该文件中设置了编译和运行的相关依赖:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

        这两条命令,前一条的编译依赖,后一条是运行依赖

        2.在CMakeLists.txt中添加编译选项,打开CMakeLists.txt文件

                2.1 在find_package中添加消息生成依赖的功能包message_generation,这样在编译时才能找到所需要的的文件:

find_package(catkin REQUIRED COMPONENTS
    roscpp
    rospy
    std_msgs
    std_srvs
    message_generation
)

                 2.2 设置需要编译的msg文件,找到它们所在的位置然后添加进去:

add_message_files(
    FILES 
    PersonMsg.msg
)
generate_messages(
    DEPENDENCIES 
    std_msgs
)

                在这两条指令中,前一条会将msg文件编译成不同语言的头文件,后一条是在添加它的依赖库。

                2.3 在catkin_package中添加消息运行依赖的功能包message_runtime,找到这地方,然后打开注释添加功能包:

catkin_package(
    ......
    CATKIN_DEPENDS roscpp rospy std_msgs std_srvs message_runtime
    ......
)

        3.在以上配置工作都完成后,可以回到工作空间的根路径下,使用catkin_make命令进行编译了。编译成功后,可以使用如下命令查看自定义的PersonMsg.msg消息类型:

$ rosmsg show PersonMsg.msg

        如果命令显示出错Could not find msg 'PersonMsg',那么是环境变量没有设置,如果没有将环境添加到.bashrc中,那就再source一下环境变量即可实现上面命令:

$ source devel/setup.bash

 

        如果PersonMsg消息类型已经定义成功,那么在代码中就可以按照以上String类型的使用方法使用PersonMsg类型的消息了。

        注:在编译后,会在devel/include/learning_communication中有个PersonMsg.h这样一个头文件,这是刚刚编译过程中动态产生的。

---------------------------------------------------------------------------------------------------------------------------------

自定义服务数据:

        服务一般分为服务端(Server)和客户端(Client)两个部分,Client负责发布请求数据,等待Server处理;Server负责处理相应的功能,并且返回应答数据。

        与自定义话题消息类似,ROS中的服务数据可以通过srv文件进行语言无关的接口定义,一般放置在功能目录下的srv文件夹中。该文件包含请求与应答两个数据域,数据域中的内容与话题消息的数据类型相似,只是在请求和应答的描述之间,需要使用“---”进行分割。  

         首先在功能包(catkin_ws/src/learnning_communication)中创建一个srv文件夹,这里面是用来放所有自定义服务数据的文件的。然后在其中创建一个PersonSrv.srv的文件,可以直接创建也可以用下面的命令创建,然后在里面放置我们所需要的内容:

$ touch PersonSrv.srv

         如果要使用自定义的服务数据类型,还需要完成以下几步,对srv文件完成编译:

        1.在package.xml中添加功能包依赖,打开功能包的package.xml文件,添加以下命令确保该文件中设置了编译和运行的相关依赖:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

        这两条命令,前一条的编译依赖,后一条是运行依赖。如果在之前自定义话题消息时添加过了就不用重复添加了。

        2.在CMakeLists.txt中添加编译选项,打开CMakeLists.txt文件

                2.1 在find_package中添加消息生成依赖的功能包message_generation,这样在编译时才能找到所需要的的文件:

find_package(catkin REQUIRED COMPONENTS
    roscpp
    rospy
    std_msgs
    std_srvs
    message_generation
)

                 如果在之前自定义话题消息时添加过了就不用重复添加了。message_generation包不仅可以针对话题消息产生相应的代码,还可以根据服务消息的类型描述文件产生相关的代码。

                 2.2 设置需要编译的srv文件,找到它们所在的位置然后添加进去:

add_service_files(
    FILES 
    PersonSrv.srv
)
generate_messages(
    DEPENDENCIES 
    std_msgs
)

                在这两条指令中,前一条会将srv文件编译成不同语言的头文件,后一条是在添加它的依赖库。后一条如果在之前自定义话题消息时添加过就不用重复添加了。

                2.3 在catkin_package中添加消息运行依赖的功能包message_runtime,找到这地方,然后打开注释添加功能包:

catkin_package(
    ......
    CATKIN_DEPENDS roscpp rospy std_msgs std_srvs message_runtime
    ......
)

                 如果在之前自定义话题消息时添加过了就不用重复添加了。

        3.在以上配置工作都完成后,可以回到工作空间的根路径下,使用catkin_make命令进行编译了。编译成功后,可以使用如下命令查看自定义的PersonSrv.srv消息类型:

$ rossrv show PersonSrv.srv

        功能包编译成功后,在服务的Server节点和Client节点的代码实现中就可以直接调用这些定义好的服务消息了。

        注:要先运行Server,然后再运行Client,否则会报错。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS(Robot Operating System)是一个用于机器人开发的开源软件平台,它提供了一套完整的工具链,包括硬件驱动、通信间件、算法库等,方便开发者快速构建机器人应用。 在ROS话题(Topic)是一种常用的通信机制,它可以用于不同节点之间的消息传递。下面是ROS话题通信的基本流程: 1. 编写发布节点(Publisher Node):发布节点负责向特定话题发送消息。通常情况下,发布节点会通过ROS API接口来实现消息的发布。 2. 编写订阅节点(Subscriber Node):订阅节点负责从特定话题接收消息。与发布节点类似,订阅节点也会通过ROS API接口来实现消息的订阅。 3. 创建话题(Topic):话题是发布节点和订阅节点之间的通信媒介。在ROS话题是通过ROS Master进行管理的。发布节点需要告诉ROS Master它将要发布的话题名和消息类型,而订阅节点需要告诉ROS Master它将要订阅的话题名和消息类型。 4. 运行发布节点和订阅节点:发布节点和订阅节点可以在同一台计算机上运行,也可以在不同的计算机上运行。不同计算机上的节点可以通过ROS Master进行连接。 5. 发布消息:发布节点向特定话题发送消息消息可以是预定义ROS消息类型,也可以是自定义消息类型。 6. 接收消息:订阅节点从特定话题接收消息,接收到的消息可以被处理或传递给其他节点。 7. 关闭节点:当发布节点或订阅节点完成任务后,它们应该被正确关闭,以释放资源和关闭与ROS Master的连接。 以上就是ROS话题通信的基本流程。通过话题通信,不同节点之间可以实现实时的消息传递和数据共享,方便机器人应用的开发和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值