描述
這是一款使用LSRB算法解決迷宮的線迷宮機器人。與許多機器人不同,這是通過使用 IR 傳感器陣列來完成的,但我找到了一種僅使用 3 個 IR 傳感器來解決迷宮問題的方法。與此同時還節(jié)省了很多經(jīng)費,因此這個項目也可以說是愛好者的一個簡單且更便宜的選擇。
前提
在開始實際項目之前,還有一些先決條件。
熟悉通用PCB的焊接
基礎物理(質心、摩擦力、重心和車輪)
硬件
對稱底盤
陀螺儀(可選)
60 RPM 直流電機
車輪
紅外傳感器
Arduino Pro Mini
1. 對稱底盤
擁有對稱底盤非常重要。
如果底盤不對稱,則機器人車的質心(COM)將不在中心。如果發(fā)生這種情況,機器人將繼續(xù)向右或向左移動,這將導致最短路徑算法出現(xiàn)問題或缺陷。
2. 馬達驅動器(L298N)
這將用于驅動直流電機。L298N是雙通道的,意思是它可以同時控制兩個電機的方向。
3.Mpu 6050
MPU6050是6軸加速度加陀螺儀模塊。這意味著它可以測量 X、Y 和 Z 方向的加速度,還可以測量運動中身體的偏航、俯仰和滾動。
4. 60 RPM 直流電機
這些電機將用于移動機器人。為什么選擇 60 RPM 電機?好吧,如果您正在入門,最好從慢速馬達開始。速度慢的機器人更穩(wěn)定,更容易控制。對于許多強勁的 RPM,電機將難以控制(為此您需要強大的 PID 控制器)。因此,要開始使用,建議使用 60 RPM 直流電機。
5. 輪子
這些是迷宮解決機器人中最重要的組件之一。確保您的車輪具有更好的牽引力并且由優(yōu)質橡膠制成。這些車輪將連接到直流電機。
6. 紅外傳感器
這些傳感器將在檢測交叉路口類型方面發(fā)揮重要作用。
7.Arduino Pro mini
這將是我們機器人的大腦。算法的所有處理和計算都將在這個微控制器中進行。
“LSRB”算法
這是機器人解決迷宮的算法。在“LSRB”中,L 代表“LEFT”,S 代表“STRAIGHT”,R 代表 RIGHT,B 代表“BACK”或 BACKWARD。這些 LEFT、RIGHT、STRAIGHT 和 BACK 是機器人遵循的方向。該算法簡單直接。在該算法中,向左方向具有最高優(yōu)先級,而后(U 形轉彎)方向具有最低優(yōu)先級。讓我們看看這個算法是什么樣子的:
第 1 步:只要有可能轉彎,請始終跟隨左轉
第 2 步:如果無法向左走,請直接走。
第 3 步:如果 LEFT 和 STRAIGHT 都不可能,請選擇 RIGHT。
第 4 步:如果 LEFT、STRAIGHT 和 RIGHT 都不可能返回(或者這意味著要掉頭)
這意味著無論何時機器人在轉折點或十字路口,它總是盡可能向左走。如果 LEFT 不可能,那么 STRAIGHT,如果兩者都不可能,那么 RIGHT。如果所有三個轉彎都不可能,那么只能返回。這是您唯一需要了解的 LSRB 算法?;诖耍?8 種可能的情況:
1.Simple 或 Straight lane :這里 LEFT 是不可能的,但 STRAIGHT 路徑是。所以機器人將遵循直線路徑。
2.左轉(僅限左):顧名思義,這是左轉,所以這里可以左轉。根據(jù) LSRB 算法,機器人應盡可能向左走。所以機器人會在這里左轉。
3.右轉(僅右轉):同樣顧名思義,這是一個右轉,所以左和直路徑都是不可能的,所以根據(jù) LSRB 算法機器人將右轉。
4. T相交(T):這個相交的形狀像T,所以叫T相交。如圖所示,Robot 可以左轉。所以通過算法機器人會左轉。
5. 左 T 路口(直或左):再次通過圖像,我們可以看到機器人可以走左路,所以機器人會在這里左轉。
6.Right T 交點(直或右):這里不可能向左,但直路徑是。所以機器人會左轉
7.Dead End:這里 LEFT、STRAIGHT 和 RIGHT 這三個都不可能。所以機器人會在這里掉頭。
8. 四車道交叉口(Cross):此處再次通過圖像左轉是可能的,因此機器人將在此處左轉。
最后,迷宮結束:迷宮在這里結束,所以機器人會停在這里。
現(xiàn)在讓我們看一下如何將其轉換為代碼:
//LSRB ALGORITHM
IR1 =
IR2 =
IR3 =
void setup?
{
? DECLARE IR1 IR2 AND IR3 AS INPUTS
}
void loop?
{
? IR1 = digitalRead(
? IR2 = digitalRead(
? IR3 = digitalRead(
? if (IR1 == LOW && IR2 == HIGH && IR3 == LOW)//Straight path
? ? {
? ? ?Forward();
? ? }
? if (IR1 == HIGH && IR2 == LOW && IR3 == LOW)//Left turn
? ? {
? ? ?Left();
? ? }
? if (IR1 == LOW && IR2 == LOW && IR3 == HIGH)//Right Turn
? ? {
? ? ? Right();
? ? }
? if (IR1 == HIGH && IR2 == LOW && IR3 == HIGH)//T Intersection
? ? {
? ? ? Left(); // As left is possible
? ? }
? if (IR1 == HIGH && IR2 == HIGH && IR3 == LOW)//Left T Intersection
? ? {
? ? ? Left();// As Left is possible
? ? }
? if (IR1 == LOW && IR2 == HIGH && IR3 == HIGH)//Right T Tntersection
? ? {
? ? ?Forward();//As Straight path is possible
? ? }
? if (IR1 == LOW && IR2 ==LOW && IR3 == LOW)//Dead End
? ? {
? ? ?U_Turn(); //As no other direction is possible
? ? }
? if (IR1 == HIGH && IR2 == HIGH && IR3 == HIGH)//4 Lane intersection
? ? {
? ? ?Left(); //As no other direction is possible
? ? }
? if (IR1 == HIGH && IR2 == HIGH && IR3 == HIGH)//End of Maze
? ? {
? ? ?Stop(); //As no other direction is possible
? ? }?
}
代碼很簡單,但還有一個問題。4車道交叉口和迷宮盡頭的情況似乎相似。我們的機器人如何區(qū)分 4 車道交叉口和 End of Maze?答案也很簡單。讓機器人走得更遠一點?,F(xiàn)在,如果傳感器的值保持不變,那就結束了。但是如果左右傳感器的值發(fā)生變化,那么它是一個 4 路交叉點。讓我們看一下它的代碼:
if (IR1 == HIGH && IR2 == HIGH && IR3 == HIGH)
? ? {
? ? ?Forward();
? ? ?delay(
? ? ?if (IR1 == HIGH && IR2 == HIGH && IR3 == HIGH)
? ? ? ? {
? ? ? ? ? Serial.println("?ND OF MAZE");
? ? ? ? ? Stop();
? ? ? ? }
? ? ?else
? ? ? ? {
? ? ? ? ?Serial.println("FOUR WAY INTERSECTION");
? ? ? ? ?Left();
? ? ? ? }
? ? }
最短路徑算法
這是機器人用來計算迷宮中最短路徑的算法。它使用使用 LSRB 算法獲取的路徑并將其轉換為最短路徑。如何?讓我們看看這是如何工作的??紤]下圖中的迷宮。現(xiàn)在讓我們在這里放置一個機器人,讓我們通過 LSRB 算法可視化它的路徑。我們可以通過使用 LSRB 算法,機器人將采取 LEFT、LEFT、BACK、RIGHT、STRAIGHT。簡而言之,我們可以說機器人跟隨 L、L、B、R、S?,F(xiàn)在作為一個人,我們可以直接說最短路徑就是這里的 RIGHT 或“R”轉。但是機器人是如何做到這一點的呢?最短路徑算法在這里使用了替換。這些替換如下所示:
LBR = “B”
LBS = “R”
RBL = “B”
SBL = “R”
SBS = “B”
LBL = “S”
現(xiàn)在讓我們通過替換方法縮短路徑。在路徑 {L, L, B, R, S} 中,LBR = 'B' 所以 Path 現(xiàn)在變?yōu)?{ L, B, S}?,F(xiàn)在 LBS = 'R' 所以最終路徑變?yōu)?{ R} ,如前所述,這是正確的。現(xiàn)在讓我們將這個算法轉化為 Arduino 代碼:
void CALCULATE_SHORTEST_PATH(char MAZE_ARRAY[], int SIZE_OF_ARRAY)
{
? /*ONCE THE ROBOT COMPLETES THE MAZE THE FINAL SHORTEST PATH CALCULATED
? IS STORED IN THE ROBOT MEMORY.THIS SHORTEST PATH IS USED TO COMPLETE
? THE SAME MAZE IN SHORTEST AMOUNT OF TIME.(L :LEFT, R:RIGHT, B:BACK,S:STRAIGHT)
? BELOW ARE THE FEW SUBSTITUTIONS TO CONVERT FULL MAZE PATH TO ITS?
? SHORTEST PATH:
? LBL = S
? LBR = B
? LBS = R
? RBL = B
? SBL = R
? SBS = B
? LBL = S */
? char ACTION;
??
? for(int i = 0; i <= SIZE_OF_ARRAY-2; i++)
? ? {
? ? ? ACTION = MAZE_ARRAY[i];
? ? ? ? ? ?
? ? ? if(ACTION == 'B')
? ? ? ? {
? ? ? ? ? if(MAZE_ARRAY[i-1]== 'L' && MAZE_ARRAY[i+1] == 'R')
? ? ? ? ? ? {
? ? ? ? ? ? ? MAZE_ARRAY[i] = 'B';
? ? ? ? ? ? ? MAZE_ARRAY[i-1] = 0;
? ? ? ? ? ? ? MAZE_ARRAY[i+1] = 0;
? ? ? ? ? ? ? REARRANGE(MAZE_ARRAY,SIZE_OF_ARRAY,i-1,i,i+1);?
? ? ? ? ? ? }
? ? ? ? ? ?if(MAZE_ARRAY[i-1]== 'L' && MAZE_ARRAY[i+1] == 'S')
? ? ? ? ? ? {
? ? ? ? ? ? ? MAZE_ARRAY[i] = 'R';
? ? ? ? ? ? ? MAZE_ARRAY[i-1] = 0;
? ? ? ? ? ? ? MAZE_ARRAY[i+1] = 0;
? ? ? ? ? ? ? REARRANGE(MAZE_ARRAY,SIZE_OF_ARRAY,i-1,i,i+1);
? ? ? ? ? ? }
? ? ? ? ? ? if(MAZE_ARRAY[i-1]== 'R' && MAZE_ARRAY[i+1] == 'L')
? ? ? ? ? ? {
? ? ? ? ? ? ? MAZE_ARRAY[i] = 'B';
? ? ? ? ? ? ? MAZE_ARRAY[i-1] = 0;
? ? ? ? ? ? ? MAZE_ARRAY[i+1] = 0;
? ? ? ? ? ? ? REARRANGE(MAZE_ARRAY,SIZE_OF_ARRAY,i-1,i,i+1); ? ? ? ??
? ? ? ? ? ? }
? ? ? ? ? ? if(MAZE_ARRAY[i-1]== 'S' && MAZE_ARRAY[i+1] == 'L')
? ? ? ? ? ? {
? ? ? ? ? ? ? MAZE_ARRAY[i] = 'R';
? ? ? ? ? ? ? MAZE_ARRAY[i-1] = 0;
? ? ? ? ? ? ? MAZE_ARRAY[i+1] = 0;
? ? ? ? ? ? ? REARRANGE(MAZE_ARRAY,SIZE_OF_ARRAY,i-1,i,i+1); ? ? ? ? ? ??
? ? ? ? ? ? }
? ? ? ? ? ? if(MAZE_ARRAY[i-1]== 'S' && MAZE_ARRAY[i+1] == 'S')
? ? ? ? ? ? {
? ? ? ? ? ? ? MAZE_ARRAY[i] = 'B';
? ? ? ? ? ? ? MAZE_ARRAY[i-1] = 0;
? ? ? ? ? ? ? MAZE_ARRAY[i+1] = 0;
? ? ? ? ? ? ? REARRANGE(MAZE_ARRAY,SIZE_OF_ARRAY,i-1,i,i+1); ? ? ? ? ? ??
? ? ? ? ? ? }
? ? ? ? ? ? if(MAZE_ARRAY[i-1]== 'L' && MAZE_ARRAY[i+1] == 'L')
? ? ? ? ? ? {
? ? ? ? ? ? ? MAZE_ARRAY[i] = 'S';
? ? ? ? ? ? ? MAZE_ARRAY[i-1] = 0;
? ? ? ? ? ? ? MAZE_ARRAY[i+1] = 0;
? ? ? ? ? ? ? REARRANGE(MAZE_ARRAY,SIZE_OF_ARRAY,i-1,i,i+1);
? ? ? ? ? ? }
? ? ? ? ? ??
? ? ? ? ? i = -1;
? ? ? ? }
? ? ? ?
? ? ? ?delay(100); ??
? ? }
}
最短路徑算法可以用 3 個紅外傳感器嗎?
如果您只使用 3 個紅外傳感器,那就很難了。為了使其工作,您必須使用 PID 算法使機器人遵循絕對直線路徑。如果您的機器人遵循絕對直線路徑,則只能在其中實現(xiàn)最短路徑算法。
PID控制器
PID控制器中的PID代表比例積分和微分。這將在我們的機器人中用于遵循一條完全筆直的路徑。先查看一下PID這個術語的意思:
1.Proportional:此項與誤差(E)項成正比。誤差越大,比例部分的值越大。該值負責機器人的轉動。例如,如果誤差很大,那么機器人的動作也會很強。所以基本上比例負責機器人的動作強度。比例的缺點是它會產(chǎn)生很多振蕩。就像如果機器人只包含比例部分,那么車輛將繼續(xù)從左到右擺動。好吧,它會直走,但會振蕩很多。通過比例控制獲得的增益用“KP”表示。
P = KP x Error
2. 積分:即使在微分部分消除了振蕩之后,仍然存在小的偏移量。積分部分通過考慮所有誤差來消除此偏移。積分項隨時間增加。通過積分獲得的增益用“KI”表示。
I = I + KI x Error
3 微分:微分項減少或消除了比例項產(chǎn)生的振蕩。這將使機器人的運動更加順暢。機器人將沿著一條直線前進,沒有振蕩。Derivative 獲得的增益用“KD”表示。
D = KD x (Error - Previous_Error)/Time
PID 的公式由下式給出:
所以最終的PID值是通過將這些項相加得到的:
PID = P + I + D
PID 的主要目標是盡可能減少誤差項。在繼續(xù)編碼之前,PID 控制器需要三個主要元素。
1. 反饋:反饋是一個過程,其中一部分輸出用作迭代中的輸入。在我們的案例中,反饋是由 MPU6050 提供的。我們得到了什么樣的反饋?我們得到陀螺值作為反饋。
2.Actuator:這個東西起到改變系統(tǒng)輸出的作用。它可以是伺服電機、直流電機或任何其他電機。在我們的例子中,執(zhí)行器是機器人的兩個直流電機。
3.SetPoint :這是我們想要達到的理想點或值。它是通過完全消除誤差而獲得的。
現(xiàn)在將這個理論轉化為代碼:
double PID_CONTROLLER(double FEEDBACK, double dt)
{
? double ERROR_VALUE;
? double PREVIOUS_ERROR_VALUE = 0;
? double SETPOINT =
? double KP =
? double KI =
? double KD =
? double P;
? double I;
? double D;
? double INTEGRAL;
? double DERIVATIVE;
? double OUTPUT_VALUE;
? ERROR_VALUE = SETPOINT - FEEDBACK; //Here the feedback is YAW from MPU6050
? P = KP*ERROR_VALUE;?
? INTEGRAL += ERROR_VALUE*dt;
? I = KI*INTEGRAL;
? DERIVATIVE += (ERROR_VALUE-PREVIOUS_ERROR_VALUE)/dt;
? D = KD*DERIVATIVE;
? OUTPUT_VALUE = P + I + D ;
? PREVIOUS_ERROR_VALUE = ERROR_VALUE;
? return OUTPUT_VALUE;
??
}
PID值的調整:
調整系統(tǒng)的 Kp、Ki 和 Kd 值的方法有很多,其中一種是手動調整,通過它可以輕松實現(xiàn)穩(wěn)定性。最初,Kp、Ki 和 Kd 值設置為零。然后 Kp 值從零增加到系統(tǒng)開始從其平均位置振蕩的點。
隨著 Kp 值的增加,可以看出系統(tǒng)的響應逐漸增加。保持 Kp 值恒定,然后增加 Ki 值,直到從系統(tǒng)中可以看出,朝某個方向的小傾斜傾向于使車輛朝該方向加速。當正確獲得 Kp 和 Ki 值時,則增加 Kd 值。Kd 值增加,從而顯著降低了快速加速度。
適當?shù)?KD 值會導致較小的過沖和振蕩。在獲得粗略的 Kp、Ki 和 Kd 值后,進行微調。以上步驟重復多次,得到增益值的最佳組合。
PID控制器
即使使用對稱的底盤,您可能已經(jīng)注意到機器人在沿線行駛時仍然會向左或向右移動,這是因為直流電機。愛好者使用的直流電機并不完美。沒有兩個電機是一樣的。它們的機械結構之間總是存在細微差別。如果您的機器人遵循絕對直線路徑,那么您很幸運,恭喜!但很多時候這種情況不會發(fā)生,機器人通常不會向左或向右移動。如果您不使用紅外傳感器陣列,這可能會影響您的最短路徑算法。對 PID 的另一種需求是當您使用非常高的 RPM 電機時。
為了克服這個問題,有很多選擇:
1.使用優(yōu)質直流電機(不保證直線路徑)
2.使用優(yōu)質車輪(不保證直線路徑)
3.使用高度機械精確的底盤(不保證直線路徑)
4.降低一個電機的速度,使兩個電機的速度完美匹配(但這樣做后仍然存在微小的誤差,使機器人幾乎沒有偏離軌道)。
5.使用旋轉編碼器(有時可能很好用)
6.使用PID控制器(如果編碼完美,保證機器人的直線路徑)。
在所有這些選項中,只有 PID 控制器可以保證機器人的絕對直線路徑。
構造
機器人的構造非常簡單。我很確定只有圖像就足以讓您構建硬件,所以我只提供圖像。
最終成果
請注意,代碼將僅是 LSRB 算法的實現(xiàn)。代碼中有一個最短路徑函數(shù),您可以使用它來實現(xiàn)最短路徑算法。您可以嘗試使用該功能來實現(xiàn) 3 個紅外傳感器的最短路徑。
評論
查看更多