陀螺儀3D上位機 串列埠不能直接傳送負數解決方法

2021-10-25 21:13:35 字數 3502 閱讀 4175

由於接觸陀螺儀比較長時間了,一直有乙個念想,就是做乙個自己的陀螺儀3d模型顯示,功夫不負有心人,終於某個早晨在乙個技術群裡發現了有processing這個軟體可以比較簡單的實現(雖然之前也知道c#等這些傳統意義上的上位機豪強可以實現,但總歸有些生疏隔閡一般,再乙個也是基於時間成本考慮)。於是乎花了一天的時間將這個3d模型做了出來,效果還不錯,嘻嘻?~

在這期間遇到了乙個問題,在學長的幫助下成功解決,現在來描述一下這個具體過程:

首先有些東西必須描述清楚:

陀螺儀得出來得角度是有正有負串列埠每次只能發1byte,也就是8bits在這兩個大前提下,問題就慢慢顯露了出來。首先1byte最大能表示2^8=255,難道還要我陀螺儀轉的角度不超過255°不成,那顯然是byte太刁蠻了,你byte表示不了這麼多關我陀螺儀什麼事對吧。這裡就是第乙個問題,陀螺儀得角度超過255時導致byte溢位又直接回到0,試著想一下3d模型上轉了200多度了再繼續轉直接給你回到到0度,就像向日葵跟著太陽自東向西,第二天乙個猛回頭從西邊甩到東邊,這誰受得了?

第二個問題也呼應了標題,串列埠不能發負數的問題。這裡要來一波小定義:byte資料型別(位元組型)用乙個位元組(byte)儲存,可區別256個數字,取值範圍:0-255。byte是0-255的 無符號型別,所以不能表示負數。這也就是為什麼串列埠傳送資料發不過去的原因了。在3d的現象就是順時針模型跟著動,逆時針就不動了。

直接上**吧,有緣人就看著?,反正筆記也是我自己看?

arduino的**:

#include

#include

mpu6050 mpu6050(wire);

int inbyte = 0;                           // incoming serial byte

int pit,rol,yaw;                          //角度值

int pit_h,rol_h,yaw_h;                    //角度高八位

int pit_l,rol_l,yaw_l;                    //角度低八位

int pit_flag=0,rol_flag=0,yaw_flag=0;     //角度正負標誌位

void setup()

void loop()

else if(pit>0 && pit<=255-1)

else if(pit < -255+1)

else

/**********************************/

if(rol > 255-1)

else if(rol>0 && rol<=255-1)

else if(rol < -255+1)

else

/**********************************/

if(yaw > 255-1)

else if(yaw>0 && yaw<=255-1)

else if(yaw

else

serial.write(pit_h);

serial.write(pit_l);

serial.write(rol_h);

serial.write(rol_l);

serial.write(yaw_h);

serial.write(yaw_l);

serial.write(pit_flag);

serial.write(rol_flag);

serial.write(yaw_flag);

/**************這裡注釋的供除錯時看資料用*******************/

/*

serial.print("pit:");

serial.print(pit);

serial.print("    rol:");

serial.print(rol);

serial.print("    yaw:");

serial.println(yaw);

*/

}

/***************與processing確認連線*********************/

void establishcontact()

}

processing的**:

import processing.serial.*;

serial myport;

int serialinarray = new int[9];

int serialcount = 0;

int pit,rol,yaw;

int pit_last,rol_last,yaw_last;

boolean firstcontact = false;

void setup()

float i = 0,j = 0,k = 0;

void draw()

void serialevent(serial myport)

}

else

}

}

陀螺儀的學習

從陀螺儀得到x y z三個角速度後就需要通過積分來得到角度,事實上,經過簡單的積分是得不到正確的角度的,更得不到尤拉角,在這裡說一下通過的runge kunta更新四元數,從而對角速度積分得到角度的過程。四元數能到快速的發展,得益於飛行器控制與導航的發展,要求更合理的描述剛體空間的運動,以便於計算機...

陀螺儀工作原理

陀螺儀是用來測量平衡和轉速的工具,在載體高速轉動的時候,陀螺儀始終要通過自我調節,使得轉子保持原有的平衡,這一點是如何做到的?帶著這個問題,我們來看一下這個古老而又神秘的裝置的工作原理。我把三個gimbal環用不同的顏色做了標記,底部三個軸向,rgb分別對應xyz。假設現在這個陀螺儀被放在一艘船上,...

陀螺儀工作原理

我們知道陀螺儀使用來測量平衡和轉速的工具,在載體高速轉動的時候,陀螺儀始終要通過自我調節,使得轉子保持原有的平衡,這一點是如何做到的?帶著這個問題,我們來看一下這個古老而又神秘的裝置的工作原理。我把三個gimbal環用不同的顏色做了標記,底部三個軸向,rgb分別對應xyz。假設現在這個陀螺儀被放在一...