找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 23223|回復(fù): 20
收起左側(cè)

超詳細(xì)講解:羅盤(pán)和加速度計(jì)校正方法

  [復(fù)制鏈接]
ID:246831 發(fā)表于 2017-11-7 10:08 | 顯示全部樓層 |閱讀模式
羅盤(pán)和加計(jì)的校準(zhǔn)是日常開(kāi)發(fā)中最基礎(chǔ)的工作,特邀Echo老師對(duì)羅盤(pán)和加速度計(jì)校準(zhǔn)的工程方法進(jìn)行總結(jié),為小伙伴你們解惑,是有此文。

作者信息
Echo,本名鄒佳池,從事嵌入式軟件開(kāi)發(fā)。
超詳細(xì)講解:羅盤(pán)和加速度計(jì)校正方法
(附C源代碼)
1.為什么要校正我們都知道,羅盤(pán)是測(cè)量周?chē)拇艌?chǎng)強(qiáng)度,若不存在外在磁場(chǎng)的干擾,只存在地磁的話(huà),理論上羅盤(pán)旋轉(zhuǎn)測(cè)得的磁場(chǎng)是一個(gè)圓球。
可是現(xiàn)實(shí)空間中,除了地磁場(chǎng)外,還存在其他的磁場(chǎng)干擾,這里我索性將它分為兩大類(lèi)。
第一類(lèi):地球空間中的磁場(chǎng),這類(lèi)磁場(chǎng)有個(gè)特點(diǎn),就是隨著羅盤(pán)坐標(biāo)系的轉(zhuǎn)動(dòng),磁場(chǎng)方向不變,類(lèi)似地磁場(chǎng)。
第二類(lèi):羅盤(pán)坐標(biāo)空間中的磁場(chǎng),這類(lèi)磁場(chǎng)源一般是固定在飛機(jī)上的,所以隨著羅盤(pán)坐標(biāo)系的轉(zhuǎn)動(dòng),磁場(chǎng)方向也跟著轉(zhuǎn)動(dòng)。但是對(duì)于羅盤(pán)坐標(biāo)系來(lái)說(shuō),卻是一個(gè)恒定值。
對(duì)于第一類(lèi)的磁場(chǎng),目前我了解到的還沒(méi)有什么好的方式可以進(jìn)行校正(如果哪位大神知道,還請(qǐng)告知)。而我后面要介紹的校正方法,即是濾除第二類(lèi)磁場(chǎng)的干擾,校正的思想即是基于最小二乘法的橢球擬合算法。
注:這個(gè)只能校正磁場(chǎng)強(qiáng)度固定不變的磁場(chǎng),而對(duì)于電機(jī)這種變化的磁場(chǎng),我沒(méi)有測(cè)驗(yàn)過(guò),不知道電機(jī)產(chǎn)生磁場(chǎng)的強(qiáng)度大小跟電機(jī)轉(zhuǎn)速的關(guān)系怎樣,如果誰(shuí)有研究過(guò)的,還請(qǐng)告知,謝謝。
2.橢球擬合校正理論推導(dǎo)網(wǎng)絡(luò)上有許多關(guān)于橢球擬合校正的論文,我都沒(méi)有細(xì)看,因?yàn)槟切┕蕉紝?xiě)得晦澀難懂,沒(méi)有那個(gè)耐心,我這里盡量用最簡(jiǎn)潔的語(yǔ)言介紹校正方法的理論基礎(chǔ)。
首先建立數(shù)值模型,設(shè)測(cè)量值為:


,校正后的值為:,


平移參數(shù)為:


縮放參數(shù)為:



他們之間的關(guān)系如下所示:


我們校正后的目標(biāo)就是使得校正值近似分布在一個(gè)圓球上,而圓球的公式大家都知道:x2+y2+z2=R2,故我們將校正后的值帶入圓球公式,與理論的圓球半徑平方做差,構(gòu)建誤差u:


將校正值用測(cè)量值替換,變?yōu)椋?br />

可以看到,這分明就是個(gè)橢圓公式嘛~
記:


則我們的誤差u可以寫(xiě)為如下形式:


下面就是校正的核心思想了:假設(shè)我們有許多組數(shù)據(jù),我們要求得一組參數(shù),使得所有數(shù)據(jù)的誤差和最小,即∑u最小,但是由于u有正有負(fù),所以符號(hào)相反的誤差有可能相互抵消。那么加絕對(duì)值呢?這個(gè)也不可取,因?yàn)閷?duì)絕對(duì)值函數(shù)求極小值十分復(fù)雜。那么我們自然就想到對(duì)u求平方和,即:
U=∑u^2
我們把u看成一個(gè)未知數(shù),這個(gè)函數(shù)是一個(gè)二次函數(shù),其有極小值點(diǎn)。而為了求得這個(gè)極小值點(diǎn),我們對(duì)其做偏導(dǎo)即可:


記:


則我們可以將偏導(dǎo)寫(xiě)成如下形式:


B是已知的,P是我們待求的參數(shù)矩陣,故可以通過(guò)求齊次線(xiàn)性方程組,來(lái)求得P的各個(gè)參數(shù)的解。
齊次線(xiàn)性方程組求解的過(guò)程我這里就不詳細(xì)解釋了,我算法中使用的方法是經(jīng)典的高斯消元法,有興趣的可以仔細(xì)看看。
當(dāng)我們求得P的各個(gè)未知數(shù)a,b,c,d,e,f,g后,需要通過(guò)這幾個(gè)參數(shù)反求出我們的偏移量(ox,oy,oz)和縮放量(gx,gy,gz)。
在反求解之前,我們先回到上一個(gè)式子,BxP=0。其實(shí)滿(mǎn)足這個(gè)式子的解P有無(wú)數(shù)組,我們可以將式子改寫(xiě)成BxCP=0,C是一個(gè)任意常數(shù),即


我們通過(guò)解線(xiàn)性方程組求得的只是這個(gè)解系中的一個(gè)基本解,所以我們首先要求出這個(gè)基本解的C。
其算式經(jīng)推導(dǎo)如下,帶入a,b,c,d,e,f,g即可求解:
C=(d2/a + e2/b + f2/c - 4g)/4R2  (R為理論圓球半徑)
ox=d/2a
oy=e/2b
oz=f/2c
gx=sqrt(a/C)
gy=sqrt(b/C)
gz=sqrt(c/C)
最后,將這六個(gè)參數(shù)回調(diào)到之前的式子中去,即完成校正。
3.校正程序源碼(C語(yǔ)言)代碼太長(zhǎng)了 就不貼出來(lái)了,放在網(wǎng)盤(pán)種大家下載
羅盤(pán)與加計(jì)校準(zhǔn)方法 C源代碼


單片機(jī)源程序如下:
  1. #include "stdafx.h"
  2. #include "string.h"
  3. #include "math.h"

  4. #define MATRIX_SIZE 7
  5. #define u8 unsigned char

  6. double m_matrix[MATRIX_SIZE][MATRIX_SIZE+1];
  7. int m = MATRIX_SIZE;       
  8. int n = MATRIX_SIZE+1;
  9. double m_result[MATRIX_SIZE];       

  10. void DispMatrix(void);

  11. double Abs(double a)
  12. {
  13.         return a<0 ? -a : a;
  14. }

  15. u8 Equal(double a,double b)
  16. {
  17.         return Abs(a-b) < 1e-6;
  18. }

  19. void ResetMatrix(void)
  20. {
  21.         int row , column;
  22.        
  23.         for(row = 0 ; row<m ; row++){
  24.                 for(column = 0 ; column<n ; column++)
  25.                         m_matrix[row][column] = 0.0f;
  26.         }
  27. }
  28.        
  29. void CalcData_Input(double x , double y , double z)
  30. {
  31.         double V[MATRIX_SIZE];
  32.         int row , column;
  33.        
  34.         V[0] = x*x;
  35.     V[1] = y*y;
  36.     V[2] = z*z;
  37.     V[3] = x;
  38.     V[4] = y;
  39.     V[5] = z;
  40.     V[6] = 1.0;
  41.        
  42.         //構(gòu)建VxVt矩陣(Vt為V的轉(zhuǎn)置),并進(jìn)行累加
  43.         for(row = 0 ; row<MATRIX_SIZE ; row++){
  44.                 for(column = 0 ; column<MATRIX_SIZE ; column++){
  45.                         m_matrix[row][column] += V[row]*V[column];
  46.                 }
  47.         }
  48. }

  49. void SwapRow(int row1 , int row2)
  50. {
  51.         int column;
  52.         double tmp;
  53.        
  54.         for(column = 0 ; column<n ; column++){
  55.                 tmp = m_matrix[row1][column];
  56.                 m_matrix[row1][column] = m_matrix[row2][column];
  57.                 m_matrix[row2][column] = tmp;
  58.         }
  59. }

  60. void MoveBiggestElement2Top(int s_row , int s_column)
  61. {
  62.         int row,column;
  63.        
  64.         for(row = s_row+1 ; row<m ; row++){
  65.                 if( Abs(m_matrix[s_row][s_column])<Abs(m_matrix[row][s_column])){
  66.                         SwapRow(s_row , row);
  67.                 }
  68.         }
  69. }

  70. //高斯消元法,求行階梯型矩陣
  71. u8 Matrix_GaussElimination(void)
  72. {
  73.         int row,column,i,j;
  74.         double tmp;
  75.        
  76.         for(row = 0,column=0 ; row<m-1 && column<n-1 ; row++,column++){
  77.                 //將當(dāng)前列最大的一行移上來(lái)
  78.                 MoveBiggestElement2Top(row , column);
  79.                
  80.                 //整列都為0
  81.                 if(Equal(m_matrix[row][column],0.0f)){
  82.                         printf("qiyi matrix:%d %d\r\n" , row , column);
  83.                         //DispMatrix();
  84.                         //return 0;
  85.                         row--;
  86.                         continue;
  87.                 }
  88.                
  89.                 //高斯消元
  90.                 for(i = row+1 ; i<m ; i++){       
  91.                         if(Equal(m_matrix[i][column],0.0f))
  92.                                 continue;        //為0,無(wú)需處理
  93.                        
  94.                         tmp = m_matrix[i][column]/m_matrix[row][column];
  95.                        
  96.                         for(j = column ; j<n ; j++){
  97.                                 m_matrix[i][j] -= m_matrix[row][j]*tmp;
  98.                         }
  99.                 }

  100.                 DispMatrix();
  101.                 printf("\r\n");
  102.         }

  103.         return 1;
  104. }

  105. //求行最簡(jiǎn)型矩陣
  106. int Matrix_RowSimplify(void)
  107. {
  108.     int c = n;//返回值,表示(解的任意常量數(shù)+1);
  109.     //
  110.     int row,column,k,s,t;
  111.     double tmp;
  112.     //
  113.     for(row=0,column=0;row<m && column<n;row++,column++)
  114.     {
  115.         if(Equal(m_matrix[row][column],0))//平移,找出本行第一個(gè)非零;
  116.         {
  117.             row--;
  118.             continue;
  119.         }
  120.         //
  121.         c--;//少一個(gè)常量;
  122.         //
  123.         //化a[i][j]為1;
  124.         tmp = 1 / m_matrix[row][column];
  125.         for(k=column;k<n;k++)//前面的"0"就不處理了;
  126.             m_matrix[row][k] *= tmp;
  127.         //
  128.         //化a[s][j]為0
  129.         for(s=0;s<row;s++)//下面的0也不用處理;
  130.         {
  131.             if(Equal(m_matrix[s][column],0))
  132.                 continue;//已經(jīng)為0;
  133.             //
  134.             tmp = m_matrix[s][column] / m_matrix[row][column];
  135.             for(t=column;t<n;t++)
  136.                 m_matrix[s][t] -= m_matrix[row][t]*tmp;
  137.             //
  138.         }
  139.     }
  140.     //
  141.     return c;
  142. }

  143. void Matrix_Solve(double* C , double* sol)
  144. {
  145.         int row,column,i;
  146.         int any_sol[MATRIX_SIZE];

  147.         //找出任意解的位置
  148.         memset(any_sol , 0 , MATRIX_SIZE);
  149.         for(row=0,column=0 ; row<m && column<n-1 ; row++,column++){
  150.                 if(Equal(m_matrix[row][column] , 0.0f)){
  151.                         any_sol[column] = 1;        //記錄任意解的位置
  152.                         row--;        //右移1列
  153.                 }
  154.         }

  155.         //求解
  156.         row = 0;
  157.         for(column = 0 ; column<n-1 ; column++){
  158.                 if(any_sol[column] == 1){        //任意解
  159.                         sol[column] = C[column];
  160.                 }else{
  161.                         sol[column] = m_matrix[row][n-1];
  162.                         //加上任意解
  163.                         for(i = column+1 ; i<n-1 ; i++){
  164.                                 if(any_sol[i]==1 && !Equal(m_matrix[row][i],0.0f)){
  165.                                         sol[column] -= m_matrix[row][i]*C[i];
  166.                                 }
  167.                         }       
  168.                         row++;
  169.                 }
  170.         }
  171. }

  172. void DispMatrix(void)
  173. {
  174.         int row,column;
  175.        
  176.         for(row = 0 ; row<m ; row++){
  177.                 for(column = 0 ; column<n ; column++){
  178.                         printf("%.3f        " , m_matrix[row][column]);
  179.                 }
  180.                 printf("\r\n");
  181.         }
  182. }

  183. void Calc_Process(double radius)
  184. {
  185.         double C[MATRIX_SIZE];
  186.         double Res[MATRIX_SIZE];
  187.         int i;
  188.         double k;

  189.         ResetMatrix();

  190.         //輸入任意個(gè)數(shù)磁場(chǎng)測(cè)量點(diǎn)坐標(biāo),請(qǐng)盡量保證在橢球上分布均勻
  191.         CalcData_Input(7 , -7 , -2);
  192.         CalcData_Input(-1 , -7 , -2);
  193.         CalcData_Input(3 , 3 , -2);
  194.         CalcData_Input(3 , -17 , -2);
  195.         CalcData_Input(3 , -7 , 4);
  196.         CalcData_Input(3 , -7 , -8);

  197.         Matrix_GaussElimination();
  198.         Matrix_RowSimplify();

  199.     //賦值任意解參數(shù)值
  200. ……………………

  201. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
Calibration.rar (2 KB, 下載次數(shù): 143)




評(píng)分

參與人數(shù) 2黑幣 +11 收起 理由
AND-ziyi + 10
zycwswws + 1 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2017-11-9 04:12 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:246451 發(fā)表于 2017-11-24 16:50 | 顯示全部樓層

好資料,幫了大忙
回復(fù)

使用道具 舉報(bào)

ID:283807 發(fā)表于 2018-2-12 11:16 | 顯示全部樓層
非常感謝!
回復(fù)

使用道具 舉報(bào)

ID:284773 發(fā)表于 2018-2-22 15:22 | 顯示全部樓層
謝謝分享!剛剛好需要!
回復(fù)

使用道具 舉報(bào)

ID:289911 發(fā)表于 2018-3-10 09:35 | 顯示全部樓層
學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

ID:289911 發(fā)表于 2018-3-10 09:36 | 顯示全部樓層
謝謝分享!剛剛好需要,學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

ID:319555 發(fā)表于 2018-4-30 20:27 | 顯示全部樓層
好東西
回復(fù)

使用道具 舉報(bào)

ID:319555 發(fā)表于 2018-4-30 20:28 | 顯示全部樓層
謝謝分享!剛剛好需要,學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

ID:166068 發(fā)表于 2018-5-23 16:41 | 顯示全部樓層
有點(diǎn)騙積分的感覺(jué)啊,我這里全貼出來(lái)
  1. // 本程序?qū)θS散點(diǎn)數(shù)據(jù)進(jìn)行橢球擬合
  2. // 編 寫(xiě) 人:鄒佳池
  3. // 編寫(xiě)日期:2016-5-25
  4. // 技術(shù)交流QQ:529380360
  5. // 請(qǐng)尊重作者的勞動(dòng)成果,轉(zhuǎn)載請(qǐng)注明出處,謝謝
  6. #include "stdio.h"
  7. #include "string.h"
  8. #include "math.h"
  9.   
  10. #define MATRIX_SIZE 7
  11. #define u8 unsigned char
  12.   
  13. double m_matrix[MATRIX_SIZE][MATRIX_SIZE+1];
  14. int m = MATRIX_SIZE;        
  15. int n = MATRIX_SIZE+1;
  16. double m_result[MATRIX_SIZE];        
  17.   
  18. void DispMatrix(void);
  19.   
  20. double Abs(double a)
  21. {
  22.         return a<0 ? -a : a;
  23. }
  24.   
  25. u8 Equal(double a,double b)
  26. {
  27.         return Abs(a-b) < 1e-6;
  28. }
  29.   
  30. void ResetMatrix(void)
  31. {
  32.         int row , column;
  33.          
  34.         for(row = 0 ; row<m ; row++){
  35.                 for(column = 0 ; column<n ; column++)
  36.                         m_matrix[row][column] = 0.0f;
  37.         }
  38. }
  39.          
  40. void CalcData_Input(double x , double y , double z)
  41. {
  42.         double V[MATRIX_SIZE];
  43.         int row , column;
  44.          
  45.         V[0] = x*x;
  46.     V[1] = y*y;
  47.     V[2] = z*z;
  48.     V[3] = x;
  49.     V[4] = y;
  50.     V[5] = z;
  51.     V[6] = 1.0;
  52.          
  53.         //構(gòu)建VxVt矩陣(Vt為V的轉(zhuǎn)置),并進(jìn)行累加
  54.         for(row = 0 ; row<MATRIX_SIZE ; row++){
  55.                 for(column = 0 ; column<MATRIX_SIZE ; column++){
  56.                         m_matrix[row][column] += V[row]*V[column];
  57.                 }
  58.         }
  59. }
  60.   
  61. void SwapRow(int row1 , int row2)
  62. {
  63.         int column;
  64.         double tmp;
  65.          
  66.         for(column = 0 ; column<n ; column++){
  67.                 tmp = m_matrix[row1][column];
  68.                 m_matrix[row1][column] = m_matrix[row2][column];
  69.                 m_matrix[row2][column] = tmp;
  70.         }
  71. }
  72.   
  73. void MoveBiggestElement2Top(int s_row , int s_column)
  74. {
  75.         int row,column;
  76.          
  77.         for(row = s_row+1 ; row<m ; row++){
  78.                 if( Abs(m_matrix[s_row][s_column])<Abs(m_matrix[row][s_column])){
  79.                         SwapRow(s_row , row);
  80.                 }
  81.         }
  82. }
  83.   
  84. //高斯消元法,求行階梯型矩陣
  85. u8 Matrix_GaussElimination(void)
  86. {
  87.         int row,column,i,j;
  88.         double tmp;
  89.          
  90.         for(row = 0,column=0 ; row<m-1 && column<n-1 ; row++,column++){
  91.                 //將當(dāng)前列最大的一行移上來(lái)
  92.                 MoveBiggestElement2Top(row , column);
  93.                   
  94.                 //整列都為0
  95.                 if(Equal(m_matrix[row][column],0.0f)){
  96.                         printf("qiyi matrix:%d %d\r\n" , row , column);
  97.                         //DispMatrix();
  98.                         //return 0;
  99.                         row--;
  100.                         continue;
  101.                 }
  102.                   
  103.                 //高斯消元
  104.                 for(i = row+1 ; i<m ; i++){        
  105.                         if(Equal(m_matrix[i][column],0.0f))
  106.                                 continue;        //為0,無(wú)需處理
  107.                           
  108.                         tmp = m_matrix[i][column]/m_matrix[row][column];
  109.                           
  110.                         for(j = column ; j<n ; j++){
  111.                                 m_matrix[i][j] -= m_matrix[row][j]*tmp;
  112.                         }
  113.                 }
  114.   
  115.                 DispMatrix();
  116.                 printf("\r\n");
  117.         }
  118.   
  119.         return 1;
  120. }
  121.   
  122. //求行最簡(jiǎn)型矩陣
  123. int Matrix_RowSimplify(void)
  124. {
  125.     int c = n;//返回值,表示(解的任意常量數(shù)+1);
  126.     //
  127.     int row,column,k,s,t;
  128.     float tmp;
  129.     //
  130.     for(row=0,column=0;row<m && column<n;row++,column++)
  131.     {
  132.         if(Equal(m_matrix[row][column],0))//平移,找出本行第一個(gè)非零;
  133.         {
  134.             row--;
  135.             continue;
  136.         }
  137.         //
  138.         c--;//少一個(gè)常量;
  139.         //
  140.         //這里不化成對(duì)角矩陣為1的矩陣,為了防止輸入的數(shù)據(jù)較大的時(shí)候,求出的解為接近于0值的情況
  141.         //tmp = 1 / m_matrix[row][column];
  142.         //for(k=column;k<n;k++)//前面的"0"就不處理了;
  143.             //m_matrix[row][k] *= tmp;
  144.         //

  145.         //化上三角矩陣為對(duì)角矩陣[/i][/i][/i]
  146. [i][i][i]       if(row == m-1)
  147.                         m_matrix[row][column] = 0.0f;        //強(qiáng)制為0,釋放一個(gè)自由度,否則很難有解

  148.         for(s=0;s<row;s++)//下面的0也不用處理;
  149.         {
  150.             if(Equal(m_matrix[s][column],0))
  151.                 continue;//已經(jīng)為0;
  152.             //
  153.             tmp = m_matrix[s][column] / m_matrix[row][column];
  154.             for(t=column;t<n;t++)
  155.                 m_matrix[s][t] -= m_matrix[row][t]*tmp;
  156.             //
  157.         }
  158.     }

  159.         DispMatrix();
  160.     printf("\r\n");
  161.     //
  162.     return c;
  163. }
  164.   
  165. void Matrix_Solve(double* C , double* sol)
  166. {
  167.         int row,column,i;
  168.         int any_sol[MATRIX_SIZE];
  169.   
  170.         //找出任意解的位置
  171.         memset(any_sol , 0 , MATRIX_SIZE);
  172.         for(row=0,column=0 ; row<m && column<n-1 ; row++,column++){
  173.                 if(Equal(m_matrix[row][column] , 0.0f)){
  174.                         any_sol[column] = 1;        //記錄任意解的位置
  175.                         row--;        //右移1列
  176.                 }
  177.         }
  178.   
  179.         //求解
  180.         row = 0;
  181.         for(column = 0 ; column<n-1 ; column++){
  182.                 if(any_sol[column] == 1){        //任意解
  183.                         sol[column] = C[column];
  184.                 }else{
  185.                         sol[column] = m_matrix[row][n-1];
  186.                         //加上任意解
  187.                         for(i = column+1 ; i<n-1 ; i++){
  188.                                 if(any_sol[i]==1 && !Equal(m_matrix[row][i],0.0f)){
  189.                                         sol[column] -= m_matrix[row][i]*C[i];
  190.                                 }
  191.                         }

  192.                                                 sol[column] /= m_matrix[row][column];        //除以對(duì)角線(xiàn)元素
  193.                         
  194.                                                 row++;
  195.                 }
  196.         }
  197. }
  198.   
  199. void DispMatrix(void)
  200. {
  201.         int row,column;
  202.          
  203.         for(row = 0 ; row<m ; row++){
  204.                 for(column = 0 ; column<n ; column++){
  205.                         printf("%.3f        " , m_matrix[row][column]);
  206.                 }
  207.                 printf("\r\n");
  208.         }
  209. }
  210.   
  211. void Calc_Process(double radius)
  212. {
  213.         double C[MATRIX_SIZE];
  214.         double Res[MATRIX_SIZE];
  215.         int i;
  216.         double k;
  217.   
  218.         ResetMatrix();
  219.   
  220.         //這里輸入任意個(gè)點(diǎn)的羅盤(pán)(加速度)參數(shù),盡量在球面上均勻分布(可使用APM的六面采集法采集)
  221.                 CalcData_Input(7 , -7 , -2);
  222.         CalcData_Input(-1 , -7 , -2);
  223.         CalcData_Input(3 , 3 , -2);
  224.         CalcData_Input(3 , -17 , -2);
  225.         CalcData_Input(3 , -7 , 4);
  226.         CalcData_Input(3 , -7 , -8);
  227.   
  228.         Matrix_GaussElimination();
  229.         Matrix_RowSimplify();
  230.   
  231.         for(i = 0 ; i<MATRIX_SIZE ; i++){
  232.                 C[i] = 1000.0f;
  233.         }
  234.   
  235.         Matrix_Solve(C , Res);
  236.   
  237.         printf("a:%.2f b:%.2f c:%.2f d:%.2f e:%.2f f:%.2f g:%.2f\r\n" , Res[0],Res[1],Res[2],Res[3],Res[4],Res[5],Res[6]);
  238.   
  239.         k = (Res[3]*Res[3]/Res[0]+Res[4]*Res[4]/Res[1]+Res[5]*Res[5]/Res[2] - 4*Res[6])/(4*radius*radius);
  240.   
  241.         m_result[0] = sqrt(Res[0] / k);
  242.                 m_result[1] = sqrt(Res[1] / k);
  243.                 m_result[2] = sqrt(Res[2] / k);
  244.                 m_result[3] = Res[3] / (2 * Res[0]);
  245.                 m_result[4] = Res[4] / (2 * Res[1]);
  246.                 m_result[5] = Res[5] / (2 * Res[2]);
  247.   
  248.         printf("Xo:%f Yo:%f Zo:%f Xg:%f Yg:%f Zg:%f C:%f\r\n" , m_result[3],m_result[4],m_result[5],m_result[0],m_result[1],m_result[2],k);
  249.         while(1);
  250. }
  251.   
  252.   
  253. int main(int argc, char* argv[])
  254. {
  255.         Calc_Process(2.0);
  256.         return 0;
  257. }
復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:485377 發(fā)表于 2019-3-6 10:02 | 顯示全部樓層
樓主您好,附件里的代碼“Calibration.rar ”不是文章里講的代碼,“羅盤(pán)與加計(jì)校準(zhǔn)方法”這個(gè)從哪里下載呢?
回復(fù)

使用道具 舉報(bào)

ID:485377 發(fā)表于 2019-3-6 10:15 | 顯示全部樓層
摩天輪1111 發(fā)表于 2018-5-23 16:41
有點(diǎn)騙積分的感覺(jué)啊,我這里全貼出來(lái)

兄弟,謝謝!。。!
回復(fù)

使用道具 舉報(bào)

ID:90358 發(fā)表于 2019-3-29 11:52 | 顯示全部樓層
謝謝分享!剛剛好需要!
回復(fù)

使用道具 舉報(bào)

ID:39405 發(fā)表于 2019-5-24 08:31 | 顯示全部樓層

謝謝分享!剛剛好需要!
回復(fù)

使用道具 舉報(bào)

ID:149528 發(fā)表于 2019-7-8 08:34 | 顯示全部樓層
圖片怎么打不開(kāi)呀?
回復(fù)

使用道具 舉報(bào)

ID:147081 發(fā)表于 2020-5-26 10:44 | 顯示全部樓層
圖片看不到啊。
回復(fù)

使用道具 舉報(bào)

ID:892838 發(fā)表于 2021-3-17 22:41 | 顯示全部樓層
進(jìn)來(lái)求知!雖看不太懂!但還是學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:915602 發(fā)表于 2021-5-4 17:40 | 顯示全部樓層
        //輸入任意個(gè)數(shù)磁場(chǎng)測(cè)量點(diǎn)坐標(biāo),請(qǐng)盡量保證在橢球上分布均勻
        CalcData_Input(7 , -7 , -2);
        CalcData_Input(-1 , -7 , -2);
        CalcData_Input(3 , 3 , -2);
        CalcData_Input(3 , -17 , -2);
        CalcData_Input(3 , -7 , 4);
        CalcData_Input(3 , -7 , -8);

請(qǐng)教下,這是輸入的坐標(biāo)還是磁力計(jì)采集數(shù)據(jù)呀,如果是坐標(biāo),磁力數(shù)據(jù)哪里輸入的呢
回復(fù)

使用道具 舉報(bào)

ID:234769 發(fā)表于 2023-2-23 19:37 | 顯示全部樓層

進(jìn)來(lái)求知!雖看不太懂!但還是學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:704640 發(fā)表于 2023-3-13 10:25 來(lái)自手機(jī) | 顯示全部樓層
太強(qiáng)大了,雖然現(xiàn)在看不明白,感謝老師
回復(fù)

使用道具 舉報(bào)

ID:298582 發(fā)表于 2023-9-12 15:05 | 顯示全部樓層
圖片看不到了,有啥辦法可以看嗎,壓縮包里面也沒(méi)有講解的內(nèi)容,只有代碼了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表