ros节点在python中的实现方法
1. 创建package软件包
- 打开终端输入以下指令创建一个新的package软件包
cd catkin_ws/src/ catkin_create_pkg ssr_pkg(包名) rospy std_msgs cd .. catkin_ws
- 注意: 在ros中,通过python编写的节点是不需要
catkin_ws
编译就可以直接运行的,但是在新创建package软件包时,需要对软件包直接进行catkin_ws
编译,这是为了让新建的这个package通过编译进入ros的软件包列表,以便在后面运行节点时,ros能够在软件包列表中找到这个package软件包 - 在新建的软件包中新建一个
scripts
目录用于存放python代码,原有的src
子目录是用于存放C++代码的
2. 通过python创建一个publisher发布者
#!/usr/bin/env python3
''' 'shebang' 在脚本的开头指示要使用的解释器,解释器的版本取决于Ubuntu版本,低于20.04版本的Ubuntu系统不支持Python3'''
#encoding = UTF-8
'''编码格式 UTF-8'''
import rospy
from std_msgs.msg import String
if __name__ == "__main__":
rospy.init_node('sensor_node')
rospy.logwarn("Hello World!!!")
pub = rospy.Publiser("chat_box_1", String, queue_size = 10)
rate = rospy.Rate(10)
while not rospy.is_shutdown():
rospy.loginfo("THIS IS A PYTHON CODE")
msg = String()
msg.data = "I AM WRITING NOW"
pub.publish(msg)
rate.sleep()
代码解析同C++,详情见"ROS学习——发布者publisher和订阅者Subscriber(c语言)"
- 在Ubuntu系统中新建的文件,出于安全考虑,并不带有执行权限,因此并不能直接运行,因此需要进入到py节点中的终端后输入
chmod +x sensor_node.py
(Change mode +execute 节点名称)添加节点的执行权限,然后就可以直接编译了
3. 通过python创建一个subscriber订阅者
#!/usr/bin/env python3
#encoding = UTF-8
import rospy
import locale
from std_msgs.msg import String
def sensor_callback(msg):
rospy.loginfo(msg.data)
def sensor_callback2(msg):
rospy.logwarn(msg.data)
if __name__ == "__main__":
locale.setlocale(locale.LC_ALL, "")
rospy.init_node('ma_node') #初始化节点
rospy.logwarn("Hello World!!!")
sub = rospy.Subscriber("chat_box_1", String, sensor_callback, queue_size=10)
sub_2 = rospy.Subscriber("chat_box_2", String, sensor_callback2, queue_size=10)
rospy.spin()
- 值得注意的是,在python中系统默认在检查出消息的传递后,自动再次调用spin()函数,因此,在C++中需要将spinOnce()放在循环内以确保消息的正常传递,而python代码中着不需要,如果在python中添加循环的话,则可能变成一个死循环,使程序永远卡在 spin(),无法正常退出。
- 如果在rosrun启动某一节点存在python和C++的同名节点时,记得在启动时采用
rosrun package node.py
而不是rosrun package node
,以避免错误的调用C++节点