總體來講,整個算法的設(shè)計都基于PID動態(tài)控制
尋線算法:
假設(shè)我們有三個尋線傳感器分別叫做 A、B、C。
如果小車處于最佳狀態(tài),error == 0,那么A、B、C就應(yīng)該等于0,1,0。
如果小車向右偏離黑線,error == -1, 那么A、B、C就應(yīng)該等于1,0,0。
如果小車向左偏離黑線,error == 1, 那么A、B、C就應(yīng)該等于0,0,1。
控制方法:
經(jīng)過無數(shù)的嘗試,發(fā)現(xiàn)只有用差速轉(zhuǎn)彎的方式,才能完美的貼合曲線。
當(dāng) error == 0, 左右輪速度相等,假設(shè)都為 50% PWM。
若 error == -1,右輪速度應(yīng)快于左輪,才能將小車?yán)刭惖?,所以右?60% PWM、左輪 40 % PWM。
若 error == 1,左輪速度應(yīng)快于右輪,才能將小車?yán)刭惖溃宰筝?60% PWM、右輪 40 % PWM。
We will keep calculating the errors, and we will move the car according to the errors. So in this way, the car will always stay on the black line.
偽代碼看起來像這樣:
int A = 0;
int B = 0;
int C = 0;
float Kp = 0;
float Ki = 0;
float Kd = 0;
float error=0, P_value = 0, I_value = 0, D_value = 0, PID_value = 0;
float previous_error = 0;
int initial_motor_power = 50;
void calculate_PID() {
P_value = error;
I_value = I_value + error;
D_value = error - previous_error;
PID_value = (Kp * P_value) + (Ki * I_value) + (Kd * D_value);
previous_error = error;
}
void setup() {
}
void loop() {
if (A == 0 && B == 1 && C == 0) {
error = 0;
} else if (A == 1 && B == 0 && C == 0) {
error = -1;
} else if (A == 1 && B == 0 && C == 0) {
error = 1;
}
calculate_PID();
if (round(PID_value * 10) == 0) {
go_straight(initial_motor_power, initial_motor_power);
}
else if (PID_value < 0) {
speed1 = initial_motor_power - abs(PID_value)
speed2 = initial_motor_power + abs(PID_value)
constrain(speed1, 0, 100)
constrain(speed2, 0, 100)
go_right(speed1, speed2) // speed1 < speed2 here
}
else if (PID_value > 0) {
speed1 = initial_motor_power + abs(PID_value)
speed2 = initial_motor_power - abs(PID_value)
constrain(speed1, 0, 100)
constrain(speed2, 0, 100)
go_left(speed1, speed2) // speed1 > speed2 here
}
}
下面是重復(fù)內(nèi)容
503陸空兩棲機器人巡航 項目(冠/亞/季軍)技術(shù)報告
南京鐵道職業(yè)技術(shù)學(xué)院 胡英杰,孫雅斌
指導(dǎo)教師: 楊杰
摘要 通過PID算法,不斷測試,尋出最優(yōu)參數(shù),從而達到最好的效果
關(guān)鍵詞 PID;樹莓派;差速轉(zhuǎn)彎;智能小車;Pix無人機
1.引言
現(xiàn)今是一個不斷發(fā)展的年代,一切過時的東西都將消失在歲月的塵埃之中。唯有那些不斷開拓的人,才能立足自我,不斷創(chuàng)新,從而在激烈的社會競爭中取得不敗之地。
有時候我想想都能笑出來,接近2020年,有些人還在拿著51單片機做開發(fā)。51單片機能聯(lián)網(wǎng)嗎?51單片機支持面向?qū)ο缶幊虇幔?1單片機可以使用成千上萬的開源庫嗎?這種現(xiàn)象只能說明大部分的人是不思進取的,不愿前進的。
而本隊恰恰相反,從一開始就立足最新科技成果,采用了樹莓派+Px4這種高級的組合。且不說樹莓派自帶的網(wǎng)絡(luò)屬性(暗指你可以通過 IP packets 的方式對它進行控制),就算憑著它深度集成的 Python 開發(fā)環(huán)境,就能從軟件開發(fā)上占足優(yōu)勢(畢竟Python 1分鐘, C 寫2小時不是瞎說的)
另外,由于采用了開源飛控 PX4,我們不需要花大量的精力進行飛機平衡調(diào)參,省下來的不少時間可以全用在對賽道本身的研究上。
如此一來,事情就變得美妙而簡單了。
2.作品的總體設(shè)計
2.1 小車部分
(1) 小車的設(shè)計思想
輕: 不輕就飛不起來了
機動性強: 輪子反應(yīng)要快,馬力要足
(2) 小車的組成
紅外巡線模塊→樹莓派→電機驅(qū)動
超聲波模塊→樹莓派→電機驅(qū)動
帶孔鋁合金自制框架
樹莓派3b+
TT減速電機
數(shù)字巡線模塊
超聲波傳感器
自制萬向輪
輪胎
電機驅(qū)動板
LED燈
2.2 無人機部分
(1)選購原則
盡量購買開源產(chǎn)品,因為資源豐富,容易上手。
(2)硬件組成
Pixhawk2.4.8飛控
F330機架
好盈樂電調(diào)
YH2212電機
減震架
8045漿
樂迪遙控器
4000mh電池
2.3 程序設(shè)計
(1) 小車巡線算法
假設(shè)我們有三個尋線傳感器分別叫做 A、B、C。
如果小車處于最佳狀態(tài),error == 0,那么A、B、C就應(yīng)該等于0,1,0。
如果小車向右偏離黑線,error == -1, 那么A、B、C就應(yīng)該等于1,0,0。
如果小車向左偏離黑線,error == 1, 那么A、B、C就應(yīng)該等于0,0,1
(2)小車控制方法
經(jīng)過無數(shù)的嘗試,發(fā)現(xiàn)只有用差速轉(zhuǎn)彎的方式,才能完美的貼合曲線。
當(dāng) error == 0, 左右輪速度相等,假設(shè)都為 50% PWM。
若 error == -1,右輪速度應(yīng)快于左輪,才能將小車?yán)刭惖?,所以右?60% PWM、左輪 40 % PWM。
若 error == 1,左輪速度應(yīng)快于右輪,才能將小車?yán)刭惖?,所以左?60% PWM、右輪 40 % PWM。
We will keep calculating the errors, and we will move the car according to the errors. So in this way, the car will always stay on the black line.
(3)核心代碼
int A = 0;
int B = 0;
int C = 0;
float Kp = 0;
float Ki = 0;
float Kd = 0;
float error=0, P_value = 0, I_value = 0, D_value = 0, PID_value = 0;
float previous_error = 0;
int initial_motor_power = 50;
void calculate_PID() {
P_value = error;
I_value = I_value + error;
D_value = error - previous_error;
PID_value = (Kp * P_value) + (Ki * I_value) + (Kd * D_value);
previous_error = error;
}
void setup() {
}
void loop() {
if (A == 0 && B == 1 && C == 0) {
error = 0;
} else if (A == 1 && B == 0 && C == 0) {
error = -1;
} else if (A == 1 && B == 0 && C == 0) {
error = 1;
}
calculate_PID();
if (round(PID_value * 10) == 0) {
go_straight(initial_motor_power, initial_motor_power);
}
else if (PID_value < 0) {
speed1 = initial_motor_power - abs(PID_value)
speed2 = initial_motor_power + abs(PID_value)
constrain(speed1, 0, 100)
constrain(speed2, 0, 100)
go_right(speed1, speed2) // speed1 < speed2 here
}
else if (PID_value > 0) {
speed1 = initial_motor_power + abs(PID_value)
speed2 = initial_motor_power - abs(PID_value)
constrain(speed1, 0, 100)
constrain(speed2, 0, 100)
go_left(speed1, speed2) // speed1 > speed2 here
}
}
(4)流程控制
實際上,在這個具體的比賽,小車只有兩次機會碰到全白,一是剛進隧道時,二是到達起飛點時。
只要把握住了這兩個節(jié)點,那整個程序就可以被分為兩部分: 尋黑線 和 過隧道。