当前位置:   article > 正文

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

rospy.init_node

参考

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)
  • 1

01 创建节点

在编写程序前,需要创建工作空间,然后在工作空间的src文件夹下创建功能包

功能包的创建可以使用如下指令:(我的功能包名称为is_a_test,后面的是相关的依赖项)

catkin_create_pkg is_a_test std_msgs rospy roscpp
  • 1

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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

 
说明:

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

 
说明:

  • 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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

 
说明:

  • 如果是使用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
  • 1
  • 2
  • 3
  • 4
  • 5

 
说明:

报错:

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():'
  • 1
  • 2
  • 3
  • 4
  • 5

解决:

在文件头加上:

#!/usr/bin/env python
  • 1

#!/usr/bin/env python这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。
当系统看到这一行的时候,首先会到env设置(环境变量)里查找python的安装路径,再调用对应路径下的解释器程序完成操作。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/401078
推荐阅读
相关标签
  

闽ICP备14008679号