3.ROS编程学习:话题通信python

目录

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秒,等待发布者注册成功在发布消息。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值