ADRC Ardupilot代码分析

2023-05-16

记录一下自己对于Ardupilot ADRC控制代码的一些理解

GitHub链接

ADRC: Active Disturbance Rejection Control by MichelleRos · Pull Request #20243 · ArduPilot/ardupilot

参考论文

ADRC UAV Paper Details:

Jiachi_Zou_Thesis.2018.ADRC.UAV.Github.pdf

修改细则

  • RC_Channel.cpp文件添加了ALT_RATE_CONTROL部分(高度变化率控制)

  • wscript文件添加AP_ADRC部分

  • AC_AttitudeControl.h文件新增高度控制函数,AC_AttitudeControl_Multi.cpp函数添加几个参数,并在AC_AttitudeControl_Multi.h函数中声明:

    • _pid2_rate_roll
    • _pid2_rate_pitch
    • _pid2_rate_yaw

    以上三个参数在AC_AttitudeControl_Multi类创建的时候初始化

  • AP_ADRC.h函数为ADRC控制器的ESO定义部分,AP_ADRC.cpp函数为ADRC控制器的ESO实现部分

    定义几个重要参数(AP_GROUPINFO),除控制模式参数为AP_Int8类型,其余参数均为AP_Float类型:

    • _wc: ADRC control bandwidth(rad/s) → ADRC控制器带宽
    • _wo: ADRC ESO bandwidth(rad/s) → ADRC ESO带宽
    • _b0: ADRC control input gain → ADRC控制器输入增益
    • _delta: ADRC control linear zone length → ADRC控制器线性区间长度
    • _order: ADRC control model order → ADRC控制模式
    • _limit: ADRC control output limit → ADRC控制器输出限幅

    ESO内部参数:

    • _z1:ESO系统输入的观测值
    • _z2:ESO系统输入的微分的观测值
    • _z3:ESO系统总扰动

    ADRC参数更新:

    • 控制器误差 = 目标值 - z1
    • 控制微分误差 = -z2
    • 状态观测误差 = z1 - 测量值

    ADRC函数定义:

    • fal函数:Fal函数实际上是对控制工程界的一个经验知识:“大误差,小增益;小误差,大增益”的数学拟合,具有快速收敛的特性。
    • sign函数:符号函数
    • reset_eso函数:将当前测量值赋给z1,z2和z3置零,实现ESO初始化

    针对于ADRC控制模式变量来选择对应的控制率(待补充)

    • 模式1:

      • 非线性控制率:

        output = (_wc * fal(e1,0.5f,_delta) - sigma * _z2)/_b0;
        
      • 输出限幅:

        超过阈值的输出限制在阈值处,其他的输出乘以对应的系数并输出

        // Limit output
        if(is_zero(_limit.get())){
        	output_limited = output;
        }else{
        	output_limited = constrain_float(output * dmod,-_limit,_limit);
        }
        
      • 状态估计:

        定义两个变量,beta1beta2,代表各扩张状态观测器的反馈增益,更新之前的PID值

        // State estimation
        float fe = fal(e,0.5,_delta);
        float beta1 = 2 * _wo;
        float beta2 = _wo * _wo;
        _z1 = _z1 + _dt * (_z2 - beta1*e + _b0 * output_limited);
        _z2 = _z2 + _dt * (-beta2 * fe);
        
        _pid_info.P      = _z1;
        _pid_info.I      = _z2;
        _pid_info.D      = _z3;
        _pid_info.FF     = output_limited;
        
    • 模式2:

      • 非线性控制率:

        output = (kp * fal(e1,0.5f,_delta) + kd * fal(e2,0.25,_delta) - sigma * _z3)/_b0;
        
      • 输出限幅:

        与模式1的一致

      • 状态估计:

        这里与模式1多了个beta3变量,该变量调节扩张观测器的跟踪速度

        // State estimation
        float beta1 = 3 * _wo;
        float beta2 = 3 * _wo * _wo;
        float beta3 = _wo * _wo * _wo;
        float fe  = fal(e,0.5,_delta);
        float fe1 = fal(e,0.25,_delta);
        _z1  = _z1 + _dt * (_z2 - beta1 * e);
        _z2  = _z2 + _dt * (_z3 - beta2 * fe + _b0 * output_limited);
        _z3  = _z3 + _dt * (- beta3 * fe1);
        
        _pid_info.P      = _z1;
        _pid_info.I      = _z2;
        _pid_info.D      = _z3;
        _pid_info.FF     = output_limited;
        
    • 日志记录:

      target actual error

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

ADRC Ardupilot代码分析 的相关文章

  • 最流行的开源飞控项目ArduPilot Mega(APM)介绍及发展历史

    ArduPilotMega APM 是市面上最强大的基于惯性导航的开源自驾仪 特性包括 免费开源固件 xff0c 支持飞机 xff08 34 ArduPlane 34 xff09 xff0c 多旋翼 四旋翼 六旋翼 八旋翼等 直升机 xff
  • 解决ardupilot中使用UWB每次上电的时候坐标不一样的问题

    解决ardupilot中使用UWB每次上电的时候坐标不一样的问题 ctime 2019 08 02 22 41 07 43 0800 1564756867 标签 xff08 空格分隔 xff09 xff1a 技术 飞控 在GCS Commo
  • ardupilot之mavlink消息--飞控接收--单向

    由于项目需要 xff0c 完成一个测试demo 本次从dronekit中发送mavlink消息给飞控 xff0c 飞控接收发来的wp信息 xff0c 然后进行修改供程序使用 首先祭出测试视频 dronekit arudpilot test
  • Pixhawk之UAV控制理论、ardupilot源码框架介绍

    一 开篇 您有无人机么 xff1f 没有 那赶紧去某宝买一套 昨天 开会开到接近下午一点钟 xff0c 收获相当大 xff0c 原本不太清楚的ardupilot框架现在也大致熟悉了 xff0c 接下来主要就是结合源码了解其控制过程了 xff
  • 【移植Ardupilot的日志记录方法到linux上】

    移植Ardupilot的日志记录方法到linux上 说明日志结构组成日志写入操作预定义日志项运行时添加日志项的方法 单例测试编译方法查看数据其他 说明 采用二进制文件记录 xff0c 可在mission planer查看 支持所有数据类型记
  • ADRC最速综合函数fhan实现

    ADRC最优综合函数fhan函数测试 fhan函数是ADRC的跟踪微分控制器的核心函数 xff0c 使得状态变量可以快速跟踪上系统输入 本例中 xff0c 设理想输入v 61 sin t 用状态变量x1跟踪输入 xff0c x2跟踪输入的导
  • 基于simulink的svm-dtc-adrc控制建模与仿真

    目录 一 理论基础 二 核心程序 三 仿真结论 一 理论基础 永磁电机由于没有励磁绕组和励磁装置 xff0c 不消耗励磁功率 xff0c 对磁极设在转子的电机 如一般同步电机 还可省去滑环和电刷 随着永磁材料和控制技术的发展 xff0c 永
  • px4最新版commander代码分析

    commander位于Firmware src modules commander文件夹中 该部分主要负责对地面站 遥控器以及其它部分发布的cmd命令 xff0c 包括vehicle command VEHICLE CMD DO SET M
  • ardupilot & px4 书写自己的app & drivers (二)

    新建任务列表任务 打印时间 任务列表 const AP Scheduler span class hljs tag Task span Copter span class hljs tag scheduler tasks span span
  • Ardupilot添加自定义日志(AP_LOG)

    1 在libraries AP Logger LogStructure h中添加自定义的结构体 span class token keyword struct span span class token class name PACKED
  • ardupilot的libraries之PID

    在源码的libraries中 xff0c 有两个关于PID的源文件文件夹 xff0c 一个叫AC PID xff0c 另一个是PID AC PID中又细分为AC HELI PID AC P和AC PID xff0c 这里我们只讨论AC PI
  • 配置Ardupilot环境4--------Ubuntu 安装eclipse

    1 资源准备 这个的要求不是太清楚 xff0c 反正我是随便下的版本 xff0c 成功配置 下载JDK 选择dk 8u172 linux x64 tar gz 下载Eclipse 选择Eclipse IDE for Java Develop
  • Ardupilot SITL——arducopter 操作步骤

    打开cygwin输入 cd ardupilot ArduCopter Tools autotest sim vehicle py map console xff08 默认master下版本arducopter xff0c 默认模拟 四轴 x
  • 《战狼》演习中到底是靠什么代码攻破对方的指挥系统?

    战狼 演习中到底是靠什么代码攻破对方的指挥系统 红蓝双方正在进行军事演习 开局 红方发动了手速buff 仅用时3秒 便成功入侵了对方了指挥网络 旗开得胜 接下来让我们好好学习一下这段代码 敲黑板 啊 这 C语言的气息 通过红框标注的prin
  • 从枚举类型的ordinal()方法说起

    文章背景 本周有一个开发任务涉及到了枚举类型的修改 需要对枚举类型新增一项 在新增的时候我没有加在已有项的最后面 而是在中间随便找了个位置 其实也不是很随便 我是根据语义关联性觉得放在某一项后面比较合适 没想到的是 我的无心之举经造成了大
  • 【Unity问题&错误】list问题

    error CS0305 Using the generic type System Collections Generic List
  • Adam优化算法详细解析

    本文转载于以下博客地址 http www atyun com 2257 html 如有冒犯 还望谅解 Adam优化算法是一种对随机梯度下降法的扩展 最近在计算机视觉和自然语言处理中广泛应用于深度学习应用 在引入该算法时 OpenAI的Die
  • linux下代码分析工具Splint

    1 C代码静态分析工具 Its4 读取一个或多个 C C 源程序 将每个源程序分割成函数标志流 然后检查生成的标志是否存在于漏洞数据库中 从而得到每个源程序的所有错误警告列表 并带有相关的描 述 其规则库vulns i4d定义了各种函数的危
  • java代码分析及分析工具

    一个项目从搭建开始 开发的初期往往思路比较清晰 代码也比较清晰 随着时间的推移 业务越来越复杂 代码也就面临着耦合 冗余 甚至杂乱 到最后谁都不敢碰 作为一个互联网电子商务网站的业务支撑系统 业务复杂不言而喻 从09年开始一直沿用到现在 中
  • (转)StyleCop

    微软的StyleCop作为一款代码分析插件 集成到Visual Studio 2008和Visual Studio 2010之中 可以帮助开发人员迅速地理清编程规范问题 对确保软件质量 确保软件开发效率而言 意义非凡 与同样出自微软的另一款

随机推荐

  • 大疆A3、N3、M100飞控ONBOARDSDK二次开发经验分享

    开发流程 步骤一 选择开发方式 先去大疆的开发者网站 xff08 https developer dji com xff09 看资料 xff0c 我选择的是ONBOARD SDK stm32 xff08 图一 xff09 步骤二 观看官方资
  • Boost库教程

    Boost库教程 1 Lexical Cast 用于高效文本格式转化 using boost lexical cast 例 xff1a 将A转换为string类型 lexical cast A 错误消息使用try catch 捕捉 异常名为
  • 软路由连接NAS做链路聚合

    软路由连接NAS做链路聚合 群晖NAS支持多种链路聚合方式 xff0c 如自适应负载平衡 IEEE 802 3ad动态Link Aggregation 平衡XOR等方式 xff0c 其中 xff0c IEEE 802 3ad动态Link A
  • 软路由网络部署配置

    软路由网络部署配置 一 作为交换机二 作为一级路由器三 作为旁路由模式一 xff1a 主路由开 DHPC 43 N1 关 DHPC 非全局 xff09 设置步骤 模式二 xff1a 主路由开 DHPC 43 N1 关DHPC 全局 方法一方
  • PX4 vision_to_mavros定位

    PX4官方给出以下做法从而使用intel realsense t265深度相机作为视觉估计的硬件选择 在这里我使用pixhawk 4和realsense t265以及Jetson TX2机载计算机以及benewake tfmini激光测高模
  • Top 50 有趣网站

    50 经典桌面 这个名叫东子的偏执狂不知花了多少 工夫 xff0c mydeskcity com的谌萘看锏 了40G xff0c 很多图片都是站长本人在国 外搜集后 xff0c 自己进行加工的作品 http www mydeskcity c
  • PX4避障和轨迹规划(3DVFH*)

    采用伴侣计算机 Companion Computer 的方案 xff0c 通过使用mavros的obstacle distance插件订阅 mavros obstacle send话题 xff0c 进而通过local planner本地轨迹
  • PX4飞控控制投放装置

    PX4飞控控制投放装置原理跟相机触发方式一样 xff0c 都是通过映射辅助AUX通道实现对应的信号发送 相机触发方法参考如下链接 xff1a Camera Trigger PX4 User Guide 触发方法有很多种 xff0c 这里我们
  • PX4板载计算机外部控制

    板载计算机外部控制主要是使用第三方机载计算机 xff08 如 xff1a Intel Aero Jetson TX2 Jetson Nano 其他类型minipc xff09 等通过mavlink协议实现对飞控参数的获取和机载端控制 xff
  • PX4无人机配置4G空地多机组网系统

    前言 使用4G网络实现无人机地面端与天空端实时通信 xff0c 并基于蒲公英cloudVPN组网技术实现广域网内的异地组网 xff0c 进一步实现不限制距离的空地多机远程组网系统 cloudVPN组网无需公网IP xff0c 需要注册一个花
  • OpenWRT配置Zerotier实现内网映射

    OpenWRT加入zerotier xff1a zerotier使用教程 OPENWRT LEDE 配置ZeroTier网络教程 子绘绘的博客 CSDN博客 Openwrt路由通过Zerotier组网实现异地内网互访 Linux加入zero
  • PX4云台控制

    一 云台硬件配置 云台采用storm32bgc无刷三轴云台 xff0c 该云台支持通过飞控控制与WBUS多通道接收机控制 这里我们采用通过pixhawk4飞控进行控制 pwm控制模式 采用三条3pin杜邦线将飞控辅助通道AUX1 3连接至云
  • 行人和人脸识别数据集

    推荐一个可应用于无人车 无人机 监控识别相关的数据集 行人和人脸检测数据集 xff08 FEEMS xff09 xff1a GitHub neverland7D Face and Pedestrian Detection Dataset F
  • Acuro二维码识别与降落对准

    什么是Aruco码 xff1f Aruco码能做什么 xff1f 搜索任务 自主降落等辅助标识 替代复杂任务中较难识别的目标 xff08 短期替代 长期替代 xff09 SLAM中的地标 反解无人机位置 实现定点 最容易识别的目标之一 1
  • ADRC控制算法在多旋翼飞行器上的应用

    基础理论知识 xff1a 程序中涉及的部分知识点参考如下链接 xff1a ADRC算法以及参数整定 xff1a 关于ADRC算法以及参数整定 xff08 调参 xff09 的一些心得体会 西涯先生的博客 CSDN博客 adrc控制算法 AD
  • 补充总结:现代控制理论

    补充内容 xff1a 现代控制理论与经典控制理论的区别 xff1a 经典控制理论主要是借助于传递函数研究系统输出与输入的关系 xff0c 而不管系统到底内部结构如何 xff0c 好比一个未知的 黑匣子 现代控制理论相对而言是要研究系统内部的
  • 网上英语学习资源大整理

    翻译 http www bilinguist com 汉英论坛 xff0c 高手云集 url http www chinatranslate net url 中国翻译网 xff0c 号称全国最大的翻译专业网站 url http gb tra
  • 使用PID和LQR控制器进行多旋翼飞行器控制

    任务内容 通过调整PID和LQR控制器以实现稳定悬停的多旋翼飞行器 xff0c 运用在无论是在仿真中还是在实际系统中 参考内容 LQR控制部分基础参考内容 xff1a LQR控制器 参考链接 xff1a Linear Quadratic R
  • Ardupilot板载计算机上云实践——第一步

    阿里云ECS在基于MAVLink的飞行器的数据中转与日志上云应用 自己先搭建了一个Demo用于测试稳定性 xff0c 访问地址 xff1a http 182 92 127 202 8123 Ardupilot 官方在今年 xff08 202
  • ADRC Ardupilot代码分析

    记录一下自己对于Ardupilot ADRC控制代码的一些理解 GitHub链接 ADRC Active Disturbance Rejection Control by MichelleRos Pull Request 20243 Ard