当前位置: 首页 > article >正文

PX4无人机控制开发踩坑记录:控制频率、坐标系转换与欧拉角多解问题

前言这里记录自己设计无人机控制代码过程中遇到的常见问题和自己踩过的坑。1. 控制频率的影响本质上无人机控制系统通常以离散形式运行。对于相同的控制参数设置不同的控制频率会显著影响系统的闭环性能。随着控制频率的提高系统的有效控制带宽增大使得控制器能够采用更为激进的控制策略从而获得更快的动态响应。因此在高速飞行或快速机动等场景中通常需要较高的控制频率以保证控制性能和稳定性。我们假设一个简单的系统模型x˙v \dot{x} vx˙vv˙areal \dot{v} a_{real}v˙areal​a˙realacmd−arealτact \dot{a}_{real} \frac{a_{cmd} - a_{real}}{\tau_{act}}a˙real​τact​acmd​−areal​​其中xxx位置vvv速度acmda_{cmd}acmd​控制器输出的期望加速度areala_{real}areal​执行器实际产生的加速度τact\tau_{act}τact​执行器时间常数控制器采用简单的Position-P Velocity-P形式acmdkp(xref−xm)kv(vref−vm) a_{cmd} k_p (x_{ref}-x_m) k_v (v_{ref}-v_m)acmd​kp​(xref​−xm​)kv​(vref​−vm​)其中xm,vmx_m, v_mxm​,vm​为带有测量延迟的状态。下图展示了相同参数不同控制频率下的影响我使用了较为激进的控制参数kp15.0,kv10.0k_p 15.0,\quad k_v 10.0kp​15.0,kv​10.0从图中可以看出频率越高响应速度越快收敛效果越好。除此之外轨迹规划的效果也依赖于较高的控制频率。例如当无人机以10 m/s 的速度沿半径为 6 m 的圆轨迹飞行时如果控制频率较低轨迹执行效果将更接近一个多边形而不是理想的圆形。2. 坐标转换本人在设计控制器时曾在这一问题上踩过坑。以常见的 PX4 飞控为例在发布控制话题时需要明确所使用的坐标系。例如通过 MAVROS 获取的 GPS 数据通常采用ENU 坐标系而一些里程计如 VIO则通常以初始机头方向为 x 轴、天空方向为 z 轴并满足右手坐标系进行定义。此外还需要注意位置与速度是否在同一坐标系中表达。例如在 PX4 中/mavros/local_position/odom的消息类型为nav_msgs/Odometry其中pose表达在header.frame_id坐标系中twist表达在child_frame_id坐标系中因此位置通常是在世界坐标系如 odom 或 map中表示而速度则是在机体坐标系中表示。而我之前使用的一种 VIO 里程计中位置与速度是统一在同一坐标系中表达的。在更换为 RTK 定位后由于坐标系定义发生变化再加上同时存在欧拉角处理和控制频率等问题导致调试了较长时间才发现这一差异。因此在根据里程计数据设计控制算法并计算期望位姿时需要特别注意将结果转换到控制话题所使用的坐标系中。例如在使用姿态控制话题/mavros/setpoint_raw/attitude时需要保证发布的期望姿态与飞控内部使用的坐标系一致。在实现中我使用如下公式进行姿态转换quqimu⊗qodom−1⊗qd q_u q_{\text{imu}} \otimes q_{\text{odom}}^{-1} \otimes q_dqu​qimu​⊗qodom−1​⊗qd​其中qimuq_{\text{imu}}qimu​IMU 坐标系下的姿态四元数表示qodomq_{\text{odom}}qodom​里程计坐标系下的姿态四元数表示qdq_dqd​控制器计算得到的期望姿态quq_uqu​最终计算得到的期望姿态用于发布到/mavros/setpoint_raw/attitude该公式的核心是先计算IMU 坐标系与里程计坐标系之间的旋转关系qIOqimu⊗qodom−1 q_{IO} q_{\text{imu}} \otimes q_{\text{odom}}^{-1}qIO​qimu​⊗qodom−1​该四元数表示从 odom 坐标系到 IMU 坐标系的旋转变换。随后将控制器在 odom 坐标系中计算得到的期望姿态qdq_dqd​通过该变换映射到 IMU 坐标系中quqIO⊗qd q_u q_{IO} \otimes q_dqu​qIO​⊗qd​最终得到的quq_uqu​即为在 IMU 坐标系下表达的期望姿态可以直接作为姿态控制指令发布给/mavros/setpoint_raw/attitude。简单来说这一步的作用是将控制器在 odom 坐标系中计算得到的期望姿态转换到 IMU 坐标系下再发送给飞控。如果忽略这一转换在 VIO、RTK 和 IMU 坐标系定义不一致的情况下很容易导致姿态控制出现偏差甚至无法稳定。3. 欧拉角表示的不唯一性在实际实现过程中当调用 Eigen 提供的 eulerAngles(0,1,2) 函数时观察到姿态角会出现突变现象。这一问题的根本原因在于 欧拉角表示本身并不是唯一的。对于同一个旋转矩阵或四元数往往存在多组欧拉角可以表示相同的空间姿态。因此在进行 旋转矩阵或四元数到欧拉角的转换时数学上会出现多解的情况。为了保证数值计算的稳定性并尽量避免奇异情况如接近万向节锁 gimbal lock许多数值库在实现欧拉角分解时会采用 分支选择branch switching策略。Eigen 的 eulerAngles() 函数实现参考了 Graphics Gems IV 中的相关算法在特定条件下会自动切换到另一组等价的欧拉角解以保持分解结果的数值稳定性。然而这种分支切换在数值上可能表现为 欧拉角的突然跳变例如 yaw 增加或减少 π。当这些欧拉角进一步用于三角函数运算如计算 sin、cos时就可能导致控制量出现符号突变从而影响控制算法的稳定性。在实际无人机飞行场景中姿态变化通常具有一定范围约束例如 roll 和 pitch 一般不会超过 ±90°。在这种情况下可以通过 固定欧拉角分解的分支例如直接使用四元数解析公式计算 roll、pitch、yaw避免自动分支切换带来的角度突变问题从而保证姿态角在数值上的连续性。这种处理方式在无人机控制系统中更加稳定和可靠。

相关文章:

PX4无人机控制开发踩坑记录:控制频率、坐标系转换与欧拉角多解问题

前言:这里记录自己设计无人机控制代码过程中遇到的常见问题和自己踩过的坑。 1. 控制频率的影响本质上,无人机控制系统通常以离散形式运行。对于相同的控制参数设置,不同的控制频率会显著影响系统的闭环性能。随着控制频率的提高,…...

WiFi 覆盖不足?无 WiFi 也能控!用4G 模块 CT11-BC 实现全域远程控制教程

工业级4G远程控制:CT11-B&C模块全域覆盖实战指南在户外、偏远地区等 WiFi 信号覆盖不足的场景中,传统 WiFi 模块常因通信中断无法实现远程控制,而 4G 模块凭借广覆盖、高稳定性的核心优势,成为物联网远程控制的理想解决方案。…...

EKF INS GPS松组合导航技术解析:深度解读状态更新与地理坐标系的选择——NED(北东地)视角

EKF INS/GPS松组合导航,15状态,地理系采用NED(北东地)北东地坐标系下的惯性导航总是带着某种神秘感。当我们把IMU数据塞进算法时,那些跳动的数值就像在三维空间跳华尔兹。今天咱们聊聊怎么用15个状态的扩展卡尔曼滤波(EKF&#xf…...

苍穹外卖Day7 (缓存菜品/套餐 购物车)

问题说明实现思路缓存菜品代码实现每次修改数据需要及时清理缓存中相应的数据因为每次修改数据库中相应的数据都需要清理对应的缓存所以直接在控制层封装清理缓存的方法调用方法参数直接传key就好了缓存注解springCache的使用Spring Cache常用注解Cacheable 缓存中有就取&…...

龙虾的热度确实高过能力,但它是普通人拥抱 AI 浪潮的第一步

最近一周,一向以风格稳重著称的腾讯一反常态,不仅借着一场“免费帮装虾”的线下活动迅速推高了大众对“龙虾”的热情,而且在短期内推出了大量“龙虾”产品。 目前已经上线的,有被称为腾讯版“免部署小龙虾”的办公工具WorkBuddy&…...

【STS/Eclipse】tomcat配置及项目servlet运行相关问题

在配置tomcat以及初次尝试运行项目时遇到了一些问题,先是非法字符"H",后是打开网页出现404的情况,也是找了很多相关帖子,但发现有些问题的解决方式还需要补充,所以就有了此文。本篇使用的:Spring…...

量子位专访陶哲轩:我为什么现在创办一个AI x Science组织

数学家陶哲轩,公开了AI新身份——SAIR Foundation联合创始人。 之前,他是举世闻名的数学天才,年少成名的传奇数学家、13岁加冕IMO的最年轻金牌得主……24岁就成为加州大学洛杉矶分校(UCLA)史上最年轻的终身正教授。 …...

关于在虚拟机安装RedHat详细过程

1.首先打开VMware0.1新建虚拟机0.2 选择自定义,下一步0.3按图设置0.4给自己的虚拟机改名,下一步0.5输入密码,下一步0.7默认设置,下一步0.8根据自己所需性能设置处理器的数量,下一步0.9根据自己所需要的内存设置&#x…...

[连载] C++ 零基础入门-4.C++ 键盘输入 cin 一步一步学

作者:咏方舟-长江支流 日期:2026-03-15 免费《C 零基础到底层实战-全套31篇 体系化教程》,从环境安装→基础语法 → 面向对象 → 多线程 → 智能指针 → 鸿蒙原生开发,一套打通:桌面开发 / 嵌入式 / 鸿蒙 / 高薪底层…...

安装Android开发环境

1.下载&安装Android Studio a.打开浏览器,在地址栏输入网址“https://developer.android.google.cn/”,进入谷歌安卓开发者中文官网。 b.在主页面找到“下载Android Studio”按钮,点击进入下载页面,下载最新版AndroidStudio。…...

智能搜索新选择:通义千问3-VL-Reranker-8B部署与API调用教程

智能搜索新选择:通义千问3-VL-Reranker-8B部署与API调用教程 你是否曾为搜索结果不够精准而烦恼?比如在电商平台找“适合户外运动的红色背包”,结果搜出来的商品图片里背包却是蓝色的。或者想找一段“海边日落”的视频素材,系统却…...

基于GD32F303的便携式教学数字示波器设计

1. 项目概述基于GD32F303RCT6微控制器构建的便携式简易数字示波器,面向嵌入式系统学习、基础信号观测及教学实验场景设计。该系统在保持硬件精简与成本可控的前提下,实现了直流至200kHz带宽的实时波形采集、触发显示与人机交互功能。整机采用单板集成架构…...

Lingbot-Depth-Pretrain-ViTL-14 构建智能监控系统:人群密度估计与异常行为检测

Lingbot-Depth-Pretrain-ViTL-14 构建智能监控系统:人群密度估计与异常行为检测 你有没有想过,为什么传统的监控摄像头有时候会“数错人”?比如在一条长长的走廊里,远处的人看起来很小,近处的人看起来很大&#xff0c…...

【异常】解决Attu连接超时No connection established. Last error: connect ETIMEDOUT 10.x.x.x:19530

解决 connect ETIMEDOUT 连接超时问题 在日常开发和运维过程中,我们经常会遇到网络连接超时类错误,这类问题往往涉及网络、服务、配置等多个层面,本文将以 connect ETIMEDOUT 错误为例,详细解析报错原因及完整解决思路。 一、报错内容 No connection established. Last …...

重装系统后快速恢复CasRel模型开发环境:镜像与依赖一键还原

重装系统后快速恢复CasRel模型开发环境:镜像与依赖一键还原 重装系统,对开发者来说,简直是场噩梦。辛辛苦苦搭建好的Python环境、CUDA驱动、各种深度学习框架,还有那个调了无数参数才跑起来的CasRel模型项目,一夜之间…...

http错误码来自底层SDK的哪个头文件里面定义的

HTTP 错误码在你这套实现里,主要来自底层 QURL SDK。对应关系是:通用层 am_http_error_t.err_code 的值,是在 oshttp.c:192-196、oshttp.c:203-207、oshttp.c:344-349 这些地方,直接把底层 qurl_ecode_t ret 填进去的。 底层 API …...

SpatialGlue:双注意力机制驱动的空间多组学整合新范式

1. SpatialGlue:当空间多组学遇上双注意力机制 第一次听说SpatialGlue这个工具时,我正在处理一组小鼠大脑皮层的空间转录组数据。当时最头疼的问题就是——如何把不同组学数据里的空间信息"粘合"在一起?传统方法要么忽略空间位置&a…...

STM32F4 CAN通信库函数实战:从零构建车载数据收发节点

1. 为什么选择STM32F4的CAN通信 如果你正在开发车载电子系统,比如车身控制单元(BCU)或者仪表盘通信模块,CAN总线绝对是绕不开的技术。我在汽车电子行业摸爬滚打多年,见过太多工程师被CAN通信的底层协议搞得头大。其实STM32F4系列内置的CAN控制…...

Windows下Python进程监控与自动化管理实践

1. Windows下Python进程管理入门指南 在Windows系统上运行Python脚本时,经常会遇到需要监控脚本运行状态、自动重启崩溃进程或者更新代码后重新加载的场景。比如你开发了一个爬虫程序需要724小时运行,或者部署了一个Web服务需要保证高可用性。手动操作不…...

StructBERT零样本分类-中文-base降本增效:相比Fine-tuning节省87%标注与训练成本

StructBERT零样本分类-中文-base降本增效:相比Fine-tuning节省87%标注与训练成本 想象一下,你手头有10万条中文文本需要分类,传统方法需要标注数据、训练模型、调优参数,整个过程耗时耗力。现在告诉你:不用标注一条数据…...

CLIP ViT-H-14图像特征服务效果展示:食品菜品识别、包装盒文字无关匹配

CLIP ViT-H-14图像特征服务效果展示:食品菜品识别、包装盒文字无关匹配 1. 服务概述 CLIP ViT-H-14图像编码服务是基于laion2B-s32B-b79K预训练模型的图像特征提取解决方案。这项服务将先进的视觉-语言预训练模型封装为易用的API和Web界面,特别适合需要…...

Linux下VCS+Verdi联合仿真避坑指南:从编译选项到波形调试全流程

Linux环境下VCS与Verdi高效联调实战手册 引言 在数字芯片验证领域,仿真工具链的熟练使用直接决定验证效率。Synopsys VCS作为业界领先的编译型仿真器,配合Verdi强大的波形调试能力,已成为IC验证工程师的标配工具组合。但在实际项目中&#xf…...

L-BFGS优化算法避坑指南:路径平滑中梯度计算常见的5个错误与修正方法

L-BFGS优化算法避坑指南:路径平滑中梯度计算常见的5个错误与修正方法 在机器人路径规划、自动驾驶轨迹优化等场景中,L-BFGS算法因其内存效率和收敛速度成为路径平滑的首选工具。但许多开发者在实现过程中常因梯度计算的细节问题导致算法无法收敛或得到次…...

避开这3个坑!用GPT-SoVITS克隆自己声音时90%新手会犯的错误

避开这3个坑!用GPT-SoVITS克隆自己声音时90%新手会犯的错误 当你第一次听到AI用你的声音说出从未讲过的话时,那种震撼感无与伦比。但现实往往很骨感——多数人第一次尝试语音克隆得到的不是"数字分身",而是充满机械杂音的"电子…...

合泰HT32芯片开发避坑指南:从Pack下载到固件库移植的完整流程

合泰HT32芯片开发实战:从环境搭建到外设移植的深度解析 对于习惯了STM32生态的工程师来说,初次接触合泰HT32系列芯片可能会遇到不少困惑。以HT32F52342为代表的新一代合泰MCU,虽然在性能价格比上颇具优势,但开发环境的搭建、固件库…...

Outlook账户登录失败?5步彻底清理缓存和凭据(附注册表路径)

Outlook账户登录故障终极解决指南:从缓存清理到系统级修复 你是否经历过这样的场景:明明Microsoft账户密码正确,网页版和其他设备都能正常登录,偏偏在某台电脑的Outlook客户端反复提示输入密码,甚至出现"抱歉&…...

从机械振动到电力系统:智能故障诊断领域的中文核心期刊全解析

从机械振动到电力系统:智能故障诊断领域的中文核心期刊全解析 在工业4.0和智能制造的大背景下,智能故障诊断技术正成为保障设备安全运行的关键支撑。无论是旋转机械的异常振动监测,还是电力变压器的绝缘劣化预警,精准的故障识别算…...

Android多屏异显开发避坑指南:Surface/BufferQueue API的正确打开方式

Android多屏异显开发实战:从SurfaceFlinger到BufferQueue的深度解析 在智能家居控制面板、车载双屏系统以及商业展示设备等场景中,Android多屏异显技术正成为开发者必须掌握的技能。不同于简单的屏幕镜像,真正的多屏异显需要精确控制每个显示…...

NI VeriStand实战:5分钟搞定LabVIEW模型导入与实时测试应用搭建

NI VeriStand实战:5分钟搞定LabVIEW模型导入与实时测试应用搭建 对于许多从事实时测试与硬件在环仿真的工程师来说,时间就是最宝贵的资源。项目周期不断压缩,测试需求日益复杂,如何在保证系统可靠性的前提下,快速构建一…...

Jmeter接口测试:使用教程(上)

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 Jmeter是一款小巧,轻便、开源的性能测试工具,它也可以很方便的进行接口测试。下面我就带大家学习下jmeter接口测试。一、Jmeter简介Jmeter是…...