(转载)使用Python编写ROS程序

转自https://blog.csdn.net/h_l_dou/article/details/83348519

一,定义msg消息

  1. 在 你的功能包--》【beginner_tutorials】,新建msg消息目录,新建Num.msg文件

   
   
  1. $ roscd beginner_tutorials
  2. $ mkdir msg
  3. $ cd msg
  4. $ touch Num.msg
  5. $ rosed beginner_tutorials Num.msg
  1. Num.msg文件,手工输入代码:
int64 num

   
   
  1. 打开文件rosed 你的功能包名-—》【beginner_tutorials】 package.xml,增加依赖,

   
   
  1. <build_depend>message_generation </build_depend>
  2. <run_depend>message_runtime </run_depend>
  1. 打开文件rosed 你的功能包名--》【beginner_tutorials】 CMakeLists.txt,增加依赖,

   
   
  1. # Do not just add this line to your CMakeLists.txt, modify the existing line
  2. find_package(catkin REQUIRED COMPONENTS
  3. roscpp
  4. rospy
  5. std_msgs
  6. message_generation
  7. )
  1. 在CMakeLists.txt文件,增加消息文件,取消#,并修改为

   
   
  1. add_message_files(
  2. FILES
  3. Num .msg
  4. )
  1. 在CMakeLists.txt文件,增加消息生成包,取消#,并修改为

   
   
  1. generate_messages(
  2. DEPENDENCIES
  3. std_msgs
  4. )
  1. 在CMakeLists.txt文件,增加消息生成包,取消CATKIN_DEPENDS的#,并修改为

   
   
  1. catkin_package(
  2. # INCLUDE_DIRS include
  3. # LIBRARIES beginner_tutorials
  4. CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
  5. # DEPENDS system_lib
  6. )
  1. 编译代码

   
   
  1. $ cd ~/catkin_ws
  2. $ catkin_make
  1. 检查服务
  • 命令:
$ rosmsg show beginner_tutorials/Num

   
   
  • 效果:
int64 num

   
   

编写发布器的步骤

  1. 进入之前建立的包beginner_tutorials
$ roscd beginner_tutorials

   
   
  1. 建立Python脚本目录

   
   
  1. $ mkdir scripts
  2. $ cd scripts
  1. 访问代码:
https://github.com/ros/ros_tutorials/blob/kinetic-devel/rospy_tutorials/001_talker_listener/talker.py

   
   
  1. 新建talker.py文件,设置权限为可执行,并手工输入代码

   
   
  1. $ touch talker.py #生成文件
  2. $ chmod +x talker.py #设置可执行
  3. $ rosed beginner_tutorials talker.py #自己输入代码

内容如下:


   
   
  1. #!/usr/bin/env python
  2. #coding=utf-8
  3. import rospy
  4. from std_msgs.msg import String
  5. def talker():
  6.     pub = rospy.Publisher( 'chatter',String, queue_size= 10)
  7.     rospy.init_node( 'talker',anonymous= True)
  8.     rate = rospy.Rate( 10) # 10hz
  9.     while not rospy.is_shutdown():
  10.         hello_str = "超哥 好帅啊 %s" % rospy.get_time()
  11.         rospy.loginfo(hello_str)
  12.         pub.publish(hello_str)
  13.         rate.sleep()
  14. if __name__ == '__main__':
  15.     try:
  16.         talker()
  17.     except rospy.ROSInterruptException:
  18.         pass
  • 请手工输入上面代码,加深节点结构印象。
  1. 代码分析
  • 代码:#!/usr/bin/env python

  • 分析:指定通过python解释代码

  • 代码:#coding=utf-8
  • 分析:使python能识别中文编码,这样你就可以让发布者和订阅者能发布中文和订阅中文了
  • 代码:import rospy

  • 分析:导入rospy包,rospy是ROS的python客户端。参考rospy API接口

  • 代码:from std_msgs.msg import String

  • 分析:

    • 导入python的标准字符处理库
    • String是一个函数,可以另外方式赋值:

   
   
  1. msg = String()
  2. msg.data = str
  • 或者
String(data=str)

   
   
  • 参考python的标准函数库

  • 代码:def talker()

  • 分析:定义talker函数,参考如何定义函数

  • 代码:pub = rospy.Publisher('chatter', String, queue_size=10)

  • 分析:定义发布的主题名称chatter, 消息类型String,实质是std_msgs.msg.String, 设置队列条目个数.参考rospy.Publisher API

  • 代码:rospy.init_node('talker', anonymous=True)

  • 分析:

    • 初始化节点,节点名称为talker, 参考rospy.init_node API
    • anonymous=True,要求每个节点都有唯一的名称,避免冲突。这样可以运行多个talker.py
  • 代码:rate = rospy.Rate(10) # 10hz

  • 分析:设置发布的频率,单位是每秒次数,这是每秒10次的频率发布主题,参考rospy.Rate API

  • 代码:rospy.is_shutdown()

  • 分析:用于检测程序是否退出,是否按Ctrl-C 或其他

  • 代码:rospy.loginfo

  • 分析:在屏幕输出日志信息,写入到rosout节点,也可以通过rqt_console来查看。参考rospy.loginfo API

  • 代码:pub.publish(hello_str)

  • 分析:发布信息到主题,参考pub.publish API

  • 代码:rate.sleep()

  • 分析:睡眠一定持续时间,如果参数为负数,睡眠会立即返回。参考 sleep api

  1. 编译代码

   
   
  1. $ cd ~/catkin_ws
  2. $ catkin_make
  1. 测试代码
  • 打开新终端,启动roscore
$ roscore 

   
   
  • 打开另一个终端,启动talker.py
$rosrun beginner_tutorials talker.py

   
   
  • 效果:

   
   
  1. [INFO] [WallTime: 1526964840.801095] 超哥 好帅啊 1526964840 .8
  2. [INFO] [WallTime: 1526964840.901098] 超哥 好帅啊 1526964840 .9
  3. [INFO] [WallTime: 1526964841.001053] 超哥 好帅啊 1526964841 .0
  4. [INFO] [WallTime: 1526964841.101093] 超哥 好帅啊 1526964841 .1
  5. [INFO] [WallTime: 1526964841.201097] 超哥 好帅啊 1526964841 .2
  1. 查看主题
  • 命令:
$ rostopic echo /chatter

   
   
  • 效果:

   
   
  1. data: 超哥 好帅啊 1478444433 .95
  2. ---
  3. data: 超哥 好帅啊 1478444434 .45
  4. ---

编写订阅器的步骤

  1. 访问代码:
https://github.com/ros/ros_tutorials/blob/kinetic-devel/rospy_tutorials/001_talker_listener/listener.py

   
   
  1. 进入~/catkin_ws/src/beginner_tutorials/scripts目录,建立listener.py文件

   
   
  1. $ roscd beginner_tutorials
  2. $ cd scripts
  3. $ touch listener.py
  4. $ chmod +x listener.py
  5. $ rosed beginner_tutorials listener.py
  1. 手工输入如下代码:

   
   
  1. #!/usr/bin/env python
  2. #coding=utf-8
  3. import rospy
  4. from std_msgs.msg import String
  5. def callback(data):
  6.     rospy.loginfo(rospy.get_caller_id() + '我觉得 %s', data.data)
  7. def listener():
  8.     # In ROS, nodes are uniquely named. If two nodes with the same
  9.     # name are launched, the previous one is kicked off. The
  10.     # anonymous=True flag means that rospy will choose a unique
  11.     # name for our 'listener' node so that multiple listeners can
  12.     # run simultaneously.
  13. #对上面注释翻译
  14. #在ROS中,节点是唯一命名的。 如果两个节点相同
  15.     #名称被启动,前一个被启动。 该
  16.     #anonymous = True标志意味着rospy会选择一个独特的
  17.     #我们的'侦听器'节点的名称,以便多个侦听器可以
  18.     #同时运行。
  19.      rospy.init_node( 'listener', anonymous= True)
  20.     rospy.Subscriber( 'chatter', String, callback)
  21.     # spin() simply keeps python from exiting until this node is stopped
  22.     rospy.spin()
  23. if __name__ == '__main__':
  24.     listener()
  1. 代码分析
  • 代码:rospy.init_node('listener', anonymous=True)

  • 分析:

    • 初始化节点,节点名称为talker, 参考rospy.init_node API
    • anonymous=True,要求每个节点都有唯一的名称,避免冲突。这样可以运行多个listener.py
  • 代码: rospy.Subscriber("chatter", String, callback)

  • 分析:

    • 订阅函数,订阅chatter主题,内容类型是std_msgs.msgs.String。
    • 当有新内容,调用callback函数处理。接受到的主题内容作为参数传递给callback.
  • 代码:rospy.spin()

  • 分析:保持节点运行,直到节点关闭。不像roscpp,rospy.spin不影响订阅的回调函数,因为回调函数有自己的线程。

  1. 编译代码

   
   
  1. $ cd ~/catkin_ws
  2. $ catkin_make
  1. 测试代码
  • 打开新终端,启动roscore
$ roscore 

   
   
  • 先打开终端运行talker.py, 打开另一个终端,启动listener.py
$rosrun beginner_tutorials listener.py

   
   
  • 效果:

   
   
  1. [ INFO] [WallTime: 1526964838.601590] /listener_1299_1526964825697我觉得 超哥 好帅啊 1526964838.6
  2. [ INFO] [WallTime: 1526964838.701610] /listener_1299_1526964825697我觉得 超哥 好帅啊 1526964838.7
  3. [ INFO] [WallTime: 1526964838.801621] /listener_1299_1526964825697我觉得 超哥 好帅啊 1526964838.8
  4. [ INFO] [WallTime: 1526964838.901650] /listener_1299_1526964825697我觉得 超哥 好帅啊 1526964838.9
  5. [ INFO] [WallTime: 1526964839.001606] /listener_1299_1526964825697我觉得 超哥 好帅啊 1526964839.0
  6. [ INFO] [WallTime: 1526964839.101618] /listener_1299_1526964825697我觉得 超哥 好帅啊 1526964839.1
  1. 也可以使用命令测试listener.py
  • 命令:
$ rostopic pub -r 10 /chatter std_msgs/String "test"

   
   
  • 效果:

   
   
  1. $ rostopic echo /chatter
  2. data: test
  3. ---
  4. data: test
  5. ---
  6. data: test
  7. ---
  8. data: test
  9. ---
  10. data: test
  11. ---
  12. data: test
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值