ArduPilot之开源代码Library&Sketches设计

  • 1. 简介
    • 1.1 Core libraries
    • 1.2 Sensor libraries
    • 1.3 Other libraries
  • 2. 源由
  • 3. Library Sketches设计
    • 3.1 设计框架
    • 3.2 Example Sketches
    • 3.3 AP_Common Sketches
      • 3.3.1 配置sitl环境
      • 3.3.2 编译AP_Common
      • 3.3.3 运行AP_Common
      • 3.3.4 代码AP_Common
  • 4. Library设计
  • 5. 实例理解
  • 6. 总结
  • 7. 参考资料

1. 简介

目前Copter/Plane/Rover共享了以下的顶层Library设计:

1.1 Core libraries

  • AP_AHRS - attitude estimation using DCM or EKF
  • AP_Common - core includes required by all sketches and libraries
  • AP_Math - various math functions especially useful for vector manipulation
  • AC_PID - PID(Proportional-Integral-Derivative) controller library
  • AP_InertialNav - inertial navigation library for blending accelerometer inputs with gps and baro data
  • AC_AttitudeControl - ArduCopter’s control library includes various functions of attitude, position control based on PID control.
  • AC_WPNav - waypoint navigation library
  • AP_Motors - multicopter and traditional helicopter motor mixing
  • RC_Channel - a library to more convert pwm input/output from APM_RC into internal units such as angles
  • AP_HAL, AP_HAL_ChibiOS, AP_HAL_Linux - libraries to implement the “Hardware abstraction layer” which presents an identical interface to the high level code so that it can more easily be ported to different boards.

1.2 Sensor libraries

  • AP_InertialSensor - reads gyro and accelerometer data, perform calibration and provides data in standard units (deg/s, m/s) to main code and other libraries
  • AP_RangeFinder - sonar and ir distance sensor interfaced library
  • AP_Baro - barometer interface library
  • AP_GPS - gps interface library
  • AP_Compass - 3-axis compass interface library
  • AP_OpticalFlow - optical flow sensor interface library

1.3 Other libraries

  • AP_Mount, AP_Camera, AP_Relay - camera mount control library, camera shutter control libraries
  • AP_Mission - stores/retrieves mission commands from eeprom
  • AP_Buffer - a simple FIFO buffer for use with inertial navigation

2. 源由

Library的功能很多,有驱动/算法/组件/应用等等,但是从设计思路上来考虑,它遵循Library开发的模式,或者说有设计框架。

了解如何通过设计思路和框架代码来理解Library设计,就能站在一个抽象的高度,设计的思维来分析业务模型(驱动/算法/组件/应用)。

这也是为什么我们来研读下Library Example Sketches的原因,这个Sketch有点类似Library Demo for Test。
换句话说,Sketch是可以独立运行的,而真正的Library是无法单独运行,需要系统来启动加载的,但是逻辑上来说类似,方便初期的开发和调试。

因此,了解ArduPilot中使用的库API和约定对理解代码至关重要。

3. Library Sketches设计

3.1 设计框架

Library Sketches共性:

  • 具有类似arduino的setup()和loop()接口函数
  • 含有hal引用变量 //平台抽象AP_HAL/AP_HAL_ChibiOS/AP_HAL_Linux
  • 含有AP_HAL_MAIN()宏定义 //主入口,内部逻辑调用setup()、loop()
  • hal对象API常用函数:hal.console->printf()/hal.scheduler->delay()/hal.scheduler->delay_microseconds()/hal.gpio->pinMode()/hal.gpio->read()/hal.gpio->write()/hal.i2c/hal.spi/AP_HAL::millis()/AP_HAL::micros()

其中AP_HAL_MAIN宏定义,是通过hal.run函数对设备代码进行关联执行的。

#define AP_HAL_MAIN() \AP_HAL::HAL::FunCallbacks callbacks(setup, loop); \extern "C" {                               \int AP_MAIN(int argc, char* const argv[]); \int AP_MAIN(int argc, char* const argv[]) { \hal.run(argc, argv, &callbacks); \return 0; \} \}

而这里run是一个虚构函数,对特定的系统可以各自重构。

virtual void run(int argc, char * const argv[], Callbacks* callbacks) const = 0;

简单了解下工程上面分别对ChibiOS/Linux系统做了HAL抽象,详见:

HAL_ChibiOS in HAL_ChibiOS_Class.h
HAL_Linux in HAL_Linux_Class.h

当然,ESP32前些时间也确实做了对ArduPilot的支持,鉴于其OS并非ChibiOS/Linux,所以增加了ESP32系统的支持,详见:

HAL_ESP32 in HAL_ESP32_Class.h

在以上特定系统的run函数内部,除了系统板级初始化以外,就是调用step()/loop()来初始化ArduPilot的Library。

注:这里的Library,主要侧重的是应用。因为从Library技术本身的角度只是库,一些列的函数实现,是静态的。而应用比较侧重的动态,比如:实例。

3.2 Example Sketches

ArduPilot代码中有很多Demo可供参考:

$ cd $ARDUPILOT_HOME
$ ./waf list | grep 'examples'
examples/AC_PID_test
examples/AHRS_Test
examples/AP_Common
examples/AP_Compass_test
examples/AP_Declination_test
examples/AP_Logger_AllTypes
examples/AP_Logger_test
examples/AP_Marvelmind_test
examples/AP_Mission_test
examples/AP_Motors_test
examples/AP_Notify_test
examples/AP_OpticalFlow_test
examples/AP_Parachute_test
examples/Airspeed
examples/AnalogIn
examples/BARO_generic
examples/CompassCalibrator_index_test
examples/DSP_test
examples/Derivative
examples/File_IO
examples/Filter
examples/FlashTest
examples/GPS_AUTO_test
examples/GPS_UBLOX_passthrough
examples/Hello
examples/ICM20789
examples/INS_generic
examples/LowPassFilter
examples/LowPassFilter2p
examples/ModuleTest
examples/NMEA_Output
examples/Printf
examples/RCInput
examples/RCInputToRCOutput
examples/RCOutput
examples/RCOutput2
examples/RCProtocolDecoder
examples/RCProtocolTest
examples/RC_Channel
examples/RC_UART
examples/RFIND_test
examples/RNG_test
examples/RPM_generic
examples/RTC_test
examples/RingBuffer
examples/Scheduler_test
examples/SmartRTL_test
examples/Storage
examples/StorageTest
examples/ToshibaLED_test
examples/UART_chargen
examples/UART_test
examples/UAVCAN_sniffer
examples/eulers
examples/expo_inverse_test
examples/jedec_test
examples/location
examples/matrix_alg
examples/onvif_test
examples/polygon
examples/rotations
examples/routing

3.3 AP_Common Sketches

3.3.1 配置sitl环境

$ cd $ARDUPILOT_HOME
$ ./waf configure --board sitl
Setting top to                           : /home/daniel/Work/ardupilot
Setting out to                           : /home/daniel/Work/ardupilot/build
Autoconfiguration                        : enabled
Setting board to                         : sitl
Using toolchain                          : native
Checking for 'g++' (C++ compiler)        : /usr/lib/ccache/g++
Checking for 'gcc' (C compiler)          : /usr/lib/ccache/gcc
Checking for c flags '-MMD'              : yes
Checking for cxx flags '-MMD'            : yes
CXX Compiler                             : g++ 11.3.0
Checking for need to link with librt     : not necessary
Checking for feenableexcept              : yes
Enabled OpenDroneID                      : no
Enabled firmware ID checking             : no
GPS Debug Logging                        : no
Enabled custom controller                : yes
Checking for HAVE_CMATH_ISFINITE         : yes
Checking for HAVE_CMATH_ISINF            : yes
Checking for HAVE_CMATH_ISNAN            : yes
Checking for NEED_CMATH_ISFINITE_STD_NAMESPACE : yes
Checking for NEED_CMATH_ISINF_STD_NAMESPACE    : yes
Checking for NEED_CMATH_ISNAN_STD_NAMESPACE    : yes
Checking for header endian.h                   : yes
Checking for header byteswap.h                 : yes
Checking for HAVE_MEMRCHR                      : yes
Configured VSCode Intellisense:                : no
Checking for program 'python'                  : /usr/bin/python
Checking for python version >= 2.7.0           : 3.10.6
Checking for program 'python'                  : /usr/bin/python
Checking for python version >= 2.7.0           : 3.10.6
Source is git repository                       : yes
Update submodules                              : yes
Checking for program 'git'                     : /usr/bin/git
Checking for program 'size'                    : /usr/bin/size
Benchmarks                                     : disabled
Unit tests                                     : enabled
Scripting                                      : enabled
Scripting runtime checks                       : enabled
Debug build                                    : disabled
Coverage build                                 : disabled
SITL 32-bit build                              : disabled
Checking for program 'rsync'                   : /usr/bin/rsync
'configure' finished successfully (7.749s)

3.3.2 编译AP_Common

$ ./waf build --target examples/AP_Common
Waf: Entering directory `/home/daniel/Work/ardupilot/build/sitl'
Embedding file locations.txt:Tools/autotest/locations.txt
Embedding file models/Callisto.json:Tools/autotest/models/Callisto.json
[ 15/896] Compiling libraries/AC_AttitudeControl/AC_WeatherVane.cpp
[ 16/896] Compiling libraries/AC_AttitudeControl/AC_PosControl.cpp
[ 49/896] Compiling libraries/AC_AttitudeControl/AC_AttitudeControl.cpp
[ 50/896] Compiling libraries/AC_AutoTune/AC_AutoTune.cpp
[ 51/896] Compiling libraries/AC_Avoidance/AP_OABendyRuler.cpp
[ 52/896] Compiling libraries/AC_Avoidance/AP_OADatabase.cpp
[ 53/896] Compiling libraries/AC_Avoidance/AC_Avoid.cpp
[ 54/896] Compiling libraries/AC_Fence/AC_Fence.cpp
[ 55/896] Compiling libraries/AC_Fence/AC_PolyFence_loader.cpp
[ 56/896] Compiling libraries/AC_PrecLand/AC_PrecLand.cpp
[ 62/896] Compiling libraries/AC_WPNav/AC_Loiter.cpp
[ 63/896] Compiling libraries/APM_Control/AP_SteerController.cpp
[ 66/896] Compiling libraries/APM_Control/AP_AutoTune.cpp
[ 67/896] Compiling libraries/APM_Control/AP_YawController.cpp
[ 68/896] Compiling libraries/APM_Control/AP_PitchController.cpp
[ 69/896] Compiling libraries/APM_Control/AR_AttitudeControl.cpp
[ 85/896] Compiling libraries/APM_Control/AP_RollController.cpp
[ 86/896] Compiling libraries/APM_Control/AR_PosControl.cpp
[ 87/896] Compiling libraries/AP_ADSB/AP_ADSB_Sagetech_MXS.cpp
[ 88/896] Compiling libraries/AP_ADSB/AP_ADSB.cpp
[ 89/896] Compiling libraries/AP_AHRS/AP_AHRS_Backend.cpp
[110/896] Compiling libraries/AP_AHRS/AP_AHRS_DCM.cpp
[111/896] Compiling libraries/AP_AHRS/AP_AHRS.cpp
[132/896] Compiling libraries/AP_AIS/AP_AIS.cpp
[133/896] Compiling libraries/AP_Airspeed/AP_Airspeed.cpp
[142/896] Compiling libraries/AP_Airspeed/AP_Airspeed_NMEA.cpp
[149/896] Compiling libraries/AP_Arming/AP_Arming.cpp
[150/896] Compiling libraries/AP_Avoidance/AP_Avoidance.cpp
[189/896] Compiling libraries/AP_BLHeli/AP_BLHeli.cpp
[190/896] Compiling libraries/AP_Baro/AP_Baro.cpp
[191/896] Compiling libraries/AP_Baro/AP_Baro_SITL.cpp
[197/896] Compiling libraries/AP_BattMonitor/AP_BattMonitor.cpp
[198/896] Compiling libraries/AP_BattMonitor/AP_BattMonitor_Params.cpp
[199/896] Compiling libraries/AP_BoardConfig/AP_BoardConfig.cpp
[200/896] Compiling libraries/AP_CANManager/AP_CANManager.cpp
[229/896] Compiling libraries/AP_CANManager/AP_CANDriver.cpp
[230/896] Compiling libraries/AP_Compass/AP_Compass.cpp
[231/896] Compiling libraries/AP_CustomRotations/AP_CustomRotations_params.cpp
[242/896] Compiling libraries/AP_CustomRotations/AP_CustomRotations.cpp
[271/896] Compiling libraries/AP_DAL/AP_DAL_RangeFinder.cpp
[301/896] Compiling libraries/AP_DAL/AP_DAL_Beacon.cpp
[303/896] Compiling libraries/AP_DAL/AP_DAL.cpp
[305/896] Compiling libraries/AP_DAL/AP_DAL_VisualOdom.cpp
[307/896] Compiling libraries/AP_Filesystem/AP_Filesystem_posix.cpp
[308/896] Compiling libraries/AP_FlashIface/AP_FlashIface_JEDEC.cpp
[309/896] Compiling libraries/AP_Follow/AP_Follow.cpp
[311/896] Compiling libraries/AP_Frsky_Telem/AP_Frsky_SPort_Passthrough.cpp
[312/896] Compiling libraries/AP_GyroFFT/AP_GyroFFT.cpp
[313/896] Compiling libraries/AP_InertialSensor/AP_InertialSensor.cpp
[314/896] Compiling libraries/AP_JSButton/AP_JSButton.cpp
[321/896] Compiling libraries/AP_L1_Control/AP_L1_Control.cpp
[322/896] Compiling libraries/AP_Landing/AP_Landing.cpp
[323/896] Compiling libraries/AP_Landing/AP_Landing_Slope.cpp
[324/896] Compiling libraries/AP_Landing/AP_Landing_Deepstall.cpp
[347/896] Compiling libraries/AP_LeakDetector/AP_LeakDetector_Analog.cpp
[348/896] Compiling libraries/AP_LeakDetector/AP_LeakDetector_Backend.cpp
[349/896] Compiling libraries/AP_LeakDetector/AP_LeakDetector.cpp
[350/896] Compiling libraries/AP_LeakDetector/AP_LeakDetector_Digital.cpp
[357/896] Compiling libraries/AP_Logger/AP_Logger_Backend.cpp
[369/896] Compiling libraries/AP_Logger/AP_Logger.cpp
[370/896] Compiling libraries/AP_Logger/AP_Logger_File.cpp
[402/896] Compiling libraries/AP_Logger/LoggerMessageWriter.cpp
[403/896] Compiling libraries/AP_Math/quaternion.cpp
[404/896] Compiling libraries/AP_Math/SCurve.cpp
[405/896] Compiling libraries/AP_Math/vector3.cpp
[406/896] Compiling libraries/AP_Menu/AP_Menu.cpp
[407/896] Compiling libraries/AP_Mission/AP_Mission.cpp
[408/896] Compiling libraries/AP_Motors/AP_MotorsMatrix.cpp
[409/896] Compiling libraries/AP_Motors/AP_MotorsTri.cpp
[410/896] Compiling libraries/AP_NavEKF2/AP_NavEKF2.cpp
[411/896] Compiling libraries/AP_NavEKF3/AP_NavEKF3_RngBcnFusion.cpp
[412/896] Compiling libraries/AP_NavEKF3/AP_NavEKF3_OptFlowFusion.cpp
[413/896] Compiling libraries/AP_NavEKF3/AP_NavEKF3_PosVelFusion.cpp
[414/896] Compiling libraries/AP_NavEKF3/AP_NavEKF3_Logging.cpp
[415/896] Compiling libraries/AP_NavEKF3/AP_NavEKF3_GyroBias.cpp
[447/896] Compiling libraries/AP_NavEKF3/AP_NavEKF3_Control.cpp
[448/896] Compiling libraries/AP_NavEKF3/AP_NavEKF3_AirDataFusion.cpp
[449/896] Compiling libraries/AP_NavEKF3/AP_NavEKF3.cpp
[457/896] Compiling libraries/AP_NavEKF3/AP_NavEKF3_MagFusion.cpp
[458/896] Compiling libraries/AP_NavEKF3/AP_NavEKF3_Outputs.cpp
[459/896] Compiling libraries/AP_NavEKF3/AP_NavEKF3_VehicleStatus.cpp
[504/896] Compiling libraries/AP_NavEKF3/AP_NavEKF3_Measurements.cpp
[505/896] Compiling libraries/AP_NavEKF3/AP_NavEKF3_core.cpp
[506/896] Compiling libraries/AP_ONVIF/base64.cpp
[507/896] Compiling libraries/AP_ONVIF/sha1.cpp
[508/896] Compiling libraries/AP_ONVIF/AP_ONVIF.cpp
[509/896] Compiling libraries/AP_OSD/AP_OSD_ParamSetting.cpp
[510/896] Compiling libraries/AP_OSD/AP_OSD_ParamScreen.cpp
[512/896] Compiling libraries/AP_OSD/AP_OSD_Screen.cpp
[513/896] Compiling libraries/AP_RCProtocol/AP_RCProtocol_FPort2.cpp
[536/896] Compiling libraries/AP_RCProtocol/AP_RCProtocol_CRSF.cpp
[570/896] Compiling libraries/AP_RCProtocol/AP_RCProtocol.cpp
[575/896] Compiling libraries/AP_RCProtocol/AP_RCProtocol_FPort.cpp
[580/896] Compiling libraries/AP_RCProtocol/AP_RCProtocol_Backend.cpp
[581/896] Compiling libraries/AP_RCProtocol/AP_RCProtocol_DSM.cpp
[582/896] Compiling libraries/AP_RCProtocol/AP_RCProtocol_SRXL2.cpp
[583/896] Compiling libraries/AP_RCTelemetry/AP_CRSF_Telem.cpp
[585/896] Compiling libraries/AP_RCTelemetry/AP_RCTelemetry.cpp
[587/896] Compiling libraries/AP_Rally/AP_Rally.cpp
[592/896] Compiling libraries/AP_RangeFinder/AP_RangeFinder.cpp
[599/896] Compiling libraries/AP_Scheduler/AP_Scheduler.cpp
[618/896] Compiling libraries/AP_Soaring/AP_Soaring.cpp
[619/896] Compiling libraries/AP_Soaring/Variometer.cpp
[620/896] Compiling libraries/AP_Soaring/SpeedToFly.cpp
[621/896] Compiling libraries/AP_Soaring/ExtendedKalmanFilter.cpp
[622/896] Compiling libraries/AP_TECS/AP_TECS.cpp
[623/896] Compiling libraries/AP_TemperatureSensor/TSYS01.cpp
[624/896] Compiling libraries/AP_Terrain/AP_Terrain.cpp
[625/896] Compiling libraries/AP_Vehicle/AP_Vehicle.cpp
[626/896] Compiling libraries/AP_WindVane/AP_WindVane_Home.cpp
[627/896] Compiling libraries/AP_WindVane/AP_WindVane_Airspeed.cpp
[628/896] Compiling libraries/AP_WindVane/AP_WindVane_ModernDevice.cpp
[629/896] Compiling libraries/AP_WindVane/AP_WindVane_RPM.cpp
[630/896] Compiling libraries/AP_WindVane/AP_WindVane_SITL.cpp
[641/896] Compiling libraries/AP_WindVane/AP_WindVane_Backend.cpp
[653/896] Compiling libraries/AP_WindVane/AP_WindVane_Analog.cpp
[654/896] Compiling libraries/AP_WindVane/AP_WindVane_NMEA.cpp
[655/896] Compiling libraries/AP_WindVane/AP_WindVane.cpp
[657/896] Compiling libraries/AR_Motors/AP_MotorsUGV.cpp
[660/896] Compiling libraries/AR_WPNav/AR_PivotTurn.cpp
[661/896] Compiling libraries/AR_WPNav/AR_WPNav.cpp
[689/896] Compiling libraries/AR_WPNav/AR_WPNav_OA.cpp
[744/896] Compiling libraries/GCS_MAVLink/GCS_Common.cpp
[745/896] Compiling libraries/GCS_MAVLink/GCS_Fence.cpp
[746/896] Compiling libraries/GCS_MAVLink/GCS_Dummy.cpp
[846/896] Compiling libraries/PID/PID.cpp
[847/896] Compiling libraries/RC_Channel/RC_Channel.cpp
[848/896] Compiling libraries/SRV_Channel/SRV_Channels.cpp
[849/896] Compiling libraries/StorageManager/StorageManager.cpp
[850/896] Compiling libraries/AP_HAL/SIMState.cpp
[886/896] Compiling libraries/AP_HAL_SITL/UARTDriver.cpp
[887/896] Compiling libraries/AP_HAL_SITL/SITL_cmdline.cpp
[888/896] Compiling libraries/AP_HAL_SITL/Storage.cpp
[889/896] Compiling libraries/AP_Scripting/lua_scripts.cpp
[890/896] Compiling libraries/AP_Scripting/lua_repl.cpp
[891/896] Compiling libraries/AP_Scripting/lua_bindings.cpp
[892/896] Compiling libraries/AP_Scripting/lua_boxed_numerics.cpp
[893/896] Compiling build/sitl/libraries/AP_Scripting/lua_generated_bindings.cpp
[894/896] Compiling libraries/AP_Common/examples/AP_Common/AP_Common.cpp
[895/896] Linking build/sitl/lib/libap.a
[896/896] Linking build/sitl/examples/AP_Common
Waf: Leaving directory `/home/daniel/Work/ardupilot/build/sitl'BUILD SUMMARY
Build directory: /home/daniel/Work/ardupilot/build/sitl
Target              Text (B)  Data (B)  BSS (B)  Total Flash Used (B)  Free Flash (B)
-------------------------------------------------------------------------------------
examples/AP_Common    901928     26343   129264                928271  Not ApplicableBuild commands will be stored in build/sitl/compile_commands.json
'build' finished successfully (3m51.704s)

3.3.3 运行AP_Common

$ ./build/sitl/examples/AP_Common -M quad -C
Suggested EK3_DRAG_BCOEF_* = 16.288, EK3_DRAG_MCOEF = 0.209
Starting sketch 'UNKNOWN'
Starting SITL input
AP_Common testsi:0 high:0 low:0
i:1 high:0 low:1
i:2 high:0 low:2
i:3 high:0 low:3
i:4 high:0 low:4
i:5 high:0 low:5
i:6 high:0 low:6
i:7 high:0 low:7
i:8 high:0 low:8
i:9 high:0 low:9
i:10 high:0 low:10
i:11 high:0 low:11
i:12 high:0 low:12
i:13 high:0 low:13
i:14 high:0 low:14
i:15 high:0 low:15
i:16 high:0 low:16
i:17 high:0 low:17
i:18 high:0 low:18
i:19 high:0 low:19
i:20 high:0 low:20
i:21 high:0 low:21... ...

3.3.4 代码AP_Common

从代码中,可以看出AP_Common的loop()函数中没有代码,因此,主要是setup时做了两个循环。

//
// Unit tests for the AP_Common code
//#include <AP_Common/AP_Common.h>
#include <AP_HAL/AP_HAL.h>void setup();
void loop();
void test_high_low_byte(void);const AP_HAL::HAL& hal = AP_HAL::get_HAL();void test_high_low_byte(void)
{// test each value from 0 to 300for (uint16_t i = 0; i <= 300; i++) {uint8_t high = HIGHBYTE(i);uint8_t low = LOWBYTE(i);hal.console->printf("\ni:%u high:%u low:%u", (unsigned int)i, (unsigned int)high, (unsigned int)low);}// test values from 300 to 65400 at increments of 200for (uint16_t i = 301; i <= 65400; i += 200) {uint8_t high = HIGHBYTE(i);uint8_t low = LOWBYTE(i);hal.console->printf("\ni:%u high:%u low:%u", (unsigned int)i, (unsigned int)high, (unsigned int)low);}
}/**  euler angle tests*/
void setup(void)
{hal.console->printf("AP_Common tests\n\n");test_high_low_byte();
}void loop(void)
{// do nothing
}AP_HAL_MAIN();

4. Library设计

关于Library Example Sketches设计,大家可能已经比较能够理解其来龙去脉,更多的可以理解为最小粒度的测试Library单元(单元测试可以在这个级别做)。

而ArduPilot飞控程序则是并非如此简单,Library Example Sketches算是管中窥豹,但是ArduPilot关于Library在系统级别的关联也是类似:

#define AP_HAL_MAIN_CALLBACKS(CALLBACKS) extern "C" { \int AP_MAIN(int argc, char* const argv[]); \int AP_MAIN(int argc, char* const argv[]) { \hal.run(argc, argv, CALLBACKS); \return 0; \} \}

上述宏定义是ArduPilot设备代码宏定义入口部分,比如:ArduCopter\Copter.cpp

AP_HAL_MAIN_CALLBACKS(&copter);

好了,说倒这里。可能大家有点迷茫。其实大家可以对比AP_Common中的AP_HAL_MAIN();

AP_Common = hal.run + setup + loop
ArduCopter = hal.run + copter + AP_Vehicle(setup + loop)

因为,ArduPilot采用了C++的一个对象模型,建立了Copter设备对象,并将Copter的setup/loop打包在AP_Vehicle中实现了。

5. 实例理解

好了,到这里我们可以看出Library Example Sketches是一个mini的基于setup/loop函数类似Ardunio的应用。

ArduPilot的所有设备AntennaTracker/ArduCopter/ArduPlane/ArduSub/Rover/Blimp都是这么展开的。

./ArduCopter/Copter.cpp:797:AP_HAL_MAIN_CALLBACKS(&copter);
./AntennaTracker/Tracker.cpp:173:AP_HAL_MAIN_CALLBACKS(&tracker);
./Rover/Rover.cpp:503:AP_HAL_MAIN_CALLBACKS(&rover);
./ArduSub/ArduSub.cpp:349:AP_HAL_MAIN_CALLBACKS(&sub);
./ArduPlane/ArduPlane.cpp:895:AP_HAL_MAIN_CALLBACKS(&plane);
./Blimp/Blimp.cpp:275:AP_HAL_MAIN_CALLBACKS(&blimp);

6. 总结

总的来说,ArduPilot从代码框架设计结构上遵循了Ardunio设计思路;

  1. Declaration of Variables
  2. Initialization: It is written in the setup () function.
  3. Control code: It is written in the loop () function.

在上述基础上,加入了设备应用建模,并对模型共性部分Library化抽象,方便维护。

当然,这里只是从概念和代码的角度管中窥豹,很多细节问题:驱动,数据共享,通信等问题我们在后面的章节中再行深入的讨论和学习。

7. 参考资料

【1】ArduPilot开源飞控系统之简单介绍
【2】ArduPilot之开源代码框架
【3】ArduPilot飞控之ubuntu22.04-SITL安装
【4】ArduPilot飞控之ubuntu22.04-Gazebo模拟
【5】ArduPilot飞控之Mission Planner模拟
【6】ArduPilot飞控AOCODARC-H7DUAL固件编译

ArduPilot之开源代码LibrarySketches设计相关推荐

  1. ArduPilot之开源代码Sensor Drivers设计

    ArduPilot之开源代码Sensor Drivers设计 1. 源由 2. Sensor Drivers设计 2.1 front-end / back-end分层 2.2 设计思想分析 3 实例理 ...

  2. ArduPilot之开源代码基础知识Threading概念

    ArduPilot之开源代码基础知识&Threading概念 1. 源由 2. 基础知识 2.1 The timer callbacks 2.2 HAL specific threads 2. ...

  3. 完整复现何恺明ICCV获奖论文结果并开源 !(附论文开源代码)

    ICCV 作为计算机视觉的顶级会议,2017年共收到2143篇论文投稿,比上一届ICCV2015的1698篇增加了26.2%.共621篇被选为大会论文,录用比例28.9%:poster.spotlig ...

  4. 开源代码却无奈遗弃,濒临奔溃的开源开发者们!

    整理 | 郑丽媛 头图 | CSDN下载自东方 IC 近年来,全球开源项目数量呈指数级增长,据开源软件安全平台 SourceClear 的调查报告预测,2026 年全球开源项目数量将超过 3 亿. 然 ...

  5. C++开源代码项目汇总

    Google的C++开源代码项目 v8  -  V8 JavaScript Engine V8 是 Google 的开源 JavaScript 引擎. V8 采用 C++ 编写,可在谷歌浏览器(来自 ...

  6. 区块链 java 开源_详细介绍Java区块链开源代码背后的内容

    什么是Java区块链开源代码?它是一种分布式分类帐技术,将所有不同的属性放在一起.那么Java区块链开源代码就可以通过不同的共识机制,使所有添加的数据不变.2015年之前,估计大家都知道的区块链的申请 ...

  7. KDD Cup 2019 AutoML Track冠军深兰科技DeepBlueAI团队技术分享 | 开源代码

    作者丨罗志鹏 单位丨深兰北京AI研发中心 近日,KDD Cup 2019 AutoML Track 比赛结果出炉,本次赛题是第五次 AutoML 挑战赛,由第四范式.ChaLearn 和微软联合举办, ...

  8. 类似系统的UIActivityViewController显示方式的开源代码:HYActivityView

    特点: 比较适合iOS7风格. 视图高度会根据按钮数量改变. 可自定义一行的按钮数量. 使用Autolayout来实现布局.横屏竖屏可以自动切换. 最重要的是使用简单 注意事项: 视图高度没有进行特别 ...

  9. 基于DM642的X264开源代码实现的研究

    基于DM642的X264开源代码实现的研究 文章发表于:2008-09-08 11:24 作者:谭超 王库 傅颖 来源:微计算机信息 摘要:本文概述了H.264视频压缩编码标准的主要特性,简要介绍了当 ...

最新文章

  1. Spring MVC中 log4j日志文件配置相对路径
  2. 安软件一劳永逸_如何克服一劳永逸地公开演讲的恐惧
  3. android padding作用,android:padding和android:layout_margin的区别
  4. Spring Data Jpa 报错org.hibernate.LazyInitializationException: could not initialize proxy
  5. Codeforces Round #243 (Div. 1)
  6. Git(15)- Git 分支 - 分支开发工作流
  7. 服务器清理虚拟内存工具,win2008内存释放工具
  8. ToStringBuilder学习
  9. Kindle刷安卓双系统的方法
  10. 超纤商标为精美时尚服饰再添点睛之笔
  11. 原型设计工具——墨刀
  12. 卡塔尔能源每年将向中石化供应400万吨液化天然气;哪吒汽车发布技术品牌浩智 | 美通企业日报...
  13. 牙医管家牙科软件APP功能-“看牙无忧”口腔分期功能介绍
  14. 图像学习一:图像的旋转
  15. Android工程师的职业规划篇(周末闲扯)
  16. 【硬核】肝了一个月,Cisco网络工程师知识点总结
  17. ICN: Integrated crosstalk noise
  18. vue3脚手架创建项目,然后再去安装scss报错解决方式
  19. 管廊复杂网格参数化算法及其大数据在线渲染
  20. 35岁到40岁,如何突破

热门文章

  1. 【产品管理】产品管理四要素
  2. MySQL的时间戳(Timestamp)类型学习
  3. 单词学习-长久的过程
  4. 【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )
  5. 中文编码标准GB2312, GB18030的下载地址
  6. VisualSVN破解
  7. Web 图集应用,属于非游戏类的图集/雪碧图对象/JS雪碧图/前端图集/JS图集
  8. 摄像头识别黑烟加框处理(测试)
  9. 【转】优秀的JavaScript模块是怎样炼成的
  10. C#中使用OracleTransaction