ros的常用的订阅消息

下面介绍ros里面常用的订阅消息,并用代码示例写法和效果

**注意:ros里的消息和服务头文件所在地址为:
/opt/ros/kinetic/include**我们可以前往这里面去查看里面的成员


1.订阅GPS数据

(准确来说,这里订阅的不为原始的gps,而是经过数据融合(加速度计和磁力计)后的gps)

头文件:sensor_msgs/NavSatFix.h
类型:sensor_msgs::NavSatFix.h
名称:mavros/global_position/global
常用的类成员变量:

latitude;//经度
longitude;//纬度
altitude;//海拔

代码示例:
注意:用c++写也可以,需要在头文件上加上#include <iostream>
以及using namespace std;

#include <ros/ros.h>  //必须包含的头文件
#include <mavros_msgs/State.h>  //此次需要订阅的消息体的头文件
#include <sensor_msgs/NavSatFix.h>

sensor_msgs::NavSatFix current_gps; //建立一个该消息体类型的变量,用于存储订阅的信息


//回调函数,订阅的时候必须要有的,一个订阅对应一个回调函数
//作用:在接受到该消息体的内容时执行里面的内容,这里面的内容就是赋值和打印
void gps_cb(const sensor_msgs::NavSatFix::ConstPtr& msg)
{
        current_gps = *msg;
        printf("%f %f %f\n",current_gps.latitude,current_gps.longitude,current_gps.altitude);
}

int main(int argc,char **argv)
{
        ros::init(argc,argv,"dingyue"); //ros系统的初始化,最后一个参数为节点名称
        ros::NodeHandle nh;  //声明一个nh对象,NodeHandle这个类很重要,很多操作都是在这个类里面
	

        //订阅。<>里面为模板参数,传入的是订阅的消息体类型,()里面传入三个参数,分别是该消息体的位置、缓存大小(通常为1000)、回调函数
        ros::Subscriber gps_sub = nh.subscribe<sensor_msgs::NavSatFix>("mavros/global_position/global",10,gps_cb);

        //设置下面的循环速率 20hz
	ros::Rate rate(20.0);

        //大循环
	while(ros::ok())
	{
                ros::spinOnce(); //循环等待回调函数,用来处理所有的消息体的回调函数,类似与轮训.即所有的消息体的回调函数是在这里面触发(使用)的
                                 //ros::spinOnce();和rate.sleep();是成对存在的,两者的运行时间之和=ros::Rate rate(20.0)设定的时间;如果ros::spinOnce();没有
                                 //执行,则rate.sleep();的时间就为ros::Rate rate(20.0)设定的时间
                rate.sleep();//延时
	}
	
	return 0;
}

结果:
在这里插入图片描述


2.订阅imu原始数据

头文件:sensor_msgs/Imu.h
类型:sensor_msgs::Imu.h
名称:mavros/imu/data
常用的类成员变量:

对象1:geometry_msgs::Vector3  angular_velocity 
对象2:geometry_msgs::Vector3  linear_acceleration
//注意:geometry_msgs::Vector3这个类又包含xyz三个成员,所以对象1和对象
//2又包含xyz三个成员

代码示例:
注意:用c++写也可以,需要在头文件上加上#include <iostream>
以及using namespace std;

#include <iostream>
#include <ros/ros.h>  //必须包含的头文件
#include <mavros_msgs/State.h>  //此次需要订阅的消息体的头文件
#include <sensor_msgs/NavSatFix.h>
#include <sensor_msgs/Imu.h>
using namespace std;

sensor_msgs::Imu current_imu; //建立一个该消息体类型的变量,用于存储订阅的信息


//回调函数,订阅的时候必须要有的,一个订阅对应一个回调函数
//作用:在接受到该消息体的内容时执行里面的内容,这里面的内容就是赋值和打印
void imu_cb(const sensor_msgs::Imu::ConstPtr& msg)
{
        current_imu = *msg;
        cout << current_imu.angular_velocity.x <<" "<< current_imu.angular_velocity.y <<" "<< current_imu.angular_velocity.z <<" "<< current_imu.linear_acceleration.x <<" "<< current_imu.linear_acceleration.y << " " << current_imu.linear_acceleration.z << endl;
       
}

int main(int argc,char **argv)
{
        ros::init(argc,argv,"dingyue"); //ros系统的初始化,最后一个参数为节点名称
        ros::NodeHandle nh;  //声明一个nh对象,NodeHandle这个类很重要,很多操作都是在这个类里面
	

        //订阅。<>里面为模板参数,传入的是订阅的消息体类型,()里面传入三个参数,分别是该消息体的位置、缓存大小(通常为1000)、回调函数
        ros::Subscriber imu_sub = nh.subscribe<sensor_msgs::Imu>("mavros/imu/data",10,imu_cb);

        //设置下面的循环速率 20hz
	ros::Rate rate(20.0);

        //大循环
	while(ros::ok())
	{
                ros::spinOnce(); //循环等待回调函数,用来处理所有的消息体的回调函数,类似与轮训.即所有的消息体的回调函数是在这里面触发(使用)的
                                 //ros::spinOnce();和rate.sleep();是成对存在的,两者的运行时间之和=ros::Rate rate(20.0)设定的时间;如果ros::spinOnce();没有
                                 //执行,则rate.sleep();的时间就为ros::Rate rate(20.0)设定的时间
                rate.sleep();//延时
	}
	
	return 0;
}

结果:
在这里插入图片描述


3.订阅本地位置(local position)数据

头文件:geometry_msgs/PoseStamped.h
类型:geometry_msgs::PoseStamped.h
名称:mavros/local_position/pose
常用的类成员变量:

对象1:geometry_msgs::Pose  pose 
//注意:geometry_msgs::Pose这个类又包含position这个成员,
//而position这个成员又包含xyz三个成员变量

代码示例:
注意:用c++写也可以,需要在头文件上加上#include <iostream>
以及using namespace std;

#include <iostream>
#include <ros/ros.h>  //必须包含的头文件
#include <mavros_msgs/State.h>  //此次需要订阅的消息体的头文件
#include <sensor_msgs/NavSatFix.h>
#include <sensor_msgs/Imu.h>
#include <geometry_msgs/PoseStamped.h>
using namespace std;

geometry_msgs::PoseStamped current_position; //建立一个该消息体类型的变量,用于存储订阅的信息


//回调函数,订阅的时候必须要有的,一个订阅对应一个回调函数
//作用:在接受到该消息体的内容时执行里面的内容,这里面的内容就是赋值和打印
void lp_cb(const geometry_msgs::PoseStamped::ConstPtr& msg)
{
        current_position = *msg;
        cout << current_position.pose.position.x <<" "<< current_position.pose.position.y <<" "<< current_position.pose.position.z << endl;
       
}

int main(int argc,char **argv)
{
        ros::init(argc,argv,"dingyue"); //ros系统的初始化,最后一个参数为节点名称
        ros::NodeHandle nh;  //声明一个nh对象,NodeHandle这个类很重要,很多操作都是在这个类里面
	

        //订阅。<>里面为模板参数,传入的是订阅的消息体类型,()里面传入三个参数,分别是该消息体的位置、缓存大小(通常为1000)、回调函数
        ros::Subscriber lp_sub = nh.subscribe<geometry_msgs::PoseStamped>("mavros/local_position/pose",10,lp_cb);

        //设置下面的循环速率 20hz
	ros::Rate rate(20.0);

        //大循环
	while(ros::ok())
	{
                ros::spinOnce(); //循环等待回调函数,用来处理所有的消息体的回调函数,类似与轮训.即所有的消息体的回调函数是在这里面触发(使用)的
                                 //ros::spinOnce();和rate.sleep();是成对存在的,两者的运行时间之和=ros::Rate rate(20.0)设定的时间;如果ros::spinOnce();没有
                                 //执行,则rate.sleep();的时间就为ros::Rate rate(20.0)设定的时间
                rate.sleep();//延时
	}
	
	return 0;
}

结果:
在这里插入图片描述


4.订阅系统状态(重要)

头文件:mavros_msgs/State.h
类型:mavros_msgs::State.h
名称:mavros/state
常用的类成员变量:

bool connected;//是否连接上mavros
bool armed;//是否解锁
string mode;//模式是什么
bool guide;//是否处于offboard模式
//所以判断模式是否为offboard模式可以用string mode是否为“offboad”和bool guide 是否为1;

代码省略…


5.订阅航点(重要)

这一部分就是把地面站设置的航点信息订阅过来,很重要,因为地面站的mission模式是固定死的,一旦进入mission模式飞机的路径就不能改了。而如果要进行壁障类的操作,就需要在offboard模式下模拟飞机的mission模式,所以此时我们就需要订阅飞机的航点信息,此时飞机就可以在飞航点的路径上实现各种形如壁障的操作。

头文件:mavros_msgs/WaypointList.h
类型:mavros_msgs::WaypointList.h
名称:mavros/mission/waypoints
常用的类成员变量:

对象:mavros_msgs::Waypoint[] waypoints//航点列表,waypoints是一个对象数组 
//注意:mavros_msgs::Waypoint这个类包含x_lat, y_long, z_alt 这3个成员,x_lat为该航点的经度(x坐标),y_long为该航点的维度(y坐标),z_alt(z坐标)为改航点的相对高度(相对于原点)

代码省略…这一部分将在后面的实践部分展示

发布了183 篇原创文章 · 获赞 106 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/zouxu634866/article/details/104100533
今日推荐