当前位置: 首页 > news >正文

ArduPilot之开源代码LibrarySketches设计

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设计

ArduPilot之开源代码Library&Sketches设计 1. 简介1.1 Core libraries1.2 Sensor libraries1.3 Other libraries 2. 源由3. Library Sketches设计3.1 设计框架3.2 Example Sketches3.3 AP_Common Sketches3.3.1 配置sitl环境3.3.2 编译AP_Common3.3.3 运行AP_Common3.3.4 代…...

第一章:概述

1&#xff0c;因特网概述 1.网络、互联网和英特网 网络(Network)由若干结点(Node)和连接这些结点的链路(Link)组成。 多个网络还可以通过路由器互连起来&#xff0c;这样就构成了一个覆盖范围更大的网络&#xff0c;即互联网(或互连网)。因此&#xff0c;互联网是“网络的网络…...

MySQL --- DDL图形化工具表结构操作

一. 图形化工具 1. 介绍 前面我们讲解了DDL中关于数据库操作的SQL语句&#xff0c;在我们编写这些SQL时&#xff0c;都是在命令行当中完成的。大家在练习的时候应该也感受到了&#xff0c;在命令行当中来敲这些SQL语句很不方便&#xff0c;主要的原因有以下 3 点&#xff1a;…...

归一化处理(2023寒假每日一题 14)

在机器学习中&#xff0c;对数据进行归一化处理是一种常用的技术。 将数据从各种各样分布调整为平均值为 0 0 0、方差为 1 1 1 的标准分布&#xff0c;在很多情况下都可以有效地加速模型的训练。 这里假定需要处理的数据为 n n n 个整数 a 1 , a 2 , ⋯ , a n a_1,a_2,⋯…...

无公网IP,外网远程连接MySQL数据库

哈喽~大家好&#xff0c;这篇来看看无公网IP&#xff0c;外网远程连接MySQL数据库。 文章目录 前言1. 检查mysql安装状态2. 安装配置cpolar内网穿透3. 创建tcp隧道&#xff0c;映射3306端口4. 公网远程连接4.1 图形化界面4.2 使用命令行远程连接 5. 配置固定tcp端口地址5.1 保留…...

OJ刷题 第十四篇(递归较多)

23204 - 进制转换 时间限制 : 1 秒 内存限制 : 128 MB 将一个10进制数x(1 < x < 100,000,000)转换成m进制数(2< m < 16) 。分别用 ABCDEF表示10以上的数字。 输入 x m (1 < x < 100,000,000, 2< m < 16) 输出 m进制数 样例 输入 31 16 输出 1F 答…...

FileZilla读取目录列表失败(vsftpd被动模式passive mode部署不正确)

文章目录 现象问题原因解决方法临时解决&#xff08;将默认连接方式改成主动模式&#xff09;从根本解决&#xff08;正确部署vsftpd的被动模式&#xff09; 现象 用FileZilla快速连接vsftpd服务器时&#xff0c;提示读取目录列表失败 问题原因 是我vsftpd服务端的被动模式没…...

【Java面试八股文】数据库篇

导航&#xff1a; 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线MySQL高级篇设计模式牛客面试题 目录 请你说说MySQL索引,以及它们的好处和坏处 请你说说MySQL的索引是什么结构,为什么不用哈希表 请你说说数据库索引的底…...

Android Glide加载图片、网络监听、设置资源监听

再搞事情之前首先创建一个项目&#xff0c;就命名为GlideDemo吧。    一、项目配置 创建好之后&#xff0c;在app模块下build.gradle的dependencies闭包中添加如下依赖&#xff1a; //glide//glideimplementation com.github.bumptech.glide:glide:4.11.0annotationProcess…...

等保定级报告模版

等保定级怎么做_luozhonghua2000的博客-CSDN博客 上篇给大家说清楚了,等保定级怎么做,但在日常工作中,需要向上级或甲方输出定级报告,这篇我降弄个模版供大家参考。 信息系统安全等级保护定级报告 XX 平台系统描述 (一) 2023年5月,XX 正式上线,XX 隶属于深圳 XX 科技…...

计算机组成原理4.2.2汉明码

编码的最小距离 奇校验和偶校验 看1的个数是奇数 还是偶数 汉明码 汉明码的配置 根据不等式&#xff0c;确定增添几位&#xff0c;根据指数放置增添位 汉明码的检错 分不同检测小组 分组规则&#xff1a;哪位为’1‘就是哪组元素。 1号位为‘1’的都是第一组元素&#…...

JavaScript全解析——本地存储的概念、用法详解

本地存储概念&#xff1a; 就是浏览器给我们提供的可以让我们在浏览器上保存一些数据 常用的本地存储 localStorage sessionStorage localStorage 特点: 1.长期存储,除非手动删除否则会一直保存在浏览器中&#xff0c;清除缓存或者卸载浏览器也就没有了 2.可以跨页面通讯,…...

对象浅拷贝的5种方式

参考原文:浅拷贝的五种实现方式 - 掘金 (juejin.cn) 哈喽 大家好啊 最近发现自己对对象都不是很熟练&#xff0c;特别是涉及到一些复制&#xff0c;深浅拷贝的东西 1.Object.assign 首先 我们创建一个空对象obj1 然后创建一个对象obj2 用object.assign(目标对象&#xff0c…...

Java每日一练(20230504)

目录 1. 位1的个数 &#x1f31f; 2. 移除元素 &#x1f31f; 3. 验证二叉搜索树 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 位1的个数 编写一个…...

【深度学习】计算机视觉(13)——模型评价及结果记录

1 Tensorboard怎么解读&#xff1f; 因为意识到tensorboard的使用远不止画个图放个图片那么简单&#xff0c;所以这里总结一些关键知识的笔记。由于时间问题&#xff0c;我先学习目前使用最多的功能&#xff0c;大部分源码都包含summary的具体使用&#xff0c;基本不需要自己修…...

项目经理在项目中是什么角色?

有人说&#xff0c;项目经理就是一个求人的差事&#xff0c;你是在求人帮你做事。 有人说&#xff0c;项目经理就是一个与人扯皮的差事&#xff0c;你要不断的与开发、产品、测试等之间沟通、协调。 确实&#xff0c;在做项目的时候&#xff0c;有的人是为了完成功能&#x…...

【技术分享】防止根据IP查域名,防止源站IP泄露

有的人设置了禁止 IP 访问网站&#xff0c;但是别人用 https://ip 的形式&#xff0c;会跳到你服务器所绑定的一个域名网站上 直接通过 https://IP, 访问网站&#xff0c;会出现“您的连接不是私密连接”&#xff0c;然后点高级&#xff0c;会出现“继续前往 IP”&#xff0c;…...

Baumer工业相机堡盟相机如何使用偏振功能(偏振相机优点和行业应用)(C#)

项目场景&#xff1a; Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0…...

无损以太网与网络拥塞管理(PFC、ECN)

无损以太网 无损以太网&#xff08;Lossless Ethernet&#xff09;是一种专门用于数据中心网络的网络技术&#xff0c;旨在提供低延迟、高吞吐量和可靠性的传输服务。它是在传统以太网的基础上进行了扩展&#xff0c;引入了新的拥塞管理机制&#xff0c;以避免数据包丢失和网络…...

爬虫大全:从零开始学习爬虫的基础知识

爬虫是一种自动获取网站信息的技术&#xff0c;它可以帮助我们快速地抓取海量网站数据&#xff0c;进行统计分析、挖掘和展示。本文旨在为初学者详细介绍爬虫的基础知识&#xff0c;包括&#xff1a;爬虫原理、爬虫分类、网页结构分析、爬虫工具和技能、爬虫实践示范&#xff0…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...