第九弹 ROS订阅者Subscriber的编程实现

1. 话题模型

 2.创建订阅者

  • 初始化ROS节点
  • 订阅需要的话题
  • 循环等待话题消息,接收到消息后回调函数
  • 在回调函数中完成消息处理

ros::spin() 和 ros::spinOnce() 区别及详解

pose_scribe.cpp文件(已修正):

/*
*该例程将用于订阅/turtle/pose话题,消息类型为turtlesim::Pose
*/
#include<ros/ros.h>      //很多ROS里的API和函数从里面调用
#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,发布名为/turtle/pose的topic,注册回调函数ros::Subscriber pose_sub  = n.subscribe("/turtle1/pose",10,poseCallback);//循环等待回调函数ros::spin();return 0;}

3.配置订阅者代码编译规则

设置需要编译的代码和生成的可执行文件;

设置链接库;

add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})

将这两行话复制到learning_topic文件夹下的CMakeLists.txt文件夹中:

4. 编译并运行订阅者

 在catkin_ws目录下进行编译:

 果然还是报错了:有错不要怕,一点点改过来就行,新手上路不要怕错:

系统告诉我们,是CMakeLises.txt文件里215行少了一个),由于后面都是注释,实际上是这里忘记打右括号了。

 改正完毕,再次编译。还是有错,继续改。 

经过不断修改,终于编译成功:

添加环境变量(如果上一讲之前没有在隐藏文件中添加的话)

运行三个终端:

roscorerosrun turtlesim turtlesim_node
rosrun learning_topic pose_subscriber

小海龟没有动,我们可以运行上一讲的发布者来让他动。

打开一个新终端:

rosrun learning_topic velocity_publisher