0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Arduino六足機(jī)器人第二部分:編程

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

這篇文章來源于DevicePlus.com英語網(wǎng)站的翻譯稿。

poYBAGPzEkiAfLXQAAELfQXFyDk009.jpg

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

硬件

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

軟件

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

UNO -> Mega

在上一篇文章中,我們建議在本項目中使用Arduino UNO。但是,在使用UNO時我遇到了一個問題:它沒有足夠的SRAM內(nèi)存來進(jìn)行逆運(yùn)動學(xué)模型正常運(yùn)行時所需的所有計算。這些計算大多數(shù)是用浮點(diǎn)數(shù)來完成的。每個數(shù)字在使用時將占用4個字節(jié)的內(nèi)存,是整型的兩倍。雖然看起來不多,但是UNO只有2kB的RAM,其中一些還會被全局變量占用。如果我們?yōu)樗腥肿兞亢推渌植孔兞勘A?.5kB,那么將剩下1.5kB的可用內(nèi)存,這僅能供384個浮點(diǎn)數(shù)占用。384可能看起來挺多,但是對于1K模型所產(chǎn)生的數(shù)據(jù)量是不夠的(請閱讀下面的“算法”部分找到相關(guān)原因)。所以我們必須想辦法獲取更大的內(nèi)存。

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

pYYBAGPzEkqAIn5UAAHCTzxqtwI183.jpg

圖1:PWM擴(kuò)展板改進(jìn)后原理圖

pYYBAGPzEkyAT0EnAAEVArYJfgI259.jpg

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

現(xiàn)在,我們來探究一些物理原理、所用到的大量數(shù)學(xué)知識以及少量代碼。

逆運(yùn)動學(xué)簡介

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

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

模型

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


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


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

您可以看到在AP_Utils類中它們被聲明為私有結(jié)構(gòu)。

body origin;
leg legs[6];

將這些結(jié)構(gòu)私有化有以下兩個原因:

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

如果需要,我們可以將這些點(diǎn)可視化?,F(xiàn)在,我們的整個機(jī)器人由七個點(diǎn)來表示(圖3)。

poYBAGPzEk2AFDFpAACLxeqlDvo439.jpg

圖3:IK模型的圖形表示。簡而言之,這就是六足機(jī)器人“認(rèn)為”它所看起來的樣子。紅點(diǎn)是身體,藍(lán)點(diǎn)是腿。

這些結(jié)構(gòu)用于追蹤所有腿部的位置以及機(jī)器人本身的位置。您可能注意到了,腿部的位置僅由兩個坐標(biāo)來定義:phiz。這是因?yàn)槊織l腿只有兩個自由度,因此只能沿著兩個軸進(jìn)行移動?,F(xiàn)在可以通過身體的x、yz 坐標(biāo)來對所有位置進(jìn)行定義。每條腿的 phiz 坐標(biāo)的范圍是-1到1,并且僅確定了腿相對于身體的位置。盡管現(xiàn)在來看這種復(fù)雜性似乎是不必要的,但是實(shí)際上這比每次運(yùn)動后計算每條腿的 xyz 坐標(biāo)容易得多。phi 坐標(biāo)表示水平運(yùn)動,z表示垂直運(yùn)動。

poYBAGPzElCAaJH8AAH8qQy29Ms989.jpg

圖4:帶有phi軸和z軸的腿部細(xì)節(jié)

算法

現(xiàn)在,我們對于機(jī)器人有了足夠簡單的數(shù)學(xué)表達(dá),但是還沒有用它來做任何事。下一步就是研究如何通過僅僅修改該模型來實(shí)現(xiàn)伺服的運(yùn)轉(zhuǎn)。我們需要完成的程序是將輸入作為一組點(diǎn)坐標(biāo),并將其轉(zhuǎn)換為伺服的運(yùn)行。

這時候另一個問題就出現(xiàn)了,而這次,僅僅替換成另一個Arduino無法解決。當(dāng)啟動伺服時,我們可能需要使大部分伺服同時運(yùn)轉(zhuǎn)。但是,Arduino(以及所有與此相關(guān)的AVRs)一次只能執(zhí)行一項任務(wù)。這意味著如果我們?nèi)绻肫椒€(wěn)地運(yùn)轉(zhuǎn)伺服,就需要一個一個進(jìn)行啟動。如果僅僅將伺服從一端直接運(yùn)轉(zhuǎn)到另一端,整個過程將非常不穩(wěn)定。

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

這也是我們必須更換Arduino的原因。如果我們想要運(yùn)行每一個伺服,那么我們需要大量的內(nèi)存來存儲剛剛所計算出的坐標(biāo)。如果我們運(yùn)轉(zhuǎn)所有的伺服,我們將需要600個浮點(diǎn)數(shù)來存儲運(yùn)動坐標(biāo),因?yàn)槊總€伺服都至少需要50個位置才能產(chǎn)生平滑連續(xù)的運(yùn)轉(zhuǎn)效果。600個浮點(diǎn)數(shù)大約是 2.3 kB的RAM—這已經(jīng)超過了UNO的容量。

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

現(xiàn)在我們開始進(jìn)入IK編程的最后一步,即真正的行走。我們已經(jīng)完成了所有基礎(chǔ)工作:我們創(chuàng)建了一個模型來對所有事物進(jìn)行追蹤,我們可以運(yùn)行多個伺服,甚至可以使伺服的運(yùn)轉(zhuǎn)變得相對平滑連續(xù)。在以下內(nèi)容中,支腿的編號與下圖中的編號相對應(yīng):

poYBAGPzElKAbGE9AAFHca9ZeS4633.jpg

圖5:支腿編號

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

我們先從簡單的操作開始:在場地上轉(zhuǎn)向。通常,在為支腿設(shè)定新的位置時,您必須保證其中三條腿在地面上。這背后的原因很明顯—除非您可以非??斓匾苿又?,不然機(jī)器人將失去穩(wěn)定性并跌倒。我們可以分幾步使機(jī)器人轉(zhuǎn)向:

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

poYBAGPzElSAZYqkAAFnXr8FntQ316.jpg

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

2. 對支腿1、3和5進(jìn)行相同操作。

poYBAGPzElaAcPmQAAFi3AbNkiw363.jpg

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

3. 身體轉(zhuǎn)向。這一步是通過沿與步驟1-3中相反的方向運(yùn)行所有水平方向的伺服來完成的。因?yàn)樗械闹榷荚诘孛嫔锨也荒芤苿?,所以可以移動的只有身體。

poYBAGPzEliAamDrAANVRkd7Apo182.jpg

圖8:轉(zhuǎn)向步驟3

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

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

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

pYYBAGPzElqAJpjzAAFzGf00hfY218.jpg

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

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

pYYBAGPzElyAZOm6AAFlrPezITk911.jpg

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

3. 對支腿1和4進(jìn)行相同操作

poYBAGPzEl2AGdpGAAFvNyRefeA919.jpg

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

4. 現(xiàn)在,身體移動向前,開始重復(fù)執(zhí)行整個過程。

pYYBAGPzEl-AOc-0AAFl6j93Yyg980.jpg

圖12:行走步驟4

您可以在以下視頻中觀看整個運(yùn)動:

基本避障功能

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

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

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

以下是一個非常簡單的“自主”模式的示例,使用了到目前為止我們所討論的所有內(nèi)容:行走、轉(zhuǎn)向和從SR04中讀取距離。如果您認(rèn)真閱讀了這篇文章,那么應(yīng)該能完全理解以下代碼中最重要部分的內(nèi)容。有關(guān)所有函數(shù)的更多細(xì)節(jié),請參考庫文件夾中或 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);

 }

}


結(jié)論

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

審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3521

    瀏覽量

    93272
  • Arduino
    +關(guān)注

    關(guān)注

    187

    文章

    6453

    瀏覽量

    185928
  • 六足機(jī)器人
    +關(guān)注

    關(guān)注

    9

    文章

    23

    瀏覽量

    17007
收藏 人收藏

    評論

    相關(guān)推薦

    實(shí)現(xiàn)免調(diào)整VCO1的IC (第二部分)

    實(shí)現(xiàn)免調(diào)整VCO1的IC (第二部分)
    發(fā)表于 05-07 13:18 ?46次下載

    AT91SAM9260使用手冊第二部分

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

    常用單片機(jī)實(shí)例與仿真_第二部分

    第二部分 常用單片機(jī)實(shí)例與仿真 需要的下載
    發(fā)表于 11-10 17:37 ?13次下載

    微型模塊電源產(chǎn)品第二部分

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

    中國NB-IOT產(chǎn)業(yè)聯(lián)盟-第二部分問題清單-20160824

    中國NB-IOT產(chǎn)業(yè)聯(lián)盟-第二部分問題清單
    發(fā)表于 01-11 12:00 ?7次下載

    2012年P(guān)SoC數(shù)?;旌显O(shè)計培訓(xùn)_第二部分

    2012年P(guān)SoC數(shù)模混合設(shè)計培訓(xùn)_第二部分
    發(fā)表于 10-27 09:32 ?26次下載
    2012年P(guān)SoC數(shù)?;旌显O(shè)計培訓(xùn)_<b class='flag-5'>第二部分</b>

    如何使用 Nios II 處理器進(jìn)行你中意的設(shè)計之第二部分教程

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

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

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

    有時你需要一點(diǎn)收獲第二部分

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

    超聲波感應(yīng)器會被用于何處?—— 第二部分

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

    如何實(shí)現(xiàn)更高的系統(tǒng)效率——第二部分:高速柵極驅(qū)動器

    如何實(shí)現(xiàn)更高的系統(tǒng)效率——第二部分:高速柵極驅(qū)動器
    發(fā)表于 11-02 08:15 ?2次下載
    如何實(shí)現(xiàn)更高的系統(tǒng)效率——<b class='flag-5'>第二部分</b>:高速柵極驅(qū)動器

    設(shè)計一臺物聯(lián)網(wǎng)模塊燈——第二部分

    設(shè)計一臺物聯(lián)網(wǎng)模塊燈——第二部分
    發(fā)表于 11-02 08:16 ?0次下載
    設(shè)計一臺物聯(lián)網(wǎng)模塊燈——<b class='flag-5'>第二部分</b>

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

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

    生成任意量級的偏置電流網(wǎng)絡(luò)(第二部分

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

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

    電子發(fā)燒友網(wǎng)站提供《用于激活設(shè)備的可編程定時器-第二部分.zip》資料免費(fèi)下載
    發(fā)表于 12-13 10:31 ?0次下載
    用于激活設(shè)備的可<b class='flag-5'>編程</b>定時器-<b class='flag-5'>第二部分</b>