ros学习(2-2):ros节点创建(python)

参考

Python创建简单的ROS节点:

Python创建ROS节点(使用自定义消息):

Python创建ROS服务(使用自定义消息):



说明

与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()。

roscpprospy的接口并不一致,实现原理上两套客户端库也有各自的实现,没有基于一个同意的核心库来开发,要避免混用。

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文件

#!/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

 
说明:

1.2 订阅话题

在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 订阅话题

1.3 编译

修改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创建的功能包,并且在创建时已经安装了全部依赖,那么这里就不需要再更改了
  • 对于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

 
说明:

报错:

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的安装路径,再调用对应路径下的解释器程序完成操作。

  • 3
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值