Files
ASER-NAV/App/Contract/robot_odom.h

116 lines
4.5 KiB
C
Raw Permalink Normal View History

/**
* @file robot_odom.h
* @brief CAN 0x200
* 线 vx wz
* Blackboard_UpdateOdom() 线
*
* @note CAN odom_delta
* robot_params.h
*
* :
* v_left = (fl_delta + rl_delta) / 2
* v_right = (fr_delta + rr_delta) / 2
* vx = (v_left + v_right) / 2 [m/s]
* wz = (v_right - v_left) / wheel_track [rad/s]
*/
#ifndef ROBOT_ODOM_H
#define ROBOT_ODOM_H
#include <stdint.h>
#include <stdbool.h>
#include "robot_params.h" /* 统一参数头文件 */
/* =========================================================
* robot_params.h
* ========================================================= */
#define ODOM_TICKS_PER_REV PARAM_ENCODER_CPR
#define ODOM_WHEEL_DIAMETER PARAM_WHEEL_DIAMETER
#define ODOM_WHEEL_TRACK PARAM_WHEEL_TRACK
/* =========================================================
*
* ========================================================= */
#define ODOM_TICKS_TO_M (3.14159265358979f * (ODOM_WHEEL_DIAMETER) / (ODOM_TICKS_PER_REV))
/**< @brief 每 tick 对应的轮缘弧长 [m],即 PI*D / CPR */
#define ODOM_WHEEL_TRACK_INV (1.0f / (ODOM_WHEEL_TRACK))
/**< @brief 轮距倒数 [1/m],用于快速计算角速度 */
/* =========================================================
*
* ========================================================= */
typedef struct {
/** @brief 里程计有效标志false 时 vx/wz 强制为 0 */
bool online;
/** @brief 里程计在线但 Tick 增量为 0 的连续帧数(用于检测卡死) */
uint16_t zero_delta_count;
/** @brief 上次更新时的系统时间 [ms] */
uint32_t last_update_ms;
} OdomStatus_t;
/* =========================================================
* API
* ========================================================= */
/**
* @brief
* @note
*/
void Odom_Init(void);
/**
* @brief
* @param now_ms [ms] HAL_GetTick()
* @param fl_delta ticks
* @param rl_delta ticks
* @param fr_delta ticks
* @param rr_delta ticks
* @param odom_span_ms [ms]
* SNC_CAN_ConsumeOdomDelta()
* 0 退
* now_ms - last_update_ms
*
* @note monitorTask navTask CAN
* odom_delta 20~100ms
* -> -> Blackboard
*/
void Odom_Update(uint32_t now_ms,
int16_t fl_delta, int16_t rl_delta,
int16_t fr_delta, int16_t rr_delta,
uint32_t odom_span_ms);
/**
* @brief odom
* @param now_ms [ms]
* @param timeout_ms [ms]
*
* @note vx/wz 线
* 使
*/
void Odom_HandleTimeout(uint32_t now_ms, uint32_t timeout_ms);
/**
* @brief
* @param out_status
* @param out_vx 线 [m/s]
* @param out_wz [rad/s]
*
* @note 使使
*/
void Odom_GetSpeed(float *out_vx, float *out_wz, OdomStatus_t *out_status);
/**
* @brief 沿 s
* @return [m] Odom_Init
*
* @note
*/
float Odom_GetDistance(void);
/**
* @brief
*/
void Odom_Reset(void);
#endif /* ROBOT_ODOM_H */