基礎知識之姿態(tài)傳感器
1. 什么是姿態(tài)傳感器?
姿態(tài)傳感器是一種用于檢測和測量物體的姿態(tài)或位置的設備。它們通常使用各種傳感器技術(shù),如加速度計、陀螺儀和磁力計等,來(lái)獲取物體在空間中的方向、旋轉角度和位置信息。姿態(tài)傳感器廣泛應用于許多領(lǐng)域,包括航空航天、機器人技術(shù)、虛擬現實(shí)、運動(dòng)追蹤和醫療設備等。通過(guò)實(shí)時(shí)監測和記錄物體的姿態(tài),姿態(tài)傳感器可以幫助實(shí)現精確的導航、運動(dòng)控制和姿勢分析等功能。
本文引用地址:http://dyxdggzs.com/article/202403/455922.htm2. 姿態(tài)傳感器是如何工作的?
姿態(tài)傳感器的工作原理取決于其具體的傳感器技術(shù)。以下是幾種常見(jiàn)的姿態(tài)傳感器及其工作原理:
加速度計(Accelerometer):加速度計通過(guò)測量物體的加速度來(lái)確定其姿態(tài)。加速度計通常使用微機電系統(MEMS)技術(shù),其中包含微小的質(zhì)量和彈簧系統。當物體發(fā)生加速度變化時(shí),質(zhì)量會(huì )受到力的作用而移動(dòng),通過(guò)測量這種移動(dòng)可以確定物體的加速度和姿態(tài)。
常見(jiàn)的三軸加速度傳感器使用微電機加速度計(MEMS accelerometer)技術(shù)。它們通常包含三個(gè)獨立的加速度傳感器,分別測量物體在X軸、Y軸和Z軸方向上的加速度。只記得加速度測量機測量到的加速度和受力方向相反,當初使用這個(gè)是為了判斷受力是超重還是失重,變化時(shí),加速度傳感器會(huì )感知到這種變化并產(chǎn)生相應的電信號。這些信號經(jīng)過(guò)放大和處理后,可以轉換為數字信號,并通過(guò)數字接口(如I2C或SPI)傳輸給微控制器或其他處理器。
陀螺儀(Gyroscope):陀螺儀通過(guò)測量物體的角速度來(lái)確定其姿態(tài)。陀螺儀通常使用旋轉的轉子或振蕩器來(lái)感知角速度的變化。當物體發(fā)生旋轉時(shí),轉子或振蕩器會(huì )受到力的作用而發(fā)生相應的位移,通過(guò)測量這種位移可以確定物體的角速度和姿態(tài)。
這里介紹以下兩個(gè)內容:地面坐標系(Earth-fixed coordinate system)是一種以地球表面為參考的坐標系,用于描述物體在地球上的位置和運動(dòng)。地面坐標系通常使用經(jīng)度、緯度和高度(或海拔)來(lái)表示位置。
機體坐標系(Body-fixed coordinate system)是一種以物體自身為參考的坐標系,用于描述物體內部或相對于物體的位置和方向。機體坐標系通常使用前后、左右和上下(或X、Y、Z)來(lái)表示物體的方向。
區別:
聯(lián)系:
總的來(lái)說(shuō),地面坐標系和機體坐標系是兩種不同的坐標系,用于描述不同的參考對象和位置關(guān)系。它們在不同的應用領(lǐng)域中起著(zhù)重要的作用,并且在某些情況下需要進(jìn)行坐標轉換。
那么我們得到坐標位置是為了什么呢,主想借大學(xué)物理和高數內容介紹一下歐拉角:
歐拉角(Euler angles)是一種常用的描述物體姿態(tài)的方法。它由三個(gè)旋轉角度組成,通常分別稱(chēng)為滾轉角(roll)、俯仰角(pitch)和偏航角(yaw)。
滾轉角表示物體繞其自身的X軸旋轉的角度。俯仰角表示物體繞其自身的Y軸旋轉的角度。偏航角表示物體繞其自身的Z軸旋轉的角度。
歐拉角的旋轉順序可以有多種,最常見(jiàn)的是ZYX順序,也稱(chēng)為航向-俯仰-滾轉順序。在這種順序下,先繞Z軸旋轉偏航角,然后繞旋轉后的Y軸旋轉俯仰角,最后繞旋轉后的X軸旋轉滾轉角。
歐拉角的優(yōu)點(diǎn)是直觀(guān)且易于理解,可以直接對物體的姿態(tài)進(jìn)行描述。它廣泛應用于飛行器、機器人、游戲開(kāi)發(fā)和計算機圖形學(xué)等領(lǐng)域。
然而,歐拉角也存在一些問(wèn)題。由于旋轉順序的選擇和旋轉角度的限制,歐拉角存在萬(wàn)向鎖問(wèn)題(gimbal lock),即在某些情況下,兩個(gè)旋轉角度會(huì )變得冗余或無(wú)法唯一確定物體的姿態(tài)。為了避免這個(gè)問(wèn)題,有時(shí)候會(huì )使用四元數
(quaternions)或旋轉矩陣(rotation matrices)來(lái)替代歐拉角。哈哈哈我不會(huì )四元數,就不bb了。
總的來(lái)說(shuō),歐拉角是一種常用的姿態(tài)描述方法,具有直觀(guān)和易于理解的特點(diǎn),但在某些情況下可能存在萬(wàn)向鎖問(wèn)題。
磁力計(Magnetometer):磁力計通過(guò)測量物體周?chē)艌?chǎng)的強度和方向來(lái)確定其姿態(tài)。磁力計利用磁敏材料的特性,當材料受到磁場(chǎng)作用時(shí),其電阻或電壓會(huì )發(fā)生變化。通過(guò)測量這種變化可以確定物體所處的磁場(chǎng)方向,從而確定其姿態(tài)。
這些傳感器通常會(huì )結合在一起,形成姿態(tài)傳感器系統。通過(guò)同時(shí)測量加速度、角速度和磁場(chǎng)等參數,姿態(tài)傳感器可以計算出物體的姿態(tài),包括方向、旋轉角度和位置等信息。這些數據可以通過(guò)算法進(jìn)行處理和解析,從而實(shí)現對物體姿態(tài)的準確測量和跟蹤。
3. 如何應用姿態(tài)傳感器?
以下是一般的使用姿態(tài)傳感器的步驟:
需要注意的是,具體使用姿態(tài)傳感器的方法會(huì )因應用的不同而有所變化。例如,在航空航天領(lǐng)域中,可能需要更復雜的姿態(tài)控制算法和系統來(lái)實(shí)現精確的導航和飛行控制。在虛擬現實(shí)領(lǐng)域中,可能需要更高的實(shí)時(shí)性和精度來(lái)跟蹤用戶(hù)的頭部和手部姿態(tài)。因此,在具體應用中,需要根據需求和要求進(jìn)行相應的定制和調整。 姿態(tài)傳感器在許多領(lǐng)域中都有廣泛的應用。以下是一些姿態(tài)傳感器的應用示例:
4. 主要的姿態(tài)傳感器供應商
STMicroelectronics:STMicroelectronics是一家全球領(lǐng)先的半導體公司,提供各種姿態(tài)傳感器解決方案,包括加速度計、陀螺儀和磁力計等。
InvenSense(現為T(mén)DK公司):InvenSense是一家專(zhuān)注于慣性傳感器技術(shù)的公司,提供高性能的加速度計和陀螺儀等姿態(tài)傳感器產(chǎn)品。
Bosch Sensortec:Bosch Sensortec是博世集團的子公司,專(zhuān)注于傳感器技術(shù)。他們提供各種姿態(tài)傳感器解決方案,包括加速度計、陀螺儀和磁力計等。
Analog Devices:Analog Devices是一家領(lǐng)先的半導體公司,提供各種傳感器解決方案,包括姿態(tài)傳感器。他們的產(chǎn)品范圍包括加速度計、陀螺儀和磁力計等。
Honeywell(霍尼韋爾):Honeywell是一家全球知名的工業(yè)自動(dòng)化和控制技術(shù)供應商,他們提供各種姿態(tài)傳感器產(chǎn)品,包括加速度計、陀螺儀和磁力計等。
這只是一些主要的姿態(tài)傳感器供應商,市場(chǎng)上還有許多其他供應商提供各種姿態(tài)傳感器解決方案。在選擇供應商時(shí),可以根據產(chǎn)品性能、可靠性、技術(shù)支持和供應鏈等因素進(jìn)行評估和比較。
5. 參考案例
這只是姿態(tài)傳感器應用的一小部分示例,實(shí)際上,姿態(tài)傳感器在許多其他領(lǐng)域中也有各種應用,如游戲控制、智能家居、運動(dòng)裝備等。隨著(zhù)技術(shù)的不斷發(fā)展,姿態(tài)傳感器的應用領(lǐng)域將繼續擴大和創(chuàng )新。
此外,結合自己的電賽經(jīng)歷略述一二,向大家介紹的是MPU6050,是一款集成了三軸陀螺儀和三軸加速度計的傳感器模塊。它由英飛凌(InvenSense)公司開(kāi)發(fā),廣泛應用于姿態(tài)測量、運動(dòng)追蹤和穩定控制等領(lǐng)域。
MPU6050內部集成了三軸陀螺儀和三軸加速度計,能夠同時(shí)測量物體的旋轉和線(xiàn)性加速度。陀螺儀用于測量物體的旋轉速度和方向,而加速度計則用于測量物體的線(xiàn)性加速度和傾斜角度。
MPU6050采用數字輸出,通過(guò)I2C總線(xiàn)與微控制器或其他設備進(jìn)行通信。它具有高精度、低功耗和快速響應的特點(diǎn),適用于需要實(shí)時(shí)姿態(tài)測量和運動(dòng)追蹤的應用。
除了陀螺儀和加速度計,MPU6050還提供了一些額外的功能和傳感器,如溫度傳感器和數字運動(dòng)處理器(DMP)。溫度傳感器可用于測量環(huán)境溫度,而DMP則可以通過(guò)內部算法提供更高級的運動(dòng)處理功能,如姿態(tài)解算和方向估計。
初始化MPU6050傳感器:
初始化I2C總線(xiàn),復位MPU6050,再次喚醒mpu6050后,設置陀螺儀傳感器為±200dps,加速度傳感器±2g,設置采樣率50HZ,關(guān)閉中斷配置INT引腳低電平有效。器件id正確后,設置pll,clksel,xz的水平軸為參考
讀取傳感器數據:
使用官方empl庫所帶的函數獲取加速度值和陀螺儀值,理由歐拉公式計算得到俯仰角和偏航角(ps:需要設置延時(shí)函數如果要輸到上位機,需要提供串口等接口)
解析和處理數據:
這里介紹當時(shí)使用的方法:讀取數據判斷是否在設置的閾值范圍內,并記錄最后的數據用于比較下一次的變化情況,根據自己的算法要求進(jìn)行處理。要結合編碼器的使用,使用了STM32正交編碼器,是指在STM32系列微控制器中用于讀取旋轉編碼器信號的硬件模塊。旋轉編碼器是一種用于測量旋轉運動(dòng)的傳感器,通常由兩個(gè)光電傳感器組成,可以測量旋轉方向和速度。而STM32正交編碼器模塊支持兩種常見(jiàn)的編碼器類(lèi)型:增量式編碼器和絕對式編碼器。這里吧主將自己的理解的原理放進(jìn)來(lái):編碼器軸每旋轉一圈,A相和B相都發(fā)出相同的脈沖個(gè)數,但是A相和B相之間存在一個(gè)90°(電氣角的一周期為360”)的電氣角相位差,可以根據這個(gè)相位差來(lái)判斷編碼器貨轉的方向是正轉還是反轉,正轉時(shí),A相超前B相90°先進(jìn)行相位輸出,反轉時(shí),B相超前A相90°先進(jìn)行相位輸出。
增量式編碼器通過(guò)兩個(gè)光電傳感器(我使用的是光碼盤(pán)和光電二極管)檢測旋轉編碼盤(pán)上的刻度,并生成兩個(gè)相位差90度的方波信號。通過(guò)檢測這兩個(gè)方波信號的變化,可以確定旋轉方向和速度。STM32正交編碼器模塊可以直接讀取這兩個(gè)方波信號,并提供相應的硬件計數器和中斷功能,使得編碼器的讀取和處理變得更加簡(jiǎn)單和高效。
絕對式編碼器則通過(guò)在編碼盤(pán)上添加更多的刻度,以實(shí)現對旋轉位置的絕對測量。STM32正交編碼器模塊可以支持多種絕對式編碼器的協(xié)議和接口,如SSI(同步串行接口)、BiSS(雙向同步串行接口)和SPI(串行外設接口)等。通過(guò)讀取這些接口的數據,可以準確地獲取旋轉位置信息。
在使用STM32正交編碼器模塊時(shí),需要配置相關(guān)的寄存器和中斷,以使其與編碼器信號同步工作??梢愿鶕?shí)際需求選擇不同的計數模式、計數方向和中斷觸發(fā)條件等。此外,還可以通過(guò)使用DMA(直接內存訪(fǎng)問(wèn))功能,將編碼器數據直接傳輸到內存,減輕CPU的負擔。
總的來(lái)說(shuō),STM32正交編碼器模塊為STM32微控制器提供了方便、高效的編碼器信號讀取和處理功能,使得我們使用者可以更加輕松地實(shí)現旋轉運動(dòng)的測量和控制。通過(guò)把編碼器放在pwm直流電機轉軸處,把AB兩相接入單片機接口可以獲得具體的信息。
欸,大家可能疑惑了,我這里將姿態(tài)傳感器那為什么說(shuō)到了編碼器了呢。hhhh,因為俺要講如何在軟件上去調試姿態(tài)傳感器,那我就要再廢話(huà)了,我的目標是什么呢,結合電賽,我想說(shuō)小車(chē)直立行走任務(wù)分解
我們要求車(chē)模在直立的狀態(tài)下以?xún)蓚€(gè)輪子在地面上隨意行走,相比四輪著(zhù)地狀態(tài),車(chē)??刂迫蝿?wù)更為復雜。為了能夠方便找到解決問(wèn)題的辦法,首先將復雜的問(wèn)題分解成簡(jiǎn)單的問(wèn)題進(jìn)行討論。 從控制角度來(lái)看,車(chē)模作為一個(gè)控制對象,它的控制輸入量是兩個(gè)電轉動(dòng)速度。車(chē)橫運動(dòng)控制任務(wù)可以分解成以下三個(gè)基本控制任務(wù)
(1)控制車(chē)模平衡:通過(guò)控制兩個(gè)電機正反向運動(dòng)保持車(chē)模直立平衡化
(2)控制車(chē)橫速度:通過(guò)調節車(chē)模的傾角來(lái)實(shí)現車(chē)模速度控制,實(shí)際上還是演變成通過(guò)控制電機的轉速來(lái)實(shí)現車(chē)輪速度的控制
(3)控制車(chē)模方向:通過(guò)控制兩個(gè)電機之間的轉動(dòng)差速實(shí)現車(chē)模轉
哎呀這么復雜,我們考慮的核心在哪里,哈哈就是負反饋,是否平衡是否轉彎無(wú)法缺少的就是將采集到的數據比較反饋了,大家讀到這里就明白我在數據處理時(shí)存儲最后一次數據的用意了哈哈,最后結合pid控制。PID控制是一種常用的反饋控制算法,用于調節系統的輸出以使其達到期望值。PID是Proportional-Integral-Derivative的縮寫(xiě),分別代表比例、積分和微分三個(gè)控制項。
PID控制通過(guò)將比例、積分和微分項加權求和,得到最終的控制輸出。權重因子可以根據系統的特性和需求進(jìn)行調整,以達到最佳的控制效果。
在實(shí)際應用中,PID控制廣泛用于工業(yè)自動(dòng)化、機械控制、溫度控制、飛行器控制等領(lǐng)域。通過(guò)不斷調整PID參數,可以實(shí)現系統的穩定性、精度和響應速度的平衡。
總的來(lái)說(shuō),PID控制是一種簡(jiǎn)單而有效的控制算法,通過(guò)比例、積分和微分三個(gè)控制項的組合調節系統的輸出,以實(shí)現期望的控制效果。 這里借用了matlab仿真進(jìn)行了預測和優(yōu)化,打字累了不想說(shuō)了,哈哈,結合姿態(tài)傳感器使用一下把哈哈哈哈哈哈 偷懶嘎嘎嘎,
含mpu6050芯片的姿態(tài)傳感器模塊
基于stm4與串口調試結果圖
最后結合電賽,我想說(shuō),除了姿態(tài)傳感器我們應該還要結合編碼器,超聲波測距,步進(jìn)電機CDD攝像頭,正交碼盤(pán)的使用,pwm步進(jìn)電機,我們不僅僅要考慮到以上電子相關(guān)內容,應當考慮類(lèi)似的,在小車(chē)開(kāi)發(fā)中,扭矩通常用于描述引擎或電動(dòng)機對車(chē)輪的驅動(dòng)力。較大的扭矩可以提供更大的驅動(dòng)力,使車(chē)輛能夠加速或克服阻力。在小車(chē)開(kāi)發(fā)中,摩擦力對于車(chē)輛的制動(dòng)、轉彎和牽引等方面起著(zhù)重要作用。合理控制摩擦力可以提高車(chē)輛的操控性和安全性。為了最大限度地利用摩擦力,需要對車(chē)輛的重心、輪胎和地面之間的摩擦系數等因素進(jìn)行優(yōu)化和調整。
6.參考代碼
mpu6050驅動(dòng)
import machine
class accel():
def __init__(self, i2c, addr=0x68):
self.iic = i2c
self.addr = addr
self.iic.start()
self.iic.writeto(self.addr, bytearray([107, 0]))
self.iic.stop()
def get_raw_values(self):
self.iic.start()
a = self.iic.readfrom_mem(self.addr, 0x3B, 14)
self.iic.stop()
return a
def get_ints(self):
b = self.get_raw_values()
c = []
for i in b:
c.append(i)
return c
def bytes_toint(self, firstbyte, secondbyte):
if not firstbyte & 0x80:
return firstbyte << 8 | secondbyte
return - (((firstbyte ^ 255) << 8) | (secondbyte ^ 255) + 1)
def get_values(self):
raw_ints = self.get_raw_values()
vals = {}
vals["AcX"] = self.bytes_toint(raw_ints[0], raw_ints[1])
vals["AcY"] = self.bytes_toint(raw_ints[2], raw_ints[3])
vals["AcZ"] = self.bytes_toint(raw_ints[4], raw_ints[5])
vals["Tmp"] = self.bytes_toint(raw_ints[6], raw_ints[7]) / 340.00 + 36.53
vals["GyX"] = self.bytes_toint(raw_ints[8], raw_ints[9])
vals["GyY"] = self.bytes_toint(raw_ints[10], raw_ints[11])
vals["GyZ"] = self.bytes_toint(raw_ints[12], raw_ints[13])
return vals # returned in range of Int16
# -32768 to 32767
def val_test(self): # ONLY FOR TESTING! Also, fast reading sometimes crashes IIC
from time import sleep
while 1:
print(self.get_values())
sleep(0.05)
主程序
from machine import I2C,Pin
i2c = I2C(scl=Pin("X9"), sda=Pin("X10"))
accel = mpu6050.accel(i2c)
accel_dict = accel.get_values()
print(accel_dict)
運行結果如下
7. 上板實(shí)驗結果
樹(shù)莓派_MMA7660姿態(tài)傳感器
評論