四旋翼无人机自抗扰控制算法的深度研究与ADRC轨迹跟踪实现:附带详细说明文档
四旋翼无人机自抗扰控制算法研究 ADRC 轨迹跟踪 附带说明文档飞控调试间里飘着咖啡香小张盯着屏幕上抖得像筛糠的无人机轨迹曲线第17次把咖啡杯捏得咯吱响。四旋翼在风洞实验室的强风里表演着醉拳传统PID控制器的参数怎么调都像在打地鼠。这时候老工程师老王溜达过来在轨迹图上画了个大圈试试这个叫ADRC的流氓算法专治各种不服。ADRCActive Disturbance Rejection Control这货确实像个控制界的流氓头子。传统控制算法遇到外部扰动就像乖学生遇到校霸ADRC却自带以暴制暴的buff。核心思路就一句话管你什么妖风邪气我自抗扰控制器全给你收拾了。看看这个扩张状态观测器的实现片段class ESO: def __init__(self, beta1, beta2, beta3, dt): self.z np.zeros(3) # 状态估计值 [位置,速度,总扰动] self.beta [beta1, beta2, beta3] self.dt dt def update(self, y, u): k1 self._derivative(y, u) k2 self._derivative(y 0.5*self.dt*k1, u) k3 self._derivative(y 0.5*self.dt*k2, u) k4 self._derivative(y self.dt*k3, u) self.z (k1 2*k2 2*k3 k4) * self.dt / 6 return self.z[2] # 返回扰动估计值 def _derivative(self, y, u): e y - self.z[0] return np.array([ self.z[1] self.beta[0]*e, self.z[2] self.beta[1]*e u, self.beta[2]*e ])这段代码堪称流氓算法的鹰犬爪牙。beta参数组就像三个打手实时揪出系统里的各种扰动成分。特别注意导数计算里那个u的骚操作把控制量也喂给观测器相当于在敌方阵营安插了卧底。四旋翼无人机自抗扰控制算法研究 ADRC 轨迹跟踪 附带说明文档实际飞行时轨迹跟踪控制器得这么玩void ADRC_Controller::updateTrajectory(const Vector3d target_pos) { // 轨迹微分跟踪器 double delta 0.005; // 滤波因子 tracking_diff (target_pos - last_pos) / delta; last_pos target_pos; // 非线性状态误差反馈 double e1 pos_est - target_pos.x(); double e2 vel_est - tracking_diff.x(); // 非线性组合 double u0 -fal(e1, 0.5, delta) - fal(e2, 0.25, delta); // 扰动补偿 control_output u0 - disturbance_est / b0; }这个fal函数是个灵魂存在名字听着像国骂实际是种非线性函数。当误差大时它重拳出击误差小时温柔抚摸完美解决传统PID线性组合的要么莽要么怂问题。在 Gazebo 仿真中加载风扰模型后ADRC控制的无人机画出的轨迹就像用了飘柔——纵使妖风阵阵我自顺滑如丝。对比PID控制那癫痫发作般的轨迹ADRC的跟踪误差能压到前者的1/5以下。不过要注意b0这个补偿因子调参不当会让无人机表演托马斯回旋——别问我是怎么知道的。说明文档里必须用加粗字体警告ADRC虽好可不要贪杯特别是ESO的beta参数调大了观测器变疯狗调小了变树懒。建议先用粒子群优化找参数范围再手动微调比相亲找对象还考验耐心。某次户外实测突遇妖风阵风达15m/s。看着ADRC控制的无人机在风浪中稳如老狗而隔壁组的PID飞机早已开启随波逐流模式。那一刻我仿佛听见ADRC在说不是风动不是幡动是扰动在动而我——不动。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2450460.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!