文章目录
【记录ROS学习(四)2022/07/20】关于“ROS中订阅subscribe 多个话题并汇聚回调信息处理”以及“UR5 接收关节信息”的学习记录
一、ROS中订阅subscribe 多个话题并汇聚回调信息处理
- 在学习的过程中,我需要用到多个订阅内容集合到单个函数中进行处理的操作。
- 但是一般网络上的订阅方式是没有回调参数的,于是我走了很多歪路,例如
- 获取内存地址并用python中的ctypes,进行一个地址内容抽取,参考《python通过内存地址获取数据》),但是效果很差,估计是ROS本身封装的很严所以一般的抽取内存数据的方式不可用;
- 调取rospy.topics.Subscriber***函数里的方法,也是无法解决这个问题:
于是我开启了面向搜索引擎编程,发现这个两个教程
(1) 利用message_filter进行多传感器时间同步
(2) ROS官方教程[翻译]—message_filter的使用
附上代码示例:
import message_filters
#---------------------订阅----------------------
sub1 = message_filters.Subscriber('/topic1' , msg)
#message_filters.Subscriber 跟rospy.Subscriber 一样需要传入的函数
sub2 = message_filters.Subscriber('/topic2' , msg)
#---------------------集合-----------------------
ts = message_filters.TimeSynchronizer([sub1,sub2],1)
ts.registerCallback( 要传入的函数 )
#---------------------END----------------------
以上仅为使用模板topic 的选择还得看用户
二、UR5 接收关节信息
在实验的过程中,我希望收集UR5机械臂的关节信息,但是当我把 订阅rospy.Subscriber() 函数放在执行UR5控制(运动)的函数前面时会出现无法进入下一个函数的情况,在查阅很多网络资料后发现未知作者操作UR5机械臂一文中出现了一句话
也就是说必须UR5机械臂有出现关节变化时该订阅才会生效,因此必须让机械臂动起来或者把订阅消息的程序放在机械臂控制运动的函数之后
附上示例代码
rospy.Subscriber('/joint_states',JointState,getUR5State)
def getUR5State:
UR5state = state.position
rospy.loginfo(UR5state)
通过这一年的学习算是对强大的ROS系统有了浅薄的了解,但还有很多地方需要学习,例如 “把所有的节点放到一个Lanuch里” 或者"做成一个Qt可视化界面",以及接入力传感器数据等等更多的挑战需要去面对