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设计思路;
- Declaration of Variables
- Initialization: It is written in the setup () function.
- 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,因特网概述 1.网络、互联网和英特网 网络(Network)由若干结点(Node)和连接这些结点的链路(Link)组成。 多个网络还可以通过路由器互连起来,这样就构成了一个覆盖范围更大的网络,即互联网(或互连网)。因此,互联网是“网络的网络…...
MySQL --- DDL图形化工具表结构操作
一. 图形化工具 1. 介绍 前面我们讲解了DDL中关于数据库操作的SQL语句,在我们编写这些SQL时,都是在命令行当中完成的。大家在练习的时候应该也感受到了,在命令行当中来敲这些SQL语句很不方便,主要的原因有以下 3 点:…...
归一化处理(2023寒假每日一题 14)
在机器学习中,对数据进行归一化处理是一种常用的技术。 将数据从各种各样分布调整为平均值为 0 0 0、方差为 1 1 1 的标准分布,在很多情况下都可以有效地加速模型的训练。 这里假定需要处理的数据为 n n n 个整数 a 1 , a 2 , ⋯ , a n a_1,a_2,⋯…...
无公网IP,外网远程连接MySQL数据库
哈喽~大家好,这篇来看看无公网IP,外网远程连接MySQL数据库。 文章目录 前言1. 检查mysql安装状态2. 安装配置cpolar内网穿透3. 创建tcp隧道,映射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部署不正确)
文章目录 现象问题原因解决方法临时解决(将默认连接方式改成主动模式)从根本解决(正确部署vsftpd的被动模式) 现象 用FileZilla快速连接vsftpd服务器时,提示读取目录列表失败 问题原因 是我vsftpd服务端的被动模式没…...
【Java面试八股文】数据库篇
导航: 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线MySQL高级篇设计模式牛客面试题 目录 请你说说MySQL索引,以及它们的好处和坏处 请你说说MySQL的索引是什么结构,为什么不用哈希表 请你说说数据库索引的底…...
Android Glide加载图片、网络监听、设置资源监听
再搞事情之前首先创建一个项目,就命名为GlideDemo吧。 一、项目配置 创建好之后,在app模块下build.gradle的dependencies闭包中添加如下依赖: //glide//glideimplementation com.github.bumptech.glide:glide:4.11.0annotationProcess…...
等保定级报告模版
等保定级怎么做_luozhonghua2000的博客-CSDN博客 上篇给大家说清楚了,等保定级怎么做,但在日常工作中,需要向上级或甲方输出定级报告,这篇我降弄个模版供大家参考。 信息系统安全等级保护定级报告 XX 平台系统描述 (一) 2023年5月,XX 正式上线,XX 隶属于深圳 XX 科技…...
计算机组成原理4.2.2汉明码
编码的最小距离 奇校验和偶校验 看1的个数是奇数 还是偶数 汉明码 汉明码的配置 根据不等式,确定增添几位,根据指数放置增添位 汉明码的检错 分不同检测小组 分组规则:哪位为’1‘就是哪组元素。 1号位为‘1’的都是第一组元素&#…...
JavaScript全解析——本地存储的概念、用法详解
本地存储概念: 就是浏览器给我们提供的可以让我们在浏览器上保存一些数据 常用的本地存储 localStorage sessionStorage localStorage 特点: 1.长期存储,除非手动删除否则会一直保存在浏览器中,清除缓存或者卸载浏览器也就没有了 2.可以跨页面通讯,…...
对象浅拷贝的5种方式
参考原文:浅拷贝的五种实现方式 - 掘金 (juejin.cn) 哈喽 大家好啊 最近发现自己对对象都不是很熟练,特别是涉及到一些复制,深浅拷贝的东西 1.Object.assign 首先 我们创建一个空对象obj1 然后创建一个对象obj2 用object.assign(目标对象,…...
Java每日一练(20230504)
目录 1. 位1的个数 🌟 2. 移除元素 🌟 3. 验证二叉搜索树 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 位1的个数 编写一个…...
【深度学习】计算机视觉(13)——模型评价及结果记录
1 Tensorboard怎么解读? 因为意识到tensorboard的使用远不止画个图放个图片那么简单,所以这里总结一些关键知识的笔记。由于时间问题,我先学习目前使用最多的功能,大部分源码都包含summary的具体使用,基本不需要自己修…...
项目经理在项目中是什么角色?
有人说,项目经理就是一个求人的差事,你是在求人帮你做事。 有人说,项目经理就是一个与人扯皮的差事,你要不断的与开发、产品、测试等之间沟通、协调。 确实,在做项目的时候,有的人是为了完成功能&#x…...
【技术分享】防止根据IP查域名,防止源站IP泄露
有的人设置了禁止 IP 访问网站,但是别人用 https://ip 的形式,会跳到你服务器所绑定的一个域名网站上 直接通过 https://IP, 访问网站,会出现“您的连接不是私密连接”,然后点高级,会出现“继续前往 IP”,…...
Baumer工业相机堡盟相机如何使用偏振功能(偏振相机优点和行业应用)(C#)
项目场景: Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外࿰…...
无损以太网与网络拥塞管理(PFC、ECN)
无损以太网 无损以太网(Lossless Ethernet)是一种专门用于数据中心网络的网络技术,旨在提供低延迟、高吞吐量和可靠性的传输服务。它是在传统以太网的基础上进行了扩展,引入了新的拥塞管理机制,以避免数据包丢失和网络…...
爬虫大全:从零开始学习爬虫的基础知识
爬虫是一种自动获取网站信息的技术,它可以帮助我们快速地抓取海量网站数据,进行统计分析、挖掘和展示。本文旨在为初学者详细介绍爬虫的基础知识,包括:爬虫原理、爬虫分类、网页结构分析、爬虫工具和技能、爬虫实践示范࿰…...
【Python】【进阶篇】21、Django Admin数据表可视化
目录 21、Django Admin数据表可视化1. 创建超级用户2. 将Model注册到管理后台1)在admin.py文件中声明 3. django_admin_log数据表 21、Django Admin数据表可视化 在《Django Admin后台管理系统》介绍过 Django 的后台管理系统是为了方便站点管理人员对数据表进行操作。Django …...
【MySQL约束】数据管理实用指南
1、数据库约束的认识 数据库约束的概念:数据库的约束是关系型数据库的一个重要的功能,它提供了一种“校验数据”合法性的机制,能够保证数据的“完整性”、“准确性”和“正确性” 数据库的约束: not null:不能存储 nul…...
2023年第二十届五一数学建模竞赛C题:“双碳”目标下低碳建筑研究-思路详解与代码答案
该题对于模型的考察难度较低,难度在于数据的搜集以及选取与处理。 这里推荐数据查询的网站:中国碳核算数据库(CEADs) https://www.ceads.net.cn/ 国家数据 国家数据data.stats.gov.cn/easyquery.htm?cnC01 以及各省市《统…...
Vue父组件生命周期和子组件生命周期触发顺序
加载渲染过程 父 beforeCreate -> 父 created -> 父 beforeMount -> 子 beforeCreate -> 子 created -> 子 beforeMount -> 子 mounted -> 父 mounted子组件更新过程 父 beforeUpdate -> 子 beforeUpdate -> 子 updated -> 父 updated父组件更新…...
DevOps工程师 - 面试手册
DevOps工程师 - 面试手册 岗位概述 DevOps工程师是一种专注于提高软件开发和运维团队协作、提高软件产品交付速度和质量的职位。这种角色要求具备跨领域的知识,以便在开发和运维过程中建立起稳定、可靠的基础设施和自动化流程。 常见的职位招聘描述 负责设计、实…...
Netty内存管理--内存池空间规格化SizeClasses
一、规格化 内存池类似于一个内存零售商, 从操作系统中申请一整块内存, 然后对其进行合理分割, 将分割后的小内存返回给程序。这里存在3个尺寸: 分割尺寸: 底层内存管理的基本单位, 比如常见的以页为单位分配, 但是页的大小是灵活的;申请尺寸: 内存使用者希望申请到的内存大小…...
数据结构刷题(三十):96不同的二叉搜索树、01背包问题理论、416分割等和子集
一、96. 不同的二叉搜索树 1.这个题比较难想递推公式, dp[3],就是元素1为头结点搜索树的数量 元素2为头结点BFS的数量 元素3为头结点BFS的数量 元素1为头结点搜索树的数量 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量 元素2为头结…...
bash的进程与欢迎讯息自定义
在bash shell中,可以通过多种方式自定义欢迎讯息和提示符。主要有: 修改/etc/profile文件: 该文件在用户登录后执行,定义了PROMPT_COMMAND和PS1提示符。可以修改其内容实现自定义欢迎讯息和提示符。 例如,修改为: bash PROMPT_COMMANDecho -e "\nWelcome to My Bash She…...
本周大新闻|苹果首款MR没有主打卖点;Meta认为AI是AR OS的基础
本周XR大新闻,AR方面,苹果首款MR或没有主打卖点,反而尽可能支持更多App和服务;扎克伯格表示基于AI的AR眼镜操作系统是下一代计算平台的基础;微软芯片工程VP Jean Boufarhat加入Meta芯片团队;Humane展示了…...
Java中工具类Arrays、Collections、Objects
Arrays Arrays是Java中提供的一个针对数组操作的工具类,所有的方法都是静态的。 大致有这些常用的方法 sort()针对常用的基本数据类型,都能进行排序,byte、char、int、long、float、doubleparallelSort()并行排序,多线程排序&am…...
淘宝做seo要建网站吗/大连中小企业网络营销
1.1 (无效)// 验证本地缓存的链接是否可以访问 // pathImg为链接 target为data中变量名的字符串getValidateImage (pathImg, target) {console.log(pathImg)var imgObj new Image()imgObj.src pathImgif ((imgObj.width > 0 && imgObj.hei…...
wordpress 长图片滑动/信息流广告素材网站
【小白从小学Python、C、Java】 【Python-计算机等级考试二级】 【Python-数据分析】 Python数据分析 判断列表中元素是否全为True 判断列表中元素至少有一个为True all()和any() [太阳]选择题 以下python代码中两次输出结果分别是什么? a [1.0, True, 0, "a&quo…...
西安手机网站开发/免费b站推广网站2022
Ubuntu下VirtualBox本来可以很好地用的,今天早上一来就报错了,……提示如下内容: ------------------------------------------------------------------------- Kernel driver not installed (rc-1908) The VirtualBox Linux kernel drive…...
钟星建设集团网站/百度关键词排名靠前
一 般情况下,DBA能从监控mysql的状态列表中查看出数据库的运行端倪,需要注意的是STATUS所表示的不同内容。且需要注意的是TIME字段表示的 意思。它表示的只是最后那个STAT状态持续的时间。这个时间是有可能忽大忽小的。而不是SQL开始执行到现在的时间。单位时间是秒…...
沃噻网站建设流程/营销网站建设免费
tensorflow是一个开源软件库,用于使用数据流图进行数值计算。图中节点表示数学运算,图边表示在它们之间传递的多维数据数组。该库包括各种功能,使你可以实现和探索用于图像和文本处理的前沿卷积神经网络和循环神经网络RNN架构。由于复杂计算以…...
什么是网站名称/谷歌paypal下载
开启三台虚拟机 实战:使用varnish加速多个不同域名站点的web服务器 varnish:192.168.80.100 //需要联网 web1:192.168.80.101——www.aa.com web2:192.168.80.102——www.bb.com 三台服务器全都要操作 systemctl stop f…...