在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Arduino六足機器人第二部分:編程

李駿鵬 ? 來源:雪大大11 ? 作者:雪大大11 ? 2023-02-28 16:12 ? 次閱讀

這篇文章來源于DevicePlus.com英語網站的翻譯稿。

poYBAGPzEkiAfLXQAAELfQXFyDk009.jpg

在本項目的第二部分中,我們將繼續進行項目中相對容易的內容—編程。對六足機器人進行編程通常有兩種不同的方法。第一種是僅僅弄清楚機器人向前行走的一系列伺服運轉。顯然,這是一個艱難卻鮮見成效的工作—您所設計的代碼無法直接應用于另一臺六足機器人上。所以第二種被稱為逆運動學的方法應運而生。但是首先,我們需要改進板載微控制器

硬件

  • ? Arduino Mega
  • ? Adafruit 16通道PWM擴展板(或模塊;但是,此處強烈建議使用該擴展板,因為它的原型面積很小)
  • ? 12個帶有金屬齒輪的微型伺服(MG90S或其他同等規格產品
  • ? 4.8V或6V電池(鎳氫、鋰離子等)
  • ? 60個M3螺栓+120個螺母和墊圈(僅用于身體,對于其他部件的安裝您需要再另外添加)
  • ? 6個相同的圓珠筆彈簧
  • ? HC-SR04超聲波測距模塊(可選)

軟件

  • ? Arduino IDE
  • ? Github – 您在這里可以找到所有用于打印的 Arduino源代碼和3D模型

UNO -> Mega

在上一篇文章中,我們建議在本項目中使用Arduino UNO。但是,在使用UNO時我遇到了一個問題:它沒有足夠的SRAM內存來進行逆運動學模型正常運行時所需的所有計算。這些計算大多數是用浮點數來完成的。每個數字在使用時將占用4個字節的內存,是整型的兩倍。雖然看起來不多,但是UNO只有2kB的RAM,其中一些還會被全局變量占用。如果我們為所有全局變量和其他局部變量保留0.5kB,那么將剩下1.5kB的可用內存,這僅能供384個浮點數占用。384可能看起來挺多,但是對于1K模型所產生的數據量是不夠的(請閱讀下面的“算法”部分找到相關原因)。所以我們必須想辦法獲取更大的內存。

實現該目的最簡單的辦法是將UNO更改為MEGA。MEGA和UNO是兼容的,所以對于原理圖不用進行修改。另外,使用MEGA不僅可以為計算部分獲取四倍多的RAM,還意味著將有八倍以上的閃存可用于我們的程序存儲。我們很可能不會所有都用到,但是有更大的預留空間總是好的。以下是改進后的Fritzing原理圖,如果您使用的是Arduino MEGA最新版本 (Rev 3),更換的過程很簡單,跟斷開UNO之后連接MEGA的過程一樣。下面示意圖以供參考。

pYYBAGPzEkqAIn5UAAHCTzxqtwI183.jpg

圖1:PWM擴展板改進后原理圖

pYYBAGPzEkyAT0EnAAEVArYJfgI259.jpg

圖2:PWM模塊和HC-SR04超聲波傳感器改進后原理圖

現在,我們來探究一些物理原理、所用到的大量數學知識以及少量代碼。

逆運動學簡介

可能有些人還記得,在高中的時候,物理課中有一部分內容叫做“運動學”。簡單地說,這是力學領域中對一個目標對象(或一個點)運動的描述。這意味著在運動學中,您將使用數學公式和模型來對單個點的已知運動進行分析。顧名思義,逆運動學(IK)恰恰相反:通過一系列數學公式來反推并創建運動。

在機器人領域,通常使用的算法只能根據相應的端點運動來計算所有關節的運動。現在,您可以清楚地看到逆運動學在伺服運動編程部分的難題上所具有的優勢——它是可以通用的。從理論上來說,僅一個算法就可以處理機器人所執行的任何運動。從使用者的角度來說,它非常易于使用—您只需要告訴機器人向左轉90°,然后直行1米就可以了,而不必考慮每個伺服的位置。

模型

在以上段落中,一個詞不斷出現:一個(數學)模型。雖然聽起來很難,但是對于六足機器人這個項目來說,模型非常簡單:機器人能夠機械性的所達到的任何位置都可以由一組七個點來定義。一個用于身體,另外六個用于腿部。如果您查看了AP_Utils庫(可在 GitHub 上獲取),特別是里面的AP_Utils.h,就會看到關于這些點的定義(包含在其他內容中):


struct body {
float x;
float y;
float z;
float facing;
};


struct leg {
uint8_t number;
bool move;
float phi;
float z;
};

您可以看到在AP_Utils類中它們被聲明為私有結構。

body origin;
leg legs[6];

將這些結構私有化有以下兩個原因:

  1. 1. 用戶不應具有隨意修改這些值的權限。這些結構的存在是為了追蹤機器人的當前位置,因此,只有當機器人真正產生運動的時候這些結構才會發生變化。假如用戶想要更改當前的原點的 z 坐標,會導致IK模型發生不可預測的變化—這顯然是不可取的。
  2. 2. 通常,將共有函數和一個類中的變量數量控制到最低,是一種良好的編程習慣(尤其在C++中)。因此這樣做可以提高安全性,并利于API的輕松實現。

如果需要,我們可以將這些點可視化。現在,我們的整個機器人由七個點來表示(圖3)。

poYBAGPzEk2AFDFpAACLxeqlDvo439.jpg

圖3:IK模型的圖形表示。簡而言之,這就是六足機器人“認為”它所看起來的樣子。紅點是身體,藍點是腿。

這些結構用于追蹤所有腿部的位置以及機器人本身的位置。您可能注意到了,腿部的位置僅由兩個坐標來定義:phiz。這是因為每條腿只有兩個自由度,因此只能沿著兩個軸進行移動。現在可以通過身體的xyz 坐標來對所有位置進行定義。每條腿的 phiz 坐標的范圍是-1到1,并且僅確定了腿相對于身體的位置。盡管現在來看這種復雜性似乎是不必要的,但是實際上這比每次運動后計算每條腿的 xyz 坐標容易得多。phi 坐標表示水平運動,z表示垂直運動。

poYBAGPzElCAaJH8AAH8qQy29Ms989.jpg

圖4:帶有phi軸和z軸的腿部細節

算法

現在,我們對于機器人有了足夠簡單的數學表達,但是還沒有用它來做任何事。下一步就是研究如何通過僅僅修改該模型來實現伺服的運轉。我們需要完成的程序是將輸入作為一組點坐標,并將其轉換為伺服的運行。

這時候另一個問題就出現了,而這次,僅僅替換成另一個Arduino無法解決。當啟動伺服時,我們可能需要使大部分伺服同時運轉。但是,Arduino(以及所有與此相關的AVRs)一次只能執行一項任務。這意味著如果我們如果想平穩地運轉伺服,就需要一個一個進行啟動。如果僅僅將伺服從一端直接運轉到另一端,整個過程將非常不穩定。

解決該問題的一種方法是事先計算好所有伺服的位置,然后迭代這些數據,并對所有伺服進行設置。因為Arduino MEGA的時鐘頻率是16MHz,所以所有伺服雖然在實際過程中以很小的增量進行離散化運轉,但是整體表現出來的運行過程是連續流暢的。盡管它們只是靜態圖像的集合,但是這和視頻中所產生的連續運動的效果一致。人腦無法對視覺信息進行快速處理。如果我們在每一次位置變換之后添加一個50毫秒的延遲,則很明顯,伺服運轉實際上是由小的增量所組成的。

這也是我們必須更換Arduino的原因。如果我們想要運行每一個伺服,那么我們需要大量的內存來存儲剛剛所計算出的坐標。如果我們運轉所有的伺服,我們將需要600個浮點數來存儲運動坐標,因為每個伺服都至少需要50個位置才能產生平滑連續的運轉效果。600個浮點數大約是 2.3 kB的RAM—這已經超過了UNO的容量。

在AP_Utils庫中,將位置轉換為伺服運轉狀況的是traceLeg()setLegs() 函數。traceLeg() 函數僅進行計算:當提供了目標末端的 phi z 坐標時,它將以坐標數組的形式創建一個路徑。路徑可以具有多種形狀,當前支持的是線形(從一個點到另一個點的簡單直線)、圓弧和橢圓弧。后兩種路徑可以使步行變得更加容易。第二種函數 setLegs() 將根據 traceLeg的結果來移動所有指定的支腿,但是,所有這些對常規用戶是隱藏的。整個方案的重點是盡可能地方便用戶使用。最終用戶將無需直接設置 setLegs() ,而僅需調用與行走直接相關的函數即可。

現在我們開始進入IK編程的最后一步,即真正的行走。我們已經完成了所有基礎工作:我們創建了一個模型來對所有事物進行追蹤,我們可以運行多個伺服,甚至可以使伺服的運轉變得相對平滑連續。在以下內容中,支腿的編號與下圖中的編號相對應:

poYBAGPzElKAbGE9AAFHca9ZeS4633.jpg

圖5:支腿編號

該編號系統同時與您在庫中找到的代碼一致。

我們先從簡單的操作開始:在場地上轉向。通常,在為支腿設定新的位置時,您必須保證其中三條腿在地面上。這背后的原因很明顯—除非您可以非常快地移動支腿,不然機器人將失去穩定性并跌倒。我們可以分幾步使機器人轉向:

1. 將支腿0、2和4移動到phi 坐標最大值處(最大水平角)。

poYBAGPzElSAZYqkAAFnXr8FntQ316.jpg

圖6:轉向步驟1(支腿0、2和4)

2. 對支腿1、3和5進行相同操作。

poYBAGPzElaAcPmQAAFi3AbNkiw363.jpg

圖7:轉向步驟2(支腿1、3和5)

3. 身體轉向。這一步是通過沿與步驟1-3中相反的方向運行所有水平方向的伺服來完成的。因為所有的支腿都在地面上且不能移動,所以可以移動的只有身體。

poYBAGPzEliAamDrAANVRkd7Apo182.jpg

圖8:轉向步驟3

對這些步驟進行重復執行后,機器人可以轉彎80°。當然,只要不是在過程中一直保持 phi 軸最大坐標位置,可以實現小于該角度的轉向。得益于 traceLeg() 函數背后的巧妙算法,我們不必計算支腿的任何 z 坐標值—這些計算會自動進行,并形成圓或橢圓的形狀。您可以在以下視頻中觀察到這一過程。

最后一步是行走。具體來說,我們希望它至少能向前行走。六足機器人的行走算法有很多種,但大多數算法都基于有三個自由度的支腿。我們的支腿只有兩個自由度,因此我們必須自己進行一些設計。我所提出的方法雖然沒有達到預期的速度,但是這種方法是最易于編程的,并且易于觀察過程中的現象。

1. 首先,支腿0和3向前移動

pYYBAGPzElqAJpjzAAFzGf00hfY218.jpg

圖9:行走步驟1(支腿0和3)

2. 然后,支腿2和5向相同方向移動

pYYBAGPzElyAZOm6AAFlrPezITk911.jpg

圖10:行走步驟2(支腿2和5)

3. 對支腿1和4進行相同操作

poYBAGPzEl2AGdpGAAFvNyRefeA919.jpg

圖11:行走步驟4(支腿1和4)

4. 現在,身體移動向前,開始重復執行整個過程。

pYYBAGPzEl-AOc-0AAFl6j93Yyg980.jpg

圖12:行走步驟4

您可以在以下視頻中觀看整個運動:

基本避障功能

您可能已經注意到了,庫中有一部分專門用于SR04超聲波測距儀。這是為了獲取有關機器人所處環境的一些信息。當然,一個固定不動的傳感器是不夠的,因此在上一篇文章中我們在一個額外的伺服上也安裝了一個傳感器。

我相信大多數嘗試制造六足機器人的人對超聲波測距儀的工作原理是有一定程度了解的。對于與該傳感器的接口我建議您使用 AP_Utils::sr04_median 函數。它可以提供庫中所有SR04函數最準確的結果。您甚至可以輸出數據的單位,目前可以支持毫米、厘米和米!

重要提示: 請注意,您需要Adafruit PWM驅動程序庫來使AP_Utils運行,您可以點擊此處 下載。下載完成后,和其他Arduino庫一樣對其進行安裝。

以下是一個非常簡單的“自主”模式的示例,使用了到目前為止我們所討論的所有內容:行走、轉向和從SR04中讀取距離。如果您認真閱讀了這篇文章,那么應該能完全理解以下代碼中最重要部分的內容。有關所有函數的更多細節,請參考庫文件夾中或 GitHub 頁面上的 README.md文件。

Arduino 代碼

#include 



//define the pins that the SR04 is connected to

#define TRIG 3

#define ECHO 2



//create an instance of AP_Utils class

AP_Utils ardupod;

//you will have to supply your own offsets here

//see examples/calibration.ino for details

int offsets[16] = {5, 0, 0, -7, 10, -3, 6, -4, 3, -5, 10, -3, 0, 0, 0, 0};



void setup() {

 //reset the robot

 ardupod.begin(offsets);

}



void loop() {

 //take one step directly forward

 ardupod.walk(0, 1);

 //if an obstacle is closer than 20 cm, we have to turn

 if(sr04_median(TRIG, ECHO, CM, 100, 500) < 20.0) {

   //turn 90 degrees to the right

   ardupod.turn(90);

 }

}


結論

恭喜您完成了這個最具挑戰性的項目之一!做得很好!在嘗試使您自己的Ardupod行走之前,請確認同時運行示例文件夾中的 calibration.inoservo_test.ino。這對于正確設置所有伺服至關重要,這樣伺服才不會被損壞!在下一篇文章中,我們可能對此項目進行最后一次探索,以對一些機械性能較差的點進行改善,以及,更重要的是,增加一些改進的功能,例如遠程控制。

審核編輯:湯梓紅


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編程
    +關注

    關注

    88

    文章

    3637

    瀏覽量

    93986
  • Arduino
    +關注

    關注

    188

    文章

    6477

    瀏覽量

    187822
  • 六足機器人
    +關注

    關注

    9

    文章

    23

    瀏覽量

    17063
收藏 人收藏

    評論

    相關推薦

    實現免調整VCO1的IC (第二部分)

    實現免調整VCO1的IC (第二部分)
    發表于 05-07 13:18 ?46次下載

    AT91SAM9260使用手冊第二部分

    AT91SAM9260使用手冊第二部分
    發表于 03-10 09:13 ?86次下載

    常用單片機實例與仿真_第二部分

    第二部分 常用單片機實例與仿真 需要的下載
    發表于 11-10 17:37 ?13次下載

    微型模塊電源產品第二部分

    微型模塊電源產品第二部分,有需要的下來看看
    發表于 03-17 17:43 ?0次下載

    中國NB-IOT產業聯盟-第二部分問題清單-20160824

    中國NB-IOT產業聯盟-第二部分問題清單
    發表于 01-11 12:00 ?7次下載

    2012年PSoC數模混合設計培訓_第二部分

    2012年PSoC數模混合設計培訓_第二部分
    發表于 10-27 09:32 ?26次下載
    2012年PSoC數模混合設計培訓_<b class='flag-5'>第二部分</b>

    如何使用 Nios II 處理器進行你中意的設計之第二部分教程

    使用 Nios II 處理器進行設計”第二部分
    的頭像 發表于 06-11 14:36 ?5074次閱讀
    如何使用 Nios II 處理器進行你中意的設計之<b class='flag-5'>第二部分</b>教程

    AN-389: 使用Σ-Δ轉換器—第二部分[中文版]

    AN-389: 使用Σ-Δ轉換器—第二部分[中文版]
    發表于 03-19 06:38 ?0次下載
    AN-389: 使用Σ-Δ轉換器—<b class='flag-5'>第二部分</b>[中文版]

    有時你需要一點收獲第二部分

    有時你需要一點收獲第二部分
    發表于 04-19 11:32 ?9次下載
    有時你需要一點收獲<b class='flag-5'>第二部分</b>

    超聲波感應器會被用于何處?—— 第二部分

    超聲波感應器會被用于何處?—— 第二部分
    發表于 11-01 08:27 ?2次下載
    超聲波感應器會被用于何處?—— <b class='flag-5'>第二部分</b>

    如何實現更高的系統效率——第二部分:高速柵極驅動器

    如何實現更高的系統效率——第二部分:高速柵極驅動器
    發表于 11-02 08:15 ?2次下載
    如何實現更高的系統效率——<b class='flag-5'>第二部分</b>:高速柵極驅動器

    設計一臺物聯網模塊燈——第二部分

    設計一臺物聯網模塊燈——第二部分
    發表于 11-02 08:16 ?0次下載
    設計一臺物聯網模塊燈——<b class='flag-5'>第二部分</b>

    救世主Ga N來啦!第二部分:測量

    救世主Ga N來啦!第二部分:測量
    發表于 11-03 08:04 ?0次下載
    救世主Ga N來啦!<b class='flag-5'>第二部分</b>:測量

    生成任意量級的偏置電流網絡(第二部分

    生成任意量級的偏置電流網絡(第二部分
    發表于 11-03 08:04 ?0次下載
    生成任意量級的偏置電流網絡(<b class='flag-5'>第二部分</b>)

    用于激活設備的可編程定時器-第二部分

    電子發燒友網站提供《用于激活設備的可編程定時器-第二部分.zip》資料免費下載
    發表于 12-13 10:31 ?0次下載
    用于激活設備的可<b class='flag-5'>編程</b>定時器-<b class='flag-5'>第二部分</b>
    主站蜘蛛池模板: 日本在线www | 国产无遮挡床戏视频免费 | 福利在线播放 | 资源在线www天堂 | bt在线www天堂资源网 | 手机免费黄色网址 | 日韩欧美一区二区三区视频 | 国产h视频在线观看 | 亚洲高清一区二区三区四区 | 米奇777色狠狠8888影视 | 么公的好大好硬好深好爽视频 | 久久综合九色综合欧洲色 | 天天干夜夜艹 | 色婷婷综合久久久久中文一区二区 | 欧美视频精品在线 | 四虎影院免费网址 | 99久久精品免费精品国产 | xxx日本69hd| 免费人成a大片在线观看动漫 | 加勒比日本在线 | 亚洲天堂导航 | 牛牛碰在线视频 | 成人精品在线观看 | 喷潮白浆| 亚洲狠狠97婷婷综合久久久久 | 国产精品久久久久久久久久免费 | 我想看一级播放片一级的 | 国产成人a | 亚洲免费在线观看 | 日本69xxxx| 欧美网站视频 | 2020狠狠操 | 四虎在线视频 | 日本免费黄色大片 | 精品成人在线 | 国产在线一区视频 | 亚洲三级毛片 | 免费毛片软件 | 欧美三级手机在线 | 黄黄视频在线观看 | 99久久综合给久久精品 |