ArduPilot-Mocap转换解析
针对小直升机在optitrack移植过程中出现的两个Bug进行解析:
1)高度的控制如何实现,在直升机中,存在油门和总螺距的一起联动问题。
2)在切换的瞬间,会有一个大的偏差,需要查看log并想办法修复这个问题.
问题1) 解答:
在loiter模式
下, 摇杆的位置对应的是给定的target_climb_rate
, 详见代码如下:
对应语句为
target_climb_rate = get_pilot_desired_climb_rate(channel_throttle->get_control_in());
其中考虑了遥控器的死区.
然后通过upodate_z_controller()
函数计算出需要的油门控制量, 由于loiter模式
下有几个子模式,仅截取其中一个子模式进行说明
上图中 pos_control->set_alt_target_from_climb_rate_ff(target_climb_rate, G_Dt, false);
函数中,会将上面计算出来的target_climb_rate
转换成 _pos_target
或者_vel_desired
同时,遥控器的油门通道值还会影响高度通道acc的积分值, 详细见下图中_attitude_control.get_throttle_in()
函数
再次跳转进入run_z_controller()
函数中,可以看到由于之前油门值影响了_pos_target
或者_vel_desired
, 进而_pos_error.z
开始起作用,后面的PID运算开始发挥作用
直到下图的内容, 最终将计算出来 thr_out
送出去
因此,通过前面的分析,可以,得到如下结论: 通过油门摇杆的改变, 间接改变了油门的输出量, 其中用到PID控制器, 油门量对应的给定的爬上速率.
而我们需要将联动的两个通道也和 thr_out
关联起来即可.
在ArduPilot中修改直升机 主桨转速
的函数在 copter.cpp
中的 throttle_loop
中 50Hz, heli_update_rotor_speed_targets();
跳转进该函数, 可得到下图:
这其中的get_pilot_desired_rotor_speed()函数 为获取辅助通道的值
通过仿真测试得到如果输入值为1800则对应的值为0.8, 猜测为 (1800−1000)∗0.001=0.8(1800-1000)*0.001 = 0.8(1800−1000)∗0.001=0.8
上文中提到的油门通道的thr_out 平衡点的输出值为 0.5
问题2) 解答:
在模式的切换时候, 是有Bug的.
在模式切换的时候, 下图的loiter_nav->init_target():
跳转进去会有一个xy_controller的初始化函数,如下
_pos_control.init_xy_controller();
继续跳转进去得
上图显示的是已经修改后的loiter模式初始化部分,可以看出对于四旋翼, 其悬停的时候_ahrs.roll_sensor
是在零度附近的. 而直升机在悬停的时候,是有一个可以设置的参数来进行调节的, 默认为3度
. 故在这个地方,也就是模式的切换初期,我们需要先将这个数值给减去,(后面可以看到, 还会再次进行这个值的累加, 因此这个地方时还是有必要先减去这个数值的)
同时, 在 void AC_PosControl::run_xy_controller(float dt)
函数中( AC_PosControl.cpp文件中)
这个两个计算vel_xy_i的地方也需要进行首次进入的积分值清零, 如下图中的reset_I();
所示. 对于Vector2f AC_PID_2D::get_i_shrink()
也需要做同样的处理.
这样在后面的给定姿态角度的时候,就不会出现突变的问题了
注:在高度控制中,check_for_ekf_z_reset()中, shift_alt_target()函数,在模式切换的时候,会对高度通道产生影响,需要针对小直升机进行屏蔽,另外, 实际飞机测试中,由于小直升机存在“围绕原点”画圈的现象,通过增大位置环的D值,可以实现定点效果。
ArduPilot-Mocap转换解析相关推荐
- Scalaz(1)- 基础篇:隐式转换解析策略-Implicit resolution
在正式进入scalaz讨论前我们需要理顺一些基础的scalaz结构组成概念和技巧.scalaz是由即兴多态(ad-hoc polymorphism)类型(typeclass)组成.scalaz typ ...
- Java web/springboot上传word/doc/docx文档(含图片)与HTML富文本导入/导出互相转换解析!附项目源码
测试效果 先看下效果 文档内容如下: 上传 上传docx文档 查看解析内容 <html><head><style>p{margin-top:0pt;margin-b ...
- ArduPilot姿态控制方法解析---(倾转分离)
先给出一些预备知识: 欧拉角:即所谓的Roll , Pitch , Yaw. 而事实上,根据其定义,欧拉角的具有不同的表示.存在先绕哪个轴,后绕哪个轴转的差别(将旋转分解成绕三个轴的转角).这种表示方 ...
- PDF转换解析工具—XPDF
最近一直在研究PDF的解析,发现有很多的软件或SDK可以 预处理.这里 预处理的意思仅仅是转换一种存储格式,还需要我们进一步的结构化处理.现在介绍几种预处理方案: 第一.使用OCR软件识别. 这个做的 ...
- java 线程状态_JAVA线程漫谈:线程状态与状态转换解析
线程使用方式 JDK线程的顶层抽象是Runnable接口,本质上,线程相关的类都是基于Runnable和Thread实现类实现. JDK API级别有不同的创建线程的方式,但本质是还是基于Runnab ...
- SQL Server 透视与逆透视转换解析
本篇文章聊聊T-SQL中对数据进行透视转换 (pivoting).逆透视转换 (unpivoting) 相关技术. 透视转换是把数据从行的状态旋转为列的状态,逆透视转换则是把数据从列的状态旋转为行的状 ...
- CSS3 转换解析及制作立方体相册
CSS3 转换 通过 CSS3 转换,我们能够对元素进行移动.缩放.转动.拉长或拉伸. 一.它是如何工作? 转换的效果是让某个元素改变形状,大小和位置. 可以使用 2D 或 3D 转换来转换您的元素. ...
- SAP 中货币汇率转换解析
汇率维护在ERP中可以使用事务代码OB07或者OB08,每次不同币别的汇率更改在正式生产系统中都会新创建一条记录,保存之后会存储在表TCURR中,可以通过函数CONVERT_TO_LOCAL_CURR ...
- Golang 基础案例集合:中文拼音转换、解析二维码、压缩 zip、执行定时任务
前言 曾经,因为不够注重基础吃了好多亏.总是很喜欢去看那些高大上的东西,却忽略了最基本的东西.然后会错误的以为自己懂的很多,但是其实是沙堆中筑高台,知道很多高大上的架构,但是基础的东西却不太了解.我觉 ...
最新文章
- MarkdownView:Markdown 文档预览视图组件
- 神经网络php代码,慢慢研究
- Java IO流之【缓冲流和文件流复制文件对比】
- 程序运行依赖的重要文件版本不对_Deno核心模块:灵活依赖amp;安全沙箱
- 安卓+php推,使用 PHP 消息队列实现 Android 与 Web 通信
- cetos 中vsftpd从安装到配置完全教程
- c++string类的常用方法详解
- python程序设计与应用第1章
- ios怎么创建html文件夹,ios 创建html文件
- python廖老师_Python3.5-20190518-廖老师-自我笔记-面向对象
- Type Dynamic Web Module 4.0 requires Java 1.8 or newer----彻底杀死Bug
- java 产生随机数_java生成随机数
- BZOJ4372 烁烁的游戏(动态点分治+线段树)
- Log4j.properties配置详解【log4j配置文件】
- Android中矢量图形的相关知识
- .如何彻底删除oracle,如何做到Oracle完全卸载
- 电脑chm文件打不开解决方法
- html5 生日贺卡在线制作软件,可在线制作或打印的个性化照片贺卡
- 【无标题】我们的三周年————致我的小宝贝
- 福特FORD EDI需求分析
热门文章
- TaoTao要吃鸡(01背包)
- 使用nacos-server1.2.1版本,项目启动时疯狂的循环打印日志问题
- mini2440 H-flasher Flash id does not match问题的解决
- The Squared Mosquito Coil dfs
- 未能找到服务器主机名,未能找到主机名服务器
- php scws 获取分词结果,php实现scws中文分词搜索的方法
- 计算机考证报名照片是什么底
- Self-Attentive 基于自注意力分类的非结构化日志异常检测
- 谷歌母公司Q4营收753亿美元同比增32% 全年营收2576亿美元
- IBM SPSS Modeler通过数据挖掘我们能从股市数据得到什么