# LCM-каналы

Для более быстрого обмена данными контроллер робота использует протокол [LCM](https://lcm-proj.github.io/lcm/) для межпроцессного взаимодействия. Обмен по этому протоколу происходит исключительно с аппаратной частью робота: приводами, энкодерами и IMU. В системе имеется три LCM-канала. Рассмотрим каждый из них.

* **IMU\_DATA**: канал для получения данных с IMU робота. Формат сообщения:

```
struct imu_lcm_data
{
    float orientation_quaternion[4];

    float orientation_euler[3];
    float orientation_covariance[9];

    float angular_velocity[3];
    float angular_velocity_covariance[9];

    float linear_acceleration[3];
    float linear_acceleration_covariance[9];

    float magnetic_field[3];
    float magnetic_field_covariance[9];

    float temperature;
    float temperature_variance;
}
```

&#x20;

* **SERVO\_CMD**: предназначен для отправки задающих параметров сервоприводов. Формат сообщения имеет следующий вид:

```
struct servo_cmd_msg
{
    float timestamp; // временная метка

    float position[12];  // угловое положение [рад]
    float velocity[12];  // угловая скорость [рад/сек]
    float torque[12];  // момент [Н м]
    float kp[12];  // пропорциональный коэффициент
    float kd[12];  // дифференциальный коэффициент
}
```

* **SERVO\_STATE**: предназначен для получения состояния сервоприводов. Формат сообщения имеет следующий вид:

```
struct servo_state_msg
{
    float timestamp; // временная метка

    float position[12];  // угловое положение [рад]
    float velocity[12];  // угловая скорость [рад/сек]
    float torque[12];  // момент [Н м]
}
```
