ROS 进阶学习笔记(13) - Combine Subscriber and Publisher in Python, ROS
Combine Subscriber and Publisher in Python, ROS
This article will describe an example of Combining Subscriber and Publisher in Python in ROS programming.
This is very useful in ROS development.
We will also discuss briefly how to build and modify a catkin package which is written by Python.
- Create a catkin package with the command: catkin_create_pkg, under the path: ~/catkin_ws/src
- Build it with the command: catkin_make, under the path: ~/catkin_ws/
- Source the catkin setup file under devel folder:
$ source ~/catkin_ws/devel/setup.bash
- modify the Python scripts file under the path: ~/catkin_ws/src/<pkg_name>/scripts/nodexxx.py
- chmod +x nodexxx.py
- Run this package by Command: rosrun package_name nodexxx.py
- Modify the CMakefile.txt for Python: Writing a ROS Python Makefile
More about Create and Build catkin ROS package: This blog
The sourcecode for this Combining Subscriber and Publisher in Python is here:
#!/usr/bin/env python
# License removed for brevity
"""
learn to write Subscriber and Listener in one python script.
Function Style
Author: Sonic http://blog.csdn.net/sonictl
Date: Feb 29, 2016
"""
import rospy
from std_msgs.msg import String def callback(data):
rospy.loginfo(rospy.get_caller_id() + "callback:I heard %s", data.data)
#resp_str = "resp_str: I heard: " + data.data
talker(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. http://blog.csdn.net/sonictl
rospy.init_node('responsor', anonymous=True) rospy.Subscriber("uc0Response", String, callback) # spin() simply keeps python from exiting until this node is stopped
rospy.spin() def talker(data):
pub = rospy.Publisher('uc0Command', String, queue_size=10)
rospy.loginfo("talker:I heard %s", data.data) #while not rospy.is_shutdown():
resp_str = "resp_str: I heard: " + data.data
rospy.loginfo(resp_str)
if data.data == "cigit-pc\n" :
pub.publish(resp_str)
else:
rospy.loginfo("invalid seri data:" + data.data) if __name__ == '__main__':
#listener()
try:
listener()
#talker()
except rospy.ROSInterruptException:
pass
20160614: I have to paste the next code for an other instance because this should be very good for learners:
#!/usr/bin/env python """ odom_ekf.py - Version 0.1 2012-07-08
Republish the /robot_pose_ekf/odom_combined topic which is of type
geometry_msgs/PoseWithCovarianceStamped as an equivalent message of
type nav_msgs/Odometry so we can view it in RViz.
Created for the Pi Robot Project: http://www.pirobot.org
Copyright (c) 2012 Patrick Goebel. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.5 This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details at: http://www.gnu.org/licenses/gpl.html """ import roslib; roslib.load_manifest('rbx1_nav')
import rospy
from geometry_msgs.msg import PoseWithCovarianceStamped
from nav_msgs.msg import Odometry class OdomEKF():
def __init__(self):
# Give the node a name
rospy.init_node('odom_ekf', anonymous=False) # Publisher of type nav_msgs/Odometry
self.ekf_pub = rospy.Publisher('output', Odometry) # Wait for the /odom topic to become available
rospy.wait_for_message('input', PoseWithCovarianceStamped) # Subscribe to the /robot_pose_ekf/odom_combined topic
rospy.Subscriber('input', PoseWithCovarianceStamped, self.pub_ekf_odom) rospy.loginfo("Publishing combined odometry on /odom_ekf") def pub_ekf_odom(self, msg):
odom = Odometry()
odom.header = msg.header
odom.child_frame_id = 'base_footprint'
odom.pose = msg.pose self.ekf_pub.publish(odom) if __name__ == '__main__':
try:
OdomEKF()
rospy.spin()
except:
pass
This program above is for Transfer a
PoseWithCovarianceStamped typed topic "input" into
Odometry typed topic which is named "output".
We can learn how to initialize a node, declare a publisher, subscriber and how to use
wait_for_message() function. The callback function pub_ekf_odom is called when input has data, and we can see how this function works to convert the data from PoseWithCovarianceStamped
into Odometry.
ROS 进阶学习笔记(13) - Combine Subscriber and Publisher in Python, ROS的更多相关文章
- ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM - ROSMapModify - ROS地图修改
ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM - 2 - MapModify地图修改 We can use gmapping model to genera ...
- ROS 进阶学习笔记(12) - Communication with ROS through USART Serial Port
Communication with ROS through USART Serial Port We always need to communicate with ROS through seri ...
- ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM
(写在前面: 这里参考rbx书中第八章和ROS社区教程进行学习,先看社区教程) === Doing the Turtlebot Navigation === ref ros wiki: http ...
- ROS进阶学习笔记(10)- 搭建自己的Turtlebot(5) - Interactive Makers
用interactive_makers控制Turtlebot移动 interactive_makers 是Willow Garage公司开发的一个虚拟控制工具,可通过鼠标在虚拟环境中的操作,完成实际机 ...
- Ext.Net学习笔记13:Ext.Net GridPanel Sorter用法
Ext.Net学习笔记13:Ext.Net GridPanel Sorter用法 这篇笔记将介绍如何使用Ext.Net GridPanel 中使用Sorter. 默认情况下,Ext.Net GridP ...
- SQL反模式学习笔记13 使用索引
目标:优化性能 改善性能最好的技术就是在数据库中合理地使用索引. 索引也是数据结构,它能使数据库将指定列中的某个值快速定位在相应的行. 反模式:无规划的使用索引 1.不使用索引或索引不足 2.使用了 ...
- golang学习笔记13 Golang 类型转换整理 go语言string、int、int64、float64、complex 互相转换
golang学习笔记13 Golang 类型转换整理 go语言string.int.int64.float64.complex 互相转换 #string到intint,err:=strconv.Ato ...
- springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定
springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定 标签: springmvc springmvc学习笔记13-springmvc注解开发之集合类型參数绑定 数组绑定 需 ...
- Python3+Selenium3+webdriver学习笔记13(js操作应用:弹出框无效如何处理)
#!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记13(js操作应用:弹出框无效如何处理)'''from sel ...
随机推荐
- 基于zookeeper的activemq的主从集群配置
项目,要用到消息队列,这里采用activemq,相对使用简单点.这里重点是环境部署. 0. 服务器环境 RedHat710.90.7.210.90.7.1010.90.2.102 1. 下载安装zoo ...
- ecstore-安装提示flock,即使绕过检测,安装成功后还是提示t function 解决办法
安装时先绕过去 安装好后,修改config.php里的TMP_DIR,指向网站目录下的data目录(用绝对路径) 分析:应该是php的运行用户没有对tmp目录的写权限.中电云集的管理工具就出现过
- mysql update 将一个表某字段设为另一个表某字段的值
表新添加了一个字段,毫无疑问是空值.所以想将另一个表的某个字段的值写入到修改的表中. sql语句不复杂,但还是记录一下,因为也查了一会,以后说不定还会用到. mysql> update cent ...
- 基于geohash6编码实现相邻4、9、16网格合并
前面的两篇文章介绍了geohash的基本原理及c#代码相关实现,其中geohash 5位编码单个网格覆盖面积大约在24平方千米,6位编码单网格覆盖面大约在0.73平方千米, 相邻编码长度之间单网格覆盖 ...
- eval 日期对象
js中,eval相当于python中的eval(表达式)和exec(代码)的集合. var d = new Date(); #申明一个新的日期对象,方便之后调用,它的方法getDate();ge ...
- ios导航栏和tabbar的坑
多年不写ios,目前重构项目,发现navBar和tabbar需要注意的点,记录备忘 translucent属性会导致view起始点的变化,默认为透明,和设计图有色差,改成不透明以后,坐标位置有变化,修 ...
- vue中的计算属性中的坑,
new Vue({ el: '#app', data: { msg:'121', val: '', }, computed:{ val:function(){ return 3; } }, }); 这 ...
- Ubuntu 14.10 下Spark on yarn安装
1 服务器分布 服务器 说明 192.168.1.100 NameNode 192.168.1.101 DataNode 192.168.1.102 DataNode 2 软件环境 2.1 安装JDK ...
- 前端模拟后台返回数据之Mockjs
一.官方文档: https://github.com/nuysoft/Mock/wiki/Syntax-Specification 例子:http://mockjs.com/examples.html ...
- mina2的processor
processor顾名思义,就是进行IO处理,处理当前session的数据读写,并进行业务处理. 在mina server初始化的时候,会初始化一个processor池,通过NioSocketAcce ...