ardupilot开发
ardupilot开发
固件选择
ArduPilot是一个开源、无人驾驶的硬件和软件平台,广泛应用于多旋翼飞行器、固定翼飞机、陆地车辆和水面船只等。SpeedyBeeF405WING是一个特定型号的飞行控制器,它支持ArduPilot固件。
- ardupilot: SpeedyBeeF405WING-antennatracker:==这是一个用于无线电天线跟踪的固件。==
- ardupilot: SpeedyBeeF405WING-bootloader:==这是引导加载器,用于初始化硬件并加载主固件==。
- ardupilot: SpeedyBeeF405WING-copter:==这是一个多旋翼飞行器的固件==。
- ardupilot: SpeedyBeeF405WING-heli:==这是一个用于直升机的固件==。
- ardupilot: SpeedyBeeF405WING-plane:==这是一个用于固定翼飞机的固件==。
- ardupilot: SpeedyBeeF405WING-rover:==这是一个用于陆地车辆的固件==。
- ardupilot: SpeedyBeeF405WING-sub:==这是一个用于水下潜艇或水面船只的固件==。
代码框架
Core libraries:
- AP_AHRS - attitude estimation using DCM or EKF==(使用 DCM 或 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==(PID(比例-积分-微分)控制器库)==
- AP_InertialNav - inertial navigation library for blending accelerometer inputs with gps and baro data==(混合加速度计输入与GPS和气压计数据的惯性导航库)==
- AC_AttitudeControl - ArduCopter’s control library includes various functions of attitude, position control based on PID control.==(ArduCopter的控制库,包括基于PID控制的姿态和位置控制的各种函数)==
- 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==(将APM_RC的PWM输入/输出转换为角度等内部单位的库)==
- 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.==(实现”硬件抽象层”的库,提供与高级代码相同的接口,以便更轻松地将其移植到不同的板子上)==
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(读取陀螺仪和加速度计数据,进行校准,并将数据以标准单位(deg/s、m/s)提供给主代码和其他库)
- AP_RangeFinder - sonar and ir distance sensor interfaced library(超声波和红外距离传感器接口库)
- AP_Baro - barometer interface library(气压计接口库)
- AP_GPS - gps interface library(GPS接口库)
- AP_Compass - 3-axis compass interface library(三轴磁罗盘接口库)
- AP_OpticalFlow - optical flow sensor interface library(光流传感器接口库)
Other libraries:
- AP_Mount, AP_Camera, AP_Relay - camera mount control library, camera shutter control libraries(摄像机云台控制库,用于控制摄像机云台的运动和姿态;摄像机快门控制库,用于控制摄像机的快门操作;继电器控制库,用于控制继电器的开关操作)
- AP_Mission - stores/retrieves mission commands from eeprom(任务存储/检索库,用于将任务指令存储到EEPROM中并从EEPROM中检索任务指令)
- AP_Buffer - a simple FIFO buffer for use with inertial navigation(简单的FIFO(先进先出)缓冲区库,用于与惯性导航系统配合使用)
The hal reference
The most commonly used hal functions are:
- hal.console->printf() to print strings (打印字符串)
- AP_HAL::millis() and AP_HAL::micros() to get the time since boot
- hal.scheduler->delay() and hal.scheduler->delay_microseconds() to sleep for a short time
- hal.gpio->pinMode(), hal.gpio->read() and hal.gpio->write() for accessing GPIO pins
- I2C access via hal.i2c
- SPI access via hal.spi
传感器通信
I2C
- one master, many slaves possible(一个主人,多个从属可能)
- a relatively simple protocol which is good for communicating over short-distances (i.e. less than 1m).(一种相对简单的协议,适用于短距离(即小于1m)的通信)
- bus runs at 100kHz or 400kHz but the data rate is relatively low compared to other protocols.(总线以100kHz或400kHz运行,但与其他协议相比,数据速率相对较低)
- only 4 pins are required (VCC, GND, SDA, SCL)(仅需 4 个引脚(VCC、GND、SDA、SCL))
SPI
- one master, one slave(一个主人,一个从属)
- 20Mhz+ speed meaning it is very fast especially compared to I2C(20Mhz+ 速度意味着它非常快,尤其是与 I2C 相比)
- only works over short distances (10cm)(仅适用于短距离(10厘米))
- requires at least 5 pins (VCC, GND, SCLK, Master-Out-Slave-In, Master-In-Slave-Out) + 1 slave select pin per slave(至少需要 5 个引脚(VCC、GND、SCLK、MOSI、MISO)+ 每个从站 1 个从选择引脚)
Serial / UART
- one master, one slave(一个主人,一个从属)
- character based protocol good for communicating over longer distances compared to I2C and SPI (i.e. 1m)(与 I2C 和 SPI(即 1m)相比,基于字符的协议适合在更长的距离上进行通信)
- relatively fast at 57Kbps ~ 1.5Mbps(相对较快,57Kbps ~ 1.5Mbps)
- at least 4 pins required (VCC, GND, TX, RX), plus 2 optional pins (Clear-To-Send, Clear-To-Receive(至少需要 4 个引脚(VCC、GND、TX、RX),外加 2 个可选引脚(清除发送、清除接收))
CAN bus with UAVCAN
- multimaster bus, any node can initiate transmission of data when they need to(多主站总线,任何节点都可以在需要时启动数据传输)
- packet based protocol for very long distances(基于数据包的超长距离协议)
- high speed, typically 1 Mb (however only 50% of the bus bitrate can really be used without major collisions)(高速,通常为 1 Mb(但是只有 50% 的总线比特率可以真正使用而不会发生重大碰撞))
- at least 3 pins required (GND, CAN HI, CAN LO). Optionally VCC can be used to power nodes(至少需要 3 个引脚(GND、CH、CL)。可选 VCC 可用于为节点供电)
- point-to-point topology. Star or stubs topolgy is not advised(点对点拓扑。不建议使用星形或存根拓扑)
- termination is required at each end of the bus(总线两端都需要端接)
ArduPilot 线程
任务的调度
- idle task - called when there is nothing else to run(空闲任务 - 在没有其他要运行的任务时调用)
- init - used to start up the system(init - 用于启动系统)
- px4io - handle the communication with the PX4IO co-processor(PX4IO - 处理与 PX4IO 协处理器的通信)
- hpwork - handle thread based PX4 drivers (mainly I2C drivers)(hpwork - 处理基于线程的 PX4 驱动程序(主要是 I2C 驱动程序))
- lpwork - handle thread based low priority work (eg. IO)(处理基于线程的低优先级工作(例如。IO))
- fmuservo - handle talking to the auxiliary PWM outputs on the FMU(处理与 FMU 上的辅助 PWM 输出的通信)
- uavcan - handle the uavcan CANBUS protocol(处理 uavcan CANBUS 协议)
AP_Scheduler系统
AP_Scheduler库用于划分 时间在主车线程内,同时提供一些简单的 控制每个操作使用多少时间的机制(称为 AP_Scheduler中的“任务”)
它是一个表驱动的调度程序,每种类型都有一个 AP_Scheduler::任务表
static const AP_Scheduler::Task scheduler_tasks[] PROGMEM = { |
RC Input and Output
AP_HAL RCInput object
首先要理解的是可作为 hal.rcin 使用的 AP_HAL RCInput 对象。它提供了对当前在板上接收到的通道值的低级访问。返回的值是以微秒为单位的 PWM 值。
前往 libraries/AP_HAL/examples/RCInput/RCInput.cpp 示例文件,尝试在您的开发板上运行该示例。试着移动遥控器上的摇杆,并检查输出中的值是否正确变化。
AP_HAL RCOutput object
AP_HAL RCOutput 对象(可作为 hal.rcout 使用)提供了对所有输出通道的低级控制。其实现方式非常依赖于具体的开发板,可能涉及芯片上的定时器编程、I2C 外设或通过协处理器(如 PX4IO 微控制器)进行输出。
前往 libraries/AP_HAL/examples/RCOutput/RCOutput.cpp 示例文件。您会看到该示例只是设置了所有通道,在几秒钟的时间内将舵机从最小值到最大值摆动。连接一些舵机到您的开发板上,然后进行测试,确保它对您而言可以正常工作。
ArduPilot File Systems
ArduPilot使用多个文件系统来使用外部SD卡或自动驾驶仪闪存存储和检索数据
外部SD卡:
APM:基目录
LOGS:飞行日志存储在此处(请参阅Mission Planner中的下载和分析数据日志)
TERRAIN:地形数据存储在此处(请参阅地形跟随)
STRNG_BAK:每次启动时,参数数据都会备份到此处 scripts:LUA脚本存储在此处(请参阅Lua脚本)
代码架构
1.afs_copter.cpp/afs_copter.h高级失效保护 2.AP_Arming.cpp/AP_Arming.h解锁 3.AP_Rally.cpp/AP_Rally.h集结地 4.AP State.cpp状态转化 5.APM Config_mavlink hil.h/APM_Config.h配置信息 6.ArduCopter.cpp顶层逻辑文件 7.Attitude.cpp姿态控制 8.autoyaw.cpp自动航线规划 9.avoidance adsb.cpp/avoidance adsb.h避障 10.baro_ground_effect.cpp气压高度计地效 11.capabilities.cpp初始化一些配置 12.commands.cpp位置信息更新需求 13.compassmot.cpp消除磁罗盘对电机的影响 14.config.h配置信息 (勿修改) 15Copter.cpp/Copter.h顶层定义 16.crash_check.cpp坠毁监测 17.defines.h定义 18.ekf check.cpp扩展卡尔曼滤波器检测 19.esc calibration.cpp电调控制 20.events.cpp事件 21.failsafe.cpp失控保护 22.fence.cpp地理围栏 23.GCS Copter.h地面站与多旋翼通讯有关 24.GCS_Mavlink.cpp/GCS_Mavlink.h地面站通讯协议 25.heli.cpp旋翼的变量和函数 26.inertia.cpp获取惯性信息 27.land_detector.cpp降落检测 28.landing_gear.cpp起落架 29.leds.cppLED灯控制 30.Log.cpp日志 31.make.inc放置头文件 32.mode_acro_heil.cpp比率控制模式 (手动) 33.mode_acro.cpp比率控制模式 (完全手动角速率/手动油门) 34.mode_althold.cpp定高模式 35.mode_auto.cpp自动模式 (任务规划) 36.mode_autoune.cpp自动模式 (自动调整俯仰和滚转) 37.mode_avoid_adsb.cpp避障模式 38.mode_brake.cpp制动模式 (没有驾驶员输入) 39.mode_circle.cpp绕圈模式 40.mode_drift.cpp漂移模式 41.mode_flip.cpp翻转模式 42.mode_flowhold.cpp跟随模式 (光流位置/不带测距仪) 43.mode_follow.cpp 跟随模式 (车辆或地面站) 44.mode_guided_nogps.cpp引导模式 (无GPS) 45.mode_guided.cpp引导模式 46.mode_land.cpp着陆模式 47.mode_loiter.cpp悬停模式 48.mode_poshold.cpp位置保持模式 (类似loiter/何控制偏航角度) 49.mode_rtl.cpp返航模式 (发射点) 50.mode_smart_rtl.cpp返航模式 (家) 51.mode_sport.cpp运动模式 52.mode_stablize_heil.cpp自稳模式 53.mode_stablize.cpp自稳模式 54.mode_throw.cpp抛飞模式 (无输入) 55. mode. ( . \mathrm{pp} / \mathrm{mode} ). h模式的基类和头文件 56.motor_test.cpp电机测试 57.motor.cpp电机控制 58.navigation.cpp导航参数计算 59.Parmeters.cpp/Parmeters.h参数表 60.position_vector.cpp向量位置坐标 61.precision_landing.cpp精准着陆 62.radio.cpp无线电 63.sensors.cpp传感器控制 64.setup.cpp 初始化设置 65.swiches.cpp模式转换 66.system.cpp系统 67.takeoff.cpp起飞 68.terrain.cpp地形 69.toy_mode.cpp/toy_mode.h玩具模式 (简单与用户交互) 70.tuning.cppi调节参数 71.UserCode.cpp用户自定义代码 72.UserVariables.h用户自定义变量 73.version.cpp/version.h版本号 |
---|
manual modes(手动模式)
autonomous modes(自稳模式)
Copter Attitude Control
姿态控制
The diagram below shows the code path followed from pilot input down to pwm output.
Motors Library
在AC_AttitudeControl_Multi::rate_controller_run()
方法中:
- 该方法从姿态估计系统中获取最新的陀螺仪读数。
- 根据当前陀螺仪读数与目标角速度之间的差异,计算出滚转(roll)、俯仰(pitch)和偏航(yaw)指令。
- 然后,使用
_motors.set_roll()
、_motors.set_pitch()
和_motors.set_yaw()
方法将这些滚转、俯仰和偏航指令传递给电机库。
在AP_Motors_Class.h
文件中:
- 定义了
set_roll()
、set_pitch()
、set_yaw()
和set_throttle()
方法,用于设置滚转、俯仰、偏航和油门的输入值。 - 滚转、俯仰和偏航输入的范围是-1到+1,而油门输入的范围是0到+1。
- 电机库负责将这些高级输入转换为单独的电机和舵机输出。
- 限制标志存储在
AP_Motors_Class::limit
变量中,用于防止姿态控制器和油门控制器中的“积分项”积累过多。这些标志指示是否已达到滚转、俯仰、偏航和油门的限制。
APM固件二次开发
ardupliot代码框架
AntennaTracker、ArduCopter、ArduPlane、ArduSub:这些文件包含特定于飞行器类型的代码。
例如,ArduCopter负责处理多旋翼飞行器的代码,ArduPlane负责固定翼飞行器的代码,ArduSub负责潜水器的代码,而AntennaTracker则负责地面站天线追踪系统的代码。
- AC_AttitudeControl: 用于飞行器姿态控制的库。
- AC_Autorotation: 用于处理直升机自旋降落(Autorotation)的库。
- AC_AutoTune: 用于自动优化飞行器控制增益的自动调谐库。
- AC_Avoidance: 用于避免与障碍物碰撞的避障库。
- AC_CustomControl: 用于自定义控制的库。
- AC_Fence: 地理围栏(Geofence)库,用于设置飞行区域的边界。
- AC_InputManager: 输入管理库,处理和管理来自遥控器的输入信号。
- AC_PID: PID控制库,实现了比例-积分-微分(PID)控制算法。
- AC_PrecLand: 精确降落库,用于精确控制飞行器的降落。
- AC_Sprayer: 喷雾器库,用于控制飞行器上的喷雾装置。
- AC_WPNav: 路径导航库,用于管理飞行器的路径导航。
- AP_AccelCal: 加速度计校准库,用于校准飞行器的加速度计。
- AP_ADC: 模拟-数字转换器(ADC)库,用于处理飞行器上的模拟信号。
- AP_ADSB: Automatic Dependent Surveillance-Broadcast(ADSB)库,用于处理飞行器的ADSB信号。
- AP_AdvancedFailsafe: 高级故障保护库,用于处理飞行器的故障保护逻辑。
- AP_AHRS: 姿态和航向参考系统(AHRS)库,利用各种传感器的数据计算飞行器的姿态和方位。
- AP_Airspeed: 空速库,用于处理和管理飞行器的空速数据。
- AP_AIS: Automatic Identification System(AIS)库,用于处理船舶的自动识别系统信号。
- AP_Arming: 武装库,用于管理飞行器的启动和停止。
- AP_Avoidance: 避障库,用于避免与障碍物碰撞。
- AP_Baro: 气压计库,用于处理和管理飞行器的气压数据。
- AP_BattMonitor: 电池监控库,用于监控飞行器的电池状态。
- AP_Beacon: 信标库,用于处理和管理飞行器的信标数据。
- AP_BLHeli: BLHeli电调库,用于控制支持BLHeli协议的电调。
- AP_BoardConfig: 用于处理和管理飞行控制板配置的库。
- AP_Button: 用于处理和管理飞行器上的按钮输入的库。
- AP_Camera: 用于处理和管理飞行器上的相机的库。
- AP_CANManager: Controller Area Network(CAN)管理器库,用于处理和管理CAN接口。
- AP_CheckFirmware: 用于检查固件更新的库。
- AP_Common: 提供通用功能和定义的库。
- AP_Compass: 用于处理和管理飞行器上的磁罗盘数据的库。
- AP_CSVReader: 用于读取CSV文件的库。
- AP_CustomRotations: 用于管理自定义旋转的库。
- AP_DAL: Data Abstraction Layer(DAL)库,提供数据抽象层服务。
- AP_DDS: 提供Data Distribution Service(DDS)的库,它是一种实时数据分发服务。
- AP_Declination: 用于计算地磁倾斜角的库。
- AP_Devo_Telem: 用于处理和管理Devention协议遥测数据的库。
- AP_DroneCAN: 提供DroneCAN功能的库,DroneCAN是一种无人机CAN协议。
- AP_EFI: Electronic Fuel Injection(EFI)库,用于控制和管理电子燃油喷射系统。
- AP_ESC_Telem: 提供电子速度控制器(ESC)遥测的库。
- AP_ExternalAHRS: 用于处理外部AHRS设备的库。
- AP_FETtecOneWire: 提供对FETtec OneWire ESC的支持的库。
- AP_Filesystem: 提供文件系统操作的库。
- AP_FlashStorage: 提供Flash存储操作的库。
- AP_Follow: 提供”跟随我”功能的库。
- AP_Frsky_Telem: 提供对FrSky遥测协议的支持的库。
- AP_InternalError: 用于处理和报告内部错误的库。
- AP_IOMCU: 输入/输出微控制器单元的库,用于处理各种I/O任务。
- AP_IRLock: 用于处理红外锁定系统(通常用于精确着陆)的库。
- AP_JSButton: 用于处理和管理飞行器上的按钮输入的库。
- AP_KDECAN: 提供对KDE Direct UAS CAN总线ESC的支持的库。
- AP_L1_Control: 提供L1航迹跟踪控制的库。
- AP_Landing: 用于处理和管理飞行器的着陆过程的库。
- AP_LandingGear: 用于控制和管理飞行器上的起落架的库。
- AP_LeakDetector: 用于检测潜水航行器的漏水情况的库。
- AP_Logger: 提供日志记录功能的库。
- AP_LTM_Telem: 提供LTM遥测协议的支持的库。
- AP_Math: 提供各种数学函数和算法的库。
- AP_Menu: 提供菜单管理功能的库。
- AP_Mission: 提供飞行任务管理功能的库。
- AP_Module: 用于支持可加载模块的库。
- AP_Motors: 提供电机控制功能的库。
- AP_Mount: 提供对飞行器上装置(如照相机云台)的控制的库。
- AP_MSP: 提供MultiWii Serial Protocol (MSP)的支持的库。
- AP_NavEKF: 提供扩展卡尔曼滤波器(EKF)的库,用于态势估计。
- AP_NavEKF2: 提供第二版扩展卡尔曼滤波器的库。
- AP_NavEKF3: 提供第三版扩展卡尔曼滤波器的库。
- AP_Navigation: 提供导航功能的库。
- AP_NMEA_Output: 提供NMEA输出功能的库,通常用于与其他设备(如GPS或图形显示器)通信。
- AP_Notify: 提供状态通知功能的库,例如LED灯或蜂鸣器。
- AP_OLC: 提供在线竞争(Online Contest, OLC)飞行规划功能的库,常用于滑翔飞行。
- AP_ONVIF: 提供ONVIF协议的支持的库,ONVIF是一种网络视频接口标准。
- AP_OpenDronelD: 提供开放无人机识别系统的支持的库。
- AP_OpticalFlow: 提供光流传感器的支持的库,光流传感器常用于无人机的定位和导航。
- AP_OSD: 提供了On-Screen Display(屏幕显示)功能,用于将飞行数据显示在视频传输中。
- AP_Parachute: 用于控制和操作无人机上的降落伞系统。
- AP_Param: 提供了参数管理和配置功能,用于管理飞行控制器中的各种参数。
- AP_PiccoloCAN: 用于与PiccoloCAN协议兼容的设备进行通信。
- AP_Proximity: 提供了飞行器周围环境感知和障碍物检测的功能。
- AP_Radio: 用于与无人机上的无线电通信设备进行通信和控制。
- AP_Rally: 提供了航点集合和任务路径功能,用于无人机的航点导航。
- AP_RAMTRON: 用于与RAMTRON系列设备进行通信和数据存储。
- AP_RangeFinder: 用于与测距仪传感器进行通信和测量距离。
- AP_RCMapper: 提供了遥控器通道映射和配置的功能。
- AP_RCProtocol: 提供了与不同遥控器协议兼容的功能,用于接收和解码遥控器信号。
- AP_RCTelemetry: 用于与遥控器进行双向的遥测数据交换。
- AP_Relay: 提供了继电器控制和操作的功能。
- AP_RobotisServo: 用于与Robotis系列舵机进行通信和控制。
- AP_ROMFS: 提供了只读文件系统的功能,用于存储固件和其他只读数据。
- AP_RPM: 用于测量和监控发动机的转速。
- AP_RSSI: 用于测量和监控遥控信号强度。
- AP_RTC: 提供了实时时钟的功能,用于精确的时间记录和时间相关的操作。
- AP_SBusOut: 用于通过S.Bus协议向外部设备发送信号。
- AP_Scheduler: 提供了任务调度和时间管理的功能。
- AP_Scripting: 提供了脚本编程和执行的功能,用于自定义行为和逻辑。
- AP_SerialLED: 用于控制和操作串口LED设备。
- AP_SerialManager: 用于管理和控制串口通信。
- AP_ServoRelayEvents: 提供了舵机和继电器事件触发的功能。
- AP_SmartRTL: 提供了智能返航和自动返航功能。
- AP_Soaring: 提供了滑翔和热气球飞行的功能。
- AP_Stats: 提供了飞行数据统计和分析的功能。
- AP_TECS: 提供了自动高度和速度控制的功能。
- AP_TempCalibration: 用于温度校准和补偿。
- AP_TemperatureSensor: 提供了温度传感器的功能和接口。
- AP_Terrain: 提供了地形数据的获取和处理功能。
- AP_Torqeedo: 用于与Torqeedo电动船驱动系统进行通信和控制。
- AP_Tuning: 提供了飞行控制器参数调优和优化的功能。
- AP_Vehicle: 提供了飞行器的基本控制和状态管理功能。
- AP_VideoTX: 用于与视频传输设备进行通信和控制。
- AP_VisualOdom: 提供了视觉里程计的功能,用于无人机的定位和导航。
- AP_Volz_Protocol: 用于与Volz协议兼容的设备进行通信。
- AP_WheelEncoder: 用于读取和处理轮式编码器的数据,用于无人车的定位和测速。
- AP_Winch: 提供了绞盘控制和操作的功能。
- AP_WindVane: 用于读取和处理风向传感器的数据。
- APM_Control: APM代表ArduPilot Mega,提供了飞行控制器的基本控制功能。
- AR_Motors: AR代表ArduRover,用于无人车电机控制和操作的功能。
- AR_WPNav: AR代表ArduRover,WPNav代表航点导航,提供了无人车的航点导航功能。
- doc: 包含文档、说明和帮助文件。
- Filter: 提供了各种滤波算法,用于传感器数据的滤波和平滑。
- GCS_MAVLink: GCS代表地面控制站,MAVLink是一种无人机通信协议,用于与地面控制站之间的通信和数据交换功能。
- PID: 提供了PID控制器的实现,用于控制飞行器的稳定性和导航。
- RC_Channel: 用于接收和处理遥控器通道数据。
- SITL: SITL代表Software-In-The-Loop,提供了软件在环仿真的功能,用于在计算机上模拟飞行控制器的行为和环境。
- SRV_Channel: 用于接收和处理伺服通道数据。
ArduPlane主函数
任务列表
SCHED_TASK(read_radio, 50, 100, 6) //任务名,执行频率HZ,任务执行最大时间us,任务优先级(0-255,越低优先级越高)