px4固定翼无人机姿态控制理解

  学习px4代码也有一段时间了,所以想写一写,自己的一些学习心得吧,也算是笔记吧。

  在px4这套代码中,每一个功能都是一个模块,例如姿态控制,也就是一个应用程序,我们可以把它添加到初始话脚本里,让它自启动。需要注意的就是在一个应用程序就是处理订阅的消息,然后发布处理过后的消息。这种消息机制就是uorb消息机制,可以找资料学习它具体实现的一个过程。

  接下来,就逐步学习一下这个姿态控制的模块。

  首先就是应用程序的入口,“extern "C" __EXPORT int fw_att_control_main(int argc, char *argv[])”,在这个函数里就实现了,这个程序是否已近启动,如果没有启动就会注册函数来启动。

  task_main()这个函数就是整个姿态控制的关键,具体姿态控制的算法就是在这里面实现。刚开始就介绍说每个应用程序会订阅相应的消息,然后处理,最后发布。

所以刚开始就是一些消息的订阅:

_att_sp_sub = orb_subscribe(ORB_ID(vehicle_attitude_setpoint));//姿态设定点

_ctrl_state_sub = orb_subscribe(ORB_ID(control_state));//飞机状态

_accel_sub = orb_subscribe_multi(ORB_ID(sensor_accel), 0);//加速度值
_vcontrol_mode_sub = orb_subscribe(ORB_ID(vehicle_control_mode));//控制模式

_params_sub = orb_subscribe(ORB_ID(parameter_update));//参数更新

_manual_sub = orb_subscribe(ORB_ID(manual_control_setpoint));//手动控制的设定

_global_pos_sub = orb_subscribe(ORB_ID(vehicle_global_position));//车辆全球位置

_vehicle_status_sub = orb_subscribe(ORB_ID(vehicle_status));//飞机状态

_vehicle_land_detected_sub = orb_subscribe(ORB_ID(vehicle_land_detected));//着陆探测

接下来就是以check的方式获取订阅消息的值:

vehicle_setpoint_poll();
vehicle_accel_poll();
vehicle_control_mode_poll();
vehicle_manual_poll();
vehicle_status_poll();
vehicle_land_detected_poll();

接下来就是以阻塞等待方式检查参数是否更新,以及当前的飞机状态。阻塞等待这种获取订阅消息的方式,具体是怎么实现的可以查找资料进行学习。

这个if函数就是姿态控制运行的开始,如果姿态发生了改变,就运行这个if

if (fds[1].revents & POLLIN) 

那么要知道姿态是否发生改变,那么就需要知道当前的姿态,这通过获取当前姿态的消息,然后得到四元数,转化为旋转矩阵,进而求得姿态角:

 1 orb_copy(ORB_ID(control_state), _ctrl_state_sub, &_ctrl_state);
 2
 3
 4 /* get current rotation matrix and euler angles from control state quaternions */
 5 math::Quaternion q_att(_ctrl_state.q[0], _ctrl_state.q[1], _ctrl_state.q[2], _ctrl_state.q[3]);
 6 _R = q_att.to_dcm();
 7
 8 math::Vector<3> euler_angles;
 9 euler_angles = _R.to_euler();
10 _roll    = euler_angles(0);
11 _pitch   = euler_angles(1);
12 _yaw     = euler_angles(2);

由于姿态控制算法在一些模式下面是不会估算姿态设定点的,所以要确认这些标志。

_att_sp.fw_control_yaw = _att_sp.fw_control_yaw && _vcontrol_mode.flag_control_auto_enabled;//判断垂尾,用于自主起飞。

判断是否安全故障,如果安全故障开启,就会设定降落伞。

接下来是襟翼的设定,分为手动控制和自动控制

 1             float flap_control = 0.0f;
 2
 3             /* map flaps by default to manual if valid */
 4             if (PX4_ISFINITE(_manual.flaps) && _vcontrol_mode.flag_control_manual_enabled
 5                 && fabsf(_parameters.flaps_scale) > 0.01f) {
 6                 flap_control = 0.5f * (_manual.flaps + 1.0f) * _parameters.flaps_scale;
 7
 8             } else if (_vcontrol_mode.flag_control_auto_enabled
 9                    && fabsf(_parameters.flaps_scale) > 0.01f) {
10                 flap_control = _att_sp.apply_flaps ? 1.0f * _parameters.flaps_scale : 0.0f;
11             }
12
13             // move the actual control value continuous with time, full flap travel in 1sec
14             if (fabsf(_flaps_applied - flap_control) > 0.01f) {
15                 _flaps_applied += (_flaps_applied - flap_control) < 0 ? deltaT : -deltaT;
16
17             } else {
18                 _flaps_applied = flap_control;
19             }

然后是襟副翼的设定,分为手动控制和自动控制

 1 if (PX4_ISFINITE(_manual.aux2) && _vcontrol_mode.flag_control_manual_enabled
 2                 && fabsf(_parameters.flaperon_scale) > 0.01f) {
 3                 flaperon_control = 0.5f * (_manual.aux2 + 1.0f) * _parameters.flaperon_scale;
 4
 5             } else if (_vcontrol_mode.flag_control_auto_enabled
 6                    && fabsf(_parameters.flaperon_scale) > 0.01f) {
 7                 flaperon_control = _att_sp.apply_flaps ? 1.0f * _parameters.flaperon_scale : 0.0f;
 8             }
 9
10             // move the actual control value continuous with time, full flap travel in 1sec
11             if (fabsf(_flaperons_applied - flaperon_control) > 0.01f) {
12                 _flaperons_applied += (_flaperons_applied - flaperon_control) < 0 ? deltaT : -deltaT;
13
14             } else {
15                 _flaperons_applied = flaperon_control;
16             }

接下来就是通过订阅的消息来判断是否能够控制姿态

也就是这一行代码:

1 if (_vcontrol_mode.flag_control_attitude_enabled)

在这个if语句里面执行的主要有判断空速是否有效,如果无效设定空速为参数设定,如果有效设定空速为测量或者计算的空速。

通过vehicle_global_position来计算飞机的地面速度。

如果自问模式下面,我们需要通过遥控器来产生姿态设定点;

计算机体坐标系下飞机的速度;

准备姿态控制器运行需要的参数;

 1                 control_input.roll = _roll;
 2                 control_input.pitch = _pitch;
 3                 control_input.yaw = _yaw;
 4                 control_input.roll_rate = _ctrl_state.roll_rate;
 5                 control_input.pitch_rate = _ctrl_state.pitch_rate;
 6                 control_input.yaw_rate = _ctrl_state.yaw_rate;
 7                 control_input.speed_body_u = speed_body_u;
 8                 control_input.speed_body_v = speed_body_v;
 9                 control_input.speed_body_w = speed_body_w;
10                 control_input.acc_body_x = _accel.x;
11                 control_input.acc_body_y = _accel.y;
12                 control_input.acc_body_z = _accel.z;
13                 control_input.roll_setpoint = roll_sp;
14                 control_input.pitch_setpoint = pitch_sp;
15                 control_input.yaw_setpoint = yaw_sp;
16                 control_input.airspeed_min = _parameters.airspeed_min;
17                 control_input.airspeed_max = _parameters.airspeed_max;
18                 control_input.airspeed = airspeed;
19                 control_input.scaler = airspeed_scaling;
20                 control_input.lock_integrator = lock_integrator;
21                 control_input.groundspeed = groundspeed;
22                 control_input.groundspeed_scaler = groundspeed_scaler;

前面的判断就是为运行姿态控制器所准备的。

1 _roll_ctrl.control_attitude(control_input);
2 _pitch_ctrl.control_attitude(control_input);
3 _yaw_ctrl.control_attitude(control_input);
4 _wheel_ctrl.control_attitude(control_input);

上面就是计算目标与当前姿态的角度误差值,对于roll和pitch是计算角度误差,然后算出角速率,对于yaw速率的计算是,假设在没有侧向力的情况下,通过计算可以得到相应的yaw速率:

就是通过如下计算公式得到:

以及:

                                                                                                                                                                                                                                                       、

计算得到相应的yaw速率;

由于滚转,俯仰和偏航速率是在地面坐标系下,因此,要通过坐标转换转换到机体坐标系下,也就是:

                                                                                                                                                                           通过上述转换就把角速率转换到机体坐标系下了,接下来是通过误差,运用pid来控制姿态,下面的还需要研究一下。先这样吧。

以上内容均属自己理解,有错误之处见谅,共同讨论。

时间: 2024-10-11 21:51:48

px4固定翼无人机姿态控制理解的相关文章

看科比特怎样成为工业级无人机新标杆

  近年来,无人机行业发展异常迅猛,不管是企业经营.还是应用场景拓展.亦或是媒体关注度.民用无人机市场都发生着巨变.资本市场.各类巨头以及VC/PE纷纷对无人机产业表示浓厚兴趣,市面上也出现一批如大疆.科比特航空等无人机行业的佼佼者.可是,民用无人机行业详细如何?又有哪些问题待解?未来的发展走向如何? 爆发前的无人机市场.科比特航空领衔百花齐放 作为无人控制的智能化装备,无人机可分为:无人直升机.固定翼无人机.多旋翼无人机.无人飞艇.无人伞翼机等. 依照市场研究机构BI Intelligence

无人机开发之一:Pixhawk与Arduino简述

1. Pixhawk发展历史 发展历程:APM-->PX4FMU/IO-->Pixhawk: 1.1. Arduino简介 Arduino就是主要以以AVR单片机为核心控制器的单片机应用开发板(当然也有其他核心的例如STM32版本的但是不是官方的,还有intel的伽利略),或者是学习板啥的,Arduino开发人员开发了简单的函数,还有许多应用库,这样就不用直接去操作寄存器了,使得没有很好的单片机基础的人员也可以使用Arduino做出自己想要的东西.Arduino的开发人员还开发了一个简洁的ID

京东618: 站在了电商下一轮风口,一定会赢得那个位置

2017年6月1日到6月18日,京东商城累计下单金额达1199亿元,累计卖出商品超过7亿件,这在京东历史上,是一个从未达到的新高度,也是一个新的起点.京东集团副总裁.京东商城居家生活事业部总裁辛利军在6月18日的媒体沟通会上说,"在这个电商行业里面,有的人站在现在的风口上,京东则站在下一轮的风口上,我相信我们会赢得那个位置." "能在网上卖家具吗?" 对于电商来说,家居家装品类是一个特殊的品类.网上购买家居家装品类,特别是买家具的最大担心点就是最后一公里配送和安装.

玩转12款Linux开源机器人

玩转12款Linux开源机器人 头条网2016-02-15 09:04 3DR Solo智能无人机发布于2015年中期.作为试图与大疆广受欢迎的Phantom系列无人机相抗衡的产品,它的双处理器运行Linux系统. Rethink Robotics推出的Baxter是一款很可爱的协作机器人,它的出现降低了工厂自动化的门槛.它运行ROS和Linux操作系统.得益于先进的路径规划技术和新一代力传感器,Baxter可与人类一同工作,并避免了伤害人类的风险. BeagleBone Blue是围绕Beag

PX4/Pixhawk---uORB深入理解和应用

The Instructions of uORB 『PX4/Pixhawk』 ? 『软件体系结构』?『uORB』?『主题发布』?『主题订阅』 1 简介 1.1 PX4/Pixhawk的软件体系结构 ?PX4/Pixhawk的软件体系结构主要被分为四个层次,这可以让我们更好的理解PX4/Pixhawk的软件架构和运作: 应用程序的API:这个接口提供给应用程序开发人员,此API旨在尽可能的精简.扁平及隐藏其复杂性. 应用程序框架: 这是为操作基础飞行控制的默认程序集(节点). 库: 这一层包含了所

Pixhawk之姿态控制篇(1)_源码算法分析(超级有料)

一.开篇 姿态控制篇终于来了.来了.来了~~~ 心情爽不爽?愉悦不愉悦?开心不开心? 喜欢的话就请我吃顿饭吧,哈哈. 其实这篇blog一周前就应该写的,可惜被上一篇blog霸占了.但是也不算晚,整理了很多算法基础知识,使得本篇blog更充实.一人之力总是有限的,难免有不足之处,大家见谅,有写的不好的地方劳烦指正.看到标题了吧,属于连载篇,所以后续还会有相关问题的补充的. 二.版权声明 博主:summer 声明:喝水不忘挖井人,转载请注明出处. 原文地址:http://blog.csdn.net/

无人机--飞控科普

无人机是无人驾驶飞机的简称(Unmanned Aerial Vehicle,UAV),是利用无线电遥控设备和自备的程序控制装置的不载人飞机,包括无人直升机.固定翼机.多旋翼飞行器.无人飞艇.无人伞翼机.广义地看也包括临近空间飞行器(20-100 公里空域),如平流层飞艇.高空气球.太阳能无人机等.从某种角度来看,无人机可以在无人驾驶的条件下完成复杂空中飞行任务和各种负载任务,可以被看做是“空中机器人”. 飞控系统是无人机完成起飞.空中飞行.执行任务和返场回收等整个飞行过程的核心系统,飞控对于无人

Mavlink协议理解

来源:blog.csdn.net/super_mice/article/details/44836585 之前看了mavlink协议,网上关于mavlink的资料不多.本文大概总结了下对mavlink协议的理解.以下如不说明都是说mavlink v1.0版本. 首先附上mavlink的各个消息的简介https://pixhawk.ethz.ch/mavlink/(这里的内容很多,建议大概了解mavlink后再去浏览), mavlink协议介绍http://qgroundcontrol.org/m

Mavlink - 无人机通讯协议

http://qgroundcontrol.org/mavlink/start mavlink协议介绍https://pixhawk.ethz.ch/mavlink/ 消息简介 MAVLink简介 Mavlink协议最早由 苏黎世联邦理工学院 计算机视觉与几何实验组 的 Lorenz Meier于2009年发布,并遵循LGPL开源协议.Mavlink协议是在串口通讯基础上的一种更高层的开源通讯协议,主要应用在微型飞行器(micro aerial vehicle)的通讯上.Mavlink是为小型飞