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