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坐标)为改航点的海拔
代码省略…这一部分将在后面的实践部分展示