- 标题 : MAVROS教程—offboard模式下自主飞行
- 起源: 根据阿木实验室讲解课程整理的学习笔记,推荐大家学习无人机的去学习这个课程,俗话说的好:问渠那得清如许,唯有源头活水来 -
- MAVROS教程—offboard模式下自主飞行:https://bbs.amovlab.com/plugin.php?id=zhanmishu_video:video&mod=video&cid=11
示例代码一
#include <ros/ros.h>
#include <mavros_msgs/State.h>
mavros_msgs::State current_state;
void state_cb(const mavros_msgs::State::ConstPtr& msg){
current_state = *msg;
printf("message get callback!\n");
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "offb_node");
ros::NodeHandle nh;
ros::Subscriber state_sub = nh.subscribe<mavros_msgs::State>("mavros/state", 10,
state_cb);
ros::Rate rate(20.0);
while(ros::ok())
{
ros::spinOnce();
rate.sleep();
}
return 0;
示例一代码解析
ROS初始化
ros::init(argc, argv, "offb_node");
ros::NodeHandle nh;
这两句话是 ros 的初始化函数,每一个 ros 节点都必须执行。
消息订阅:
ros::Subscriber state_sub = nh.subscribe<mavros_msgs::State>("mavros/state", 10, state_cb);
模板函数
ros::NodeHandle::subscribe
定时器
申请了一个 20hz 的定时器
ros::Rate rate(20.0);
回调循环
ros::ok()返回真的时候一直循环,当 ros 出现一下问题(如进程被结束 ctrl+c)
的时候会返回一个 false
while(ros::ok())
{
ros::spinOnce();
rate.sleep();
}
ros::spinOnce();这一句触发一个消息回调,也就是说,实际上我们的消息回调 state_cb 函数是这个函数执行时被调用的,如果不在循环中加上这一句,那么 state_cb 永远不会被调用,直到队列满结束进程。
睡眠函数
rate.sleep();
这一句是一个睡眠函数,前面我们已经申请了
ros::Rate rate(20.0);
那么在执行sleep 的时候,就会睡眠一个绝对准确的时间来保证这个循环会以 20hz 的频率运行。实际上 rate.sleep();会记录你上次调用此函数的时间
在下一次执行 rate.sleep();的时候他会对比当前系统时间,查看距离上次调用已经经过了多长时间,再用 1 秒除以你设置的频率得到周期时间,再用周期时间减去已经经过的时间,就得到了需要睡眠的时间。然而这一切都是自动的,我们不需要关心。
示例代码二
#include <ros/ros.h>
#include <geometry_msgs/PoseStamped.h>
int main(int argc, char **argv)
{
//初始化
ros::init(argc, argv, "offb_node");
ros::NodeHandle nh;
wwww.amovauto.com
3
//公告消息
ros::Publisher local_pos_pub = nh.advertise<geometry_msgs::PoseStamped>
("mavros/setpoint_position/local", 10);
//设置循环频率
ros::Rate rate(20.0);
//实例化要发布的消息
geometry_msgs::PoseStamped pose;
pose.pose.position.x = 0;
pose.pose.position.y = 0;
pose.pose.position.z = 2;
while(ros::ok()){
local_pos_pub.publish(pose);//发布消息
ros::spinOnce();
rate.sleep();
}
return 0;
}
示例二解析
公布消息
ros::Publisher local_pos_pub =
nh.advertise<geometry_msgs::PoseStamped>("mavros/setpoint_position/local", 10);
模板函数
advertise 也是一个模板函数,模板参数为要公告的消息类型,有 2 个形参:
- 参数 1:消息名称,类型为 char *
- 参数 2:队列长度,类型为 int,一般设置 1000
公告完成以后我们会得到一个 ros::Publisher 对象(如果成功),以后我们就可以时候这个对象来发布消息了。发布消息:
local_pos_pub.publish(pose);
- local_pos_pub 是我们得到的 ros::Publisher,publish 是 ros::Publisher 对象的发布函数,参数为我们的消息实体,参数类型为 advertise函数的模板参数