# Koch v1.1

在下面的步骤中，我们将说明如何组装 Koch v1.1 机器人。

## 订购并组装部件

请按照此 [README](https://github.com/jess-moss/koch-v1-1) 中提供的采购和组装说明进行操作。这将指导您完成从动臂和主动臂的设置，如下图所示。

如需直观地了解组装过程，您可以参考[此视频教程](https://youtu.be/8nQIg9BwwTk)。

> [!WARNING]
> 自该视频发布以来，我们简化了配置阶段。因此，以下两点与视频中的说明有所不同：
>
> - 请勿立即插入所有电机线缆，请等待在[配置电机](#configure-the-motors)中收到相应指示后再操作。 - 请勿立即将控制器板（PCB）拧到基座上，请等待在[配置电机](#configure-the-motors)中收到相应指示后再操作。

## 安装 LeRobot 🤗

要安装 LeRobot，请遵循我们的[安装指南](./installation)

除了这些说明之外，您还需要安装 Dynamixel SDK（如果您从 PyPI 安装了 LeRobot，请改为运行 `pip install 'lerobot[dynamixel]'`）：

```bash
pip install -e ".[dynamixel]"
```

## 配置电机

### 1. 找到与每条机械臂关联的 USB 端口

要查找每个总线舵机适配器的端口，请运行此脚本：

```bash
lerobot-find-port
```

示例输出：

```
Finding all available ports for the MotorBus.
['/dev/tty.usbmodem575E0032081', '/dev/tty.usbmodem575E0031751']
Remove the USB cable from your MotorsBus and press Enter when done.

[...Disconnect corresponding leader or follower arm and press Enter...]

The port of this MotorsBus is /dev/tty.usbmodem575E0032081
Reconnect the USB cable.
```

找到的端口为：`/dev/tty.usbmodem575E0032081`，对应您的 leader 或 follower 机械臂。

在 Linux 上，您可能需要运行以下命令来授予 USB 端口的访问权限：

```bash
sudo chmod 666 /dev/ttyACM0
sudo chmod 666 /dev/ttyACM1
```

示例输出：

```
Finding all available ports for the MotorBus.
['/dev/ttyACM0', '/dev/ttyACM1']
Remove the usb cable from your MotorsBus and press Enter when done.

[...Disconnect corresponding leader or follower arm and press Enter...]

The port of this MotorsBus is /dev/ttyACM1
Reconnect the USB cable.
```

找到的端口为：`/dev/ttyACM1`，对应您的主臂或从臂。

### 2. 设置电机 ID 和波特率

每个电机在总线上都有一个唯一的 id。全新电机出厂时通常默认 id 为 `1`。为了确保电机与控制器之间的通信正常工作，我们首先需要为每个电机设置一个唯一的、互不相同的 id。此外，总线上传输数据的速度由波特率（baudrate）决定。为了让控制器和所有电机能够相互通信，它们必须配置为相同的波特率。

为此，我们首先需要通过控制器单独连接每个电机以设置这些参数。由于我们将把这些参数写入电机内部存储器（EEPROM）的非易失性区域，因此只需执行一次即可。

如果您正在复用来自其他机器人的电机，那么您很可能也需要执行此步骤，因为 id 和波特率可能不匹配。

#### 跟随者

将 USB 线缆从计算机和 12V 电源连接到从臂的控制器板（主臂使用 5V 电源）。然后，运行以下命令，或使用上一步中获取的端口运行 API 示例。您还需要使用 `id` 参数为从臂指定一个名称。

有关如何设置电机 ID 的视觉参考，请参阅 [此视频](https://huggingface.co/docs/lerobot/en/so101#setup-motors-video)，其中我们演示了 SO101 机械臂的设置流程。

```bash
lerobot-setup-motors \
    --robot.type=koch_follower \
    --robot.port=/dev/tty.usbmodem575E0031751 # <- paste here the port found at previous step
```

```python
from lerobot.robots.koch_follower import KochFollower, KochFollowerConfig

config = KochFollowerConfig(
    port="/dev/tty.usbmodem575E0031751",
    id="my_awesome_follower_arm",
)
follower = KochFollower(config)
follower.setup_motors()
```

您应该会看到以下说明。

```
Connect the controller board to the 'gripper' motor only and press enter.
```

按照说明，将夹爪的电机接入。请确保它是连接到板卡上的唯一电机，并且该电机本身尚未通过菊花链方式连接到任何其他电机。当您按下`[Enter]`时，脚本将自动为该电机设置 id 和波特率。

故障排除

如果在此处出现错误，请检查线缆并确保其已正确插入：

  计算机与控制器板之间的电源 USB 线 从控制器板到电机的 3 针线缆

如果您使用的是 Waveshare 控制板，请确保两个跳线设置在 `B` 通道（USB）上。

随后您应该会看到以下消息：

```
'gripper' motor id set to 6
```

随后是下一条指令：

```
Connect the controller board to the 'wrist_roll' motor only and press enter.
```

您可以将 3 针线缆从控制板上断开，但另一端可以保持与夹爪电机的连接，因为它已经处于正确的位置。现在，将另一根 3 针线缆插入腕部旋转电机，并将其连接到控制板。与之前的电机一样，请确保它是唯一连接到该板的电机，并且该电机本身未连接到任何其他电机。

按照说明，对每个电机重复此操作。

> [!TIP]
> 在按下 Enter 键之前，请在每一步检查线缆连接。例如，在操作主板时，电源线可能会意外断开。

完成后，脚本将直接结束，此时电机已准备就绪。现在，您可以将每个电机的 3 针电缆依次连接到下一个电机，并将第一个电机（id=1 的“肩部水平旋转”电机）的电缆连接到控制器板，该控制器板现在可以安装在机械臂的底座上。

#### 领导者

对 leader arm 执行相同的步骤，但相应地修改命令或脚本。

```bash
lerobot-setup-motors \
    --teleop.type=koch_leader \
    --teleop.port=/dev/tty.usbmodem575E0031751
```

```python
from lerobot.teleoperators.koch_leader import KochLeader, KochLeaderConfig

config = KochLeaderConfig(
    port="/dev/tty.usbmodem575E0031751",
    id="my_awesome_leader_arm",
)
leader = KochLeader(config)
leader.setup_motors()
```

## 校准

接下来，您需要对机器人进行校准，以确保主臂和从臂在处于相同物理位置时具有相同的位置值。校准过程非常重要，因为它使得在一个机器人上训练的神经网络能够在另一个机器人上运行。

#### 跟随者

运行以下命令或 API 示例来校准从动臂：

```bash
# Use the port of your follower arm, and give the arm a unique name with --robot.id
lerobot-calibrate \
    --robot.type=koch_follower \
    --robot.port=/dev/tty.usbmodem58760431551 \
    --robot.id=my_awesome_follower_arm
```

```python
from lerobot.robots.koch_follower import KochFollowerConfig, KochFollower

config = KochFollowerConfig(
    port="/dev/tty.usbmodem585A0076891",
    id="my_awesome_follower_arm",
)

follower = KochFollower(config)
follower.connect(calibrate=False)
follower.calibrate()
follower.disconnect()
```

我们统一了大多数机器人的校准方法。因此，这款 Koch 机械臂的校准步骤与 SO100 和 SO101 的步骤相同。首先，我们需要将机器人移动到每个关节处于其活动范围中间的位置，然后按下 `Enter`。其次，我们将所有关节移动至其完整活动范围。可以参考 SO101 的相同过程视频，链接在[这里](https://huggingface.co/docs/lerobot/en/so101#calibration-video)。

#### 领导者

执行相同的步骤来校准主臂，运行以下命令或 API 示例：

```bash
# Use the port of your leader arm, and give the arm a unique name with --teleop.id
lerobot-calibrate \
    --teleop.type=koch_leader \
    --teleop.port=/dev/tty.usbmodem58760431551 \
    --teleop.id=my_awesome_leader_arm
```

```python
from lerobot.teleoperators.koch_leader import KochLeaderConfig, KochLeader

config = KochLeaderConfig(
    port="/dev/tty.usbmodem575E0031751",
    id="my_awesome_leader_arm",
)

leader = KochLeader(config)
leader.connect(calibrate=False)
leader.calibrate()
leader.disconnect()
```

恭喜 🎉，你的机器人已准备好自主学习任务。按照本教程开始训练它：[使用真实机器人入门](./il_robots)

> [!TIP]
> 如果您有任何问题或需要帮助，请在 [Discord](https://discord.com/invite/s3KuuzsPFb) 上联系我们。

