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