参考
Python创建简单的ROS节点:
- 用Python实现ROS节点(这里也说明了用Python写ROS功能包也是需要CMakelists.txt的)
https://blog.csdn.net/sinat_16643223/article/details/114057998
Python创建ROS节点(使用自定义消息):
- ROS学习笔记(十一) roscpp介绍(一)
https://blog.csdn.net/weixin_44682965/article/details/107748350
Python创建ROS服务(使用自定义消息):
- ROS学习笔记(十二) roscpp介绍(二)
https://blog.csdn.net/weixin_44682965/article/details/107767240
说明
与C++代码区别:
- rospy没有NodeHandle。
rospy创建和初始化一个node,不再需要NodeHandle
(rospy没有设计NodeHandle这个句柄) - 创建publisher、subscriber等操作被直接封装成了rospy中的函数或类,调用简单。
创建topic、service等操作都直接用rospy里对应的方法即可。 - rospy节点的初始化不一定必须放在开头,在Publisher建立后再初始化也可以。
- 消息的创建更加简单。自定义类型的消息可以用类似于构造函数的方式创建。
例如:自定义gps类型的消息可以直接用类似与构造函数的方式gps(state,x,y)创建。 - 日志的输出方式不同,C++是ROS_INFO(),Python中为rospy.loginfo()。
判断节点是否关闭的函数不同,C++为ros::ok(),Python为rospy.is_shutdown()。
roscpp
和rospy
的接口并不一致,实现原理上两套客户端库也有各自的实现,没有基于一个同意的核心库来开发,要避免混用。
ROS2就解决了这一问题,ROS2中的客户端库有rclcpp(ROS Client Library C++)、rclpy(ROS Client Library Python)和其他语言版本,都是基于一个共同的核心ROS客户端库rcl开发(核心库由C语言实现)。
编写的python文件在执行前需要修改为可运行的节点
sudo chmod +x (文件名.py)
01 创建节点
❤ 在编写程序前,需要创建工作空间,然后在工作空间的src
文件夹下创建功能包
❤ 功能包的创建可以使用如下指令:(我的功能包名称为is_a_test
,后面的是相关的依赖项)
catkin_create_pkg is_a_test std_msgs rospy roscpp
❤ python程序在功能包的scripts
目录下创建
❤ 然后catkin_make
。如果是新创建的工作空间,需要添加一下路径。
1.1 发布话题
在scripts目录下新建talker.py
文件
import rospy
from std_msgs.msg import String
def talker():
pub = rospy.Publisher('chatter', String, queue_size=10)
rospy.init_node('talker', anonymous=True)
rate = rospy.Rate(10)
while not rospy.is_shutdown():
hello_str = "hello world %s" % rospy.get_time()
rospy.loginfo(hello_str)
pub.publish(hello_str)
rate.sleep()
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass
说明:
pub = rospy.Publisher
发布话题rospy.init_node
初始化节点rospy.loginfo
调式输出pub.publish
发布话题内容- 关于python的输出格式,可以参考 https://www.runoob.com/python3/python3-inputoutput.html
1.2 订阅话题
在scripts目录下新建listener.py
文件
import rospy
from std_msgs.msg import String
def callback(data):
rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
def listener():
rospy.init_node('listener', anonymous=True)
rospy.Subscriber("chatter", String, callback)
rospy.spin()
if __name__ == '__main__':
listener()
说明:
1.3 编译
修改Cmakelist.txt
为如下
cmake_minimum_required(VERSION 2.8.3)
project(is_a_test)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
)
catkin_package()
说明:
- 如果是使用
catkin_create_pkg
创建的功能包,并且在创建时已经安装了全部依赖,那么这里就不需要再更改了 - 对于python文件,
cmakelist
基本就是把头文件里需要的ros依赖放到find_package(catkin REQUIRED COMPONENTS)
里。而对于c++文件则复杂一些 project(beginner_tutorials)
里写明功能包的名字- 编译前需要将python设置为可执行文件(
sudo chmod +x [文件名.py]
) - 然后在工作空间
catkin_make
(因为说c++需要编译,python不需要编译,所以不太明白对于python需不需要catkin_make)
1.4 运行
在三个终端,分别运行以下三条命令(is_a_test
是功能包的名字)
roscore
rosrun is_a_test talker.py
rosrun is_a_test listener.py
说明:
- python的程序执行前,要先设置为可执行文件(
sudo chmod +x [文件名.py]
) - 更重要的一点,在
.py
文件的第一行要有#!/usr/bin/env python
,不然会报错。
参考:https://blog.csdn.net/weixin_40900419/article/details/101620485
报错:
guyue@guyue:~$ rosrun control_robot talker.py
import-im6.q16: not authorized `rospy' @ error/constitute.c/WriteImage/1037.
from: can't read /var/mail/std_msgs.msg
/home/guyue/ur_ws/src/control_robot/scripts/talker.py: 行 5: 未预期的符号 `(' 附近有语法错误
/home/guyue/ur_ws/src/control_robot/scripts/talker.py: 行 5: `def talker():'
解决:
在文件头加上:
#!/usr/bin/env python
#!/usr/bin/env python这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。
当系统看到这一行的时候,首先会到env设置(环境变量)里查找python的安装路径,再调用对应路径下的解释器程序完成操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)