ArduPilot源码深度解析
ArduPilot源码深度解析
Arducopter执行(初始化类、生成4个pthread、进入loop循环)
ArduPilot 调试开发步骤
调试手段 Serial5
JTAG GDB MAVLINK LOG SITL
特点
最方便、速率快、可调试nuttx、driver、copter、library等,最 强大的工具:printf 适合Nuttx系统都无法启动,调试最底层与功能无关的代码 适合Nuttx系统都无法启动,调试最底层与功能无关的代码 速率慢、上手容易,适合结合到地面站观看实时绘图
ArduPilot on Pixhawk
Copter library
qurt
Copter library
linux
DSP
Arm core-4
ArduPilot on Snapdragon flight
ArduPilot 架构变化及设计思想
• 为自驾仪而诞生并发展 • 一切皆文件 • 分层设计
• 控制逻辑分层 • 功能分层
Nuttx初始 化
内核初始化:系统资源、进程调度器、文件系统、console初始化 Init进程(nsh进程:初始化bin文件系统、打开console口接受指令)
Init进程解 析rcS
Init进程解 析rcAPM
挂载USB 初始化LED 挂载SD驱动 判断是否执行rcAPM(检测/fs/microsd/APM/nostart) Px4io.bin更新升级(/etc/px4io/px4io.bin)
目录
• ArduPilot架构变化及设计思想 • 编译及启动过程 • ArduPilot调试开发步骤 • 导航控制制导过程分析 • PX4Flow工程解析及图像定位
PX4源码分析以及思路随笔1
PX4源码分析以及思路随笔1PX4源码分析,以及思路随笔。
目录:1.0 环境安装1.1 roll pitch yaw2.1 loop()3.1 fastloop()3.1 .1 read_AHRS()3.1.1.1 ins.update()3.1.2 rate_controller_run()3.1.2.1 _motors.set_roll()(嵌套了rate_bf_to_motor_roll)3.1.3 motors_output()3.1.3.1 update_throttle_filter()3.1.3.2 update_battery_resistance()3.1.3.3 update_lift_max_from_batt_voltage()1.0环境安装1.首先安装px4_toolchain_installer_v14_win.exe,并配置好java 环境(安装jdk,32位)。
2.安装GitHub网站:/dev/docs/building-px4-with-make.html若提示失败,在IE浏览器中打开网页,http变为https,不断尝试。
3.克隆程序(需要翻墙),可能多次失败。
4.从C:\px4\toolchain\msys\1.0内的eclipse批处理文件打开eclipse。
5.按照/dev/docs/editing-the-code-with-eclips e.html从第二张图开始。
注:第二张图位置为ardupilot的位置。
返回目录2.1 loop函数:1.Setup各种初始化,先忽略。
2.初始定义第一个是函数名,第二个单位为赫兹为过多少时间调用一次,第三个单位为微秒,即为最大花费时间。
const AP_Scheduler::Task Copter::scheduler_tasks[] = {SCHED_TASK(rc_loop, 100, 130), /* 控制角 */SCHED_TASK(throttle_loop, 50, 75), /*油门控制*/SCHED_TASK(update_GPS, 50, 200), /* GPS更新*/3.从Loop()开始。
Ardupilot-ArduCopter-3.2.1 源码解读
ArduCopter-3.2.1 源码解读本文针对多轴飞行器最简单常见的stabilize_run模式(即自稳模式)的代码进行解读。
首先,在进行代码解读之前,首先我们要先想好,一个飞行器要工作在stabilize_run模式,需要什么输入,最后输出了什么东西。
很容易地,我们知道在stabilize_run模式下,飞行器要周期性地检测陀螺仪信号来更新计算目前的角度,检测加速度计和电子罗盘来修正分别修正pitch、roll和Yaw;同时要检测遥控器的输入,转化为相应的油门值、pitch目标值、roll目标值、Yaw转动速度目标值。
然后把上面的输入进行PID运算,最后输出各个电机的PWM值。
因此,我们需要从ArduCopter-3.2.1源码中找到下面的程序:a.程序是如何周期性运行的;b.程序在哪里更新各个传感器的值(加速度计、陀螺仪、电子罗盘);c.飞行器姿态解算;d.遥控器的输入是在哪些程序检测,并转换成pitch、roll、yaw目标值的;e.PID的计算;f.电机PWM值输出;下面,我们根据上面的思路找到相应的程序并进行解读。
程序的周期性运行首先,我们先了解程序是如何周期性运行的。
在ArduPilot官网的“Scheduling Code to Run Intermittently (Code Overview)”做出了介绍(网址:/wiki/apmcopter-code-overview/code-overview-scheduling-your-new-c ode-to-run-intermittently/)。
要让程序周期性运行,有两种办法,一种是在AP_Scheduler::Task scheduler_tasks[] PROGMEM列表里面添加函数,并定义多少时间运行一次以及设置超时,另一种是在fast_loop()函数里面新增代码。
scheduler_tasks[]可以在ArduCopter.cpp里找到:从里面我们可以看到,scheduler_tasks的程序,最快执行周期是 2.5ms(硬件对应pixhawk)。
ArduCopter代码分析
ArduCopter-v2代码结构及算法分析代码模块划分及功能描述ArduCopter.cpp是整个程序的启动点模块路径:ardupilot/libraries/一:AP_Scheduler 简单的多任务分时分片调度系统模块对外接口Void init(const Task *tasks, uint8_t num_tasks) 多任务初始化void tick(void) 控制计数值加1void run(uint16_t time_available) 遍寻任务数组,执行可以执行的任务uint16_t time_available_usec(void) 获取当前任务的剩余可用时间AP_Scheduler::Task 任务(ardupilot/ArduCopter. Pde Line 777)二:AP_HAL 硬件抽象层模块是整个系统的核心,Nuttx系统通过该模块启动用户代码部分包含了各个模块的驱动关键类:AP_HAL::HAL抽象基类HAL_PX4::HAL_PX4 是我们需要关心的子类(AP_HAL_PX4)该模块提供给用户的扩展接口:setup()进行系统中其余模块的初始化loop()主循环在本例中该方法在ardupilot/ArduCopter/ArduCopter.pde line 1612实现AP_HAL_MAIN 宏定义()用户必须通过该宏定义来定义程序的入口,完成hal的初始化initinit 会启动main_loop主循环,main_loop调用使用者定义的setup 和loop 扩展接口包含的类UARTDriver 端口读写的类接口:begin()begin(波特率,读缓存,写缓存)end()flush()set_blocking_writes()set_flow_control()get_flow_control()(1)PX4AnalogSource(2)PX4AnalogIn(3)PX4GPIO接口:Init()pinMode()analogPinToDigitalPin()read()write()toggle()channel()attach_interrupt()usb_connected()(5) PX4RCInput 遥控输入接口:void init(void* machtnichts);bool new_input(); 判断是否有新的输入到达uint8_t num_channels(); 获取RC输入通道个数uint16_t read(uint8_t ch); 读取指定通道的输入uint8_t read(uint16_t* periods, uint8_t len); 读取指定多个通道的输入bool set_overrides(int16_t *overrides, uint8_t len);bool set_override(uint8_t channel, int16_t override); 给指定通道设置假数据,如果该通道设置了假数据,则读取该通道的输入,始终读到的是设置的数据void clear_overrides();void _timer_tick(void); 循环调用每个tick更新一次input数据(4)PX4RCOutput 输出void init(void* machtnichts);void set_freq(uint32_t chmask, uint16_t freq_hz); 设置多个通道的输出频率,必须大于50uint16_t get_freq(uint8_t ch); 获取指定通道的输出频率void enable_ch(uint8_t ch); 最多8个通道void disable_ch(uint8_t ch);void write(uint8_t ch, uint16_t period_us); 单个通道写输出void write(uint8_t ch, uint16_t* period_us, uint8_t len); 多个通道写输出uint16_t read(uint8_t ch);void read(uint16_t* period_us, uint8_t len);void set_safety_pwm(uint32_t chmask, uint16_t period_us);void set_failsafe_pwm(uint32_t chmask, uint16_t period_us);void force_safety_off(void);void _timer_tick(void); 循环调用每个tick将output数据输出,电机、相机控制(5)PX4Storage(6)I2CDriverAP_HAL::UARTDriver* uartA; GCSAP_HAL::UARTDriver* uartB; GPSAP_HAL::UARTDriver* uartC; GCSAP_HAL::UARTDriver* uartD; GCSAP_HAL::UARTDriver* uartE; GPSAP_HAL::I2CDriver* i2c;AP_HAL::SPIDeviceManager* spi; 板载加速度计和磁罗盘、陀螺仪、空压表AP_HAL::AnalogIn* analogin; 电源输入AP_HAL::Storage* storage;AP_HAL::UARTDriver* console;AP_HAL::GPIO* gpio; 控制飞控板上的LED指示灯、蜂鸣器等显示AP_HAL::RCInput* rcin; 遥控器输入AP_HAL::RCOutput* rcout; 电机输出AP_HAL::Scheduler* scheduler;AP_HAL::Util* util;三:AP_Notify 根据飞机状态更新各种指示灯提示、告警模块对外接口init(bool enable_external_leds)对初始化,并对AP_BoardLED、ToshibaLED_PX4、ToneAlarm_PX4、ExternalLED、ToshibaLED_I2C、ExternalLED、ToshibaLED_I2C进行初始化void update(void)用户层可以通过该模块通知void AP_Notify::init(bool enable_external_leds) 初始化各种指示灯、蜂鸣器等等void AP_Notify::update(void) 各种指示灯根据flags标示进行更新状态四:AP_Vehicle仅仅是固定翼和螺旋飞机的通用参数结构体五:AP_GPS GPS相关库模块接口Init()Update()can_calculate_base_pos()calculate_base_pos()status() 查询gps状态Location &location(uint8_t instance)const Vector3f &velocity(uint8_t instance)velocity()float ground_speed(uint8_t instance)AP_GPS_Glitch.h中GPS_Glitch GPS干扰保护库添加了AP_GPS数据的判断对外接口:check_position() 判断GPS是否正常判断算法AP_GPS_Glitch.cpp支持的几种GPS协议AP_GPS_UBLOX 我们现在飞机应该装的这个AP_GPS_MTK19AP_GPS_MTKAP_GPS_SBPAP_GPS_SIRFAP_GPS_NMEAGPS模块结构:上层接口AP_GPS底层接口AP_GPS_Backendread() 接口,读取GPS数据,解析后统一填充到AP_GPS::GPS_State结构中,各种不同GPS会有不同的实现底层实现AP_GPS_UBLOX六:AP_Baro 气压计相关库PX4AP_Baro_PX4对外接口参考Healthy() 判断气压计能否正常工作bool init(); 初始化uint8_t read();float get_pressure(); 获取气压值float get_temperature(); 获取气温值get_altitude() 获取高度值calibrate() 校准气压计get_climb_rate() 获取爬升率DerivativeFilterstruct baro_report {float pressure;float altitude;float temperature;uint64_t timestamp;uint64_t error_count;};AP_Baro_Glitch.h 气压计干扰保护库check_alt() 判断气压计是否正常中Baro_Glitch支持几种类型的气压计AP_Baro_BMP085AP_Baro_HILAP_Baro_MS5611AP_Baro_PX4AP_Baro_VRBRAIN本例中使用的是AP_Baro_PX4七:AP_Compass_PX4 三轴罗盘相关库接口参考AP_Compass_PX4.h和Compass.hInit() 三轴罗盘初始化Read() 从罗盘驱动读取数据get_field() 获取罗盘数据八:AP_InertialSensor 惯性传感器主要接口:init( Start_style style, Sample_rate sample_rate) 加速度计和陀螺仪初始化update() 根据罗盘、加速度的._gyro_health 情况更新主陀螺仪、主加速度计get_gyro_drift_rate(void) 获取最大的陀螺漂移率get_accel() 获取加速度信息get_gyro() 获取陀螺仪信息AP_InertialSensor_Backend/AP_InertialSensor_PX4主要接口:Update()循环被调用,获取陀螺仪、加速度信息,并通过_rotate_and_offset_gyro() _rotate_and_offset_acce 对获取的信息做矩阵变换最终输出保留在_imu._gyro[instance]_imu._gyro_healthy[instance]_imu._accel[instance]_imu._accel_healthy[instance]中accel_sample_available() 判断加速度传感器可用gyro_sample_available() 判断陀螺仪传感器可用_rotate_and_offset_gyro(uint8_t instance, const Vector3f &gyro) gyro 为从陀螺仪获取的姿态数据{_imu._gyro[instance] = gyro;_imu._gyro[instance].rotate(_imu._board_orientation);_imu._gyro[instance] -= _imu._gyro_offset[instance];_imu._gyro_healthy[instance] = true;}_rotate_and_offset_accel(uint8_t instance, const Vector3f &accel){// accel 为从加速度计获取的加速度信息_imu._accel[instance] = accel;_imu._accel[instance].rotate(_imu._board_orientation);const Vector3f &accel_scale = _imu._accel_scale[instance].get();_imu._accel[instance].x *= accel_scale.x;_imu._accel[instance].y *= accel_scale.y;_imu._accel[instance].z *= accel_scale.z;_imu._accel[instance] -= _imu._accel_offset[instance];_imu._accel_healthy[instance] = true;}_set_accel_error_count() 从陀螺仪、加速度计获取error信息_set_gyro_error_count()_default_filter()属性:AP_InertialSensor &_imu;九:AP_AHRS Attitude Heading Reference System 航姿系统AP_AHRS_DCMAP_AHRS_NavEKF采用DCM(方向余弦矩阵方法)或EKF(扩展卡尔曼滤波方法)预估飞行器姿态姿态和方位参考系统综合惯性传感器、气压采样、gps进行姿态和方位管理接口:AP_AHRS_NavEKF(AP_InertialSensor &ins, AP_Baro &baro, AP_GPS &gps)Init() 设置ins、compass的反向AP_AHRSset_compass(Compass *compass) 设置磁罗盘set_airspeed(AP_Airspeed *airspeed)get_accel_ef(void) 获取加速度计的值in earth frameairspeed_estimate() 预估空速AP_AHRS_NavEKFadd_trim(….) 调整-trim roll 、pitchgroundspeed_vector() 预估飞机相对地面的水平速度update_trig(void) 根据dcm旋转矩阵更新cos_yaw、sina_yaw、cos_roll、sina_roll、sina_yaw、cos_yawupdate_cd_values(void) 根据roll、yaw、pitch更新roll_sensor、yaw_sensor、pitch_sensor get_gyro(void) 获取漂移校准的陀螺矢量get_gyro_drift(void)get_position(struct Location &loc) 获取当前位置,高度通过气压计计算,gpseuler_angles(void) 计算欧拉角、方向矩阵estimate_wind() 预估风速get_dcm_matrix(void) 获取方向余弦矩阵get_error_rp(void)get_error_yaw(void)update() 更新数据AP_Airspeed十:AP_Mission 结合AP_AHRS进行飞行任务管理十一:AP_RangeFinder 声呐或红外测距传感器的交互库十二:RCMapper通道映射,保存了roll、pitch、yaw、throttle的输入通道ID十三:AP_BoardConfig十四:AP_BattMonitor 电源模块管理十五:AP_Frsky_Telem十六:AP_InertialNav\AP_InertialNav_NavEKF 扩展带有gps和气压计数据的惯性导航库接口:get_altitude() 获取高度信息get_velocity_z() 获取z轴上的速度get_longitude() 获取基于经度的加速度get_latitude() 获取基于纬度的加速度get_latitude_diff()get_longitude_diff()get_velocity_xy() 设置在经度和纬度方向的速度十七:AC_AttitudeControl_Heli/AC_AttitudeControl 航姿控制相关库属性:_angle_ef_target模块接口:rate_controller_run()angle_ef_roll_pitch_rate_ef_yaw_smooth()frame_conversion_ef_to_bf(const Vector3f& ef_vector, Vector3f& bf_vector) 世界坐标转换到体坐标frame_conversion_bf_to_ef (const Vector3f& bf_vector, Vector3f& ef_vector) 体坐标系转换到世界坐标系relax_bf_rate_controller()set_yaw_target_to_current_heading() 设置目标航线为当前方向set_throttle_out()angle_ef_roll_pitch_rate_ef_yaw_smooth()set_throttle_out()十八:AC_PosControl 位置控制模块模块接口:AC_PosControl(const AP_AHRS& ahrs, const AP_InertialNav& inav, const AP_Motors& motors, AC_AttitudeControl& attitude_control,AC_P& p_alt_pos, AC_P& p_alt_rate, AC_PID& pid_alt_accel, AC_P& p_pos_xy, AC_PID& pid_rate_lat, AC_PID& pid_rate_lon)set_alt_target() 设置目标高度set_dt(float delta_sec) 设置时间间隔set_alt_max(float alt) 设置最大的高度set_speed_z(float speed_down, float speed_up) 设置最大的爬升和下降速度set_accel_z(float accel_cmss) 设置垂直加速度set_alt_target_with_slew() 调整目标高度为最终目标set_alt_target_from_climb_rate() 通过爬升速率、时间调整目标高度get_alt_error() 返回高度误差get_stopping_point_z() 计算停止点高度init_takeoff() 起飞前初始化高度calc_leash_length()lean_angles_to_accel() 将角度转换为加速度accel_to_lean_angles() 将水平方向的期望转换为roll、pitch的角度init_vel_controller_xyz()update_vel_controller_xyz()init_xy_controller()update_xy_controller()update_z_controller()属性:_dt 时间间隔_alt_max 距离home位置的最大高度_speed_up_cms 最大的爬升速率cm/s_speed_down_cms 最大的下降速率cm/s_accel_z_cms 最大垂直加速度_accel_cms 最大水平加速度_speed_cms 最大水平速度_leash; 水平误差_leash_down_z 向下误差_leash_up_z 向上误差_throttle_hover 估算的油门输出值_pos_target 目标位置_last_update_xy_ms 上次执行update_xy_controller的时间_last_update_z_ms 上次执行update_z_controller的时间_last_update_vel_xyz_ms 上次执行update_vel_controller_xyz的时间_roll_target 输出的roll值_pitch_target 输出的pitch值十九:AP_Motors / AP_MotorsMatrix 多旋翼和传统直升机混合的电机库接口:Init() 初始化set_update_rate() 设置输出频率set_frame_orientation()enable() 安全开关output() 输出数据的接口,设置各个电机的valueset_roll(int16_t roll_in) Motors的对外接口,AC通过该接口设置计算出来的值set_pitch(int16_t pitch_in)set_yaw(int16_t yaw_in)set_throttle(int16_t throttle_in)二十:AC_WPNav 在loiter等模式中使用接口函数:AC_WPNav(const AP_InertialNav& inav, const AP_AHRS& ahrs, AC_PosControl& pos_control)init_loiter_target() 初始化当前位置和速度update_loiter()get_yaw()get_roll()get_pitch()二十一:AC_Circle 在Circle模式中使用设置飞机飞行的范围参数原点、半径,然后每次循环根据当前位置计算下一个点的roll、pitch、yaw接口函数:init(const Vector3f& center)init()update()get_roll()get_pitch()get_yaw()二十二:AP_Relay二十三:AP_ServoRelayEvents二十四:AP_Param 运行时参数管理,配置参数的读写二十五:StorageManager/StorageAccess/PX4Storage提供了对hal->Storage进行读写封装二十六:AC_PIDPID算法库主要接口函数:get_p(float error) 计算比例放大分量get_i(float error, float dt) 计算积分放大分量get_d(float input, float dt) 计算微分放大分量get_pi(float error, float dt) 计算比例放大和积分放大分量get_pid(float error, float dt) 计算PID值AC_P 计算比例放大分量的库主要接口函数:get_p(float error) 计算比例放大分量AP_Mission:从eeprom(电可擦只读存储器)存储/读取飞行指令相关库AP_Buffer:惯性导航时所用到的一个简单的堆栈(FIFO,先进先出)缓冲区AP_Mount,AP_Camera, AP_Relay:相机安装控制库,相机快门控制库保持飞机速度始终始终不超过设置的最小速度API接口:void enable(bool true_false)bool enabled() //设置和判断控制速度功能是否可用void test_pump(bool true_false) //主要用于控制速度功能测试void set_pump_rate(float pct_at_1ms) //设置速度调整的参数void update(); // 被循环调用,不停的判断飞机速度是否超过设置的最小速度。
ardupilot(EKF)扩展卡尔曼滤波
ardupilot(EKF)扩展卡尔曼滤波一、初识卡尔曼滤波器为了描述方便我从网上找了一张卡尔曼滤波器的5大公式的图片。
篇幅所限,下图所示的是多维卡尔曼滤波器(因为EKF2是多维扩展卡尔曼滤波器,所以我们从多维说起),为了跟好的理解卡尔曼滤波器可以百度一下,从一维开始。
这5个公式之外还有一个观测模型,根据你实际的观测量来确定,它的主要作用是根据实际情况来求观测矩阵H。
因为卡尔曼滤波器是线性滤波器,状态转移矩阵A和观测矩阵H是确定的。
在维基百科上状态转移矩阵用F表示。
在ardupilot EKF2算法中,状态转移矩阵也是用F表示的。
下面是维基百科给出的线性卡尔曼滤波器的相关公式。
上述更新(后验)估计协方差的公式对任何增益K k都有效,有时称为约瑟夫形式。
为了获得最佳卡尔曼增益,该公式进一步简化为P k|k=(I-K k H k)P k|k-1,它在哪种形式下应用最广泛。
但是,必须记住它仅对最小化残差误差的最佳增益有效。
为了使用卡尔曼滤波器来估计仅给出一系列噪声观测过程的内部状态,必须根据卡尔曼滤波器的框架对过程进行建模,这意味着指定一下矩阵:只要记住一点就行了,卡尔曼滤波器的作用就是输入一些包含噪声的数据,得到一些比较接近真是情况的数据。
比如无人机所使用的陀螺仪和加速度计的读值,他们的读值都是包含噪声的,比如明明真实的角速度是俯仰2°/s,陀螺仪的读值却是2.5°/s。
通过扩展卡尔曼之后的角速度值会变得更加接近2º/s的真实值,有可能是2.1º/s。
二、扩展卡尔曼滤波器因为卡尔曼滤波器针对的是线性系统,状态转移模型(说的白话一点就是知道上一时刻被估计量的值,通过状态转移模型的公式可以推算出当前时刻被估计量的值)和观测模型。
注:有的资料显示状态模型中有,有的没有,目前我也不清楚是为什么,有可能和被估计的对象有关。
但看多了你就会发现不管网上给的公式有怎样的不同,但总体的流程是一样的,都是这5大步骤。
基于Ardupilot的微型无人船航向控制系统设计
基于Ardupilot的微型无人船航向控制系统设计作者:方洵黄辉来源:《科技创新与应用》2018年第30期摘要:APM系统平台上通用配置方式与Mavlink通讯协议参数理解。
在RTPS协议下进行控制系统设计,对无人船航向控制过程中的风浪混合干扰,对PX4平台原生mahony算法与导航控制算法修缮,结合模糊PID控制技术,提出有效的PD控制手段,实现控制参数自适应调整与优化。
采用Ardupilot平台反馈消息,并在Matlab上对控制算法优化分析,得到姿态控制优化曲线,航向控制的压线、点情况较好。
关键词:Ardupilot;pixhawk;mahony算法;Fast RTPS;模糊PID中图分类号:TP273 文献标志码:A 文章编号:2095-2945(2018)30-0027-05Abstract: The general configuration mode on APM system platform and the parameter understanding of Mavlink communication protocol are introduced. In this paper, the control system is designed under the RTPS protocol, and the original mahony algorithm and navigation control algorithm of PX4 platform are repaired under the mixed wind and wave interference in the course control of micro unmanned surface vessel (USV). Based on Fuzzy PID control technology, a simple and effective PD control method is proposed to realize the adaptive adjustment and optimization of control parameters. The Ardupilot platform was used to provide feedback information, and the optimization analysis of control algorithm was carried out in Matlab. The optimized curve of attitude control was obtained.Keywords: Ardupilot; pixhawk; mahony algorithm; Fast RTPS; Fuzzy PID1 概述1.1 课题研究背景、目的及意义在无人技术领域,相对无人机,无人车的迅猛发展,无人船的研究相对滞后。
5.深入Istio源码:Pilot-agent作用及其源码分析
5.深⼊Istio源码:Pilot-agent作⽤及其源码分析本⽂使⽤的Istio源码是 release 1.5。
介绍Sidecar在注⼊的时候会注⼊istio-init和istio-proxy两个容器。
Pilot-agent就是启动istio-proxy的⼊⼝。
通过kubectl命令我们可以看到启动命令:[root@localhost ~]# kubectl exec -it details-v1-6c9f8bcbcb-shltm -c istio-proxy -- ps -efwwUID PID PPID C STIME TTY TIME CMDistio-p+ 1 0 0 08:52 ? 00:00:13 /usr/local/bin/pilot-agent proxy sidecar --domain default.svc.cluster.local --configPath /etc/istio/proxy --binaryPath /usr/local/bin/envoy --serviceCluster details.default --drainDuration 45s --parentShutdow istio-p+ 18 1 0 08:52 ? 00:01:11 /usr/local/bin/envoy -c /etc/istio/proxy/envoy-rev0.json --restart-epoch 0 --drain-time-s 45 --parent-shutdown-time-s 60 --service-cluster details.default --service-node sidecar~172.20.0.14~details-v1-6c9f Pilot-agent除了启动istio-proxy以外还有以下能⼒:⽣成Envoy的Bootstrap配置⽂件;健康检查;监视证书的变化,通知Envoy进程热重启,实现证书的热加载;提供Envoy守护功能,当Envoy异常退出的时候重启Envoy;通知Envoy优雅退出;代码执⾏流程分析proxyCmd = &mand{Use: "proxy",Short: "Envoy proxy agent",FParseErrWhitelist: cobra.FParseErrWhitelist{UnknownFlags: true,},RunE: func(c *mand, args []string) error {...// ⽤于设置默认配置⽂件的默认配置相关参数proxyConfig := mesh.DefaultProxyConfig()// set all flagsproxyConfig.CustomConfigFile = customConfigFileproxyConfig.ProxyBootstrapTemplatePath = templateFileproxyConfig.ConfigPath = configPathproxyConfig.BinaryPath = binaryPathproxyConfig.ServiceCluster = serviceClusterproxyConfig.DrainDuration = types.DurationProto(drainDuration)proxyConfig.ParentShutdownDuration = types.DurationProto(parentShutdownDuration)proxyConfig.DiscoveryAddress = discoveryAddressproxyConfig.ConnectTimeout = types.DurationProto(connectTimeout)proxyConfig.StatsdUdpAddress = statsdUDPAddress...ctx, cancel := context.WithCancel(context.Background())// 启动 status serverif statusPort > 0 {localHostAddr := localHostIPv4if proxyIPv6 {localHostAddr = localHostIPv6}prober := kubeAppProberNameVar.Get()//健康探测statusServer, err := status.NewServer(status.Config{LocalHostAddr: localHostAddr,AdminPort: proxyAdminPort,//通过参数--statusPort 15020设置StatusPort: statusPort,KubeAppProbers: prober,NodeType: role.Type,})if err != nil {cancel()return err}go waitForCompletion(ctx, statusServer.Run)}...//构造Proxy实例,包括配置,启动参数等envoyProxy := envoy.NewProxy(envoy.ProxyConfig{Config: proxyConfig,Node: role.ServiceNode(),LogLevel: proxyLogLevel,ComponentLogLevel: proxyComponentLogLevel,PilotSubjectAltName: pilotSAN,MixerSubjectAltName: mixerSAN,NodeIPs: role.IPAddresses,DNSRefreshRate: dnsRefreshRate,PodName: podName,PodNamespace: podNamespace,PodIP: podIP,SDSUDSPath: sdsUDSPath,SDSTokenPath: sdsTokenPath,STSPort: stsPort,ControlPlaneAuth: controlPlaneAuthEnabled,DisableReportCalls: disableInternalTelemetry,OutlierLogPath: outlierLogPath,PilotCertProvider: pilotCertProvider,})//构造agent实例,实现了Agent接⼝agent := envoy.NewAgent(envoyProxy, features.TerminationDrainDuration())if nodeAgentSDSEnabled {tlsCertsToWatch = []string{}}//构造watcher实例watcher := envoy.NewWatcher(tlsCertsToWatch, agent.Restart)//启动 watchergo watcher.Run(ctx)// 优雅退出go cmd.WaitSignalFunc(cancel)//启动 agentreturn agent.Run(ctx)},}执⾏流程⼤概分成这么⼏步:1. ⽤于设置默认配置⽂件的默认配置相关参数;2. 启动 status server进⾏健康检测;3. 构造Proxy实例,包括配置,启动参数,并构造构造agent实例;4. 构造watcher实例,并启动;5. 开启线程监听信号,进⾏优雅退出;6. 启动 agent;默认配置相关参数kubectl exec -it details-v1-6c9f8bcbcb-shltm -c istio-proxy -- /usr/local/bin/pilot-agent proxy --helpEnvoy proxy agentUsage:pilot-agent proxy [flags]Flags:--binaryPath string Path to the proxy binary (default "/usr/local/bin/envoy")--concurrency int number of worker threads to run--configPath string Path to the generated configuration file directory (default "/etc/istio/proxy")--connectTimeout duration Connection timeout used by Envoy for supporting services (default 1s)--controlPlaneAuthPolicy string Control Plane Authentication Policy (default "NONE")--controlPlaneBootstrap Process bootstrap provided via templateFile to be used by control plane components. (default true)--customConfigFile string Path to the custom configuration file--datadogAgentAddress string Address of the Datadog Agent--disableInternalTelemetry Disable internal telemetry--discoveryAddress string Address of the discovery service exposing xDS (e.g. istio-pilot:8080) (default "istio-pilot:15010")--dnsRefreshRate string The dns_refresh_rate for bootstrap STRICT_DNS clusters (default "300s")--domain string DNS domain suffix. If not provided uses ${POD_NAMESPACE}.svc.cluster.local--drainDuration duration The time in seconds that Envoy will drain connections during a hot restart (default 45s)--envoyAccessLogService string Settings of an Envoy gRPC Access Log Service API implementation--envoyMetricsService string Settings of an Envoy gRPC Metrics Service API implementation-h, --help help for proxy--id string Proxy unique ID. If not provided uses ${POD_NAME}.${POD_NAMESPACE} from environment variables--ip string Proxy IP address. If not provided uses ${INSTANCE_IP} environment variable.--lightstepAccessToken string Access Token for LightStep Satellite pool--lightstepAddress string Address of the LightStep Satellite pool--lightstepCacertPath string Path to the trusted cacert used to authenticate the pool--lightstepSecure Should connection to the LightStep Satellite pool be secure--mixerIdentity string The identity used as the suffix for mixer's spiffe SAN. This would only be used by pilot all other proxy would get this value from pilot --outlierLogPath string The log path for outlier detection--parentShutdownDuration duration The time in seconds that Envoy will wait before shutting down the parent process during a hot restart (default 1m0s)--pilotIdentity string The identity used as the suffix for pilot's spiffe SAN--proxyAdminPort uint16 Port on which Envoy should listen for administrative commands (default 15000)--proxyComponentLogLevel string The component log level used to start the Envoy proxy (default "misc:error")--proxyLogLevel string The log level used to start the Envoy proxy (choose from {trace, debug, info, warning, error, critical, off}) (default "warning")--serviceCluster string Service cluster (default "istio-proxy")--serviceregistry string Select the platform for service registry, options are {Kubernetes, Consul, Mock} (default "Kubernetes")--statsdUdpAddress string IP Address and Port of a statsd UDP listener (e.g. 10.75.241.127:9125)--statusPort uint16 HTTP Port on which to serve pilot agent status. If zero, agent status will not be provided.--stsPort int HTTP Port on which to serve Security Token Service (STS). If zero, STS service will not be provided.--templateFile string Go template bootstrap config--tokenManagerPlugin string Token provider specific plugin name. (default "GoogleTokenExchange")--trust-domain string The domain to use for identities--zipkinAddress string Address of the Zipkin service (e.g. zipkin:9411)从上⾯输出我们也可以看到proxy参数的含义以及对应的默认值。
ArduPilot自动驾驶仪中文手册(待完稿)
ArduPilot 自动驾驶仪手册一、简介系统构成:1、一块ArduPilot Mega板(红色)2、一块ArduPilot Mega IMU板(红色)3、一套 MediaTek GPS 或者 uBlox GPS模块4、若干根接收机连接线及配套的插线,如果需要使用系统的自动驾驶和功能,推荐使用8通道接收机5、一套Xbee数传电台,一块Xbee数传电台与ArduPilot Mega IMU,另一块通过适配器与PC相连(提醒:因传送的数据量大,推荐配置空中速率位57600bps的数传电台,低速率数传电台将会导致严重的数据丢包现象)。
仔细阅读本手册,将有利于调试自动驾驶仪。
作为一套开源的自动驾驶仪,我们支持第三方传感器的接入,如空速计、电子罗盘等,这意味着您必须对本系统进行正确的参数设置,才能安全飞行。
二、快速入门指南(一)电路板的组装所需材料及工具:MEGA 板和IMU板各一块;板件连接插件若干;带连线的GPS模块(推荐4HZ);烙铁;焊丝等1、焊接MEGA机IMU板上的元器件2、对应安装好两块板子之间的连接插件3、两块板子相插4、连接GPS模块之后的样子,注意:GPS模块连接在红色MEGA板子上,而非蓝色IMU板子上的接口,IMU的6芯接口用于连接诸如电子罗盘等外接传感器。
(二)如何连接1、系统连接图其中,自动驾驶仪控制通道为第八通道,利用三段开关进行模式切换。
2、安装示意图因IMU板载三轴传感器,系统安装时需充分考虑到减震,尽量使其在飞机上水平安装,且安装方向应如上图所示。
3、DIP开关的使用因为接收机和配置文件之间会存在差异,可能会导致舵机出现反向工作,这时你可以通过拨动DIP开关进行修正,而非通过复杂的参数修改进行修正。
三、编程(一)所需工具1、MINI USB数据线,用于ardupilot与PC的相连。
2、配置软件arduino,下载地址/en/Main/Software(二)如何通过arduino进行编程1、通过USB连接arduino与PC,同时根据提示安装FT232RL驱动,并记下串口号。
APM飞控程序解读
* Dani Saez
:V Octo Support
* Gregory Fletcher :Camera mount orientation math
* Guntars
:Arming safety suggestion
* HappyKillmore
:Mavlink GCS
* Hein Hollander
:Octo Support
* Igor van Airde
:Control Law optimization
* Leonard Hall
:Flight Dynamics, Throttle, Loiter and Navigation Controllers
* Jonathan Challinger :Inertial Navigation
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
:Camera mount library
* Andrew Tridgell
:General development, Mavlink Support
* Angel Fernandez
:Alpha testing
* Doug Weibel
:Libraries
* Christof Schmid
arduino 解析长度阈值
arduino 解析长度阈值Arduino是一个开源电子平台,可以用于快速设计和开发各种电子设备和交互式项目。
它由一块单片机板和一套易于使用的开发环境组成,可以轻松编写和上传代码到单片机上。
Arduino平台广泛用于学术研究、创客教育和创意设计等领域。
在Arduino编程中,解析长度阈值是指对传感器或外设发送的数据进行解析时,设定的数据长度的阈值。
当接收到的数据长度大于或等于设定的阈值时,才进行解析和处理,否则继续等待接收更多的数据。
解析长度阈值在实际应用中主要用于防止接收到的数据不完整或出错的情况下进行解析,保证数据的准确性和完整性。
例如,在串口通信中,如果每次接收到的数据长度小于解析长度阈值,可能说明数据传输存在问题,可以选择丢弃该数据或等待更多的数据。
只有当接收到的数据长度达到或超过设定的解析长度阈值时,才进行后续的数据解析和处理。
设置解析长度阈值需要在Arduino编程中使用条件判断语句来实现。
一般可以使用`if`语句判断接收到的数据长度是否大于或等于解析长度阈值,并在条件成立时执行解析和处理的代码。
例如:```cppif (data.length() >= 1500) {//数据解析和处理的代码}```其中,`data`表示接收到的数据,`length()`函数用于获取数据的长度。
在上述代码中,当接收到的数据长度大于或等于1500时,才执行解析和处理的代码。
需要注意的是,解析长度阈值的设定要根据具体的应用需求和数据特点进行合理设置。
如果阈值设置过小,可能会频繁进行解析,增加系统的负荷和功耗;如果阈值设置过大,可能会延迟数据的解析和处理,影响系统的实时性。
总之,解析长度阈值是一种在Arduino编程中常用的技巧,用于保证接收到的数据的准确性和完整性。
通过合理设置阈值,可以实现对数据的有效解析和处理,提高系统的稳定性和可靠性。
ardupilot 交叉编译
ardupilot 交叉编译ArduPilot是一个开源的无人机自主飞行控制系统,它提供了一套完整的软件和硬件解决方案,用于控制无人机的飞行和导航。
在开发ArduPilot时,我们经常需要进行交叉编译,以便将软件部署到不同的硬件平台上。
本文将介绍ArduPilot交叉编译的过程和一些注意事项。
什么是交叉编译?简单来说,交叉编译是指在一台主机上开发和编译代码,然后将编译后的可执行文件部署到另一种不同体系结构的硬件平台上运行。
在ArduPilot的情况下,我们通常在一台PC上进行开发,并将编译后的代码部署到无人机的嵌入式系统上运行。
为了进行ArduPilot的交叉编译,我们首先需要选择合适的交叉编译工具链。
不同的硬件平台可能需要不同的工具链,因此我们需要根据目标平台的体系结构选择合适的工具链。
例如,如果我们的目标平台是基于ARM架构的嵌入式系统,我们可以选择ARM交叉编译工具链。
一旦选择了合适的工具链,我们就可以开始配置ArduPilot的编译环境。
首先,我们需要下载ArduPilot的源代码,并将其解压到本地目录中。
然后,我们需要根据目标平台的体系结构和工具链的路径,修改ArduPilot的编译配置文件。
在配置文件中,我们可以指定编译的目标平台、工具链的路径和一些其他的编译选项。
我们可以根据实际需求进行配置,例如指定编译的优化级别、启用或禁用某些功能等。
配置完成后,我们可以运行编译命令,开始进行ArduPilot的交叉编译。
在编译过程中,我们可能会遇到一些依赖项缺失或编译错误的问题。
这时,我们需要根据错误信息进行排查,并安装相应的依赖项或修复错误。
通常,ArduPilot的开发社区会提供一些常见问题的解决方案和建议,我们可以参考这些资源来解决问题。
一旦编译成功,我们就可以将编译后的可执行文件部署到目标平台上运行了。
在部署过程中,我们需要将可执行文件复制到目标平台的文件系统中,并配置相应的启动脚本或配置文件。
ardupilot(EKF)扩展卡尔曼滤波
ardupilot(EKF)扩展卡尔曼滤波ardupilot(EKF)扩展卡尔曼滤波⼀、初识卡尔曼滤波器为了描述⽅便我从⽹上找了⼀张卡尔曼滤波器的5⼤公式的图⽚。
篇幅所限,下图所⽰的是多维卡尔曼滤波器(因为EKF2是多维扩展卡尔曼滤波器,所以我们从多维说起),为了跟好的理解卡尔曼滤波器可以百度⼀下,从⼀维开始。
这5个公式之外还有⼀个观测模型,根据你实际的观测量来确定,它的主要作⽤是根据实际情况来求观测矩阵H。
因为卡尔曼滤波器是线性滤波器,状态转移矩阵A和观测矩阵H是确定的。
在维基百科上状态转移矩阵⽤F表⽰。
在ardupilot EKF2算法中,状态转移矩阵也是⽤F表⽰的。
下⾯是维基百科给出的线性卡尔曼滤波器的相关公式。
上述更新(后验)估计协⽅差的公式对任何增益K k都有效,有时称为约瑟夫形式。
为了获得最佳卡尔曼增益,该公式进⼀步简化为P k|k=(I-K k H k)P k|k-1,它在哪种形式下应⽤最⼴泛。
但是,必须记住它仅对最⼩化残差误差的最佳增益有效。
为了使⽤卡尔曼滤波器来估计仅给出⼀系列噪声观测过程的内部状态,必须根据卡尔曼滤波器的框架对过程进⾏建模,这意味着指定⼀下矩阵:只要记住⼀点就⾏了,卡尔曼滤波器的作⽤就是输⼊⼀些包含噪声的数据,得到⼀些⽐较接近真是情况的数据。
⽐如⽆⼈机所使⽤的陀螺仪和加速度计的读值,他们的读值都是包含噪声的,⽐如明明真实的⾓速度是俯仰2°/s,陀螺仪的读值却是2.5°/s。
通过扩展卡尔曼之后的⾓速度值会变得更加接近2o/s的真实值,有可能是2.1o/s。
⼆、扩展卡尔曼滤波器因为卡尔曼滤波器针对的是线性系统,状态转移模型(说的⽩话⼀点就是知道上⼀时刻被估计量的值,通过状态转移模型的公式可以推算出当前时刻被估计量的值)和观测模型。
注:有的资料显⽰状态模型中有,有的没有,⽬前我也不清楚是为什么,有可能和被估计的对象有关。
但看多了你就会发现不管⽹上给的公式有怎样的不同,但总体的流程是⼀样的,都是这5⼤步骤。
ardupilot扩展参数
ardupilot扩展参数全文共四篇示例,供读者参考第一篇示例:ArduPilot是一个开源的自动驾驶系统,被广泛应用于各种无人机和自动车辆中。
ArduPilot系统具有丰富的功能和参数设置,方便用户根据自己的需求进行定制和调整。
除了系统自带的参数外,用户还可以通过扩展参数来进一步优化和个性化系统的功能。
本文将介绍ArduPilot的扩展参数及其使用方法。
需要说明的是,ArduPilot的扩展参数通常是由第三方开发者或用户编写的,用于扩展系统的功能或增加新的功能。
这些扩展参数可以在官方文档或社区论坛中找到,并且通常会提供详细的安装和配置说明。
一般来说,用户需要将扩展参数文件下载到本地,并通过地面站软件将其上传到ArduPilot系统中。
ArduPilot的扩展参数通常包括各种功能模块的配置参数,例如导航模块、传感器模块、控制器模块等。
用户可以根据自己的需求选择适合的扩展参数,并进行相应的配置。
下面将介绍一些常见的ArduPilot扩展参数及其作用:1. 航点参数:航点是无人机执行任务时需要依次到达的目标点。
用户可以通过设置航点参数来调整无人机的飞行路径和航点顺序。
可以设置航点的坐标、高度、速度等参数,以实现特定的飞行任务。
2. 控制器参数:控制器是无人机飞行控制系统的核心部件,用于稳定飞行和执行各种飞行动作。
用户可以通过设置控制器参数来调整无人机的姿态、速度和加速度控制,以适应不同的环境和任务需求。
3. 传感器参数:传感器是无人机感知外部环境的重要组件,包括GPS、惯性测量单元(IMU)、气压计等。
用户可以通过设置传感器参数来提高系统的精度和稳定性,例如调整传感器校准参数、滤波参数等。
ArduPilot的扩展参数为用户提供了丰富的配置选项,可以根据不同的需求定制和优化系统的功能。
通过合理设置扩展参数,用户可以提高无人机的飞行性能、安全性和稳定性,实现更加精确和高效的飞行任务。
建议用户在使用ArduPilot系统时,多关注和尝试各种扩展参数,以发挥系统最大的潜力和效益。
知行合一ArduPilotArduPilot系统框架简述
知行合一ArduPilotArduPilot系统框架简述一、应用编程IAP1.1 IAPIAP是In Application Programming的首字符缩写。
IAP是用户自己的程序在运行过程中对User Flash部分进行烧写,目的是为了在产品发布以后通过预留的接口对产品固件进行升级。
要想实现IAP,FLASH中需要存在2个程序:Bootloader和APP。
设备启动时,首先运行Bootloader,判断是否需要升级。
如果需要升级,则通过预留的接口,获取新固件,并烧写进flash;如果不需要升级,则直接跳到APP中运行,完成启动。
1.2 IAP在STM32中的应用一片STM32芯片的Code(代码)区内一般只有一个用户程序。
而IAP方案则是将代码区划分为两部分,两部分区域各存放一个程序,一个叫bootloader(引导加载程序),另一个较user application(用户应用程序)。
bootloader在出厂时就固定下来了,在需要变更user application时只需要通过触发bootloader对user application的擦除和重新写入即可完成用户应用程序的更换。
STM32上电时,硬件会自动将0x0800 0000处的代码映射到0x0000 0000处,然后从0x0000 0000处开始运行,所以可以认为,STM32从0x0800 0000处开始运行。
所以,需要把Bootloader内容烧写在0x0800 0000处。
然后将APP内容烧写在FLASH剩余的区域。
在只有一个程序的情况下,程序的执行流程图如下图所示:STM32有一个中断向量表,这个中断向量表存放在代码开始部分的后4个字节处(即0x08000004),代码开始的4个字节存放的是堆栈栈顶的地址,当发生中断后程序通过查找该表得到相应的中断服务程序入口地址,然后再跳到相应的中断服务程序中执行。
上电后从0x08000004处取出复位中断向量的地址,然后跳转到复位中断程序的入口(标号①所示),执行结束后跳转到main函数中(标号②所示)。
Pixhawk飞控源码结构及编译流程分析
源码目录结构(获取源码的方法这里就不多说了,官网或者百度都找得到,用Git工具或者直接上github 下载都可以,推荐还是通过git工具去载, 毕竟在调用make编译之前其实还会通过git去载一些缺少模块,我的是vmware 下的Ubuntu的环境。
这博客在win下写吧,贴代码好像不是很方便,ubuntu下吧截图工具没有又qq截图来得好用,感觉博客写起来有点蛋疼,不知道你们都是咋写的……然后我关注的也是Copter部分,别的就没有深入了解也就不多说……)一、Vehicle directory:ArduCopter(多旋翼)、ArduPlane(固定翼)、APMrover2(巡逻车)、AntennaTracker(天线追踪站台?)二、AP_HAL:硬件抽象层三、Libraries:库文件四、Tools directory:Tools/scripts/install-prereqs-ubuntu.sh//运行这个shell脚本会自动安装ubuntu 环境下编译固件所需要工具,下面看下该文件的内容5 BASE_PKGS="gawk make git arduino-core curl"6 PYTHON_PKGS="pymavlink MAVProxy droneapi catkin_pkg"7 PX4_PKGS="Python-serial python-argparse openocd flex bison libncurses5-dev \8 autoconf texinfo build-essential libftdi-dev libtool zlib1g-dev \9 zip genromfs python-empy"10 BEBOP_PKGS="g++-arm-linux-gnueabihf"11 SITL_PKGS="g++ python-pip python-setuptools python-matplotlib python-serial python-scipy python-opencv python-numpy python-pyparsing ccache realpath"。
ardupilot设置指南
介绍需要的部件∙一块ArduPilot Mega 板∙一个带有连接器的ArduPilot Mega IMU 板∙一个MediaTek GPS 模块或uBlox GPS 模块。
(与适配器一起订购,并为ArduPilot编程).∙双母头舵机线,数量为ArduPilot Mega 控制的通道数加1。
基本设置为4通道,但APM 可最多控制8个通道。
其中一个通道用来控制ArduPilot Mega。
∙用来无线遥测的两个Xbee 无线模块和两个适配器。
我们在空中使用这个Xbee,地面使用这个Xbee和这个天线. 可以在空中使用这个XtreamBee 适配器,并地面使用Sparkfun USB 适配器; 或者可以使用两个XtreamBee 适配器,在地面上的那个使用一条FTDI 传输线连到电脑上。
你还需要一个至少5通道的遥控设备,一个烙铁,一条mini USB线,当然还有一个能飞的东西!(我们偏爱EasyStar和SkyFun飞翼).方法仔细阅读说明书!某一天自驾仪将成为一个能在沃尔玛买到的即插即用设备,但可惜不是现在。
飞行器各不相同,而作为一个开源项目我们尽可能支持广泛的硬件配置。
这就意味着在飞行之前你必须配置自驾仪。
一旦你配置好,你还需要根据自己的飞机来调整自驾仪。
采用循序渐进的方法,也就是说,首先处理基本问题,每次只改变一到两个设置,然后测试是否合适,在进行下一项调整。
另外重要一点是只有在理解之后再做尝试。
在还没有良好理解和阅读注意事项之前使用使用默认设置。
反复阅读基本章节。
保留以前的版本,这对排除问题是很有用的,或者也可以恢复到以前正常工作的版本。
如果存在疑问,在飞真机之前使用模拟器!连接到电脑上APM 使用一条miniB USB 数据线。
如下所示插到板子上:当吧你的APM 用USB 数据线连到电脑上时,Windows 7 将识别FTDI USB转串口芯片并安装正确的驱动。
如果没有识别,或者你使用早期版本的Windows,你需要从这里下载和安装正确的驱动。
2021.1ArduPilot开源飞控发展报告
2021.1ArduPilot开源飞控发展报告ArduPilot发展报告2021.1Andrew Tridgell 和 Randy Mackay 及AP开发团队统计数据上个月在我们的github存储库中看到了中等水平的活动: ●514个补丁影响60,000行代码,更新64个Wiki信息●56个贡献者●开发人员每周会议参加人数均为25人以上驱动程序变更本月对以下传感器和系统驱动程序进行了更改:●在AP_Periph中支持Septentrio GPS(适用于HitecMosaic)●AP_Motors添加了对十轴多旋翼的支持●将baro parameters重命名为BARO prefix●添加了MSP空速支持●修复了EK2 / EK3中的空速融合错误●增加了多旋翼风估计●增加了气流的气压补偿●在Windows上加快RF9 SITL●添加了iFlight beast飞控端口●为Pixracer添加了AP_Periph目标●添加了对双向DShot的支持●添加了Sagetech XP ADSB驱动程序●添加了NWPMU CAN EFI驱动程序●添加了USD1 CAN雷达支持●在CAND消息中添加了UAVCAN设备的日志记录●支持BMM150作为外部磁铁●在F405载板上支持CANDNA●分离EK3源中的GPS偏航和外部偏航●支持TSYS01温度传感器模拟器●使用VectorNav VN-300添加了对外部AHRS的支持●支持AP_Periph中的PWM输出●在AP_Periph中的全面支持状态显示Kerloud mini飞控产品遵循Pixhawk硬件标准,可支持PX4和Ardupilot两大社区软件。
同时提供行业客户的软硬件定制服务。
提供的产品和服务有无人机开源飞控、教育类无人机和无人车、无人系统软件方案等。
官方微信:cloudkernel_tech更多信息可参考:/kerloud_mini/多旋翼更新Copter-4.0.6-rc1 Beta测试即将结束:●修复在EKx_ALT_SOURCE = 1且测距仪失败时可能造成的不受控爬升●参数文档改进●直升机的改进,包括悬停学习Copter-4.1.0进展:●EKF3将成为默认●S曲线可改善导航●3D摄像机避障Peter Hall’s 6dofCopter固定翼更新目前发布的固定翼稳定版本4.0.7刚刚发布的4.0.8beta1修复EKF空速融合固定翼4.1待定:○新的四旋翼垂起着陆系统○船舶登陆支持○倾转垂起的改进○尾座式垂起的改进○改进了固定翼着陆和起飞○EKF的许多改进○新的ACPID系统Carbon Cub after VN-300 test flight AP_Periph更新新发布的稳定版本1.2.0●新的CAN驱动系统●支持PWM输出●支持多种通知机制●MSP输出支持●更好的错误报告●大量错误修复●支持飞控作为外围设备Kerloud Mini飞控简介云讷科技(深圳)有限公司是致力于无人机开源社区的科技企业,提供的产品和服务有无人机开源飞控、教育类无人机和无人车、无人系统软件方案等。