赞
踩
Python创建简单的ROS节点:
Python创建ROS节点(使用自定义消息):
Python创建ROS服务(使用自定义消息):
与C++代码区别:
NodeHandle
(rospy没有设计NodeHandle这个句柄)roscpp
和rospy
的接口并不一致,实现原理上两套客户端库也有各自的实现,没有基于一个同意的核心库来开发,要避免混用。
ROS2就解决了这一问题,ROS2中的客户端库有rclcpp(ROS Client Library C++)、rclpy(ROS Client Library Python)和其他语言版本,都是基于一个共同的核心ROS客户端库rcl开发(核心库由C语言实现)。
编写的python文件在执行前需要修改为可运行的节点
sudo chmod +x (文件名.py)
❤ 在编写程序前,需要创建工作空间,然后在工作空间的src
文件夹下创建功能包
❤ 功能包的创建可以使用如下指令:(我的功能包名称为is_a_test
,后面的是相关的依赖项)
catkin_create_pkg is_a_test std_msgs rospy roscpp
❤ python程序在功能包的scripts
目录下创建
❤ 然后catkin_make
。如果是新创建的工作空间,需要添加一下路径。
在scripts目录下新建talker.py
文件
#!/usr/bin/env python 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) # 10hz 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
发布话题内容在scripts目录下新建listener.py
文件
#!/usr/bin/env python import rospy from std_msgs.msg import String def callback(data): rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data) def listener(): # In ROS, nodes are uniquely named. If two nodes with the same node are launched, the previous one is kicked off. # The anonymous=True flag means that rospy will choose a unique name for our 'listener' node so that multiple listeners can run simultaneously. rospy.init_node('listener', anonymous=True) rospy.Subscriber("chatter", String, callback) # spin() simply keeps python from exiting until this node is stopped rospy.spin() if __name__ == '__main__': listener()
说明:
rospy.Subscriber
订阅话题修改Cmakelist.txt
为如下
cmake_minimum_required(VERSION 2.8.3)
project(is_a_test)
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
)
catkin_package()
说明:
catkin_create_pkg
创建的功能包,并且在创建时已经安装了全部依赖,那么这里就不需要再更改了cmakelist
基本就是把头文件里需要的ros依赖放到find_package(catkin REQUIRED COMPONENTS)
里。而对于c++文件则复杂一些project(beginner_tutorials)
里写明功能包的名字sudo chmod +x [文件名.py]
)catkin_make
(因为说c++需要编译,python不需要编译,所以不太明白对于python需不需要catkin_make)在三个终端,分别运行以下三条命令(is_a_test
是功能包的名字)
roscore
rosrun is_a_test talker.py
rosrun is_a_test listener.py
说明:
sudo chmod +x [文件名.py]
).py
文件的第一行要有#!/usr/bin/env python
,不然会报错。报错:
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的安装路径,再调用对应路径下的解释器程序完成操作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。