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++程序。
发现程序能够返回坐标,证明订阅话题的数据能够实现。
本文来自博客园,作者:Bathwind_W,转载请注明原文链接:https://www.cnblogs.com/bathwind/p/18107951