蜘蛛機(jī)器人項(xiàng)目的具體細(xì)節(jié)
蜘蛛機(jī)器人的機(jī)械結(jié)構(gòu):
它是由一個(gè)底盤(pán)、六個(gè)足、18個(gè)舵機(jī)構(gòu)成的18自由度的機(jī)器人,每一個(gè)足分成三節(jié)。
蜘蛛機(jī)器人的主控芯片:
主控芯片,stm32f103rct6,這個(gè)芯片的主頻最高為72MHZ。
它的RAM大小為48 KB,如此大小的RAM和主頻足以支持它實(shí)時(shí)演算腿部角度。
其內(nèi)置有八個(gè)定時(shí)器,其中有六個(gè)定時(shí)器帶有pwm模塊,所以這個(gè)芯片可以同時(shí)輸出24路pwm信號(hào)。
外置的傳感器:
MPU6050傳感器,此模塊用于測(cè)量蜘蛛的姿態(tài),我需要姿態(tài)信息來(lái)使蜘蛛保持平衡
ESP8266 WIFI模塊,此模塊主要用于與手機(jī)通信,實(shí)現(xiàn)手機(jī)無(wú)線操控蜘蛛
蜘蛛的控制方式:
電腦上位機(jī)串口控制運(yùn)動(dòng)模式(有線串口1)
按鍵控制蜘蛛運(yùn)動(dòng)模式
????運(yùn)動(dòng)模式1、手機(jī)重力或姿態(tài)控制蜘蛛以三角步態(tài)移動(dòng)以及移動(dòng)的距離和方向((WIFI無(wú)線控制,無(wú)線串口3)
????運(yùn)動(dòng)模式2、手機(jī)重力或姿態(tài)控制蜘蛛姿態(tài)(WIFI無(wú)線控制,無(wú)線串口3)
????運(yùn)動(dòng)模式3、底盤(pán)各種平移測(cè)試
????運(yùn)動(dòng)模式4、旋轉(zhuǎn)三角步態(tài)測(cè)試
關(guān)于重力控制或姿態(tài)控制兩種算法的優(yōu)缺點(diǎn):重力控制的傳感器數(shù)據(jù)來(lái)源于手機(jī)的加速度傳感器,姿態(tài)控制的傳感器數(shù)據(jù)來(lái)源于手機(jī)的加速度和角速度傳感器數(shù)據(jù)的融合(互補(bǔ)濾波),所以重力控制的動(dòng)態(tài)特性不如姿態(tài)控制,其靜態(tài)特性又與姿態(tài)控制的相差無(wú)幾,但是這里重力控制的計(jì)算量要比姿態(tài)控制少很多(不需要對(duì)傳感器數(shù)據(jù)進(jìn)行復(fù)雜的處理)
硬件參數(shù)與機(jī)電結(jié)構(gòu)設(shè)計(jì):
總共有18個(gè)舵機(jī)、一個(gè)舵機(jī)有3根線,如果只算上舵機(jī)線的話,那也有54根線,如果沒(méi)有規(guī)劃好線路,那會(huì)導(dǎo)致一些不可名狀的問(wèn)題。
這里是這樣處理接線問(wèn)題的,我在洞洞板上使用了母座排針(插開(kāi)發(fā)板上)和公排針(舵機(jī)引線插上邊),我將它稱為插卡式接線結(jié)構(gòu)(與Arduino與其模塊的連接方式雷同)
根據(jù)下圖的引腳設(shè)定以及開(kāi)發(fā)板引腳圖,


我很快就焊接了一個(gè)插卡式連接板,然后再將舵機(jī)過(guò)長(zhǎng)的引線剪短(這里用到了熱縮管),最終效果如下圖

硬件參數(shù):接下來(lái)考慮系統(tǒng)的硬件參數(shù),WIFI模塊的串口與STM32的串口3相連,波特率115200........如下圖


為了不占用MPU的資源,這里采用DMA傳輸?shù)姆绞絹?lái)接收WIFI模塊的數(shù)據(jù)。
來(lái)自ESP8266的數(shù)據(jù)的接收邏輯:首先我使能了串口3的空閑中斷,ESP8266接收到手機(jī)發(fā)送過(guò)來(lái)的控制命令后通過(guò)串口傳輸?shù)絊TM32上,當(dāng)數(shù)據(jù)傳輸完成后,芯片進(jìn)入串口空閑中斷程序

空閑中斷程序會(huì)處理接收的數(shù)據(jù)并重新啟動(dòng)DMA傳輸,并將數(shù)據(jù)通過(guò)串口1打印到上位機(jī)上。
電腦的串口與STM32的串口1相連,波特率之類的參數(shù)與串口3的一樣,這里依然使用DMA傳輸來(lái)接收上位機(jī)的數(shù)據(jù)

(串口1的DMA傳輸優(yōu)先級(jí)和中斷優(yōu)先級(jí)要低于串口3的)
MPU6050的I2C接口與STM32的模擬I2C接口相連。在閱讀MPU6050的手冊(cè),我們可以給出其寄存器的名字(能反映寄存器功能)與地址的映射關(guān)系(宏定義),這樣可以提高代碼的可讀性(修改Keli5的編碼模式后,我們可以使用中文宏定義與中文名變量)
MPU6050參數(shù)設(shè)置:
設(shè)定8個(gè)采樣點(diǎn)的平均濾波
加速度傳感器量程±2G
角速度傳感器量程±2000dps
采樣頻率50HZ

在這里,我啟動(dòng)了某個(gè)50HZ(與MPU6050的采樣頻率一樣)的定時(shí)器中斷,中斷程序:讀取MPU6050的數(shù)據(jù)并使用四元數(shù)積分、互補(bǔ)濾波的算法來(lái)解算姿態(tài)。
在所有中斷程序中,它的優(yōu)先級(jí)是最高的。

當(dāng)然,在使用MPU6050之前,先校正了陀螺儀的零點(diǎn)漂移和加速度計(jì)的零飄和比例尺(橢球擬合)
關(guān)于最小二乘法橢球擬合:當(dāng)加速度傳感器在靜止?fàn)顟B(tài)下(僅受到重力作用),加速度的模等于重力的模,根據(jù)這個(gè)關(guān)系,我們可以列出下面的方程,而這正是一個(gè)橢球方程,但我們不能通過(guò)這個(gè)方程來(lái)解各軸零飄和比例尺,這是因?yàn)閿?shù)據(jù)存有噪聲即便是平均濾波過(guò)的數(shù)據(jù)(濾波不能消除噪聲,只能抑制噪聲)。
在三維空間中將大量的加速度傳感器靜止時(shí)的數(shù)據(jù)繪制出來(lái),我們預(yù)測(cè)這些點(diǎn)的分布應(yīng)該會(huì)近似一個(gè)橢球,事實(shí)上也正是如此,我們?nèi)フ业揭粋€(gè)最接近的橢球方程,用這個(gè)方程的系數(shù)(零飄和比例尺)來(lái)作為傳感器的零飄和比例尺,我們用加速度矢量范數(shù)的方差來(lái)衡量數(shù)據(jù)組與橢球的距離,這樣的話,我們只要求得誤差(距離)方程最小時(shí)各軸的零飄和比例尺即可,這樣的方法就是最小二乘法橢球擬合


程序的邏輯與結(jié)構(gòu)
接下來(lái)來(lái)討論一下程序的邏輯與結(jié)構(gòu),實(shí)際上上面的文字已經(jīng)把所有的中斷程序都解釋過(guò)了,所以,這里只需要討論主程序和其他函數(shù)的邏輯與結(jié)構(gòu)
main邏輯:
我定義了一個(gè)狀態(tài)標(biāo)志位變量Mode,這個(gè)標(biāo)志位用于表示機(jī)器人的運(yùn)動(dòng)模式,當(dāng)硬件初始化萬(wàn)后,程序就進(jìn)入了while循環(huán)里,while循環(huán)里主要是Switch語(yǔ)句,根據(jù)Mode的值執(zhí)行相應(yīng)的運(yùn)動(dòng)程序




main函數(shù)之外定義的函數(shù):
舵機(jī)測(cè)試:在main函數(shù)之外還定義了不少測(cè)試用的函數(shù),這些函數(shù)主要是用來(lái)測(cè)試舵機(jī)的好壞與舵機(jī)接線是否正確用的


蜘蛛機(jī)器人的運(yùn)動(dòng)原理與算法在https://www.bilibili.com/video/BV1WB4y147D9?spm_id_from=333.999.0.0&vd_source=6cfcfed4d7c52b2a577834ce56144709已經(jīng)講述過(guò)了,這里貼出代碼演示一下算法的具體過(guò)程






我們發(fā)出一個(gè)運(yùn)動(dòng)指令,讓機(jī)器人底盤(pán)位移(10cm,10cm),對(duì)矢量指令(10cm,10cm)100均分(這是我隨便給出的一個(gè)數(shù),實(shí)際上我們可以通過(guò)舵機(jī)的精度來(lái)計(jì)算多少均分)線性插值,通過(guò)控制某個(gè)與時(shí)間成正比的變量來(lái)控制機(jī)器人的運(yùn)動(dòng),改變系數(shù)即可改變機(jī)器人執(zhí)行指令的速度。
程序結(jié)構(gòu):


