目录
1. 创建发布者
2.改CMakeLists.txt中的catkin_install_python()调用
3.改好后,回到vscode你创建的工作空间下编译,Ctrl+Shift+B
前面步骤一样,建功能包,建立scripts文件夹,建立发布者文件.py
1. 创建发布者
简单的发布者格式
#! /usr/bin/env python
# _*_ coding:utf-8 _*_ #为了告诉python解释器,按照utf-8编码读取源代码,否则,你在源代码中写的中文输出可能会由乱码
import rospy #1.导包
from std_msgs.msg import String #std_msgs.msg的导入则是为了使我们能够重用std_msgs/String消息类型
#(即一个简单的字符串容器)来发布。即发布消息的类型
"""
使用 python 实现消息发布:
1.导包
2.初始化ROS节点
3.创建发布者对象
4.编写发布逻辑并发布数据
"""
if __name__ == "__main__": #程序主入口
#2.初始化ROS节点
rospy.init_node("fanbuzhe") #设置节点名称
#3.创建发布者对象
pub = rospy.Publisher("che",String,queue_size=10) #"话题名称",发布消息的类型(这里是上面导入的String),存储容量是10(或者是长度)
#4.编写发布逻辑并发布数据
#创建数据
msg = String() ##创建 msg 对象
#使用循环发布数据
while not rospy.is_shutdown(): #not rospy.is_shutdown() ; rospy.is_shutdown() 判断节点是否关闭,关闭-》1;没有关闭-》0
#所以 not rospy.is_shutdown() :节点打开-->1 ;关闭-->0 没有关闭执行while发布数据
msg.data = "hello"
#发布数据
pub.publish(msg)
编好发布者文件后给执行权限chmod +x *.py ,给好权限后可以 ll 看一下是否成功
2.改CMakeLists.txt中的catkin_install_python()调用
大概在162行,全部选中Ctrl+/ 取消注释
catkin_install_python(PROGRAMS
scripts/my_python_script
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
catkin_install_python(PROGRAMS
scripts/xxx(改成你要运行的python发布者文件名)
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
3.改好后,回到vscode你创建的工作空间下编译,Ctrl+Shift+B
没有报错则表示编写成功
Ctrl+Alt+T打开一个新窗口(或者可以在vscode里面打开都一样)输入roscore
1.试运行一下发布者中的节点
rosrun+功能包名+python文件名
发现报错,没有找到这个功能包,我想是否是因为没有source,source刷新了一下再尝试了成功了。因为发布者里面没有任何打印输出,结果就是如下图
不是很清楚,可以再试试这个指令
rostopic echo /topic(文件中你创建的话题名称) | 将话题对应的消息输出到屏幕 |
rostopic echo che
输出
data: "hello"
---
data: "hello"
---
data: "hello"
---
data: "hello"
---
data: "hello"
---
data: "hello"
---
data: "hello"
Ctrl+C #终止进程/命令
到这里就可以说明发布者编写成功了。
进阶版:加上了频率,也可以打印输出
#! /usr/bin/env python
# _*_ coding:utf-8 _*_ #为了告诉python解释器,按照utf-8编码读取源代码,否则,你在源代码中写的中文输出可能会由乱码
import rospy #1.导包
from std_msgs.msg import String #std_msgs.msg的导入则是为了使我们能够重用std_msgs/String消息类型
#(即一个简单的字符串容器)来发布。即发布消息的类型
"""
使用 python 实现消息发布:
1.导包
2.初始化ROS节点
3.创建发布者对象
4.编写发布逻辑并发布数据
"""
if __name__ == "__main__": #程序主入口
#2.初始化ROS节点
rospy.init_node("fanbuzhe") #设置节点名称
#3.创建发布者对象
pub = rospy.Publisher("che",String,queue_size=10) #"话题名称",发布消息的类型(这里是上面导入的String),存储容量是10(或者是长度)
#4.编写发布逻辑并发布数据
#指定发布频率
rate = rospy.Rate(1) #频率为1HZ,表示1秒发布1次
#计数器
count = 0
#创建数据
msg = String() ##创建 msg 对象
#使用循环发布数据
while not rospy.is_shutdown(): #not rospy.is_shutdown() ; rospy.is_shutdown() 判断节点是否关闭,关闭-》1;没有关闭-》0
#所以 not rospy.is_shutdown() :节点打开-->1 ;关闭-->0 没有关闭执行while发布数据
count +=1
msg.data = "hello"+ str(count)
#发布数据
pub.publish(msg)
rospy.loginfo("发布的数据是:%s",msg.data)
rate.sleep()
eaibot@ubuntu:~/0420$ rosrun huatitongxun demo01_pub_p.py
[INFO] [1682128349.109151]: 发布的数据是:hello1
[INFO] [1682128350.112818]: 发布的数据是:hello2
[INFO] [1682128351.111111]: 发布的数据是:hello3
[INFO] [1682128352.110437]: 发布的数据是:hello4
[INFO] [1682128353.110554]: 发布的数据是:hello5
[INFO] [1682128354.110779]: 发布的数据是:hello6
[INFO] [1682128355.111047]: 发布的数据是:hello7
[INFO] [1682128356.111007]: 发布的数据是:hello8