ROS实操_话题订阅


需求描述: 已知turtlesim中的乌龟显示节点,会发布当前乌龟的位姿(窗体中乌龟的坐标以及朝向),要求控制乌龟运动,并时时打印当前乌龟的位姿。

实现分析:

  1. 首先,需要启动乌龟显示以及运动控制节点并控制乌龟运动。
  2. 要通过ROS命令,来获取乌龟位姿发布的话题以及消息。
  3. 编写订阅节点,订阅并打印乌龟的位姿。

实现流程:

  1. 通过ros命令获取话题与消息信息。
  2. 编码实现位姿获取节点。
  3. 启动 roscore、turtlesim_node 、控制节点以及位姿订阅节点,控制乌龟运动并输出乌龟的位姿。

1. 话题与消息获取

获取话题: /turtle1/pose

rostopic list

获取消息类型: turtlesim/Pose

rostopic type  /turtle1/pose

**获取消息格式: **

rosmsg info turtlesim/Pose

响应结果:

float32 x
float32 y
float32 theta
float32 linear_velocity
float32 angular_velocity

2. 实现订阅节点

本次案例在ROS实操_话题发布创建的dotopic功能包内进行,因此无需开展功能的包的创建等相关操作,只需在scripts目录内配置订阅节点相关的python文件即可。

touch sub_topic.py
#! /usr/bin/env python
# coding=utf-8
"""
    订阅小乌龟的位姿: 时时获取小乌龟在窗体中的坐标并打印
    准备工作:
        1.获取话题名称 /turtle1/pose
        2.获取消息类型 turtlesim/Pose
        3.运行前启动 turtlesim_node 与 turtle_teleop_key 节点

    实现流程:
        1.导包
        2.初始化 ROS 节点
        3.创建订阅者对象
        4.回调函数处理订阅的数据
        5.spin

"""

import rospy
from turtlesim.msg import Pose

def doPose(data):
    rospy.loginfo("乌龟坐标:x=%.2f, y=%.2f,theta=%.2f",data.x,data.y,data.theta)

if __name__ == "__main__":

    # 2.初始化 ROS 节点
    rospy.init_node("sub_pose_p")

    # 3.创建订阅者对象
    sub = rospy.Subscriber("/turtle1/pose",Pose,doPose,queue_size=1000)
    #     4.回调函数处理订阅的数据
    #     5.spin
    rospy.spin()
chmod +x sub_topic.py

编辑dotopic下的CmakeLists.txt文件

catkin_install_python(PROGRAMS 
  scripts/pub_topic.py
  scripts/sub_topic.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

3. 运行

工作空间下,编译并初始化环境变量

catkin_make
source devel/setup.bash

roscore

rosrun turtlesim turtlesim_node
rosrun dotopic sub_topic.py
rosrun dotopic pub_topic.py

文章作者: kolbey
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kolbey !