#### 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; ```