|
14 | 14 |
|
15 | 15 | void controlInterrupt(void)
|
16 | 16 | {
|
17 |
| - double speed_r, speed_l; |
| 17 | + // 直進速度と回転速度から、左右のモータ速度を求める |
| 18 | + double speed_r = g_speed + g_omega * TREAD_WIDTH / 2.0; |
| 19 | + double speed_l = g_speed - g_omega * TREAD_WIDTH / 2.0; |
18 | 20 |
|
19 |
| - if ((g_speed < 0.001) && (g_speed > -0.001) && (g_omega < 0.001) && (g_omega > -0.001)) { |
| 21 | + // 左右両方のモータ速度がMIN_SPEED以下の場合は走行を停止する |
| 22 | + if (fabs(speed_r) < MIN_SPEED && fabs(speed_l) < MIN_SPEED) { |
20 | 23 | g_motor_move = 0;
|
21 |
| - } else { |
22 |
| - g_motor_move = 1; |
| 24 | + return; |
23 | 25 | }
|
24 | 26 |
|
25 |
| - speed_r = g_speed + g_omega * TREAD_WIDTH / 2.0; |
26 |
| - speed_l = g_speed - g_omega * TREAD_WIDTH / 2.0; |
27 |
| - |
28 |
| - if ((speed_r > 0.001) && (speed_r < MIN_SPEED)) { |
29 |
| - speed_r = MIN_SPEED; |
30 |
| - } else if ((speed_r < -0.001) && (speed_r > (-1.0 * MIN_SPEED))) { |
31 |
| - speed_r = -1.0 * MIN_SPEED; |
| 27 | + g_motor_move = 1; |
| 28 | + // モータ速度をMIN_SPEED以上に制限する |
| 29 | + if (fabs(speed_r) < MIN_SPEED) { |
| 30 | + speed_r = (speed_r > 0.0) ? MIN_SPEED : -1.0 * MIN_SPEED; |
32 | 31 | }
|
33 |
| - if ((speed_l > 0.001) && (speed_l < MIN_SPEED)) { |
34 |
| - speed_l = MIN_SPEED; |
35 |
| - } else if ((speed_l < -0.001) && (speed_l > (-1.0 * MIN_SPEED))) { |
36 |
| - speed_l = -1.0 * MIN_SPEED; |
| 32 | + if (fabs(speed_l) < MIN_SPEED) { |
| 33 | + speed_l = (speed_l > 0.0) ? MIN_SPEED : -1.0 * MIN_SPEED; |
37 | 34 | }
|
38 |
| - g_speed = (speed_r + speed_l) / 2.0; |
39 | 35 |
|
40 |
| - g_odom_x += g_speed * 0.001 * cos(g_odom_theta) * 0.001; |
41 |
| - g_odom_y += g_speed * 0.001 * sin(g_odom_theta) * 0.001; |
42 |
| - g_odom_theta += g_omega * 0.001; |
43 |
| - g_position_r += speed_r * 0.001 / (48 * PI) * 2 * PI; |
44 |
| - g_position_l -= speed_l * 0.001 / (48 * PI) * 2 * PI; |
| 36 | + // 制限されたモータ速度から、直進速度と回転速度を求める |
| 37 | + const double forward_speed = (speed_r + speed_l) / 2.0; |
| 38 | + const double omega = (speed_r - speed_l) / TREAD_WIDTH; |
| 39 | + |
| 40 | + const double UPDATE_INTERVAL = 0.001; |
| 41 | + g_odom_x += forward_speed * UPDATE_INTERVAL * cos(g_odom_theta) * UPDATE_INTERVAL; |
| 42 | + g_odom_y += forward_speed * UPDATE_INTERVAL * sin(g_odom_theta) * UPDATE_INTERVAL; |
| 43 | + g_odom_theta += omega * UPDATE_INTERVAL; |
| 44 | + g_position_r += speed_r * UPDATE_INTERVAL / (TIRE_DIAMETER * PI) * 2 * PI; |
| 45 | + g_position_l -= speed_l * UPDATE_INTERVAL / (TIRE_DIAMETER * PI) * 2 * PI; |
45 | 46 |
|
46 | 47 | if (speed_r > 0) {
|
47 | 48 | digitalWrite(CW_R, LOW);
|
|
0 commit comments