开拓者V2飞控原理图Ano_Settler_v2
- 格式:pdf
- 大小:163.47 KB
- 文档页数:1


pixhawk教程-用STM32Discovery开发板刷Pixhawk飞控Bootloader一直想玩PX4和Pixhawk,但是手头又没有飞控的板子,3DR官网上卖的好贵。
不过好在万能的淘宝上有网友山寨版,大概价格四百多吧,这个价格还是蛮合理的,PX4的飞控板是四层板,电源什么的器件用料够足…后来跟朋友一起做了一版改进的,也是四层板,不过板子还没打出来。
如果是买的PX4的板子第一件事肯定是连接上位机更新固件啦,不过我们是自己做,一开始单片机没有固件和bootloader,连接pc是没有任何反应的,一定要先刷bootloader,这个bootloader 就是关于单片机启动方式等的一些配置。
偶然间发现官方WIKI上居然有STM32F4 discovery开发板刷PX4 Bootloader的教程。
按照教程搞发现他提供链接的toochain0.7版本早就不在了,经过我的摸索,终于配置好了所有需要的代码和编译环境。
如果你有以下这块板子,那么你也可以试着刷一下px4的bootloader跑一下NUTTX的系统。
查看原教程的地址需要的硬件需要准备一下的东西来运行并且将Discovery开发板通过串口连接PC操作NuttX的终端 :∙STM32F4DISCOVERY开发板∙Mini USB数据线一根(接在左侧连接STLink)∙Micro USB数据线一根 (接在右侧连接单片机USB )∙一个串口ttl转232电平的模块,用于连接单片机的串口到windows串口助手(我直接用无线串口数传模块)注意: 单片机串口电压是3.3v而电脑串口电压是( -12V to +12V) 直接连接电脑估计就冒烟了…恩需要的软件需要下载以下的软件工具:∙ST-LINK/V2 USB driver (Windows XP, Vista, and 7)OR ST-LINK/V2 USB driver (Windows 8)∙STM32 ST-LINK utility∙PX4 Toolchain Installer v0.6(官方这个连接失效了!这么重要的东西…估计以前的代码是苏黎世理工搞的现在域名迁移到之后没人维护过来,没关系我们下载其他版本的然后再下载对应代码折腾一下下载这个吧PX4 Toolchain Installer v13 for Windows Download这个其实就是windows toolchain)∙PX4FMU & PX4FLOW drivers(wait until after the PX4 bootloader has been flashed to install this)∙下面这四个是我加的,免去GitHub克隆∙Bootloader文件夹∙Firmware文件夹(注意这个不是px4的代码,而是另一个分支https:///px4/firmware/tree/discovery,然后再下载一份Nuttx源码放进Firmware,我分享这份已经弄好了)把以上的东西都安装好,进入PX4 Toolchain Installer安装后的文件夹,默认路径应该是C:\px4(我安装到了C:\px4\ToolChain\px4,后文都是这个路径下操作)在这个路径下找到px4_console运行后的px4_console:因为官方的ToolChain0.7不好用,所以接下来我们要配置这些源码,把下载下来的以下三个文件夹拷贝进C:\px4\ToolChain\px4进入Firmware后执行make archives指令,然后估计要等几分钟了,如图:进入libopencm3文件夹执行make lib进入Bootloader文件夹执行make我们已经可以看到可以刷进单片机的bin,后面就是使用刚才下载的ST官方工具通过板子上的ST-Link 把bootloader程序刷进去,用miniUSB线把板子连上电脑可以在设备管理器里看到:运行ST-LINK Utility工具,在开始菜单中找到STMicroelectronics点击Target»Co nnect() Discovery板将会连接,并且显示起始地址是0x08000000. 如果没有正常连接检查一下接线(STLink的两个跳线帽)和驱动是否正常。
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(); // 被循环调用,不停的判断飞机速度是否超过设置的最小速度。
X4V2飞控用户手册V1.1零度智控(北京)智能科技有限公司Zero UAV (Beijing) Intelligence Technology Co.,Ltd.目录1 免责声明 (1)2 术语和缩略语 (2)3 功能介绍 (3)4 产品清单 (4)5 安装说明 (5)5.1 机架类型 (5)5.2 飞控安装 (6)5.3 GPS安装 (6)6 接线说明 (7)6.1 接口定义 (7)6.2 接线图 (7)7 调试准备 (9)7.1 安装GCS (9)7.1.1 安装手机版GCS (9)7.1.2 安装PC版GCS (9)7.2 WIFI配置 (9)7.2.1 WIFI的通讯模式 (9)7.2.2 WIFI配置 (10)7.3 遥控器设置 (12)8 地面站软件调试 (14)8.1 手机地面站调试 (14)8.1.1 地面站软件辅助设置(安装向导) (14)8.1.2 手动设置 (16)8.2 PC地面站调试 (21)8.2.1 地面站软件辅助设置(安装向导) (21)8.2.2 手动设置 (23)9 联机调试 (27)9.1 校准磁罗盘 (27)9.1.1 手机地面站校准 (27)9.1.2 PC地面站校准 (28)9.2 掰杆解锁 (30)零度智控(北京)智能科技有限公司| 110 外场飞行 (33)10.1 飞行状态 (33)10.1.1 LED指示状态及意义 (33)10.1.2 电机平衡性和实际油门位 (34)10.1.3 飞行器晃动的参数调整 (35)10.2 飞行功能 (36)10.2.1 手机遥控模式 (36)10.2.2 手机姿态模式 (37)10.2.3 半自动起飞 (38)10.2.4 返航降落 (39)10.2.5 指点飞行 (39)10.2.6 航线飞行 (41)10.2.7 跟踪飞行 (46)10.2.8 carefree模式 (46)11 任务 (48)11.1 舵机云台 (48)12 保护机制 (50)12.1 开启电机/停转电机 (50)12.1.1 开启电机 (50)12.1.2 停转电机 (50)12.2 失控保护 (50)12.3 数据记录 (50)12.3.1 机载数据记录——黑匣子功能 (50)12.3.2 地面站数据记录 (51)13 扩展连接 (53)13.1 电台连接 (53)13.1.1 机载电台连接 (53)13.1.2 地面电台连接 (53)13.2 电量管理模块连接 (53)13.3 OSD连接 (54)14 固件升级 (55)附录 (57)2| 零度智控(北京)智能科技有限公司附录2 PC地面站介绍 (61)附录3 安装与配置视频 (63)附录4 零度技术支持 (63)附录5 更新说明 (64)零度智控(北京)智能科技有限公司| 3零度智控(北京)智能科技有限公司| 免责声明11 免责声明 危险感谢您购买零度产品。
调整ArduCopter 参数如果你使用的机身不是官方ArduCopter 套件,你可能需要改变一些PID设置(PID 是比例-积分- 微分的简称,是一个标准的控制方法。
更多的资料在这里)。
在此页底部的有一个PID的全面的指导.你可以在任务规划器的配置选项卡中以交互方式调整PID:基本性能故障排除•我的多旋翼在稳定模式下缓慢震荡(大幅运动): 降低 STABILIZE_ROLL_P,STABILIZE_PITCH_P.•我的多旋翼在稳定模式下***震荡(小幅运动): 降低 RATE_ROLL_P, RATE_PITCH_P。
•我的飞机过于迟钝:降低 RATE_ROLL_P,RATE_PITCH_P,和/或增加 STABILIZE_ROLL_P, STABILIZE_PITCH_P.•我调整了 Rate_P,还是不行:也许你的 STABILIZE_P gain 增益过高。
降低一点(见上文),并再次尝试调整 RATE_P.•我的飞机在起飞时向左或向右旋转15°:你的电机不直或着电调没有校准。
扭转电机,直到他们都直了。
运行ESC校准程序。
•激烈飞行后我的飞机偏向一方 10 - 30°:如该文所述,焊接 IMU 的滤波器U。
你可以在 system.pde 里调整漂移校正。
如果需要,大概调高0。
5.此外,降落30秒,然后继续飞行。
•我的飞机无法在空中保持完全静止:确保在飞机的重心在正中心。
然后在水平面上运行水平命令(保持关闭状态15秒,调用该功能).你也可以在无风的环境(重要)使用自动微调模式飞行。
任何风将导致四轴旋转180度后你的修改产生相反的作用。
你可以使用遥控俯仰和横滚微调,但记得在用配置工具设置遥控时,要把它们放回中心.我不喜欢使用发射微调,但永远不要使用偏航微调.(四轴也很容易受到紊流的影响。
他们将需要不断的修正,除非你安装一个光流传感器。
某天……)•我的飞机飞行很好,但后来在悬停时一条电机臂奇怪地下降了:你的电机坏了。