ROS中使用自定义消息类型

因为需要使用ROS在系统中传递消息,这里记录一下使用的方法以供后面参考。

一键安装ROS

小鱼的一键安装系列 | 鱼香ROS

首先需要新建一个目录存放程序

mkdir catkin_ws
cd catkin_ws
mkdir src
cd src

生成功能包,名字为ai

catkin_create_pkg ai std_msgs rospy roscpp
cd ai

在这个目录下新建自己要定义的消息类型

mkdir msg

 在msg文件夹下新建一个名为sendmsg.msg的文件,这个自定义的消息有两个数据,一个是datalen,一个是data,内容如下:

uint8 datalen
string data

然后在catkin_ws/src/ai/package.xml里添加功能包依赖

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

结果如下

然后在catkin_ws/src/ai/CMakeLists.txt中添加或修改编译选项(只有第二个代码中的sendmsg.msg需要改成自动定义的名字,其他的不用变)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

 add_message_files(
   FILES
   sendmsg.msg
 )

 generate_messages(
   DEPENDENCIES
   std_msgs
 )

catkin_package(
   CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
)

结果如下所示,蓝框为添加或修改的部分

编译代码,先回到catkin_ws目录,从前文目录出发:

cd ../..
catkin_make
source devel/setup.bash

这样自定义的消息就可以被使用了,然后编写发布者和订阅者的程序,放在catkin_ws/src/ai/scripts/目录下

cd src/ai/
mkdir scripts
cd scripts

 分别编写datapublisher.py和datasubscriber.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# publisher

import rospy
from ai.msg import sendmsg

def data_publisher():
	# ROS节点初始化
    rospy.init_node('data_publisher')

	# 创建一个Publisher,发布名为/data_info的topic,消息类型为sendmsg,队列长度10
    data_info_pub = rospy.Publisher('/data_info', sendmsg, queue_size=10)

	#设置循环的频率
    rate = rospy.Rate(10) 
    count=0
    while not rospy.is_shutdown():
		# 初始化sendmsg类型的消息
      data_msg = sendmsg()
      data_msg.datalen = count
      data_msg.data  = '10,20'
      count+=1

      # 发布消息
      data_info_pub.publish(data_msg)
      rospy.loginfo(f"Publsh data message{data_msg.datalen},{data_msg.data}")

      # 按照循环频率延时
      rate.sleep()

if __name__ == '__main__':
    try:
        data_publisher()
    except rospy.ROSInterruptException:
        pass

 这里的订阅者提供两种写法,一种是通过回调函数,启动这个回调函数后,每次收到信息都会执行回调函数中的内容。第二种是直接阻塞程序,收到信息后才会继续向下进行。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#subscriber

import rospy
from ai.msg import sendmsg
import time

def dataInfoCallback(msg):
    rospy.loginfo(f"Subcribe data Info: {msg.datalen},{ msg.data}")

def data_subscriber():
	# ROS节点初始化
    rospy.init_node('data_subscriber')

	# 创建一个Subscriber,订阅名为/data_info的topic,注册回调函数dataInfoCallback
    rospy.Subscriber("/data_info", sendmsg, dataInfoCallback)

	# 循环等待回调函数
    #rospy.spin()
    while True:
        time.sleep(1)
        
def data_subscriber2():
    rospy.init_node('data_subscriber2')
    while True:
        msg2 = rospy.wait_for_message('/data_info', sendmsg, timeout=None)
        rospy.loginfo(f"Subcribe data Info: {msg2.datalen},{msg2.data}")
        


if __name__ == '__main__':
    #data_subscriber()
    data_subscriber2()

 赋予程序可执行权限

sudo chmod +x datapublisher.py
sudo chmod +x datasubscriber.py

然后在这个终端中打开roscore

roscore

 打开两个新的终端,进入catkin_ws

cd catkin_ws/
source devel/setup.bash

 然后分别运行发布者和订阅者程序,就可以看到信息传输了

rosrun ai datapublisher.py
rosrun ai datasubscriber.py

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在ROS2,如果要发布自定义消息类型,需要进行以下几个步骤。首先,需要在消息定义文件定义自定义消息类型,该文件需要保存在消息目录,并使用.msg文件扩展名。\[1\]然后,在发布节点的源代码使用ROS2的Publisher类来创建发布者对象,并指定自定义消息类型作为模板参数。例如:ros2::Publisher<my_msgs::MyMessage> pub = node.create_publisher<my_msgs::MyMessage>("my_topic", 10);\[2\]接下来,编写发布消息的逻辑,并使用发布者对象的publish方法来发布消息。最后,运行发布节点,即可发布自定义消息类型消息。 #### 引用[.reference_title] - *1* *2* [ROS笔记(6)——自定义消息类型](https://blog.csdn.net/weixin_40582034/article/details/129041958)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [ROS实践07 自定义消息调用python](https://blog.csdn.net/qq_42227760/article/details/130013586)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值