《ROS1学习笔记4——话题通信之订阅者》
文章目录1、创建工作空间及功能包1.1、前期准备1.1.1、进入工作空间1.1.2、新建功能包1.1.2、新建c代码1.2、实现思路2、编写代码3、编译运行3.1、编辑CMakeLists文件3.1.1、检查依赖3.1.2、创建可执行文件与链接库3.2、编译3.3、改变环境变量3.4、运行代码3.4.1、启动ROS3.4.2、运行海龟节点和海龟控制节点3.4.3、订阅话题1、创建工作空间及功能包1.1、前期准备在上一篇文章中我们在编写实现了在话题通信中的发布消息这一节我们尝试订阅消息。选择在上一期创建的demo_ws工作空间下编写节点代码。1.1.1、进入工作空间右键选择用vscode打开工作空间目录或者在终端中输入 code ./ 也能直接进入vscode并打开工作空间1.1.2、新建功能包在与上一节相同的工作空间下创建一个新的功能包来编写话题订阅的代码。cd demo_ws/src catkin_create_pkg demo_topic_sub roscpp rospy std_msgs geometry_msgs turtlesim此时你的工作空间目录为1.1.2、新建c代码在src目录下右击新建cpp文件我这里取名为topic_sub.cpp1.2、实现思路初始化ROS节点订阅需要的话题循环等待话题消息接收到消息后进入回调函数在回调函数中进行消息处理2、编写代码代码如下#includeros/ros.h#includeturtlesim/Pose.hvoidposeCallback(constturtlesim::Pose::ConstPtrmsg){//将接受到的消息打印出来ROS_INFO(Turtle pose:x :%0.6f, y:%0.6f,msg-x,msg-y);}intmain(intargc,char**argv){//初始化ROS节点ros::init(argc,argv,pose_subscriber);//创建节点句柄ros::NodeHandle n;//创建一个Subscriber订阅名为/turtle1/pose的topic,注册回调函数poseCallback//订阅者不知道消息什么时候进来。相当于中断一旦有消息进来就调用回调函数ros::Subscriber pose_subn.subscribe(/turtle1/pose,10,poseCallback);//循环等待回调函数//死循环ros::spin();return0;}3、编译运行3.1、编辑CMakeLists文件3.1.1、检查依赖如果你在使用catkin_creat_pkg命令创建功能包时添加上了依赖CMakeLists中就会包括以下库依赖若没有则需手动加上。3.1.2、创建可执行文件与链接库在155行左右加上如下两句代码:add_executable(topic_sub src/topic_sub.cpp)target_link_libraries(topic_sub ${catkin_LIBRARIES})解释1、add_executable(demo_sub src/demo_sub.cpp)add_executableCMake 命令用于创建可执行文件demo_pub生成的可执行文件名称(此名称可随便取)src/demo.cpp源代码文件路径此路径以及你刚编辑的cpp文件名得正确2、target_link_libraries(demo_sub${catkin_LIBRARIES})target_link_libraries将库文件链接到可执行文件${catkin_LIBRARIES}ROS 相关的库文件集合3.2、编译在工作空间的目录下输入如下命令进行编译catkin_make没有报错且进度跑到100就是编译成功并且会显示我们工作空间下存在的两个功能包。此时还可以检查/devel/lib/demo_topic_sub目录下有无出现可执行文件并且可执行文件的名字是你刚才add_executable取的名字绿色的就是可执行文件直接展开也可以看到3.3、改变环境变量source devel/setup.bash3.4、运行代码在vscode中CtrlShift5是再打开一个终端这里打开四个终端第一个终端是我们刚编译代码的开第二个终端运行roscore开第三个终端运行海龟模拟器节点第四个终端运行海龟键盘控制节点。3.4.1、启动ROSroscore3.4.2、运行海龟节点和海龟控制节点rosrun turtlesim turtlesim_noderosrun turtlesim turtle_teleop_key3.4.3、订阅话题rosrun [功能包名] [可执行文件名]rosrun demo_topic_sub demo_sub此时终端里开始打印小海龟的位置信息x和有的坐标此时你也可以将鼠标放在运行海龟键盘控制的终端里使用键盘控制海龟运动你会发现坐标在实时变化