因为需要使用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