ROS学习第四天

今天学习订阅这个话题的实现。我们要订阅这个话题是关于小海龟的位置信息。依旧是先运行roscore。然后启动小海龟节点。输入rostopic list,查看当前小海龟启动后的对应的话题。
在这里插入图片描述
我们要订阅的话题就是/turtle1/pose。具体查看某个话题,比如查看改话题的发布者(Publishers)和订阅者(Subscribers)以及话题的类型(Type),用命令:rostopic info +某个话题。这里我们输入指令
rostopic info /turtle1/pose

在这里插入图片描述
这个话题所包含是海龟的位置信息,我们可以输入指令查看里面的包含的数据类型。:

rosmsg show turtlesim/Pose 

在这里插入图片描述
接下俩我们编写c++和python对应的程序。这里仍旧用的是古月居老师的例程。
具体c++代码:

#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("/turtle1/pose",10,poseCallback);
	//循环等待回调函数
	ros::spin();
}

python代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

########################################################################
####          Copyright 2020 GuYueHome (www.guyuehome.com).          ###
########################################################################

# 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
import rospy
from turtleim.msg import Pose
def poseCallback(msg):
	rospy.loginfo("Turtle pose: x:%0.6f,y:%0.6f")
def pose_subcriber():
	#ros节点初始化
	rospy.init_node('pose_subcriber',anonymous=True)
	#创建一个Subscriber,订阅名为/turtle1/pose的Topic,注册回调函数poseCallback
	rospy.Subscriber("/turtle1/pose",Pose,poseCallback)
	#循环等待回调函数
	rospy.spin()
if __name__ == '__main__':
	pose_subcriber()

运行c++程序时候我们仍然需要先往CMakelists.txt添加俩句指令:

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

所在路径如下图所示:
在这里插入图片描述
接下来切换回根文件夹,输入指令:catkin_make.等待编译成功。接下来仍旧要是环境变量生效,但每次输入过于麻烦,所以可以让环境变量生效可以往/home/bathwind你的文件夹下的隐藏文件.bashrc文件。如下图所示。
在这里插入图片描述
在保存完之后重启终端窗口。输入指令rosrun learning_topic pose_subsiber运行编译好的c++程序。
在这里插入图片描述
发现程序能够返回坐标,证明订阅话题的数据能够实现。

posted @ 2022-01-07 21:53  Bathwind_W  阅读(5)  评论(0编辑  收藏  举报  来源