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代码需要整洁化的地方。

相关推荐
浅浅的小草4 天前
APM使用LUA脚本发送实现遥控器PWM信号输出CAN协议信号
开发语言·apm
浅浅的小草4 天前
APM通过mission planner地面站摇杆指令给飞控
apm
长路漫漫202111 天前
ArduPilot教程(二)运行第一个SITL无人机仿真
ardupilot·mission planner·drone·mavlink·qgroundcontrol
叱咤少帅(少帅)1 个月前
go skywalking agent 接入apm
apm
汉得数字平台1 个月前
【鲲苍提效】应用链路全景透视,让性能问题无处可藏
apm·性能监控·异构系统管理
低调的JVM1 个月前
EasyTelemetry:让OpenTelemetry拥抱Arthas Trace的强大功能
apm·可观测·javaagent·opentelemetry
星光20252 个月前
APM学习(8):TECS控制(1)
ardupilot·tecs
Minilinux20182 个月前
Android音频系列(09)-AudioPolicyManager代码解析
android·音视频·apm·audiopolicy·音频策略
芒果de香蕉皮2 个月前
开源飞控APM备降点源码分析
无人机·二次开发·apm·开源飞控·备降点
EmotionFlying3 个月前
(11)(2.3.1) ESC遥测(二)
copter·ardupilot·电调和电机