APM学习(7):ArduPilot初始化过程

ArduPilot的初始化过程主要在飞行器的setup()函数中实现,目前的版本,飞行器的setup()函数已经标准化,实现在AP_Vehicle::setup()函数中,其它飞行器,如多旋翼(Copter)、固定翼(Plane)是AP_Vehicle的子类,分别实现他们的重载函数来定制它们的初始化程序。根据AP_Vehicle::setup()函数,ArduPilot的初始化流程如下

1 参数初始化

AP_Param::setup_sketch_defaults()

载入默认的参数数值,根据var_info变量所定义的参数,依次载入它们的默认数值

2 终端初始化

serial_manager.init_console()

由串口实现,启用串口0

3 载入参数

load_parameters()

和1类似,从存储介质载入参数

4 初始化任务管理器(Scheduler)

AP::scheduler().init(...)

对任务管理器进行初始化,包括设定循环频率、循环时间、检查任务项优先级等

5 设定控制通道

set_control_channels()

主要指设定输入通道(RC Channels),包括初始化通道变量、设定通道的范围等

6 地面站初始化

gcs().init()

主要是设定系统ID(sysid)

7 串口初始化

serial_manager.init()

所有串口初始化,设定串口协议、波特率、收发存储大小等

8 地面站端口设定

gcs().setup_console()

主要设定地面站的通讯端口,选择符合Mavlink协议的串口

9 延时回调函数设定

hal.scheduler->register_delay_callback(...)

设定延时函数的回调函数,当用户调用延时函数时,大于5ms时,会自动调用这个函数,以避免CPU空转,提高程序效率。这个shceduler是HAL层的调度器。

10 板卡设置

BoardConfig.init()

进行板卡初始化,硬件相关

11 MSP协议初始化

msp.init()

MSP协议(MultiWii Serial Protocol)初始化,以支持MSP协议设备

12 数据记录初始化

logger.init(...)

13 飞行器初始化

init_ardupilot()

这是飞行器初始化函数接口,包含大量飞行器的初始化,每一个飞行器对象应该定制这个函数以进行定制化的初始化,包括机上的传感器、导航系统、输入输出端口、飞行任务、控制模式等,如下(以Plane为例)

1)输入通道(RC)初始化

rc().init()

2)输出通道初始化

init_rc_out_main()

3)气压计初始化

barometer.init()

4)测距仪(超声波、激光雷达等)初始化

rangefinder.init()

测距设备的初始化,比如超声波、激光雷达等

5)电池初始化

battery.init()

主要是电池监测设备的初始化

6)GCS串口初始化

gcs().setup_uarts()

与前面gcs的初始化相似,建立和Mavlink串口的连接,这里似乎是建立更多的串口与地面站的连接

7)指南针初始化

AP::compass().init()

指南针模块的初始化

8)空速计初始化

airspeed.set_fixedwing_parameters(&aparm);

airspeed.set_log_bit(MASK_LOG_IMU);

空速计的初始化

9)GPS初始化

gps.init()

GPS的初始化

10)输入通道初始化

init_rc_in()

与第1)项基本类似,RC输入初始化相关

11)重新载入参数

AP_Param::reload_defaults_file()

从默认文件中重新载入参数

12)启动惯性导航系统(INS)

startup_INS()

启动惯性导航系统,惯性导航系统包括加速度计、陀螺仪、气压计等设备,初始化包括对AHRS的初始化、气压计的校准等

13)任务(Mission)初始化

mission.init()

初始化任务系统,Mission表示飞行器所需要执行的任务

14)辅助输出通道初始化

init_rc_out_aux()

辅助输出通道初始化

15)设定飞行模式

set_mode_by_number(...)

设定一个初始化的模式

16)初始重设模式

根据遥控输入,设定初始模式

到这里init_ardupilot程序结束,继续后续初始化

14 空速计初始化

airspeed.init()

15 输出通道(SRV Channels)初始化

AP::srv().init()

输出通道初始化

16 电子栅栏初始化

fence.init()

在这些初始化过程中,其中有一些重复的碎片化的初始化流程,这是ArduPilot代码需要整洁化的地方。

相关推荐
苏渡苇14 天前
Spring Insight 里如何把 Span 画成瀑布时间线
后端·spring·spring cloud·springboot·监控·apm
苏渡苇15 天前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring·spring cloud·系统监控·apm
ManageEngine卓豪19 天前
如何用 OpenTelemetry 实现企业分布式应用的全链路可视化?Applications Manager 集成方案与配置
可视化·apm·应用性能管理·分布式应用
编程序的员2 个月前
使用OpenTelemetry来监控GoLang应用
运维·golang·monitoring·apm·opentelemetry
yueqc12 个月前
Android 渲染(三):掉帧监控
android·渲染·apm·掉帧
Databuff3 个月前
国产开源APM databuff 成为 CNCF 顶级项目opentelemetry 官宣Vendor
运维·开源·skywalking·apm·可观测性·opentelemetry
热爱运维的小七4 个月前
深度解析|应用性能 + RUM + 拨测:现代 IT 运维的可观测性“铁三角”
运维·it运维·devops·apm·rum·网站拨测
SRETalk4 个月前
SkyWalking / Jaeger / ARMS 已经有了,还需要统一可观测平台吗
skywalking·apm·jaeger·flashcat·arms
星光20255 个月前
APM学习(9):串口管理
串口·ardupilot
key_3_feng6 个月前
APM基础概念普及:应用性能管理的全面解析
apm