#### 1.银星机器人参数

##### 1.1 基本尺寸参数

​		银星机器人有两个大齿轮，分别在电机和轮子上，经过尺寸的测量发现两个齿轮大小一样，应该是`1:1`的关系。

| 类别           | 参数    | 数值           |
| -------------- | ------- | -------------- |
| 轮子直径       | `mm`    | `240`          |
| 轮距           | `mm`    | `420`          |
| 编码器分辨率   | -       | 32(估计值)     |
| 电机减速比     | -       | `1:90`         |
| 减速箱默认转速 | `RPM`   | 54             |
| 电机默认转速   | `r/min` | 4200           |
| 电机默认方向   | `CCW`   | 逆时针方向旋转 |
| 额定电压       | 伏特    | 24             |
| 额定电流       | 安培    | 1.6            |
| 额定功率       | 瓦特    | 22             |

##### 1.2 接线方式

​		在`Pibot`开发板定义中，对于二轮差分模型。`Motor1`和`Motor2`分别对应的是左轮和右轮，关系如下表所示：

| 项目     | 类别                | `Pibot`端口 \  `Gebot`端口  | 说明       |
| -------- | ------------------- | --------------------------- | ---------- |
| `MOTOR1` | 左轮                | `U5`   \   `PL(Port Left)`  | 连接端口   |
| `MOTOR2` | 右轮                | `U4`   \   `PR(Port Right)` | 连接端口   |
| `LEN`    | 左轮`PWM`（橙色线） | `PA3`                       | 速度控IO   |
| `LP`     | 左轮方向 (绿色线)   | `PB13`                      | 方向控制IO |
| `REN`    | 右轮`PWM`（灰色线） | `PA2`                       | 速度控IO   |
| `RP`     | 右轮方向 (紫色线)   | `PB14`                      | 方向控制IO |

#### 1.3 默认方向

​		`Pibot`在运动学解算的时候，是按照每个轮子单独考虑的。默认情况下，轮子轴的方向指向左侧的`y`轴，轮子的前进方向前方的`x`轴方向。所以按照运动学解算，小车在前进的时候，左轮是需要“反向”旋转的。

​		为了更好理解，我们假设电机上面有标注默认的正负号，假设电机默认是顺时针旋转(轴心朝前)。当我们把电机安装在左轮的时候，给默认的电压方向，那么左轮是倒退的，所以我们需要给"负值"的`PWM`，即是让轮子反方向旋转。当然，`PWM`本身是一个非负的数值，负值表示其方向作用。

```C
// 如果PWM为正值
if (pwm_value > 5) {
    // 控制电机运动方向
    GPIO_SetBits(GPIOB, GPIO_Pin_13);
    // 设置电机速度
    PB_Set_PWM(TIM2, 4, (uint16_t)pwm_value);
// 如果PWM为负值
}else if (pwm_value < -5) {
    // 控制电机运动方向
    GPIO_ResetBits(GPIOB, GPIO_Pin_13);
    // 设置电机速度
    PB_Set_PWM(TIM2, 4, (uint16_t)-pwm_value);
}
```

| 类别     | 方向     | 数值 | 说明                                     |
| -------- | -------- | ---- | ---------------------------------------- |
| 左电机   | 小车前进 | 负值 | 小车在给前进命令时`PWM`实际是负值。      |
| 左编码器 | 小车前进 | 负值 | 小车给前进命令时，小车编码器总值负增长。 |
| 右电机   | 小车前进 | 正值 | 小车在给前进命令时`PWM`实际是正值。      |
| 右编码器 | 小车前进 | 正值 | 小车给前进命令时，小车编码器总值正增长。 |

##### 1.4 编码器到速度的换算

​		目前银星机器人采用的是霍尔编码器，但是其磁环的参数是未知的。常见的磁环的有22个极性。那么电机转动一圈下来就会产生44个脉冲计数。霍尔编码器原理详情见《霍尔编码器原理》。

```c
// 运动距离 = 编码器数值 / 编码器一圈脉冲计数 / 减速比 * 轮子直径 * PI
dis = (encoder_num / ENCODER_RATIO) / reduction ratio * wheel_diameter /  PI;
```

​		对应的，在`robot.cpp`中，可以看到里程计的换算，轮子直径原始是mm单位乘以0.001转m：

```C++
// 距离 = 编码器的增量 * PI * 轮子直径/ 编码器一圈脉冲计数 / 电机减速比
dis[i] = encoder[i]->get_increment_count_for_odom()*__PI*DataHolder::get()->parameter.params.wheel_diameter*0.001/DataHolder::get()->parameter.params.encoder_resolution/DataHolder::get()->parameter.params.motor_ratio;
```

