ardupilot 遥控器输入量如何转换成目标加速度

2024-01-29 19:44

本文主要是介绍ardupilot 遥控器输入量如何转换成目标加速度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

文章目录

  • 目录
  • 摘要
  • 1.理论依据
  • 2程序细节分析
  • 3.代码实现

摘要

主要根据遥控器的横滚,俯仰通道值转换成对应的欧拉角度,然后根据欧拉角度转换成地理坐标系下的目标加速度的过程。

1.理论依据

在这里插入图片描述

2程序细节分析

根据公式(8)我们可以得到前右下坐标系下对应的加速度:
在这里插入图片描述
到这里我们得到了前右下坐标系下的加速度,此时我们只需要转换到地理坐标系即可。

在这里插入图片描述

3.代码实现

很早之前的代码实现过程

void AC_Loiter::set_sky_droid_pilot_desired_acceleration(float euler_roll_angle_cd, float euler_pitch_angle_cd, float dt)
{//在公用接口上转换从cm度到弧度---- Convert from centidegrees on public interface to radians//单位缩小了100,之前扩大了100倍,并且这里单位变成弧度const float euler_roll_angle = radians(euler_roll_angle_cd*0.01f);const float euler_pitch_angle = radians(euler_pitch_angle_cd*0.01f);//转换我们期望的姿态到加速度矢量,当我们是悬停时候---- convert our desired attitude to an acceleration vector assuming we are hovering//因此这里的假设是悬停操作,下面得到机体坐标系下的目标加速度信息const float pilot_cos_pitch_target = constrain_float(cosf(euler_pitch_angle), 0.5f, 1.0f); //限制俯仰角度在-60到60度//得到右侧的加速度信息const float pilot_accel_rgt_cms = GRAVITY_MSS*100.0f * tanf(euler_roll_angle)/pilot_cos_pitch_target;//得到前向加速度信息const float pilot_accel_fwd_cms = -GRAVITY_MSS*100.0f * tanf(euler_pitch_angle);//旋转加速度矢量到地理坐标系下(经纬度坐标系) rotate acceleration vectors input to lat/lon frame_desired_accel.x = (pilot_accel_fwd_cms*_ahrs.cos_yaw() - pilot_accel_rgt_cms*_ahrs.sin_yaw());_desired_accel.y = (pilot_accel_fwd_cms*_ahrs.sin_yaw() + pilot_accel_rgt_cms*_ahrs.cos_yaw());//计算误差关于我们认为我们应该到和我们想要到的 difference between where we think we should be and where we want to be//得到姿态误差值Vector2f angle_error(wrap_PI(euler_roll_angle - _predicted_euler_angle.x), wrap_PI(euler_pitch_angle - _predicted_euler_angle.y));// calculate the angular velocity that we would expect given our desired and predicted attitude//计算给定期望和预测姿态时的角速度_attitude_control.input_shaping_rate_predictor(angle_error, _predicted_euler_rate, dt);//根据预测角速度更新预测姿态----- update our predicted attitude based on our predicted angular velocity_predicted_euler_angle += _predicted_euler_rate * dt;// convert our predicted attitude to an acceleration vector assuming we are hovering//假设我们在悬停,将预测的姿态转换为加速度矢量const float pilot_predicted_cos_pitch_target = cosf(_predicted_euler_angle.y);//获取右向的加速度const float pilot_predicted_accel_rgt_cms = GRAVITY_MSS*100.0f * tanf(_predicted_euler_angle.x)/pilot_predicted_cos_pitch_target;//获取向前的加速度const float pilot_predicted_accel_fwd_cms = -GRAVITY_MSS*100.0f * tanf(_predicted_euler_angle.y);//旋转加速度矢量到地理坐标系---- rotate acceleration vectors input to lat/lon frame_predicted_accel.x = (pilot_predicted_accel_fwd_cms*_ahrs.cos_yaw() - pilot_predicted_accel_rgt_cms*_ahrs.sin_yaw());_predicted_accel.y = (pilot_predicted_accel_fwd_cms*_ahrs.sin_yaw() + pilot_predicted_accel_rgt_cms*_ahrs.cos_yaw());
}

//最新代码

void AC_Loiter::set_pilot_desired_acceleration(float euler_roll_angle_cd, float euler_pitch_angle_cd)
{const float dt = _attitude_control.get_dt();// Convert from centidegrees on public interface to radiansconst float euler_roll_angle = radians(euler_roll_angle_cd * 0.01f);const float euler_pitch_angle = radians(euler_pitch_angle_cd * 0.01f);// convert our desired attitude to an acceleration vector assuming we are not accelerating verticallyconst Vector3f desired_euler {euler_roll_angle, euler_pitch_angle, _ahrs.yaw};const Vector3f desired_accel = _pos_control.lean_angles_to_accel(desired_euler);_desired_accel.x = desired_accel.x;_desired_accel.y = desired_accel.y;// difference between where we think we should be and where we want to beVector2f angle_error(wrap_PI(euler_roll_angle - _predicted_euler_angle.x), wrap_PI(euler_pitch_angle - _predicted_euler_angle.y));// calculate the angular velocity that we would expect given our desired and predicted attitude_attitude_control.input_shaping_rate_predictor(angle_error, _predicted_euler_rate, dt);// update our predicted attitude based on our predicted angular velocity_predicted_euler_angle += _predicted_euler_rate * dt;// convert our predicted attitude to an acceleration vector assuming we are not accelerating verticallyconst Vector3f predicted_euler {_predicted_euler_angle.x, _predicted_euler_angle.y, _ahrs.yaw};const Vector3f predicted_accel = _pos_control.lean_angles_to_accel(predicted_euler);_predicted_accel.x = predicted_accel.x;_predicted_accel.y = predicted_accel.y;
}
Vector3f AC_PosControl::lean_angles_to_accel(const Vector3f& att_target_euler) const
{// rotate our roll, pitch angles into lat/lon frameconst float sin_roll = sinf(att_target_euler.x);const float cos_roll = cosf(att_target_euler.x);const float sin_pitch = sinf(att_target_euler.y);const float cos_pitch = cosf(att_target_euler.y);const float sin_yaw = sinf(att_target_euler.z);const float cos_yaw = cosf(att_target_euler.z);return Vector3f{(GRAVITY_MSS * 100.0f) * (-cos_yaw * sin_pitch * cos_roll - sin_yaw * sin_roll) / MAX(cos_roll * cos_pitch, 0.1f),(GRAVITY_MSS * 100.0f) * (-sin_yaw * sin_pitch * cos_roll + cos_yaw * sin_roll) / MAX(cos_roll * cos_pitch, 0.1f),(GRAVITY_MSS * 100.0f)};
}

可以看出最新的代码对加速度的限制范围相对较小。其实之前代码也有这个倾斜角到加速度的转换只是没有使用

// get_lean_angles_to_accel - convert roll, pitch lean angles to lat/lon frame accelerations in cm/s/s
void AC_PosControl::lean_angles_to_accel(float& accel_x_cmss, float& accel_y_cmss) const
{// rotate our roll, pitch angles into lat/lon frame// todo: this should probably be based on the desired attitude not the current attitudeaccel_x_cmss = (GRAVITY_MSS * 100) * (-_ahrs.cos_yaw() * _ahrs.sin_pitch() * _ahrs.cos_roll() - _ahrs.sin_yaw() * _ahrs.sin_roll()) / MAX(_ahrs.cos_roll() * _ahrs.cos_pitch(), 0.5f);accel_y_cmss = (GRAVITY_MSS * 100) * (-_ahrs.sin_yaw() * _ahrs.sin_pitch() * _ahrs.cos_roll() + _ahrs.cos_yaw() * _ahrs.sin_roll()) / MAX(_ahrs.cos_roll() * _ahrs.cos_pitch(), 0.5f);
}

这篇关于ardupilot 遥控器输入量如何转换成目标加速度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/657985

相关文章

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

多重背包转换成0-1背包

http://acm.hdu.edu.cn/showproblem.php?pid=2191 多重背包特点: 一种物品有C个(既不是固定的1个,也不是无数个) 优化的方法: 运用神奇的二进制,进行物品拆分,转化成01背包 物品拆分,把13个相同的物品分成4组(1,2,4,6) 用这4组可以组成任意一个1~13之间的数! 原理:一个数总可以用2^

Prompt - 将图片的表格转换成Markdown

Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI assistant tasked with extracting the content of

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

[数据集][目标检测]智慧农业草莓叶子病虫害检测数据集VOC+YOLO格式4040张9类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4040 标注数量(xml文件个数):4040 标注数量(txt文件个数):4040 标注类别数:9 标注类别名称:["acalcerosis","fertilizer","flower","fruit","grey

将浮点型算式的中缀表达式转换成后缀表达式并算出式子结果

最近因为需要了解如何将在Win应用程序控制台输入的算式表达式转化成其后缀表达式的算法,所以在网上搜索了一下,看到许多人的程序都只是对应于运算数在0~9的范围内的整型运算式,所以自己就写了一个可以计算浮点型算式的程序,一下是运行时的截图: 式子中的a,b,c是可供用户自行输入的变量。 首先,我先对输入的运算符进行了简单的合法性判断,我的判断代 码如下: //函数的传入参

目标检测-RT-DETR

RT-DETR (Real-Time Detection Transformer) 是一种结合了 Transformer 和实时目标检测的创新模型架构。它旨在解决现有目标检测模型在速度和精度之间的权衡问题,通过引入高效的 Transformer 模块和优化的检测头,提升了模型的实时性和准确性。RT-DETR 可以直接用于端到端目标检测,省去了锚框设计,并且在推理阶段具有较高的速度。 RT-DET

【无线通信发展史⑧】测量地球质量?重力加速度g的测量?如何推导单摆周期公式?地球半径R是怎么测量出来的?

前言:用这几个问答形式来解读下我这个系列的来龙去脉。如果大家觉得本篇文章不水的话希望帮忙点赞收藏加关注,你们的鼓舞是我继续更新的动力。 我为什么会写这个系列呢? 首先肯定是因为我本身就是一名从业通信者,想着更加了解自己专业的知识,所以更想着从头开始了解通信的来源以及在每一个时代的发展进程。 为什么会从头开始写通信? 我最早是学习了中华上下五千年,应该说朝代史,这个算个人兴趣,从夏