달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2016. 2. 8. 02:58

센서값 보정 작품/쿼드콥터2016. 2. 8. 02:58

하드웨어를 다시 만들었기 때문에 센서가 기체에 얼마만큼 기울어져 있는가를 다시 측정 해야했다.

그래서 테스트 해보았는데.. 센서값이 희안하게 조금씩 증가하기도 하고... 뭔가가 반응이 느린것 같았다.

그래서 센서가 기울어진 정도를 측정 했을때 값이 이상하게 나왔다.


test1

test2

test3

test4


roll이든 pitch든 실제 IMU의 측정값인 alpha값이 어느 정도 오차 범위에서 비슷 하게 나와야 하는데 1테스당 5번 시행해서 1개씩 너무 오차가 크게 달랐다.

그래서 오차가 적은 test2의 결과를 받아들여 초기 roll의 setpoint는 -0.60으로 하고 pitch의 setpoint는 -0.67로 하였다.


보정하는데 쓴 코드는 아래에 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
/////////////////IMU Sensor/////////////////
//IMU Sensor variable
typedef union {
    signed short value;
    unsigned char byte[2];
} S2BYTE;
 
S2BYTE data_word;
 
unsigned char SBuf[100];
int SCnt = 0;
double  DegRoll, DegPitch, DegYaw;
double roll_alpha1[5], roll_alpha2[5], roll_beta[5];
double pitch_alpha1[5], pitch_alpha2[5], pitch_beta[5];
double roll_mean, pitch_mean;
int count = 0, n=0;
////////////////////////////////////////////
 
int receieve_y_from_computer(void)
{
    if (Serial.available()){
        char c = Serial.read();
        if (c == 'y'){
            Serial.println("recieve 'y'.");
            return 1;
        }
    }
 
    return 0;
}
 
 
//센서값을 읽어서 roll,pitch,yaw 값을 알아낸다.
int recieve_data(void)
{
    static int step_ = 0, check_all_recieve = 0;
    unsigned char data1byte;
    int n;
 
    data1byte = Serial1.read();
 
    switch (step_)
    {
    case 0:
        if (data1byte == 0x55) { step_ = 1, check_all_recieve = 0; }
        break;
 
    case 1:
        if (data1byte == 0x55) { step_ = 2;  SCnt = 0; }
        else step_ = 0;
        break;
 
    case 2:
        SBuf[SCnt++= (unsigned char)data1byte;
        if (SCnt == 8)  // roll(2byte),pitch(2byte),yaw(2byte),checksum(2byte) 
        {
            step_ = 0;
            SCnt = 0;
            check_all_recieve = 1;
        }
        break;
 
    default:
        break;
    }
 
    return check_all_recieve;
}
 
 
static int trans_data_to_degree(unsigned char *sdata)  // sdata : roll(2)+pitch(2)+yaw(2)+chk(2)
{
    int n;
    unsigned short chk = 0;
 
    ///////////// checksum /////////////////
    chk = 0x55 + 0x55;
    for (n = 0; n<6; n++) chk += sdata[n];
    if (chk != get_data_word(&sdata[6]))
    {
        Serial.println("checksum error!");
        return 0//   
    }
    ////////////////////////////////////////
 
    DegRoll = get_data_word(&sdata[0]) / 100.;
    DegPitch = get_data_word(&sdata[2]) / 100. * -1;
    DegYaw = get_data_word(&sdata[4]) / 100.;
 
    return 1;
}
 
static signed short get_data_word(unsigned char *dat)
{
    // little endian..
    data_word.byte[0= dat[1];
    data_word.byte[1= dat[0];
 
    return data_word.value;
}
 
 
 
void setup() {
 
    Serial.begin(115200);
    Serial1.begin(57600);
 
 
}
 
void loop() {
 
    if (Serial1.available()){
        if (recieve_data() == 1)  //roll(2byte),pitch(2byte),yaw(2byte),checksum(2byte) 모든 데이터 받았음
        {
            if (trans_data_to_degree(SBuf) == 1//센서값을 읽어서 roll,pitch,yaw 값을 알아낸다. 
            {
                if (count == 0){
 
                    if (receieve_y_from_computer() == 1)
                    {
                        Serial.print("n = "); Serial.println(n);
 
                        roll_alpha1[n] = DegRoll; 
                        pitch_alpha1[n] = DegPitch;
                        Serial.print("roll_alpha1=  "); Serial.print(roll_alpha1[n]); 
                        Serial.print(" , pitch_alpha1= "); Serial.println(pitch_alpha1[n]);
                        count++;
                    }
                }
 
                Serial.println(DegPitch);
 
            
                if (count == 1){
                    if (receieve_y_from_computer() == 1)
                    {
                        roll_alpha2[n] = DegRoll; 
                        pitch_alpha2[n] = DegPitch;
                        Serial.print("roll_alpha2=  "); Serial.print(roll_alpha2[n]); 
                        Serial.print(" , pitch_alpha2= "); Serial.println(pitch_alpha2[n]);
                        count++;
                    }
                }
 
                if (count == 2){
                    if (receieve_y_from_computer() == && count == 2)
                    {
                        roll_beta[n] = (roll_alpha1[n] + roll_alpha2[n]) / 2;
                        pitch_beta[n] = (pitch_alpha1[n] + pitch_alpha2[n]) / 2;
 
                        Serial.print("roll_beta=  "); Serial.print(roll_beta[n]); 
                        Serial.print(" , pitch_beta= "); Serial.println(pitch_beta[n]);
                        Serial.println("");
                    
                        count = 0;
                        n++;
                    }
                }
 
 
 
            }
        }
    }
 
 
    if (n >= 5)
    {
        Serial.print("roll_alpha1 = ");
        for (int i = 0; i < 5; i++){
            Serial.print(roll_alpha1[i]);
            Serial.print(" ,  ");
        }
        Serial.println("");
 
        Serial.print("roll_alpha2 = ");
        for (int i = 0; i < 5; i++){
            Serial.print(roll_alpha2[i]);
            Serial.print(" ,  ");
        }
        Serial.println("");
 
        Serial.print("roll_beta = ");
        for (int i = 0; i < 5; i++){
            Serial.print(roll_beta[i]);
            Serial.print(" ,  ");
        }
        Serial.println("");
 
        Serial.print("pitch_alpha1 = ");
        for (int i = 0; i < 5; i++){
            Serial.print(pitch_alpha1[i]);
            Serial.print(" ,  ");
        }
        Serial.println("");
 
        Serial.print("pitch_alpha2 = ");
        for (int i = 0; i < 5; i++){
            Serial.print(pitch_alpha2[i]);
            Serial.print(" ,  ");
        }
        Serial.println("");
 
        Serial.print("pitch_beta = ");
        for (int i = 0; i < 5; i++){
            Serial.print(pitch_beta[i]);
            Serial.print(" ,  ");
        }
        Serial.println("");
 
        Serial.println("");
        Serial.println("");
 
        for (int i = 0; i < 5; i++)
        {
            roll_mean += roll_beta[i];
            pitch_mean += pitch_beta[i];
        }
        roll_mean = roll_mean / 5.0;
        pitch_mean = pitch_mean / 5.0;
 
        Serial.print("roll_mean = "); Serial.println(roll_mean);
        Serial.print("pitch_mean = "); Serial.println(pitch_mean);
        n = 0;
    }
}
cs


근데 밤새서 왜 센서가 이런가에대해서 열받고 씨름하고 있었는데 또 해보니까 잘 되었다...뭐지..??

:
Posted by youjin.A