soft_imu.h 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. #ifndef __SOFT_IMU_H
  2. #define __SOFT_IMU_H
  3. #include "common.h"
  4. #include "soft_gs.h"
  5. #include "stdbool.h"
  6. #include "vklink.h"
  7. #include <stdint.h>
  8. enum
  9. {
  10. // 磁校准-无
  11. MAG_CAL_NO = 0,
  12. // 磁校准-XY平面
  13. MAG_CAL_XY = 1,
  14. // 磁校准-XZ平面
  15. MAG_CAL_XZ = 2,
  16. // 磁校准-校准成功
  17. MAG_CAL_OK = 3,
  18. // 磁校准-校准失败
  19. MAG_CAL_FAIL = 4,
  20. };
  21. enum
  22. {
  23. // 上电未收到星采用AHRS算法
  24. I_AHRS = 0,
  25. // 上电搜到星后使用INS/GPS算法
  26. INSGPS = 1,
  27. // 发生丢星准备过渡到ahrs状态
  28. T_AHRS = 2,
  29. // INS/GPS算法中持续丢星10s后切换回AHRS不再回INS算法
  30. F_AHRS = 3,
  31. };
  32. enum
  33. {
  34. IMU_MSG_ID = 0, // IMU 包消息
  35. GPS_MSG_ID = 1, // GPS 包消息
  36. CALIBRARION_MSG_ID = 2, // 校准消息
  37. SENSOR_MSG_ID = 3, // 传感器消息
  38. VER_MSG_ID = 4, // 版本消息
  39. IMU_POS_OFFSET_ID = 7, // IMU 安装偏差
  40. GPS_POS_OFFSET_ID = 8, // GPS 安装偏差
  41. REQ_MSG_ID = 20, // 请求消息
  42. ACK_MSG_ID = 21, // 应答消息
  43. HDW_MSG_ID = 0X20, // 互顶位数据
  44. };
  45. enum
  46. {
  47. MAG_CALIB = 1, // 磁校准
  48. ATTITUE_CALIB = 2, // 水平姿态校准
  49. ASSEMBLE_CALIB = 3, // 安装校准
  50. FILTER_PARAM_CALIB = 4, // 滤波参数校准
  51. LOCK_UNLOCK_CALIB = 5, // 上锁解锁位置校准
  52. DGPS_DIRECTION_CALIB = 6, // 双差分天向安装方式校准
  53. IMU_POS_CALIB = 7, // IMU 安装偏差
  54. GPS_POS_CALIB = 8, // GPS 安装偏差
  55. RTK_POS_CALIB = 9, // RTK 安装偏差
  56. BASE_STATION_STATUS_CALIB = 10, // 基站工作状态
  57. DISABLE_GPS_ALT = 11, // 是否禁用GPS高度
  58. };
  59. enum
  60. {
  61. GPS_VERSION_NORMAL = 1,
  62. GPS_VERSION_PRO = 2,
  63. GPS_VERSION_RTK = 3
  64. };
  65. // 状态标志位的错误状态位mask
  66. #define GPS_STATUS1_ERROR_MASK 0XFB
  67. #define GPS_STATUS2_ERROR_MASK 0X3C
  68. #define ACCGYRO_STATUS_ERROR_MASK 0X3F
  69. #define MAG_STATUS_ERROR_MASK 0XBB
  70. typedef struct
  71. {
  72. int version;
  73. // 滤波档位
  74. uint8_t filter_param;
  75. // 安装方向
  76. uint8_t assemble_direction_param;
  77. // 双差分天线安装方向
  78. uint8_t dgps_direction_param;
  79. // GPS 安装位置偏差 cm
  80. int8_t gps_pos_param[6];
  81. // IMU 安装位置偏差 cm
  82. int8_t imu_pos_param[3];
  83. } IMU_Config;
  84. // 采用一字节对齐的方式,便于直接memcpy,与解析
  85. // 现在采用改变对齐方式的方式,牺牲了CPU的效率。后期与IMU端商定一致的结构体序列,sizeof()是30个字节
  86. #pragma pack(1)
  87. typedef struct
  88. {
  89. float _zitai_yaw; // 4--5 磁航向 单位:0.01° ,
  90. // 范围:0---360, 北偏西为正
  91. float _zitai_roll; // 6--7 横滚 单位:0.01° ,
  92. // 范围:-18000---18000,左负右正
  93. float _zitai_pitch; // 8--9 俯仰 单位:0.01° ,
  94. // 范围:-18000---18000,左负右正
  95. float _x_gyro; // 10--11 X陀螺 单位:°/s
  96. float _y_gyro; // 12--13 y陀螺 单位:°/s
  97. float _z_gyro; // 14--15 z陀螺 单位:°/s
  98. float _x_vel; // 16--17 相对左右速度 单位:cm/s 左->右 为正 左<-右 为负
  99. float _y_vel; // 18--19 相对前后速度 单位:cm/s 后->前 为正 前<-后 为负
  100. float _z_vel; // 20--21 垂直速度 单位:cm/s 上正下负
  101. short _x_acc; // 22--23 机体左右加速度 单位:cm/s^2 左->右 为正 左<-右 为负
  102. short _y_acc; // 24--25 机体前后加速度 单位:cm/s^2 后->前 为正 前<-后 为负
  103. short _z_acc; // 26--27 Z轴加速度计 单位:cm/s^2 上正下负
  104. double _c_lng; // 28--31 解算X偏差 cm 左负右正
  105. double _c_lat; // 32--35 解算Y偏差 cm 前正后负
  106. float _baro_alt; // 36--39 高度 单位:cm
  107. } REV_IMU;
  108. #pragma pack()
  109. extern REV_IMU raw_imu;
  110. #pragma pack(1)
  111. typedef struct
  112. {
  113. int _longitude; // 经度 单位:1e-7
  114. int _latitude; // 纬度 单位:1e-7
  115. short _gps_yaw; // 航向 单位:0.1度, 范围:0--360, 北偏东为正
  116. int _gps_alt_mm; // GPS高度 单位:mm
  117. short _gps_vel; // GPS速度 单位:dm/s
  118. unsigned char _gps_num; // GPS星数
  119. unsigned char _gps_pdop; // PDOP 单位:0.1
  120. short _gps_year; //
  121. unsigned char _gps_month; //
  122. unsigned char _gps_day; //
  123. unsigned char _gps_hour; //
  124. unsigned char _gps_minute; //
  125. unsigned char _gps_second; //
  126. unsigned char _gps_millisecond; // 毫秒/100
  127. //----GPS状态标志----
  128. char _gps_status;
  129. //----气压计状态标志----
  130. char _gps_status2;
  131. //----陀螺加计状态标识----
  132. char _acc_gyro_status;
  133. //----磁传感器状态标识----
  134. char _mag_status;
  135. //---- 振动系数----
  136. char _oscillating_coefficient; // 振动系数
  137. // 温度单位:度
  138. signed char _temprature;
  139. // 姿态标志位 0-AHRS 1-INSGPS 2-FAHRS
  140. char _insgps_ok;
  141. // 磁校准状态
  142. char _state_flag;
  143. // RTK状态标识 0-无RTK 1-RTK 2-GPS高度可用
  144. unsigned char _rtk_state;
  145. // imu安装方向 1-正向, 2-右向, 3-后向,4-左向 低4位
  146. // imu滤波参数 0-强滤波, 1-中滤波, 2-弱滤波 高4位
  147. char _imu_assembly_direction;
  148. // 垂直方向gps速度, mm/s
  149. short _gps_vetical_vel;
  150. // IMU 收取解锁落锁状态
  151. char _imu_get_throttle_flag;
  152. // 标定的重力加速度
  153. char _g0;
  154. // 双天线安装方向 0-前后 1-左右
  155. char _dgps_assembly_direction;
  156. // 冗余 gps 星数
  157. char _redundant_gps_num;
  158. // 双天线定向中 ant2 卫星数目
  159. char _dgps_ant2_gps_num;
  160. // 从 gps 经度
  161. int _auxiliary_gps_lon;
  162. // 从 gps 纬度
  163. int _auxiliary_gps_lat;
  164. // ins 姿态正确性
  165. // bit0 0-ins 姿态正确 1-ins 姿态异常
  166. char _ins_error;
  167. // 车载相对位置信息
  168. float _vehicle_vector_east;
  169. float _vehicle_vector_north;
  170. float _vehicle_vector_up;
  171. // 车载相对位置锁定标志 1-锁定 0-不锁定
  172. uint8_t _vehicle_vector_flag;
  173. } REV_GPS;
  174. #pragma pack()
  175. extern REV_GPS raw_gps;
  176. #pragma pack(1)
  177. typedef struct
  178. {
  179. short _xgyro1; // 0.02deg/s
  180. short _ygyro1;
  181. short _zgyro1;
  182. short _xgyro2;
  183. short _ygyro2;
  184. short _zgyro2;
  185. signed char _xacc1; // 0.1m/s^2
  186. signed char _yacc1;
  187. signed char _zacc1;
  188. signed char _xacc2;
  189. signed char _yacc2;
  190. signed char _zacc2;
  191. short _xmag1; // 0.1mGause
  192. short _ymag1;
  193. short _zmag1;
  194. short _xmag2;
  195. short _ymag2;
  196. short _zmag2;
  197. float _baroalt; // 1m
  198. char _filter_reset_flag;
  199. signed char _mag_yaw;
  200. char _ahrs_roll;
  201. char _ahrs_pitch;
  202. short _gps_espeed;
  203. short _gps_nspeed;
  204. } REV_SENSOR;
  205. #pragma pack()
  206. extern REV_SENSOR raw_sensor;
  207. struct INS_DATA
  208. {
  209. IMU_Config imu_conf;
  210. int horz_vel; // 水平合成速度。单位cm/s
  211. char insgps_ok; // ins/gps准备好了,可以起飞的标志位
  212. char mag_calib_flag; // 状态标志位,磁校准状态
  213. float Q[4]; // 当前姿态四元数表示
  214. float dcm[3][3]; // 当前姿态旋转矩阵表示
  215. int lng; // 经度
  216. int lat; // 纬度
  217. float gps_yaw; // GPS航向。单位度
  218. int gps_alt; // GPS高度。单位cm
  219. int gps_vel; // GPS速度。单位cm/s
  220. short gps_num; // GPS星数。单位 颗
  221. short gps_pdop; // GPS定位精度。单位
  222. int baro_alt; // 气压高度。单位 cm
  223. short gps_year; // 年
  224. char gps_month; // 月
  225. char gps_day; // 日
  226. char gps_hour; // 时
  227. char gps_minute; // 分
  228. char gps_second; // 秒
  229. char gps_millisecond; // 毫秒
  230. uint32_t last_gps_second_local_time; // 上一次 gps 秒变更的本地时间
  231. char rtk_state; // 差分状态 // RTK状态标识 0-无RTK 1-RTK 2-GPS高度可用
  232. char oscillating_coefficient; // 振动系数
  233. signed char temprature; // 温度
  234. bool has_cal_delta_lonlat_to_cm_ratio; // 是否已经计算了经纬度转平面误差因子
  235. double delta_lon_to_cm_ratio; // 经度差转平面距离因子
  236. double delta_lat_to_cm_ratio; // 纬度差转平面距离因子
  237. };
  238. extern struct INS_DATA ins;
  239. extern unsigned char mag_cal_status; // 0---无校准 1-- 校准xz 2--校准完成
  240. // 收到Imu数据标志位
  241. extern bool recieve_isimudata;
  242. // 收到Gps数据标志位
  243. extern bool recieve_isgpsdata;
  244. // 收到Sensor数据标志位
  245. extern bool recieve_issensordata;
  246. // 接收到了INS数据
  247. extern comp_status imu_link_status;
  248. // DMA传输出错标志位
  249. extern bool dma_iserror;
  250. // 磁校准
  251. extern bool ci_jiao_zhun;
  252. // 通知 IMU 解锁了
  253. extern bool notify_imu_unlock;
  254. // 通知 IMU 上锁了
  255. extern bool notify_imu_lock;
  256. // 位置平均滤波
  257. extern char average_filter_counts;
  258. void send_req_msg_to_imu(uint8_t req_id);
  259. void send_calibration_msg_to_imu(uint8_t calib_id, uint8_t *calib_value,
  260. uint16_t len);
  261. void imu_uart3_initial(unsigned int imu_bps);
  262. void imu_euler_angle_clear(void);
  263. void imu_attitude_ananlysis(void);
  264. void dma_analysis_imudata(void);
  265. void dma_analysis_gpsdata(void);
  266. void dma_analysis_sensordata(void);
  267. void get_right_ins_data(void);
  268. void get_ins_status(void);
  269. void send_msg_to_imu(void);
  270. void unclock_clear_altitude(void);
  271. void send_vklink_msg_to_imu(const VKlink_Msg_Type *txMsg);
  272. void imu_tx_msg_to_gcs(struct GCS_Link *pgcs);
  273. void send_imu_hdw_data(uint8_t update_type, void* data);
  274. #endif