APM代码调试知识点汇总

由于项目的需要,对ardupilot的源码进行二次开发。本文记录在二次开发中遇到的问题以及注意事项:

  1. CUAV V5 实测 apm 串口,对于姿态数据的发送和接收在200Hz的时候,是没有问题的,但是当达到250Hz及以上之后,数据传送会在很大概率出现丢包的现象,而且这还是在有线串口的情况下测试的。
    这点和PX4代码有点相像,尽管PX4当时是采用mavros消息的形式完成对数据的采集,但是PX4姿态环的更新频率(也就是说把mavlink消息相关姿态环的数据提升到unlimited,也就是一收到姿态数据立马更新,也是200多Hz)。但是不管是apm还是px4在角速度环的控制频率都已经在800-1000,甚至更高的频率执行了。
  2. apm设定高度值需要给定高度的参考坐标系
  3. apm guided模式修改: 进入 guided 模式后首先是 init函数,在这里完成guided子模式的设置,一些参数(如最大wp_speed, wp 上升速度,下降速度,wp_accerlate_speed的设置。),获取当前的位置,并作为停止点。然后进入子模式的run函数。子模式的run函数执行频率是400Hz, 在fast_loop 中 flight_mode->run()中被调用。
  4. set_destination为设置目标点,后续还需要通过调用位置PID控制器完成vehicle的控制设计
  5. 发送目标点不能太高的频率,可以采用的策略是“判断给定的目标点是否距离上次给的目标点太远,如果太近则没有必要更新目标点”,用以降低目标点的更新频率。PS:如果给的频率太高,则vehicle的飞行速度起不来,但是可以飞过去。
  6. 给定的高度要指定高度的相对点,采用函数为 Location::set_alt_cm()
  7. 采用 wp_nav:: reached_wp_destiantion()函数来判断是否达到了给定目标点,否则vehicle会一直在目标点附近快速绕圈。该函数是给定一个半径来判断是否达到了目标点。半径参数可以通过GCS设置。
  8. 航点操作一条龙函数 wp_nav->update_wpnav(); pos_control->update_z_controller(); attitude_cotnrol->input_euler_angle_roll_pitch_yaw().
  9. 在apm中使用串口的时候,要先判断下串口的句柄是否为空。
  10. 记得采用astyle 进行apm代码格式的规范化
  11. apm中要求failsafe_throttle_value + 10 >= 油门通道的最小值,或者 failsafe_throttle_value <910 就不会报错 “Check FS_THR_VALUE”
  12. 通过修改mp中的arming_check可以修改解锁检查项目
  13. 模式切换在100Hz循环的rc().read_mode_switch()中进行
  14. apm在调试过程中遇到问题,调试的时候变量是正常的,但是编译下载到单片机中则显示出错。怀疑编译优化造成,最后在源文件上加入编译优化选项解决:
    #pragma GCC optimize(“O0”)
    注:原ardupilot代码中,默认的优化等级为O2,但是可以看到其中很多文件都选择了其他的优化方式。
  15. 类内静态成员变量在类在初始化,在类内不能够初始化静态成员函数不能访问静态成员变量,静态成员函数也是有权限的
  16. ArduPilot中使能GPS对应的参数较多,有GPS_TYPE auto ek2_gps , gps_posNXXX等等, compass_use
  17. 在解锁的时候,经常会提示 PreArm: Pitch (RC2) is not neutral, 可以采用参数设置为 rc2_DZ ,也就是死区来解决,实测好使,但是在程序中没有找到相关代码。

你可能感兴趣的:(个人总结,ArduPilot,c++)