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

继续记录无人机SITL的大循环



task列表在哪初始化?有点类似与kernel加了一推回调函数在大循环里面


const AP_Scheduler::Task Sub::scheduler_tasks[] = {
// update INS immediately to get current gyro data populated
FAST_TASK_CLASS(AP_InertialSensor, &sub.ins, update),
// run low level rate controllers that only require IMU data
FAST_TASK(run_rate_controller),
// send outputs to the motors library immediately
FAST_TASK(motors_output),
// run EKF state estimator (expensive)
FAST_TASK(read_AHRS),
// Inertial Nav
FAST_TASK(read_inertia),
// check if ekf has reset target heading
FAST_TASK(check_ekf_yaw_reset),
// run the attitude controllers
FAST_TASK(update_flight_mode),
// update home from EKF if necessary
FAST_TASK(update_home_from_EKF),
// check if we've reached the surface or bottom
FAST_TASK(update_surface_and_bottom_detector),
#if HAL_MOUNT_ENABLED
// camera mount's fast update
FAST_TASK_CLASS(AP_Mount, &sub.camera_mount, update_fast),
#endif

SCHED_TASK(fifty_hz_loop, 50, 75, 3),
#if AP_SUB_RC_ENABLED
SCHED_TASK(rc_loop, 50, 130, 3),
#endif
SCHED_TASK_CLASS(AP_GPS, &sub.gps, update, 50, 200, 6),
#if AP_OPTICALFLOW_ENABLED
SCHED_TASK_CLASS(AP_OpticalFlow, &sub.optflow, update, 200, 160, 9),
#endif
SCHED_TASK(update_batt_compass, 10, 120, 12),
SCHED_TASK(read_rangefinder, 20, 100, 15),
SCHED_TASK(update_altitude, 10, 100, 18),
#if AP_SUB_RC_ENABLED
SCHED_TASK_CLASS(RC_Channels, (RC_Channels*)&sub.g2.rc_channels, read_aux_all, 10, 50, 18),
#endif
SCHED_TASK(three_hz_loop, 3, 75, 21),
SCHED_TASK(update_turn_counter, 10, 50, 24),
SCHED_TASK(one_hz_loop, 1, 100, 33),
SCHED_TASK_CLASS(GCS, (GCS*)&sub._gcs, update_receive, 400, 180, 36),
SCHED_TASK_CLASS(GCS, (GCS*)&sub._gcs, update_send, 400, 550, 39),
#if HAL_MOUNT_ENABLED
SCHED_TASK_CLASS(AP_Mount, &sub.camera_mount, update, 50, 75, 45),
#endif
#if AP_CAMERA_ENABLED
SCHED_TASK_CLASS(AP_Camera, &sub.camera, update, 50, 75, 48),
#endif
#if HAL_LOGGING_ENABLED
SCHED_TASK(ten_hz_logging_loop, 10, 350, 51),
SCHED_TASK(twentyfive_hz_logging, 25, 110, 54),
SCHED_TASK(loop_rate_logging, LOOP_RATE, 50, 55),
SCHED_TASK_CLASS(AP_Logger, &sub.logger, periodic_tasks, 400, 300, 57),
#endif
SCHED_TASK_CLASS(AP_InertialSensor, &sub.ins, periodic, 400, 50, 60),
#if HAL_LOGGING_ENABLED
SCHED_TASK_CLASS(AP_Scheduler, &sub.scheduler, update_logging, 0.1, 75, 63),
#endif
SCHED_TASK(terrain_update, 10, 100, 72),
#if AP_STATS_ENABLED
SCHED_TASK(stats_update, 1, 200, 76),
#endif
#ifdef USERHOOK_FASTLOOP
SCHED_TASK(userhook_FastLoop, 100, 75, 78),
#endif
#ifdef USERHOOK_50HZLOOP
SCHED_TASK(userhook_50Hz, 50, 75, 81),
#endif
#ifdef USERHOOK_MEDIUMLOOP
SCHED_TASK(userhook_MediumLoop, 10, 75, 84),
#endif
#ifdef USERHOOK_SLOWLOOP
SCHED_TASK(userhook_SlowLoop, 3.3, 75, 87),
#endif
#ifdef USERHOOK_SUPERSLOWLOOP
SCHED_TASK(userhook_SuperSlowLoop, 1, 75, 90),
#endif

};

#0 AP_AHRS::update_state (this=0x555555b02cd8 <copter+11128>) at ../../libraries/AP_AHRS/AP_AHRS.cpp:444
#1 0x000055555561032f in AP_AHRS::update (this=0x555555b02cd8 <copter+11128>, skip_ins_update=true)
at ../../libraries/AP_AHRS/AP_AHRS.cpp:594
#2 0x00005555555d0bb5 in Copter::read_AHRS (this=0x555555b00160 <copter>) at ../../ArduCopter/Copter.cpp:919
#3 0x00005555555d2340 in Functor<void>::method_wrapper<Copter, &Copter::read_AHRS> (obj=0x555555b00160 <copter>)
at ../../libraries/AP_HAL/utility/functor.h:88
#4 0x000055555568d6b6 in Functor<void>::operator() (this=0x555555ac9ee0 <Copter::scheduler_tasks+128>)
at ../../libraries/AP_HAL/utility/functor.h:54
#5 0x00005555556ee4b3 in AP_Scheduler::run (this=0x555555b002b0 <copter+336>, time_available=2500)
at ../../libraries/AP_Scheduler/AP_Scheduler.cpp:270
#6 0x00005555556ee962 in AP_Scheduler::loop (this=0x555555b002b0 <copter+336>)

看一看这个电量咋算出来的


float Frame::get_current_amp(void)
{
float current = 0;
for (uint8_t i=0; i<num_motors; i++) {
current += motors[i].get_current();
}
return current;
}

(gdb) p frame->motors[0].current
$10 = 7.59481621
(gdb) p frame->motors[1].current
$11 = 7.59473801
(gdb) p frame->motors[2].current
$12 = 7.59512186
(gdb) p frame->motors[3].current
$13 = 7.59443188
加起来....

上一波理论知识点DCM

这个 dcm 矩阵描述了当前飞机的姿态。虽然它看起来只是一堆数字,但它实际上精确地包含了飞机的横滚 (Roll)、俯仰 (Pitch) 和偏航 (Yaw) 信息。

我们可以将它转换成人更容易理解的欧拉角。你给出的这个矩阵对应的姿态大致是:

偏航角 (Yaw): 约 -111.6° (或 248.4°)

俯仰角 (Pitch): 约 -26.4° (机头向下)

横滚角 (Roll): 约 -21.1° (向左倾斜)
//////////

如何直观地观察这个矩阵?
DCM 矩阵的每一列,代表了地球坐标系(北-东-地)的轴在飞机机体坐标系下的方向向量:

第一列 (a):(-0.36, -0.91, 0.20),这是地球的“北”轴在飞机里的指向。

第二列 (b):(0.80, -0.41, -0.44),这是地球的“东”轴在飞机里的指向。

第三列 (c):(0.49, -0.00, 0.87),这是地球的“地”轴(重力方向)在飞机里的指向。

从这个矩阵我们能直观地看出一些飞机状态:

第三列 (c) 严重偏离了 (0,0,1):这说明飞机没有平飞。理想的平飞状态,第三列应该是接近 (0, 0, 1),意味着重力在飞机的 Z 轴上。而你现在是 (0.49, -0.00, 0.87),表明飞机有一个很大的俯仰角(机头向下或向上),导致重力被分解到了 X 轴上。

第一列 (a) 和第二列 (b) 不成单位正交:这表明飞机正在持续旋转,或者说你的 dcm 矩阵是瞬时的、动态变化的姿态。

http://www.jsqmd.com/news/975766/

相关文章:

  • 如何用免费AI工具将模糊图片变成高清画质?
  • FanControl终极指南:3分钟搞定Windows风扇智能控制
  • 高管流失、战略变形、执行走样:如何靠“组织能力铁三角”让企业重回增长快车道?
  • AKStream深度解析:基于.NET6与ZLMediaKit的流媒体管理平台架构设计与性能优化
  • 2026年6月锯切设备实力厂家推荐分析,锯条/冷切/金属切割/二手圆锯机/锯切设备/锯床配件,锯切设备企业哪个好 - 品牌推荐师
  • 亨得利官方正规门店地址权威公示(2026年6月最新) - 亨得利钟表维修中心
  • Superlog 开源自主可观测性工具全栈技术深度剖析
  • Cursor AI 安装、使用方法详细全解
  • 想转AI工程师?先搞懂这7个概念再说
  • 嵌入式Bootloader实战:MMC2107二级架构设计与Flash编程器实现
  • ESP32 +MPU6050+OLED 实验
  • Aria2一键安装管理脚本终极指南:高效部署与故障排查完整方案
  • 终极AI视频创作指南:5分钟从零到专业视频制作
  • Open3D点云处理避坑指南:边界框、凸包、隐点移除的实战陷阱与优化
  • Codex又又又更新了!这次似乎不需要Xcode了?Codex更新、Codex遥控器、Codex手机版、iOS Builder、Xcode替代方案、AI编程工具、Codex客户端下载、Mac远程控制、
  • 3分钟解决!Switch手柄连接PC完整指南:BetterJoy终极教程
  • 从选型到布线:BCM5396 16口交换芯片在工业网关中的硬件设计实战
  • 2026淄博市黄金回收白银回收铂金回收怎么变现?实地探访 5 家本地老牌回收店铺 - 中安检金银铂钻回收
  • 向量引擎和向量 API 中转到底怎么选:RAG 开发者在 Windows 和低配 Linux 上的实战记录
  • Stable Baselines3 实战指南:用5行代码构建生产级强化学习系统
  • Windows 10 OneDrive完全卸载指南:终极免费解决方案彻底根除云存储残留
  • 解密XAPK到APK转换:零依赖Python工具深度实战指南
  • 虚拟内存:硬盘假装自己是内存
  • 深入解析i.MXRT安全FOTA方案:SBL与SFW框架设计与实战
  • 潍坊潍城区黄金回收哪家靠谱?2026正规上门回收价格表 - 行行星
  • 基于C#的S7-200 PLC PPI串口通信调试工具包(含源码与图形界面)
  • 终极解决方案:让Windows资源管理器完美显示iPhone HEIC照片缩略图
  • AI编程技巧-什么时候改切新会话
  • Genesis Plus GX:专业世嘉游戏模拟器完整指南
  • LPC5500 PowerQuad硬件FFT加速实战:性能对比与CMSIS-DSP迁移指南