<!-- .slide: data-background="https://i.imgur.com/gJLfldF.jpg" data-background-color="#111111" data-background-opacity="0.2" -->
###### tags: `iot-car` `lab` 返回[物聯網智慧自走車](/s/5c7ggGf0Spqql5Gy31Cqzg)
## 開車不用轉彎真方便!<br> <span style="color:#F9BF45;">水平移動避障</span>
###### [點我開啟簡報模式](/@BEExANT-ta/BJ6yNSqwK#)
###### <kbd>ESC</kbd> 鍵進入總覽模式
###### <kbd>←</kbd> <kbd>↑</kbd> <kbd>↓</kbd> <kbd>→</kbd> 切換頁面
---
<center><img src="https://i.imgur.com/seGXYOt.jpg" width=50%></img></center>
由於麥克納姆輪車的特性,可以實現==八個方向==的移動、原地==旋轉360度==,在==有限的空間==下能夠很==靈活的進行移動==,前面的練習中我們已熟悉如何操控車子,以及使用超音波感測器判斷與牆壁間的距離,這單元將進一步利用==左右水平移動+避障==閃避突出的牆壁並抵達終點。
---
## 目標
**設置好車道後,將自走車放置在==靠右==的起點出發,利用四個超音波感測器==判斷周遭牆壁==,以==水平移動==的方式探索出路,最後抵達終點時==判斷前方顏色為邊界顏色時停止==。**
---
## 設計原理
- 利用超音波的數值可以歸納出多種狀況: 前方障礙(可以向左、右、後移動),右前方障礙(可以向左、後移動)...等等。
- 依據不同狀況設定不同方向來控制自走車。
---
## 車道配置圖
<center><img src="https://i.imgur.com/vZKHTch.png" width=70%></img></center>
---
## 範例程式碼
新增程式檔並命名==平移避障移動==,將以下程式碼複製貼上程式編輯區執行。
```javascript=
let pingF = DATA.pingF;
let pingB = DATA.pingB;
let pingL = DATA.pingL;
let pingR = DATA.pingR;
let speed = 50;
let limit = 800;
if(DATA.colorF[3] == "紫")
{
move_stop.set();
}
else if(pingF < limit && pingR < limit && pingF > 0 && pingR > 0 )
{
move_left.set(speed);
}
else if(pingF < limit && pingL < limit && pingF > 0 && pingL > 0 )
{
move_right.set(speed);
}
else if(pingL < limit && pingL > 0)
{
move_forward.set(speed);
}
else if(pingR < limit && pingR > 0)
{
move_forward.set(speed);
}
```
---
## 程式解說
逐行講解程式意義。
----
```javascript=
let pingF = DATA.pingF;
let pingB = DATA.pingB;
let pingL = DATA.pingL;
let pingR = DATA.pingR;
```
- 定義區域變數,==pingF==、==pingB==、==pingL==、==pingR==分別代表==前==、==後==、==左==、==右==方的超音波感測資料。
----
```javascript=
let speed = 50;
let limit = 800;
```
- 定義初始速度與==超音波最小值==。
----
```javascript=
if(DATA.colorF[3] == "紫")
{
move_stop.set();
}
```
- 當前方顏色判斷為 =="紫"== 時,控制車子==停止==。
----
```javascript=
else if(pingF < limit && pingL < limit && pingF > 0 && pingL > 0 )
{
move_right.set(speed);
}
else if(pingF < limit && pingR < limit && pingF > 0 && pingR > 0 )
{
move_left.set(speed);
}
```
- 上述不成立時,當==前方==感測==小於最小值== 且 ==左方(右方)==感測==小於最小值== 且 ==前方與左方(右方)大於0==時,控制車子==向右(左)移動==。
----
```javascript=
else if(pingL < limit && pingL > 0)
{
move_forward.set(speed);
}
else if(pingR < limit && pingR > 0)
{
move_forward.set(speed);
}
```
- 上述不成立時,當==左方(右方)==感測==小於最小值== 且 ==左方(右方)大於0==時,控制車子==向前==移動。
---
## 參數修改
為方便實作,以下會將範例程式中可修改的參數標示出來,進行實作時只需修改對應參數,並觀察結果即可。
:::warning
:zap: 詳細內建JS參數參考 - [內建Js參數及功能總覽](/wlfjvQBzRPCmJ8LCL3f2Fg)
:::
----
:::success
**let speed = 50;**
:::
- x可代入 30 ~ 50,表示車子的預設速度,速度過快會使感測器來不及反應。
----
:::success
**let limit = ==x==**
:::
- x可代入 600~800,當車子與牆壁距離小於此值時將避開。
---
## 範例影片
{%youtube XWQy9CMFqH4 %}
<a class="btn btn-warning" style="width:100%;color:#333333;" href="/s/s2K5DrGBTXmf8fdqP0l8Hg" role="button"> 遠程手臂控制 **⇨** </a>
<a class="btn btn-primary" style="width:100%;" href="/s/-UEmP-gsSIyDL1SSy3XXgA" role="button"> **⇦** 車道置中移動
</a>
{"metaMigratedAt":"2023-06-16T14:19:54.930Z","metaMigratedFrom":"YAML","title":"開車不用轉彎真方便! - 水平移動避障","breaks":true,"slideOptions":"{\"transition\":\"slide\",\"transitionSpeed\":\"fast\",\"theme\":\"league\"}","contributors":"[{\"id\":\"a1db0c29-d848-4070-be84-9191a2398ca8\",\"add\":6022,\"del\":2844}]"}