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

相关推荐
xixixi777778 天前
了解一下APM工具——就像给软件系统装的“全身CT”,能实时透视从用户点击到后端数据库的每个环节性能,精准定位哪里慢、为什么慢
数据库·安全·数据采集·apm·日志监控
星光202521 天前
APM学习(4):常用的Mavlink消息
ardupilot·mavlink
ManageEngine卓豪25 天前
Azure 监控工具怎么选?从原生局限到第三方解决方案的效率跃升
microsoft·azure·apm·azure监控
飞翔的佩奇4 个月前
OpenTelemetry学习笔记(十二):在APM系统中,属性的命名空间处理遵循规则
笔记·学习·springboot·sdk·apm·opentelemetry
鼠鼠我捏,要死了捏4 个月前
基于SkyWalking的微服务APM监控实战指南
skywalking·apm·microservices
EmotionFlying5 个月前
(8)(8.1) 光学流量传感器测试和设置(一)
copter·ardupilot·导航
向上的车轮6 个月前
Spring Boot微服务架构(八):开发之初就引入APM工具监控
spring boot·apm
EmotionFlying6 个月前
(7)Nokov 室内光学跟踪系统
copter·ardupilot·导航
瘦瘦的追梦洋8 个月前
AudioFlinger与AudioPoliceManager初始化流程
android·apm·audioflinger