# Koch v1.1

En los pasos a continuación, explicamos cómo ensamblar el robot Koch v1.1.

## Ordenar y ensamblar las piezas

Siga las instrucciones de adquisición y ensamblaje proporcionadas en este [README](https://github.com/jess-moss/koch-v1-1). Esto le guiará a través de la configuración de ambos brazos, el seguidor y el líder, como se muestra en la imagen siguiente.

Para una explicación visual del proceso de ensamblaje, puede consultar [este tutorial en video](https://youtu.be/8nQIg9BwwTk).

> [!WARNING]
> Desde la producción de este video, simplificamos la fase de configuración. Por lo tanto, dos cosas difieren de las instrucciones de ese video:
>
> - No conecte todos los cables del motor de inmediato y espere a que se le indique hacerlo en [Configure the motors](#configure-the-motors). - No atornille la placa del controlador (PCB) a la base de inmediato y espere a que se le indique hacerlo en [Configure the motors](#configure-the-motors).

## Instalar LeRobot 🤗

Para instalar LeRobot, siga nuestra [Guía de instalación](./installation)

Además de estas instrucciones, debe instalar el SDK de Dynamixel (si instaló LeRobot desde PyPI, ejecute `pip install 'lerobot[dynamixel]'` en su lugar):

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

## Configura los motores

### 1. Encuentra los puertos USB asociados con cada brazo

Para encontrar el puerto de cada adaptador de servos de bus, ejecute este script:

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

Ejemplo de salida:

```
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.
```

Donde se encuentra el puerto: `/dev/tty.usbmodem575E0032081` correspondiente a su brazo líder o seguidor.

En Linux, es posible que necesites otorgar acceso a los puertos USB ejecutando:

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

Ejemplo de salida:

```
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.
```

Donde se encuentra el puerto: `/dev/ttyACM1` correspondiente a su brazo líder o seguidor.

### 2. Establecer los ids de los motores y las tasas de baudios

Cada motor se identifica mediante un id único en el bus. Cuando son nuevos, los motores suelen venir con un id predeterminado de `1`. Para que la comunicación funcione correctamente entre los motores y el controlador, primero es necesario asignar un id único y diferente a cada motor. Además, la velocidad a la que se transmiten los datos en el bus está determinada por el baudrate. Para que el controlador y todos los motores puedan comunicarse entre sí, es necesario configurar todos con el mismo baudrate.

Con ese fin, primero necesitamos conectar cada motor individualmente con el controlador para establecer estos parámetros. Dado que escribiremos estos parámetros en la sección no volátil de la memoria interna de los motores (EEPROM), solo tendremos que hacerlo una vez.

Si estás reutilizando motores de otro robot, probablemente también necesites realizar este paso, ya que los ids y la velocidad de baudios probablemente no coincidirán.

#### Seguidor

Conecte el cable USB desde su computadora y la fuente de alimentación de 12V a la placa de control del brazo seguidor (el brazo líder utiliza la fuente de alimentación de 5V). Luego, ejecute el siguiente comando o ejecute el ejemplo de la API con el puerto que obtuvo en el paso anterior. También deberá asignar un nombre a su brazo seguidor con el parámetro `id`.

Para una referencia visual sobre cómo configurar los ids de los motores, consulte [este video](https://huggingface.co/docs/lerobot/en/so101#setup-motors-video) donde seguimos el proceso para el brazo 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()
```

Deberías ver la siguiente instrucción.

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

Como se indicó, conecte el motor de la pinza. Asegúrese de que sea el único motor conectado a la placa y de que el propio motor no esté aún encadenado a ningún otro motor. Al presionar `[Enter]`, el script establecerá automáticamente el id y la velocidad de baudios para ese motor.

Solución de problemas

Si obtienes un error en ese punto, revisa tus cables y asegúrate de que estén bien conectados:

  Cable USB de alimentación entre su computadora y la placa de control Cable de 3 pines desde la placa de control hasta el motor

Si está utilizando una placa de controlador Waveshare, asegúrese de que los dos puentes estén configurados en el canal `B` (USB).

A continuación, debería ver el siguiente mensaje:

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

Seguido de la siguiente instrucción:

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

Puede desconectar el cable de 3 pines de la placa de control, pero puede dejarlo conectado al motor de la pinza en el otro extremo, ya que ya estará en el lugar correcto. Ahora, conecte otro cable de 3 pines al motor de giro de la muñeca y conéctelo a la placa de control. Como con el motor anterior, asegúrese de que sea el único motor conectado a la placa y de que el propio motor no esté conectado a ningún otro.

Repita la operación para cada motor según se indica.

> [!TIP]
> Compruebe el cableado en cada paso antes de presionar Enter. Por ejemplo, el cable de alimentación podría desconectarse mientras manipula la placa.

Cuando haya terminado, el script simplemente finalizará, momento en el que los motores estarán listos para su uso. Ahora puede conectar el cable de 3 pines de cada motor al siguiente, y el cable del primer motor (el 'shoulder pan' con id=1) a la placa de control, que ahora puede fijarse a la base del brazo.

#### Líder

Realice los mismos pasos para el brazo líder, pero modifique el comando o el script en consecuencia.

```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()
```

## Calibrar

A continuación, deberá calibrar su robot para asegurarse de que los brazos líder y seguidor tengan los mismos valores de posición cuando se encuentran en la misma posición física. El proceso de calibración es muy importante, ya que permite que una red neuronal entrenada en un robot funcione en otro.

#### Seguidor

Ejecute el siguiente comando o ejemplo de API para calibrar el brazo seguidor:

```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()
```

Unificamos el método de calibración para la mayoría de los robots. Por lo tanto, los pasos de calibración para este brazo Koch son los mismos que para el SO100 y el SO101. Primero, debemos mover el robot a la posición en la que cada articulación se encuentra en el medio de su rango, y luego presionamos `Enter`. En segundo lugar, movemos todas las articulaciones a través de su rango de movimiento completo. Un video de este mismo proceso para el SO101 como referencia se puede encontrar [aquí](https://huggingface.co/docs/lerobot/en/so101#calibration-video).

#### Líder

Siga los mismos pasos para calibrar el brazo líder, ejecute el siguiente comando o ejemplo de 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()
```

Felicidades 🎉, tu robot está listo para aprender una tarea por sí solo. Comienza a entrenarlo siguiendo este tutorial: [Primeros pasos con robots del mundo real](./il_robots)

> [!TIP]
> Si tienes alguna pregunta o necesitas ayuda, comunícate con nosotros en [Discord](https://discord.com/invite/s3KuuzsPFb).

