px4直升机混控逻辑整理
目录
一、直升机混控矩阵的介绍:
二、源代码解读
一、直升机混控矩阵的介绍:
直升机混控:
直升机混控将三个控制输入(roll,pitch,thrust)组合为四个输出(斜盘伺服系统和主电机ESC设置)。
直升机混控的第一个输出是主电机的油门设置。 随后的输出是斜盘伺服器。 可以通过添加简单的混合器来控制尾桨。
推力控制输入既用于主电动机设置,也用于斜盘的总螺距。 它使用油门曲线和俯仰曲线,均由五个点组成。
混合器定义以以下内容开头:
H: <number of swash-plate servos, either 3 or 4>
T: <throttle setting at thrust: 0%> <25%> <50%> <75%> <100%>
P: <collective pitch at thrust: 0%> <25%> <50%> <75%> <100%>
T:
定义油门曲线的点。
P:
定义总距曲线的点。
两条曲线都包含0至10000之间的五个点。 对于简单的线性行为,曲线的五个值应为 0 2500 5000 7500 10000
。
接下来是斜盘伺服器(3或4)的每行,格式如下:
S: <angle> <arm length> <scale> <offset> <lower limit> <upper limit>
其中 <angle>
是舵机安装的角度 ,单位为度,0度在机头的方向上。 从上方看,正角为顺时针方向。
<arm length>
是臂长的比例归一化长度10000等于1。 如果所有伺服臂的长度相同,则该值必须为10000。 臂长越大,伺服偏转量越小,臂越短,伺服偏转量越大。
<scale>
是伺服输出缩放比例,按 <scale> / 10000
。 缩放后,将 <offset>
偏移,该范围应在-10000到+10000之间。 , <lower limit>
和 <upper limit>
对于完整的伺服范围 应当为-10000和+10000。
可以通过添加 来控制尾桨 简单求和混控 :
M: 1
S: 0 2 10000 10000 0 -10000 10000
这样,尾桨设置将直接映射到偏航命令。 这既适用于伺服控制的尾旋翼,也适用于带有专用电机的尾旋翼。
源码中有机架blade130作为示例机型:
H: 3
T: 0 3000 6000 8000 10000
P: 500 1500 2500 3500 4500
# Swash plate servos:
S: 0 10000 10000 0 -8000 8000
S: 140 13054 10000 0 -8000 8000
S: 220 13054 10000 0 -8000 8000# Tail servo:
M: 1
S: 0 2 10000 10000 0 -10000 10000
- 节气门曲线以稍微陡峭的坡度开始,在推力为50%时达到6000(0.6)。
- 它继续以较小的斜率在100%的推力下达到10000(1.0)。
- 总距曲线是线性的,但不会使用整个范围。
- 油门为0%时,总螺距设置已为500(0.05)。
- 在最大油门时,总螺距仅为4500(0.45)。
- 对这种类型的直升机使用较高的值会使叶片失速。
- 该直升机的斜盘舵机的角度为0度,140度和220度。
- 伺服臂长度不相等。
- 与第一伺服器相比,第二和第三伺服器的臂更长,比率为1.3054。
- 伺服限制在-8000和8000,因为它们受到机械限制。
二、源代码解读
直升机混控器的文件路径src/lib/mixer/HelicopterMixer/HelicopterMixer.cpp
源码贴在下面,逐步解读
unsigned
HelicopterMixer::mix(float *outputs, unsigned space)
{if (space < _mixer_info.control_count + 1u) {return 0;}/* Find index to use for curves */float thrust_cmd = get_control(0, 3);int idx = (thrust_cmd / 0.25f);/* Make sure idx is in range */if (idx < 0) {idx = 0;} else if (idx > HELI_CURVES_NR_POINTS - 2) {/* We access idx + 1 below, so max legal index is (size - 2) */idx = HELI_CURVES_NR_POINTS - 2;}/* Local throttle curve gradient and offset */float tg = (_mixer_info.throttle_curve[idx + 1] - _mixer_info.throttle_curve[idx]) / 0.25f;float to = (_mixer_info.throttle_curve[idx]) - (tg * idx * 0.25f);float throttle = constrain(2.0f * (tg * thrust_cmd + to) - 1.0f, -1.0f, 1.0f);/* Local pitch curve gradient and offset */float pg = (_mixer_info.pitch_curve[idx + 1] - _mixer_info.pitch_curve[idx]) / 0.25f;float po = (_mixer_info.pitch_curve[idx]) - (pg * idx * 0.25f);float collective_pitch = constrain((pg * thrust_cmd + po), -0.5f, 0.5f);float roll_cmd = get_control(0, 0);float pitch_cmd = get_control(0, 1);outputs[0] = throttle;for (unsigned i = 0; i < _mixer_info.control_count; i++) {outputs[i + 1] = collective_pitch+ cosf(_mixer_info.servos[i].angle) * pitch_cmd * _mixer_info.servos[i].arm_length- sinf(_mixer_info.servos[i].angle) * roll_cmd * _mixer_info.servos[i].arm_length;outputs[i + 1] *= _mixer_info.servos[i].scale;outputs[i + 1] += _mixer_info.servos[i].offset;outputs[i + 1] = constrain(outputs[i + 1], _mixer_info.servos[i].min_output, _mixer_info.servos[i].max_output);}return _mixer_info.control_count + 1;
}
首先获得油门通道值
float thrust_cmd = get_control(0, 3); 这样获得油门是在0到1之间
计算油门曲线在哪个阶段
int idx = (thrust_cmd / 0.25f); 将油门行程分为四段
确认油门在范围内
if (idx < 0) {
idx = 0;油门不允许为负数
} else if (idx > HELI_CURVES_NR_POINTS - 2) {
idx = HELI_CURVES_NR_POINTS - 2;
}
这样限幅完是0~3,下面再加1就是1~4.
接着是油门阶段曲线限制和总距曲线限制 和前面定义的曲线的点是对应的
H: <number of swash-plate servos, either 3 or 4>
T: <throttle setting at thrust: 0%> <25%> <50%> <75%> <100%>
P: <collective pitch at thrust: 0%> <25%> <50%> <75%> <100%>
float tg = (_mixer_info.throttle_curve[idx + 1] - _mixer_info.throttle_curve[idx]) / 0.25f;
float to = (_mixer_info.throttle_curve[idx]) - (tg * idx * 0.25f);
float throttle = constrain(2.0f * (tg * thrust_cmd + to) - 1.0f, -1.0f, 1.0f);
/* Local pitch curve gradient and offset */
float pg = (_mixer_info.pitch_curve[idx + 1] - _mixer_info.pitch_curve[idx]) / 0.25f;
float po = (_mixer_info.pitch_curve[idx]) - (pg * idx * 0.25f);
float collective_pitch = constrain((pg * thrust_cmd + po), -0.5f, 0.5f);
然后获取俯仰和横滚的通道输入
float roll_cmd = get_control(0, 0);
float pitch_cmd = get_control(0, 1);
最后将各通道将总距和俯仰以及横滚通道按舵机角度比列混控
outputs[0] = throttle;
for (unsigned i = 0; i < _mixer_info.control_count; i++) {
outputs[i + 1] = collective_pitch
+ cosf(_mixer_info.servos[i].angle) * pitch_cmd * _mixer_info.servos[i].arm_length
- sinf(_mixer_info.servos[i].angle) * roll_cmd * _mixer_info.servos[i].arm_length;
outputs[i + 1] *= _mixer_info.servos[i].scale;
outputs[i + 1] += _mixer_info.servos[i].offset;
outputs[i + 1] = constrain(outputs[i + 1], _mixer_info.servos[i].min_output, _mixer_info.servos[i].max_output);
}
这里outputs[0]是油门的输出所以不用再混控。
px4直升机混控逻辑整理相关推荐
- px4机架和混控文件读取
在px4启动文件RCS中,可以看到对autostart文件的读取 # # Set parameters and env variables for selected AUTOSTART. # if ! ...
- 纯手写F3飞控的直升机固件(2.直升机倾斜盘混控了解)
首先,对于一个直升机无副翼控制系统(FBLSystem),遥控器设定的倾斜盘类型必须为 Normal 或 H-1,也就是说,Pit.Ail.Ele三个通道无混控关系,倾斜盘混控由直升机无副翼控制系统完 ...
- 【Pixhawk】PX4源码控制逻辑详解(以UGV小车为例)
PX4启动流程 主体控制逻辑 commander:飞行模式控制 stickmapper:摇杆映射 position_estimator:从GPS获得的位置估计 navigator:读取航点,产生期望位 ...
- 开源自制的6通道航模遥控器(三)-遥控器端增加MIX混控模式
1.了解什么是混控 要了解混控,需要先对比一般的遥控模式.一般遥控的每个操作控制都是一个通道,比如美国手的遥控器,左边摇杆前后控制油门,左右控制方向舵:右边摇杆前后控制升降舵,左右控制副翼(横滚).混 ...
- 富斯FS-T6 APM飞控四种飞行模式设置方法_MIX混控设置
来源于5iMX论坛的这篇帖子 富斯FS-T6 APM飞控两种飞行模式设置方法点击打开链接 但是我按照作者的设置MIX的方法,怎么都只有三种通道 先上图吧: 1.我的混控设置: OFFSET是偏移量,向 ...
- 三角翼航模尾翼混控原理探索
最近几天突然想自己diy一个航模--三角翼航模.在研究三角翼的姿态控制的时候,涉及到了混控的知识,我在网上找了好久也找不到相关的原理介绍,或者具体的算法.要么就是让你看遥控器的说明书进行相关设置,要么 ...
- VAE逻辑整理及VAE在异常检测中的小实验(附代码)
VAE逻辑整理及VAE在异常检测中的小实验(附代码) Variance和control variate 两种常见的分类器 相应代码 Minst数据集的训练和重构 KDD99数据 本文主要讲解一下整个 ...
- .Net下WinForm换肤控件整理
.Net下WinForm换肤控件整理 ...
- PX4从放弃到精通(十一):混控及PWM输出
最新文章
- 图解Transformer:Attention Is All You Need
- 深度学习(三)theano学习笔记(2)基础函数-未完待续
- Spring Boot 密码加密的 2 种姿势!
- 问题 D: 巧求和(思维)
- 云小课 | 华为云KYON之VPC终端节点
- HTTP的请求与响应问题(没有了CSDN,暂时把这里当作论坛了)
- EF架构~对AutoMapper实体映射的扩展
- blender基本翻译+快捷键
- part-1 输入偏置电流和输入失调电流
- YOLOV5出现.acceptable suffix is [‘.pt‘]的错误||不使用权重报错
- Firefly ROC-RK3328-PC 四核64位入门级Mini PC 官方教程矫正经验
- 以开发之名|线上家装新美学——梦想之家,由你来定
- Axure RP 8 激活码
- EU.org免费域名申请教程
- [Chaosblade] chaosblade-jvm-exec和chaosblade交互
- ARFoundation之路-视频播放
- 【半导体器件数值模拟之仓田卫篇】
- 软件的MSDN版、OEM版、RTM版有什么不同?
- USBViewer(USB移动存储设备使用记录查看器)
- 智力题及答案(逻辑推理)
热门文章
- 有两个关系S(A, B, C, D)和T(C, D,E, F), 写出与下列查询等价的SQL表达式:
- 【PDF】java使用Itext生成pdf文档--详解
- 今日微语早报简报 精选12条新闻摘要 每天一分钟 知晓天下事 3月22日
- c atol()函数_atol()函数以及C ++中的示例
- nodejs生成uid
- 软件产品选型测试/POC测试
- 三星堆火了,VR科技如何唤醒千年文明?
- 上海庆科EMW3162 WiFi模块 串口透传
- Java自学1(哭唧唧又重头开始学了)
- 黑马程序员 python 基础版 哪个老师_(看黑马程序员Python基础班视频挺好,犹豫该不该报班?)...