APM(PX4-v2) 定高模式相关(AltHold)

2023-05-16

1.分析log文件,及其消息的赋值

    { LOG_CONTROL_TUNING_MSG, sizeof(log_Control_Tuning),  "CTUN", "Qhhfffecchh", "TimeUS,ThrIn,AngBst,ThrOut,DAlt,Alt,BarAlt,DSAlt,SAlt,DCRt,CRt" },

void Copter::Log_Write_Control_Tuning()

{

    struct log_Control_Tuning pkt = {

        LOG_PACKET_HEADER_INIT(LOG_CONTROL_TUNING_MSG),

        time_us             : AP_HAL::micros64(),

        throttle_in         : channel_throttle->control_in,

        angle_boost         : attitude_control.angle_boost(),

        throttle_out        : motors.get_throttle(),

        desired_alt         : pos_control.get_alt_target() / 100.0f,

        inav_alt            : inertial_nav.get_altitude() / 100.0f,

        baro_alt            : baro_alt,

        desired_sonar_alt   : (int16_t)target_sonar_alt,

        sonar_alt           : sonar_alt,

        desired_climb_rate  : (int16_t)pos_control.get_vel_target_z(),

        climb_rate          : climb_rate

    };

    DataFlash.WriteBlock(&pkt, sizeof(pkt));

}

上面的结构体就是我们要分析定高效果时需要查看的部分主要信息,

time_us为运行时间,

throttle_in为油门输入,0到1000的整数值。

throttle_out油门输出,0到1000的float数值。

desired_alt目标高度, _pos_target.z的值除以100,单位为米。

inav_alt   飞机目前高度,_relpos_cm.z的值除以100,单位为米。

baro_alt 气压计的高度,单位为厘米。此值在sensors.cpp的read_barometer的函数中更新,read_barometer通过ArduCopter.cpp中的update_altitude调用,update_altitude为定义的10hz的schedule.

desired_climb_rate为需要的爬升速率,_vel_target.z的值,单位cm/s。

climb_rate为当前的爬升速率,此值在inertia.cpp中的read_inertial_altitude函数中更新,实际上就是读取的inertial_nav的_velocity_cm.z的值,read_inertial_altitude在ArduCopter.cpp中的throttle_loop函数中被调用,throttle_loop为定义的50hz的schedule.


2.我们来看相关定高函数

   当切换到定高模式时,althold_init先被运行,其代码如下:

bool Copter::althold_init(bool ignore_checks)

{

    // initialize vertical speeds and leash lengths

    //(-250,250),设置最大下降速率_speed_down_cms,最大上升速率_speed_up_cms,并重新计算了_leash_up_z,_leash_down_z。

    pos_control.set_speed_z(-g.pilot_velocity_z_max, g.pilot_velocity_z_max);


   //250,设置最大加速度_accel_z_cms,并重新计  算了_leash_up_z,_leash_down_z。

    pos_control.set_accel_z(g.pilot_accel_z);


    // initialise position and desired velocity

    //将当前EKF的高度值(_relpos_cm.z)赋值给_pos_target.z。

    pos_control.set_alt_target(inertial_nav.get_altitude());

   

     //将当前EKF的爬升速率(_velocity_cm.z)赋值给_vel_desired.z。从这里可以看到,如果我们切到定高模式之前,飞机仍在爬升或下降,切换到定高模式后,飞机        还是会继续爬升或下降的

    pos_control.set_desired_velocity_z(inertial_nav.get_velocity_z());

    // stop takeoff if running

    takeoff_stop();

    return true;

}


高度控制函数在精简掉姿态控制相关内容后,代码如下:

void Copter::althold_run()

{

    AltHoldModeState althold_state;

    float takeoff_climb_rate = 0.0f;



    // initialize vertical speeds and acceleration

    // 设置z轴最小速度和最大速度

    pos_control.set_speed_z(-g.pilot_velocity_z_max, g.pilot_velocity_z_max);

  // 设置z轴加速度

    pos_control.set_accel_z(g.pilot_accel_z);




    // get pilot desired climb rate

    // 根据遥控器输入,算出爬升速度

    float target_climb_rate = get_pilot_desired_climb_rate(channel_throttle->control_in);

    target_climb_rate = constrain_float(target_climb_rate, -g.pilot_velocity_z_max, g.pilot_velocity_z_max);



    // call position controller

    pos_control.set_alt_target_from_climb_rate_ff(target_climb_rate, G_Dt, false);

    pos_control.update_z_controller();

}

在get_pilot_desired_climb_rate中需要获取mid_stick,注意由于THR_MIN和RC3_DZ的存在,这个值并不是500(千分之),而是548(futuba t8fg遥控器),所以deadband是448到648,要想保持定要,油门输入必须保持在448到648之间。

set_alt_target_from_climb_rate_ff是根据target_climb_rate的速度去计算目标高度,在这个函数内部用了一个取平方根的方式,使速度变化由快变慢,可以由下面matlab生成的图片看出来,x轴为此函数运行次数,y轴为_vel_desired.z,_vel_desired.z初始值为0,target_climb_rate设置100的时候画出的图,这样做的目的估计是使飞行器可以先快后慢的变化,保持最后的平稳。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

APM(PX4-v2) 定高模式相关(AltHold) 的相关文章

随机推荐

  • Android自定义控件基础

    采用自定义控件解决重复编写代码的问题 总共分三步 1 写好一个自定义模板布局 title XML span class hljs pi lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34
  • String,StringBuffer,StringBuilder的区别(优缺点)

    最近学习到StringBuffer xff0c 心中有好些疑问 xff0c 搜索了一些关于String xff0c StringBuffer xff0c StringBuilder的东西 xff0c 现在整理一下 关于这三个类在字符串处理中
  • nginx+tomcat重复请求

    好久不写技术文章了 xff0c 越发的觉得单纯的讲技术没啥意思 怪不得知乎越来越火 xff0c 因为大家都喜欢看故事 xff0c 不喜欢硬生生的技术文章 笔者今天就来就给大家讲故事 最近网站压力突然增大 xff0c 把带宽都占满了 xff0
  • Android真机获得root权限修改文件权限

    好久没有更新博客了 xff0c 最近因为重装了系统导致所有的配置都不存在了 xff0c 当要修改Android权限去查看数据库文件的时候 xff0c 发现又忘记了怎么去获得修改权限 xff08 其实第一次弄这个内容的时候就费了很大的劲 xf
  • Android完全自定义控件并且实现监听事件

    本篇文章带来Android的完全自定义控件 载体是自定义一个开关的控件 xff0c 并且能够响应事件 xff0c 首先我们先创一个项目 xff0c 名字就叫ToggleView xff0c 修改MainActivity span class
  • 2016年总结,辛勤劳作的一年

    直到刚才听到门外的爆竹声 才意识到这一年 xff0c 快结束了 今天是11月26号 xff0c 其实离2017年还有一段距离 xff0c 趁着今天有空 xff0c 给自己写一篇文章 其实 xff0c 我是很不想说 xff0c 你好 xff0
  • Android屏幕适配实战

    说一下在项目里面遇到的一个问题 xff0c 和解决思路 需求来源于运营小姐姐 xff0c 她们希望在App的搜索关键字前面加上图片醒目效果图如下 布局很简单左边一个SimpleDraweeView xff0c 右边一个TextView xf
  • 定制阿里代码检查,实现你自己的代码规范检查

    几个月前 xff0c 阿里开源了p3c xff0c 我也接到了老大交给我的技术改造 是这样的 xff0c app是老项目了 xff0c 半年前接入了ARouter xff0c 由于Activity繁多 xff0c 就没有去全局支持ARout
  • Fresco内部诟病引起的初次从网络加载PNG图片失败

    如题描述 xff0c 这个问题在项目中存在已久 xff0c 今天由于自己的功能在首页 xff0c 初次启动的体验极其糟糕 xff0c 所以硬下头皮把这个问题解决了 先来描述一下怎么样一个差的体验吧 就是当我第一次加载网络PNG xff08
  • 不用第三方写一个简单的推流软件

    https github com iOSSinger SGLivingPublisher 不用第三方写一个简单的推流软件 6 commits 1 branch 0 releases 1 contributor Objective C 100
  • 【安防百科】视频监控中常用的分辨率

    http www 360doc com content 17 0317 10 33642774 637585058 shtml 在上一节跟大家谈了摄像机的线数 xff0c 线 是模拟时代的产物 xff0c 当今世界早已是数字化的世界 xff
  • ubuntu20.04下的录屏与视频剪辑软件

    ubuntu20 04下的录屏与视频剪辑 一 录屏软件SimpleScreenRecorder安装与使用1 安装2 设置录制窗口参数3 开始录制 二 视频剪辑软件kdenlive的安装1 安装2 启动 一 录屏软件SimpleScreenR
  • 八、Gazebo 学习笔记:附加网格(Mesh)

    官网教程链接 xff1a http gazebosim org tutorials tut 61 attach meshes 概述 先决条件 xff1a 创建一个移动机器人 网格可以在视觉上和传感器上增加模型的真实感 本教程演示了用户如何使
  • Can I become a good programmer without math and algorithms knowledge?

    Knowledge of algorithms has very little to do with programming skill As some random dude on the internet once said 34 Wh
  • MOXA串口服务器的配置

    1 配置AP 步骤一 xff1a 连接网线 xff0c 如果遇到无法连接本地网络就先查看宽带驱动有没有装好 xff0c 另外换一根网线试试 打开网络连接 点属性打开本地连接属性 步骤二 xff1a 更改电脑的IP地址 xff0c 如192
  • 什么是人工智能?

    Extinguished philosophies lie about the cradle of every science as the strangled snakes beside that of Hercules adapted
  • 【基于Python的ROS学习】

    基于Python的ROS学习 1 订阅topic def span class token function listener span span class token punctuation span span class token
  • P2P中DHT网络介绍

    一 P2P 及 DHT 网络简单介绍 xff1a P2P在思想上可以说是 internet 思想 精神 哲学非常集中的体现 xff0c 共同的参与 xff0c 透明的开放 xff0c 平等的分享 xff08 让我想起之前学习过的 xff0c
  • C++ 库

    基础类 1 Dinkumware C 43 43 Library 参考站点 xff1a http www dinkumware com P J Plauger编写的高品质的标准库 P J Plauger博士是Dr Dobb 39 s程序设计
  • APM(PX4-v2) 定高模式相关(AltHold)

    1 分析log文件 xff0c 及其消息的赋值 LOG CONTROL TUNING MSG sizeof log Control Tuning 34 CTUN 34 34 Qhhfffecchh 34 34 TimeUS ThrIn An