本文记录使用C++或Python编程实现订阅小乌龟的位姿信息。
前面的内容里,介绍了如何使用话题发布实现小乌龟的圆周运动,主要控制的话题是 /turtle1/cmd_vel,这里尝试使用话题订阅小乌龟在模拟平面上的位姿,借助的话题是 /turtle1/pose。
借助ROS命令查看话题
查看所有话题
rostopic list
使用rostopic echo 话题名
rostopic echo /turtle1/pose
使用 rostopic info 话题名 查看话题的详细信息
rostopic info /turtle1/pose
可以发现这里的 Subscribers 为空
使用
rosmsg show turtlesim/Pose
有了上面的分析,开始进行程序的实现
C++实现
#include "ros/ros.h"
#include "turtlesim/Pose.h"
/**
* @brief
* 订阅乌龟的pose话题
*
* @param argc
* @param argv
* @return int
*/
void doPose(const turtlesim::Pose::ConstPtr &pose){
ROS_INFO("animal location x=%.2f,y=%.2f,chaoxiang = %.2f,xiansudu=%.2f,jiaosudu=%.2f",pose->x,pose->y,pose->theta,pose->linear_velocity,pose->angular_velocity);
}
int main(int argc,char *argv[]){
setlocale(LC_ALL,"");
//初始化节点
ros::init(argc,argv,"sub_test_01");
//定义句柄
ros::NodeHandle nh;
//创建订阅对象
ros::Subscriber sub = nh.subscribe("/turtle1/pose",100,doPose);
//处理订阅消息
//回调函数
ros::spin();
return 0;
}
Python实现
#! /usr/bin/env python
# -*- coding:utf-8 -*-
import rospy
from turtlesim.msg import Pose
def doPose(pose):
rospy.loginfo("location_coord:(%.2f,%.2f),chaoxiang(%.2f),linear_speed(%.2f),angular_speed(%.2f)",\
pose.x,pose.y,pose.theta,pose.linear_velocity,pose.angular_velocity)
if __name__=="__main__":
rospy.init_node("sub_test_02")
sub = rospy.Subscriber("/turtle1/pose",Pose,doPose,queue_size=10)
rospy.spin()
【注:需要在package.xml中添加 turtlesim的依赖文件,然后在CMakeLists.txt中添加相应的配置,然后进行编译运行,会看到下面的内容】
使用下面的命令,可以发现有订阅者了。
rostopic info /turtle1/pose