【Mavros解析 】01 ROS消息以及常用指令

2023-05-16

【Mavros解析 】01ROS消息以及常用指令

    • 示例代码一
    • 示例一代码解析
      • ROS初始化
      • 消息订阅:
      • 模板函数
      • 定时器
      • 回调循环
      • 睡眠函数
    • 示例代码二
    • 示例二解析
      • 公布消息
        • 模板函数

  • 标题 : 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函数的模板参数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Mavros解析 】01 ROS消息以及常用指令 的相关文章

随机推荐