From 346cc7d685283df529aadbcf9c156de040ce44f9 Mon Sep 17 00:00:00 2001
From: yincheng.zhong <634916154@qq.com>
Date: 星期一, 24 十一月 2025 09:51:48 +0800
Subject: [PATCH] 仿真跑起来了,但是起点转向不太对。

---
 STM32H743/FML/motion_control.c |   24 ++++++++++++++++++++++--
 1 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/STM32H743/FML/motion_control.c b/STM32H743/FML/motion_control.c
index b5ed3ee..7b19d09 100644
--- a/STM32H743/FML/motion_control.c
+++ b/STM32H743/FML/motion_control.c
@@ -176,6 +176,7 @@
     float dist = mc_distance(start_point, state->pos);
 
     float desired_heading = arm_atan2_f32(vec_y, vec_x);
+    out->target_heading_deg = desired_heading * RAD2DEG;
     float heading_err = mc_wrap_angle(desired_heading - state->heading_rad);
     float yaw_rate_cmd = state->config.heading_kp * heading_err;
     yaw_rate_cmd = MC_CLAMP(yaw_rate_cmd, -state->config.max_turn_rate, state->config.max_turn_rate);
@@ -227,6 +228,7 @@
     float vec_x = target[0] - state->pos[0];
     float vec_y = target[1] - state->pos[1];
     float desired_heading = arm_atan2_f32(vec_y, vec_x);
+    out->target_heading_deg = desired_heading * RAD2DEG;
     float heading_err = mc_wrap_angle(desired_heading - state->heading_rad);
     float heading_err_rate = (heading_err - state->last_heading_err) / (dt_s > 0.0f ? dt_s : 0.013f);
     state->last_heading_err = heading_err;
@@ -313,8 +315,17 @@
     _state->pos[0] = _enu[0];
     _state->pos[1] = _enu[1];
     _state->pos[2] = _enu[2];
-    _state->heading_rad = mc_wrap_angle((_gprmi->m_fHeadingAngle) * DEG2RAD);
-    _state->heading_deg = _gprmi->m_fHeadingAngle;
+    float gps_heading_rad = mc_wrap_angle((_gprmi->m_fHeadingAngle) * DEG2RAD);
+    if (_state->imu_valid == HIDO_TRUE)
+    {
+        float heading_err = mc_wrap_angle(gps_heading_rad - _state->heading_rad);
+        _state->heading_rad = mc_wrap_angle(_state->heading_rad + heading_err * MC_CFG_GPS_HEADING_BLEND);
+    }
+    else
+    {
+        _state->heading_rad = gps_heading_rad;
+    }
+    _state->heading_deg = _state->heading_rad * RAD2DEG;
     _state->pitch_deg = _gprmi->m_fPitchAngle;
     _state->roll_deg = _gprmi->m_fRollAngle;
     _state->vel[0] = _gprmi->m_fEastVelocity;
@@ -364,11 +375,19 @@
         return;
     }
 
+    if (_state->imu_valid == HIDO_TRUE && _dt_s > 0.0f)
+    {
+        _state->heading_rad = mc_wrap_angle(_state->heading_rad + _state->yaw_rate_rad * _dt_s);
+        _state->heading_deg = _state->heading_rad * RAD2DEG;
+    }
+
     if (_state->stage == MC_STAGE_IDLE)
     {
         _state->stage = MC_STAGE_GOTO_START;
     }
 
+    _out->target_heading_deg = _state->heading_deg;
+
     switch (_state->stage)
     {
     case MC_STAGE_GOTO_START:
@@ -379,6 +398,7 @@
         break;
     case MC_STAGE_FINISHED:
         _out->active = HIDO_FALSE;
+        _out->target_heading_deg = _state->heading_deg;
         break;
     default:
         break;

--
Gitblit v1.10.0