此篇blog的目的是对px4工程有一个整体认识,对各个信号的流向有个了解,以及控制算法采用的控制框架。

PX4自动驾驶仪软件可分为三大部分:实时操作系统、中间件和飞行控制栈。

1.NuttX实时操作系统
提供POSIX-style的用户操作环境(如printf(), pthreads,/dev/ttyS1,open(),write(),poll(),ioctl()),进行底层的任务调度。
2.PX4中间件
PX4中间件运行于操作系统之上,提供设备驱动和一个微对象请求代理(micro object request broker,uORB)用于驾驶仪上运行的单个任务之间的异步通信。Px4被3DR开源后,整个代码结构被⼤改,原先的系统被摒弃,进而采用Nuttx,但是核心思想没变-为了简化开发而采用牺牲部分效率的消息传递机制,这是Px4 与ArduPilot 最本质的差别。
3.PX4飞行控制栈
飞行控制栈可以使用PX4的控制软件栈,也可以使用其他的控制软件,如APM:Plane、APM:Copter,但必须运行于PX4中间件之上。

此部分又可分为

决策导航部分:根据飞行器自身安全状态和接收到的命令,决定工作于什么模式,下一步应该怎么做。

位置姿态估计部分:根据传感器得到自身的位置和姿态信息,此部分算法含金量最高,算法也相当多。

位置姿态控制部分:根据期望位置和姿态设计控制结构,尽可能快、稳的达到期望位置和姿态。

控制器输出部分:mixer和执行器,pwm限幅。

算法在Firmware/src/modules,驱动在Firmware/src/drivers

px4原生固件模块列表:

系统命令程序

mavlink –通过串口发送和接收mavlink信息

sdlog2 –保存系统日志/飞行数据到SD卡

tests –测试系统中的测试程序

top –列出当前的进程和CPU负载

uORB – 微对象请求代理器-分发其他应用程序之间的信息

驱动

mkblctrl–blctrl电子模块驱动

esc_calib –ESC的校准工具

fmu –FMU引脚输入输出定义

gpio_led –GPIO LED驱动

gps –GPS接收器驱动

pwm –PWM的更新速率命令

sensors –传感器应用

px4io –px4io驱动

uavcan –uavcan驱动

飞行控制的程序

飞行安全和导航

commander –主要飞行安全状态机

navigator –任务,失效保护和RTL导航仪

估计姿态和位置

attitude_estimator_ekf –基于EKF的姿态估计

ekf_att_pos_estimator –基于EKF的姿态和位置估计

position_estimator_inav–惯性导航的位置估计

multirotor姿态和位置控制器

mc_att_control–multirotor姿态控制器

mc_pos_control –multirotor位置控制器

fixedwing姿态和位置控制器

fw_att_control –固定翼飞机的姿态控制

fw_pos_control_l1 –固定翼位置控制器

垂直起降姿态控制器

vtol_att_control –垂直起降姿态控制器

3.1决策

3.1.1 任务决策。以任务为导向,任务决策主要决定多旋翼下一步“去哪儿”,进一步,需要规划路径,使得整个过程能满足诸如:飞向航路点并沿航线飞,以及飞向航路点并避障等要求。
3.1.2 健康管理和失效保护。以安全为导向, 失效保护主要决定多旋翼下一步“去哪儿”。多旋翼飞行器在飞行前或飞行中,可能会发生通信故障、传感器失效和动力系统异常等,这些意外会直接导致控制任务无法完成。这一部分包括安全问题的介绍、机载设备的健康评估、机载设备的健康监测、失效后的保护建议。

传感器校正在commander里面

对应的程序在Firmware/src/modules/commander和Firmware/src/modules/navigator

完成任务模式切换,同时考虑电池电量、GPS等传感器是否正常工作等信息。

[cpp] view plaincopy
  1. commander
  2. orb_publish(ORB_ID(home_position), homePub, &home);
  3. orb_publish(ORB_ID(offboard_mission), mission_pub, &mission);
  4. orb_publish(ORB_ID(vehicle_control_mode), control_mode_pub, &control_mode);
  5. orb_publish(ORB_ID(vehicle_status), status_pub, &status);
  6. orb_publish(ORB_ID(actuator_armed), armed_pub, &armed);
  7. orb_publish(ORB_ID(vehicle_command_ack), command_ack_pub, &command_ack);
  8. orb_copy(ORB_ID(vehicle_status), state_sub, &state);
  9. orb_copy(ORB_ID(parameter_update), param_changed_sub,&param_update;
  10. orb_copy(ORB_ID(manual_control_setpoint), sp_man_sub, &sp_man);
  11. orb_copy(ORB_ID(offboard_control_mode), offboard_control_mode_sub, &offboard_control_mode);
  12. orb_copy(ORB_ID(telemetry_status), telemetry_subs[i], &telemetry);
  13. orb_copy(ORB_ID(sensor_combined), sensor_sub, &sensors);
  14. orb_copy(ORB_ID(differential_pressure), diff_pres_sub, &diff_pres);
  15. orb_copy(ORB_ID(system_power), system_power_sub, &system_power);
  16. orb_copy(ORB_ID(safety), safety_sub, &safety);
  17. orb_copy(ORB_ID(vtol_vehicle_status), vtol_vehicle_status_sub, &vtol_status);
  18. orb_copy(ORB_ID(vehicle_global_position), global_position_sub, &gpos);
  19. orb_copy(ORB_ID(vehicle_local_position), local_position_sub, &local_position);
  20. orb_copy(ORB_ID(vehicle_attitude), attitude_sub, &attitude);
  21. orb_copy(ORB_ID(vehicle_land_detected), land_detector_sub, &land_detector);
  22. orb_copy(ORB_ID(battery_status), battery_sub, &battery);
  23. orb_copy(ORB_ID_VEHICLE_ATTITUDE_CONTROLS, actuator_controls_sub, &actuator_controls);
  24. orb_copy(ORB_ID(subsystem_info), subsys_sub, &info);
  25. orb_copy(ORB_ID(position_setpoint_triplet), pos_sp_triplet_sub, &pos_sp_triplet);
  26. orb_copy(ORB_ID(vehicle_gps_position), gps_sub, &gps_position);
  27. orb_copy(ORB_ID(mission_result), mission_result_sub, &mission_result);
  28. orb_copy(ORB_ID(geofence_result), geofence_result_sub, &geofence_result);
  29. orb_copy(ORB_ID(vehicle_command), cmd_sub, &cmd);
[cpp] view plaincopy
  1. navigator
  2. orb_publish(ORB_ID(position_setpoint_triplet), _pos_sp_triplet_pub, &_pos_sp_triplet);
  3. orb_publish(ORB_ID(mission_result), _mission_result_pub, &_mission_result);
  4. orb_publish(ORB_ID(geofence_result), _geofence_result_pub, &_geofence_result);
  5. orb_publish(ORB_ID(vehicle_attitude_setpoint), _att_sp_pub, &_att_sp);
  6. orb_copy(ORB_ID(vehicle_global_position), _global_pos_sub, &_global_pos);
  7. orb_copy(ORB_ID(vehicle_gps_position), _gps_pos_sub, &_gps_pos);
  8. orb_copy(ORB_ID(sensor_combined), _sensor_combined_sub, &_sensor_combined);
  9. orb_copy(ORB_ID(home_position), _home_pos_sub, &_home_pos);
  10. orb_copy(ORB_ID(navigation_capabilities), _capabilities_sub, &_nav_caps);
  11. orb_copy(ORB_ID(vehicle_status), _vstatus_sub, &_vstatus)
  12. orb_copy(ORB_ID(vehicle_control_mode), _control_mode_sub, &_control_mode)
  13. orb_copy(ORB_ID(parameter_update), _param_update_sub, &param_update);
  14. orb_copy(ORB_ID(vehicle_command), _vehicle_command_sub, &cmd);

3.2位置估计和姿态估计

此部分需要大量理论知识,暂时还比较欠缺。

sensors是对陀螺仪、加速度计地磁计的一个处理

[cpp] view plaincopy
  1. sensors
  2. orb_publish(ORB_ID(airspeed), _airspeed_pub, &_airspeed);
  3. orb_publish(ORB_ID(differential_pressure), _diff_pres_pub, &_diff_pres);
  4. orb_publish(ORB_ID(battery_status), _battery_pub, &_battery_status);
  5. orb_publish(ORB_ID(rc_channels), _rc_pub, &_rc);
  6. orb_publish(ORB_ID(manual_control_setpoint), _manual_control_pub, &manual);
  7. orb_publish(ORB_ID(actuator_controls_3), _actuator_group_3_pub, &actuator_group_3);
  8. orb_publish(ORB_ID(sensor_combined), _sensor_pub, &raw);
  9. orb_copy(ORB_ID(sensor_accel), _accel_sub[i], &accel_report);
  10. orb_copy(ORB_ID(sensor_gyro), _gyro_sub[i], &gyro_report);
  11. orb_copy(ORB_ID(sensor_mag), _mag_sub[i], &mag_report);
  12. orb_copy(ORB_ID(sensor_baro), _baro_sub[i], &_barometer);
  13. orb_copy(ORB_ID(differential_pressure), _diff_pres_sub, &_diff_pres);
  14. orb_copy(ORB_ID(vehicle_control_mode), _vcontrol_mode_sub, &vcontrol_mode);
  15. orb_copy(ORB_ID(parameter_update), _params_sub, &update);
  16. orb_copy(ORB_ID(rc_parameter_map), _rc_parameter_map_sub, &_rc_parameter_map);
  17. orb_copy(ORB_ID(input_rc), _rc_sub, &rc_input);
[cpp] view plaincopy
  1. ardrone_interface
  2. orb_publish(ORB_ID(actuator_outputs), pub, &outputs);
  3. orb_copy(ORB_ID_VEHICLE_ATTITUDE_CONTROLS, actuator_controls_sub, &actuator_controls);
  4. #define ORB_ID_VEHICLE_ATTITUDE_CONTROLS    ORB_ID(actuator_controls_0)
  5. orb_copy(ORB_ID(actuator_armed), armed_sub, &armed);
  6. batt_smbus
  7. orb_publish(_batt_orb_id, _batt_topic, &new_report);
  8. orb_copy(ORB_ID(battery_status), sub, &status)
  9. bma180
  10. orb_publish(ORB_ID(sensor_accel), _accel_topic, &report);
  11. GPS
  12. orb_publish(ORB_ID(vehicle_gps_position), _report_gps_pos_pub, &_report_gps_pos);
  13. orb_publish(ORB_ID(satellite_info), _report_sat_info_pub, _p_report_sat_info);
  14. hmc5883
  15. orb_publish(ORB_ID(sensor_mag), _mag_topic, &new_report);
  16. hott
  17. orb_publish(ORB_ID(esc_status), _esc_pub, &esc);
  18. orb_copy(ORB_ID(sensor_combined), _sensor_sub, &raw);
  19. orb_copy(ORB_ID(battery_status), _battery_sub, &battery);
  20. orb_copy(ORB_ID(airspeed), _airspeed_sub, &airspeed);
  21. orb_copy(ORB_ID(esc_status), _esc_sub, &esc);
  22. l3gd20
  23. orb_publish(ORB_ID(sensor_gyro), _gyro_topic, &report);
  24. lsm303d
  25. orb_publish(ORB_ID(sensor_accel), _accel_topic, &accel_report);
  26. orb_publish(ORB_ID(sensor_mag), _mag->_mag_topic, &mag_report);
  27. mpu6000
  28. orb_publish(ORB_ID(sensor_accel), _accel_topic, &arb);
  29. orb_publish(ORB_ID(sensor_gyro), _gyro->_gyro_topic, &grb);
  30. mpu9250
  31. orb_publish(ORB_ID(sensor_accel), _accel_topic, &arb);
  32. orb_publish(ORB_ID(sensor_gyro), _gyro->_gyro_topic, &grb);
  33. ms5611
  34. orb_publish(ORB_ID(sensor_baro), _baro_topic, &report);
  35. pwm_out_sim
  36. orb_publish(ORB_ID(actuator_outputs), _outputs_pub, &outputs);
  37. orb_copy(_control_topics[i], _control_subs[i], &_controls[i]);
  38. actuator_controls_s _controls[actuator_controls_s::NUM_ACTUATOR_CONTROL_GROUPS];
  39. orb_copy(ORB_ID(actuator_armed), _armed_sub, &aa);
  40. px4flow
  41. orb_publish(ORB_ID(optical_flow), _px4flow_topic, &report);
  42. orb_publish(ORB_ID(distance_sensor), _distance_sensor_topic, &distance_report);
  43. orb_publish(ORB_ID(subsystem_info), pub, &info);
  44. px4fmu
  45. orb_publish(ORB_ID(actuator_outputs), _outputs_pub, &outputs);
  46. orb_publish(ORB_ID(safety), _to_safety, &safety);
  47. orb_publish(ORB_ID(input_rc), _to_input_rc, &_rc_in);
  48. orb_copy(_control_topics[i], _control_subs[i], &_controls[i]);
  49. orb_copy(ORB_ID(actuator_armed), _armed_sub, &_armed);
  50. orb_copy(ORB_ID(parameter_update), _param_sub, &pupdate);
  51. px4io
  52. orb_publish(ORB_ID(vehicle_command), pub, &cmd);
  53. orb_publish(ORB_ID(safety), _to_safety, &safety);
  54. orb_publish(ORB_ID(battery_status), _to_battery, &battery_status);
  55. orb_publish(ORB_ID(servorail_status), _to_servorail, &_servorail_status);
  56. orb_publish(ORB_ID(input_rc), _to_input_rc, &rc_val);
  57. orb_publish(ORB_ID(actuator_outputs), _to_outputs, &outputs);
  58. orb_publish(ORB_ID(multirotor_motor_limits), _to_mixer_status, &motor_limits);
  59. orb_copy(ORB_ID(actuator_armed), safety_sub, &safety);
  60. orb_copy(ORB_ID(vehicle_command), _t_vehicle_command, &cmd);
  61. orb_copy(ORB_ID(parameter_update), _t_param, &pupdate);
  62. orb_copy(ORB_ID(actuator_controls_0), _t_actuator_controls_0, &controls);
  63. orb_copy(ORB_ID(actuator_controls_x), _t_actuator_controls_0, &controls);
  64. orb_copy(ORB_ID(vehicle_control_mode), _t_vehicle_control_mode, &control_mode);
  65. stm32(adc)
  66. orb_publish(ORB_ID(system_power), _to_system_power, &system_power);

3.3位置控制和姿态控制

3.4pwm输出

3.4.1mixer

官方地址(已失效)对应的内容

混合器输出定义控制器的输出是如何映射到电机和伺服输出。所有内置mixer文件位于ROM文件系统的/etc/mixers目录,并编译成固件。Mixer是一组独立的映射器,从控制读入写入,写入执行器输出。一个模块,结合一组根据预先定义的规则和参数的输入,产生一组输出。

(1)语法:
Mixer的定义是文本文件,用一个大写字母后跟一个冒号开头的行。所有其他的行都会被忽略,这意味着解释性文本可与定义相混合。每个文件可以定义多个Mixer。由一个Mixer产生的执行器输出的数量是特定的。
起始形式如下:
<tag>:<mixer arguments>
标签选择Mixer的类型,“M”为一种简单求和Mixer,“R”为多转子(多旋翼)Mixer等。
一个空的Mixer不消耗控制,并产生一个执行机构的输出,其值始终为零。通常一个空的Mixer被用作占位符Mixer的集合中,以实现制动器输出的特定模式。
空的Mixer定义形式:
Z:
 
(2)简单的Mixer
一个简单的Mixer的开始:
M: <control count>
O: <-ve scale> <+ve scale> <offset> <lower limit> <upper limit>

如果为零,则输出就为零,Mixer输出的固定值是受限制的。
第二行定义了输出输出定标器和标量参数。虽然计算作为浮点运算进行的,存储在所述定义文件中的值是由10000倍缩放,-0.5偏移被编码为-5000.
 
该定义继续描述控制输入和缩放项:
S: <group> <index> <-ve scale> <+ve scale> <offset> <lower limit> <upper limit>
这些值定义了控制组从那些定标器中读取数据,和该组内的值的偏移。是特定于设备读取Mixer的定义。
 
当用于混合车辆的控制,混合器组0是车辆姿态控制组,索引值从0到3通常分别是:roll,pitch,yaw,thrust。
 
具体详解见:https://pixhawk.org/dev/mixing?s[]=mixer
 
(3)多旋翼Mixer
在多旋翼混合器结合四个控制输入(roll,pitch,yaw,thrust)为一组用于驱动电机速度控制器制动输出。
Mixer定义的形式:
R: <geometry> <roll scale> <pitch scale> <yaw scale> <deadband>
参数解释:
    机械:包括quad(4x,4+),hex(6x,6+),octo(8x,8+)
    单独的roll,pitch和yaw控制因子
    电机输出死区

Px4源码框架结构图相关推荐

  1. 【PX4-AutoPilot教程-1】PX4源码文件目录架构分析

    PX4源码文件目录架构分析 PX4源代码的结构复杂,这是源代码的总目录结构(以v1.13.0为例): Firmware ├─boards ├─build ├─cmake ├─Documentation ...

  2. Pixhawk代码分析-源码框架

    源码框架 pixhawk代码框架: pixhawk代码框架基础分析: 阅读下面内容时请结合源码阅读,便于理解. The basic structure of ArduPilot is broken u ...

  3. Ardupilot源码框架

    Ardupilot源码地址:https://github.com/ArduPilot/ardupilot,官网地址:http://ardupilot.org/ 文章目录 1.Ardupilot介绍 2 ...

  4. 深度解剖dubbo源码-知识结构图

    深度解剖dubbo源码-知识结构图

  5. 基恩士PLC KV8000+XH16EC总线控制,全ST程序实例 全程序无加密,公司级框架,功能齐全,提供项目源码框架FB源码

    基恩士PLC KV8000+XH16EC总线控制,全ST程序实例,本人自己开发全程序无加密,公司级框架,功能齐全,提供项目源码框架FB源码,触摸屏源码. 需要一定ST基础才能看懂. 重在分享编程思想 ...

  6. px4源码编译之 建立自己的程序模块

    前言:在网上找了一大圈,如何在px4源码examples中添加自己的程序,包括官网那个都没有用,后来发现需要在对应的编译位置对cmake文件进行修改,具体如下: 1.在你想要的位置新建文件夹,建议和你 ...

  7. 2022年最新视觉框架VM PRO 2.7版本,C#源码框架,机器视觉源码框架

    2022年最新视觉框架VM PRO 2.7版本,C#源码框架,机器视觉源码框架,编程语言C#,算法使用的是halcon,参考了cognex visionpro的输入输出,有C#基础和Halcon基础学 ...

  8. 2022年最新视觉框架VM PRO 2.7版本,增加了机器人 流程框架 多任务流程 C#源码框架,机器视觉源码框架

    2022年最新视觉框架VM PRO 2.7版本,增加了机器人 流程框架 多任务流程 C#源码框架,机器视觉源码框架,编程语言C#,算法使用的是halcon,参考了cognex visionpro的输入 ...

  9. 2022年视觉框架,增加了机器人 流程框架 多任务流程 C#源码框架,机器视觉源码框架,编程语言C#,算法使用的是halcon

    2022年最新视觉框架VM PRO 2.7版本,增加了机器人 流程框架 多任务流程 C#源码框架,机器视觉源码框架,编程语言C#,算法使用的是halcon,参考了cognex visionpro的输入 ...

最新文章

  1. 数字孪生白皮书(2019)
  2. 从四点来探索监控设备系统的组成
  3. createQuery与createSQLQuery
  4. java ldap 连接池_使用Ldap连接池
  5. 让360安全浏览器默认使用谷歌内核
  6. TestCase / test plan / test case
  7. 斯特林数-斯特林反演
  8. 10电脑睡眠后自动关机怎么回事 win_Win8.1睡眠后自动关机如何解决 Win8.1电脑睡眠时间久了自动关机怎么办...
  9. xcode5 ios7 64位 iphone5s引用第三方库报错的解决办法
  10. 最新(2019)斯坦福CS224n深度学习自然语言处理课程(视频+笔记+2017年合集)
  11. JVM监控及诊断工具GUI篇之JConsole
  12. 软件项目解决方案模板
  13. 图像修复经典算法--Criminisi算法
  14. linux下scrt依赖包libssl1.0.0解决方法
  15. PHP实现DES加密、解密
  16. 直流有刷电机驱动板原理和测试方法
  17. Spring MVC 详解
  18. sense8影评摘抄
  19. pci串行端口找不到驱动程序_PCI网卡和PCIE网卡
  20. 定制 kali nethunter内核 (官方不支持的手机)

热门文章

  1. Linux 下安装配置redis
  2. 分享几种绕过防注入的方法
  3. Spring+Hibernate配置多数据源
  4. SharePoint 2010 隐藏快速启动栏(左侧导航)
  5. [Python从零到壹] 四十一.图像处理基础篇之图像采样处理
  6. 【数据结构与算法】之深入解析“灯泡开关”的求解思路与算法示例
  7. 【数据结构与算法】之深入解析“二叉树的层序遍历”的求解思路与算法示例
  8. iOS经典面试题之深入解析类Class的iskindOfClass与isMemberOfClass的底层原理
  9. 2020\Simulation_1\3.叶节点数
  10. 126. Word Ladder II