小車轉向的調試與實現
怎么實現小車的90度轉向?
首先,在09_國產IMU移植及姿態解算.md里面我們可以獲取到小車的姿態信息,對應的轉向信息就是Yaw(偏航角)。
而在08_直流減速電機PID速度環與位置環調試中我們也可以準確控制小車輪子的轉速和轉多少個脈沖(也就是轉幾圈)了。
這樣實現小車的轉向就有了兩種方案了。一種是用Yaw(偏航角)作為測量值,想要轉的角度作為目標值,用PID驅動小車以一定的速度去旋轉來達到目標值。
第二種是在實現小車輪子位置環的基礎上,控制兩邊輪子同時向不同的方向旋轉一定的圈數(編碼器脈沖),在小車輪子不打滑的情況下轉過的角度就是一個確定的值,在送藥小車的地圖中,旋轉基本都是90度的,所以這種實現方法會很簡單也容易調試。
用角度環實現90度轉向
在pid_thread.c中實現:
創建相應的PID控制參數的結構體:
positional_pid_params_t car_angle_ring_pid;
初始化控制結構體并修改kp ki kd:
//角度環配置 //角度環 pid 參數初始化 positional_pid_init(&car_angle_ring_pid, 0.015, 0, 0, 0.1, 2, -2); //修改 角度環 kp ki kd car_angle_ring_pid.positional_pid_set_value(&car_angle_ring_pid, 0.015, 0, 0);
在PID的軟件定時器回調函數中計算兩個輪子需要的速度:
// 小車角度環 if (car_angle_ring_enable_flag == 1) { static float error = 0; error = turn_target - fusion_data.euler.euler.yaw; // 處理角度突變 if (error > 180.0f) error -= 360.0f; else if (error < -180.0f) error += 360.0f; angle_ring_speed_target = positional_pid_compute( &car_angle_ring_pid, error, fusion_data.euler.euler.yaw); } else { turn_target = fusion_data.euler.euler.yaw; angle_ring_speed_target = 0; }
打開角度環后他就會保持Yaw為0,如下面這個圖一樣:
下面是設定他靠角度換旋轉90度的效果:
用位置環實現90度轉向
還是在pid_thread.c中實現:
在08_直流減速電機PID速度環與位置環調試已經可以讓輪子轉固定的脈沖(圈數)了,直接把對應的目標值加給電機1和電機2的位置目標就可以了。
// 位置式旋轉,負數左轉,正數右轉。 void car_spin_position(int32_t _position_target) { motor1_position_target += -_position_target; motor2_position_target -= _position_target; }
在實際實現中,如下面的gif圖所示:
審核編輯 黃宇
-
電機
+關注
關注
142文章
9042瀏覽量
145750 -
PID
+關注
關注
35文章
1472瀏覽量
85605 -
開發板
+關注
關注
25文章
5081瀏覽量
97695
發布評論請先 登錄
相關推薦
評論