ROS学习路
在学习订阅消息时,先编写好订阅者的cpp程序:
/*
该例程将订阅/turtle/pose话题,消息类型turtle::Pose
*/
#include <ros/ros.h>
#include "turtlesim/Pose.h"
//接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
//打印接收到的消息
ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}
int main(int argc,char **argv)
{
//初始化ros节点
ros::init(argc,argv,"pose_subscriber");
//创建节点句柄
ros::NodeHandle n;
//创建一个subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
ros::Subscriber pose_sub=n.subscribe("/turtle/pose",10,poseCallback);
//循环等待回调函数
ros::spin();
return 0;
}
然后在工作空间目录下编译,正常编译通过,编译命令:
~$ cd ~/catkin_ws
~$ catkin_make
编译完成后启动ros服务:
~$ roscore
打开新的终端,启动小乌龟:
~$ rosrun turtlesim turtlesim_node
打开新的终端,启动订阅(如果没有把环境变量设置为全局的还需要在本终端设置环境变量):
~$ source ~/catkin_ws/devel/setup.bash
启动订阅:
~$ rosrun learning_topic pose_subscriber
执行订阅后终端无反应,没有任何数据输出,执行命令:
~$ rqt_graph
发现turtle和订阅pose_subscriber是相互独立的,也就是说pose_subscriber并没有订阅到小乌龟的运动信息,详细检查源程序发现在pose_subscriber.cpp中创建订阅者时,订阅信息" /turtle/pose"漏写了一个1,导致订阅信息错误,更正为" /turtle1/pose"后,重新编译,重新启动各项服务, 订阅信息成功。
此时重新查看节点关系,节点关系正常:
~$ rqt_graph