<!-- .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>&#8592;</kbd> <kbd>&#8593;</kbd> <kbd>&#8595;</kbd> <kbd>&#8594;</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"> 遠程手臂控制 **&#8680;** </a> <a class="btn btn-primary" style="width:100%;" href="/s/-UEmP-gsSIyDL1SSy3XXgA" role="button"> **&#8678;** 車道置中移動 </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}]"}
    1157 views
   Owned this note