目录
1.建立scripts文件夹与python文件
2.发布者实现
3.订阅者实现
4.CMakeList.txt配置
5.添加可执行权限
6.运行roscore+rosrun
7.计算图
8.注意的点
1.建立scripts文件夹与python文件
首先在之间建立的功能包中创建scripts文件夹,在文件夹下建立pub_p.py与sub_p.py
2.发布者实现
pub_p.py
#! /usr/bin/env python
# -*- coding: UTF-8 -*-
import rospy
from std_msgs.msg import String
if __name__ == "__main__":
rospy.init_node("pub_py")
pub = rospy.Publisher ("chongfu_py", String, queue_size=10)
msg = String()
rate = rospy.Rate(1)
count = 0
rospy.sleep(3)
while not rospy.is_shutdown():
count += 1
msg.data = "hello" + str(count)
pub.publish(msg)
rospy.loginfo("发布数据:%s", msg.data)
rate.sleep()
声明python版本和编码格式,UTF-8有中文,如果不加这个声明,默认ASCII码,会报错。
#! /usr/bin/env python
# -*- coding: UTF-8 -*-
导入模块
import rospy
from std_msgs.msg import String
导入之前配置功能包依赖(库):rospy库和标准消息库
if __name__ == "__main__":
这个语句下,只有本py文件作为脚本运行才运行,调用的情况不会运行。
rospy.init_node("pub_py")
ros::init(argc,argv,"publisher");
ros::NodeHandle n;
与roscpp在创建并初始化节点后,无须再创建句柄,因为再c++下创建发布者需要用到创建的句柄。
msg = String()
调用字符串类,将来输出字符串消息。
rate = rospy.Rate(1)
rate.sleep()
设置循环的频率,循环中的sleep,按照循环的频率进行延时。
count = 0
count += 1
添加计数器,每次循环加1
msg.data = "hello" + str(count)
强制类型转换,并拼接字符串。
pub.publish(msg)
发布者发布消息。可以通过rostopic echo 话题名,查询。
rospy.loginfo("发布数据:%s", msg.data)
在控制台输出,可以在终端看到输出。
配置CMakeList.txt
catkin_install_python(PROGRAMS
scripts/pub_p.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
找到,取消注释,加入文件路径。
3.订阅者实现
sub_p.py
#! /usr/bin/env python
# -*- coding: UTF-8 -*-
import rospy
from std_msgs.msg import String
def huidiao(msgg):
rospy.loginfo("订阅的数据:%s", msgg.data)
if __name__ == "__main__":
rospy.init_node("sub_py")
sub = rospy.Subscriber(name = "chongfu_py", data_class= String, callback = huidiao, queue_size = 1000)
rospy.spin()
import rospy
from std_msgs.msg import String
导入rospy库和标准消息库。
def huidiao(msgg):
rospy.loginfo("订阅的数据:%s", msgg.data)
其中msgg接收的实参就是发布者发布的话题消息。
if __name__ == "__main__":
rospy.init_node("sub_py")
sub = rospy.Subscriber(name = "chongfu_py", data_class= String, callback = huidiao, queue_size = 1000)
rospy.spin()
创建并初始化sub_py节点。
创建订阅者, 与c++相同,话题名称必须与发布者相同,数据类型为字符串,回调函数为前面定义的回调函数名,消息储存队列为1000个。
spin不停的回头,与回调函数相配合,不停的订阅消息,然后通过回调函数体中的loginfo在控制台输出。
4.CMakeList.txt配置
catkin_install_python(PROGRAMS
scripts/pub_p.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
catkin_install_python(PROGRAMS
scripts/sub_p.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
5.添加可执行权限
进入scripts文件夹,打开终端
chmod +x *.py
6.运行roscore+rosrun
7.计算图
rqt_graph
8.注意的点
(1)报错
SyntaxError: Non-ASCII character '\xe5' in file /home/rosmelodic/catkin_ws/src/sub_pub/scripts/pub_p.py on line 18, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
解决,程序开头加:
# -*- coding: UTF-8 -*-
(2)给py文件添加可执行权限
chmod +x *.py
给一个文件夹下所有py文件加可执行权限。
ll
查询可执行权限。
(3)显示话题发布的数据
rostopic echo 话题名
在没有编写控制台打印的代码时,可以通过这条命令看话题发布是否正常运行,正常运行后,详细编写话题内容。
(4)由于发布者有注册时间导致消息开始有一部分丢失
在创建发布者后,发布消息前,加入
rospy.sleep(3)
休眠3秒,等待发布者注册成功在发布消息。