ROS系统用python创建发布者与订阅者,并发布自定义话题消息

ROS系统用python创建发布者与订阅者,并发布自定义话题消息

最近使用pythonros进行ROS系统开发,发现用python开发的教程挺少的,所以记录一下,废话不多说,开始教程:

一、创建工作空间

$ mkdir catkin_ws
$ cd catkin_ws/
$ mkdir src
$ cd src/
$ catkin_init_workspace  #初始化工作空间
$ cd ..   #回到根目录
$ catkin_make #编译工作空间

二、创建功能包

$ catkin_create_ws/src   #在catkin_ws/src目录下创建
$ catkin_create_pkg <文件名> + <依赖包> 这里我使用的是roscpp rospy std_msgs geometry_msgs

所以完整的命令是:

$ catkin_create_pkg laneline roscpp rospy std_msgs geometry_msgs

为了将c++代码与python分开,我在新建的laneline功能包里创建了一个scripts文件夹用来存放
python版本的文件

$ mkdir scripts

三、定义话题消息

1、首先我们要先创建一个msg文件夹再,创建一个msg文件:定义一下功能包想要输出的变量

int8  angle
int8  delta_x

编译之后会自动生成为.msg

四、创建发布者和订阅者代码

发布者 laneline_publisher.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将发布/laneline_info话题,自定义消息类型laneline_publisher::laneline

import rospy
from laneline.msg import laneline

def laneline_publisher():
	# ROS节点初始化
    rospy.init_node('laneline_publisher', anonymous=True)

	# 创建一个Publisher,发布名为/laneline_info的topic,消息类型为laneline_publisher::laneline,队列长度10
    laneline_info_pub = rospy.Publisher('/laneline_info', laneline, queue_size=10)

	#设置循环的频率
    rate = rospy.Rate(10) 

    while not rospy.is_shutdown():
		# 初始化laneline_publisher::laneline类型的消息
    	laneline_msg = laneline()
    	laneline_msg.angle = -30;
    	laneline_msg.delta_x  = 18;

		# 发布消息
        laneline_info_pub.publish(laneline_msg)
    	rospy.loginfo("Publish laneline message[%d, %d]", 
				laneline_msg.angle, laneline_msg.delta_x)

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

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

订阅者 laneline_subscriber.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将订阅/laneline_info话题,自定义消息类型laneline_publisher::laneline

import rospy
from laneline.msg import laneline

def lanelineInfoCallback(msg):
    rospy.loginfo("Subcribe laneline Info: angle:%d  delta_x:%d", 
			 msg.angle, msg.delta_x)

def laneline_subscriber():
	# ROS节点初始化
    rospy.init_node('laneline_subscriber', anonymous=True)

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

	# 循环等待回调函数
    rospy.spin()

if __name__ == '__main__':
    laneline_subscriber()

五、在package.xml添加功能包依赖并修改Cmakelists.txt文件

1、在生成的package.xml中主要添加这两行,一个编译依赖,一个执行依赖
ROS系统用python创建发布者与订阅者,并发布自定义话题消息_第1张图片

2、与C++不同的是,使用python文件时,需要在Cmakelists.txt添加三个编译选项:
1)在find_package( )里面添加message_generation
ROS系统用python创建发布者与订阅者,并发布自定义话题消息_第2张图片
2)添加生成message
ROS系统用python创建发布者与订阅者,并发布自定义话题消息_第3张图片
3)添加catkin_package message_runtime
ROS系统用python创建发布者与订阅者,并发布自定义话题消息_第4张图片

六、编译生成相关语言文件

回到根目录进行

$ cd ~/catkin_ws
$ catkin_make #编译

编译成功之后,打开终端,首先运行roscore

$ roscore

然后打开两个终端在laneline/srcipts里分别运行laneline_publisher.py与laneline_subscriber.py

$ python laneline_publisher.py
$ python laneline_subscriber.py

七、结果

ROS系统用python创建发布者与订阅者,并发布自定义话题消息_第5张图片
发布者发出的laneline_msg.anglelaneline_msg.delta_x成功被订阅者收到。

你可能感兴趣的:(ROS,ROS,python)