# Yakut

По аналогии с CAN utils для отладки и проверки корректности сообщений, отправленных через cyphal используется инструмент [Yakut](https://github.com/OpenCyphal/yakut/tree/main).

Yakut - это простой кроссплатформенный инструмент с интерфейсом командной строки (CLI) для диагностики и отладки сетей Cyphal. Благодаря тому, что Yakút основан на PyCyphal, он поддерживает все транспорты Cyphal (UDP, serial, CAN, ...) и совместим со всеми основными функциями протокола. Он разработан для использования в GNU/Linux, Windows и macOS.

Перед установкой yakut, убедитесь что версия python >=3.8 и установите дополнительные пакеты:

<pre class="language-shellscript"><code class="lang-shellscript"><strong>sudo apt update
</strong><strong>sudo apt upgrade
</strong><strong>sudo apt install libsdl2-dev libasound2-dev libjack-dev can-utils jq
</strong>sudo apt install python3-jsonnet
</code></pre>

Инструкция по установке yakut <https://pypi.org/project/yakut/>

Если **возникают ошибки** при использолвании команды `pip install yakut,`

воспользуйтесь `pipx:`

```python
sudo apt install pipx
pipx install yakut
pipx ensurepath
```

Прописанные в файле .bashrc экспорты должны выглядеть примерно так(в зависимости от ваших настроек):

```
export PATH="$PATH:/home/pi/.local/bin"
export YAKUT_FORMAT=json
export UAVCAN__CAN__IFACE=socketcan:can0
export UAVCAN__NODE__ID=101
export UAVCAN__CAN__MTU=64
export UAVCAN__CAN__BITRATE="500000 4000000"

export CYPHAL_PATH="$HOME/.cyphal:$CYPHAL_PATH"
```

Репозитоий, содержащий определения регламентированных типов данных Cyphal вы найдете по ссылке: <https://github.com/OpenCyphal/public_regulated_data_types/tree/master>

О том, как пользоваться yakut написано здесь

{% @github-files/github-code-block %}

Давайте разберем три основные команды - yakut monitor (y mon), yakut subscribe (y sub) и yakut publish (y pub).

## Yakut monitor

Сокращенный вариант этой команды&#x20;

&#x20;`y mon`

Она используется для отображения всей активности в сети. Она отслеживает узлы, находящиеся в режиме онлайн, и ведет в реальном времени статистику всех передач, которыми обменивается каждый узел в сети. Она также может обнаружить некоторые распространенные проблемы конфигурации сети, например, "зомби-узлы" (узлы, не публикующие uavcan.node.Heartbeat).&#x20;

<figure><img src="https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2F7y1PdvvfLfuslAE02e1Z%2Fimage.png?alt=media&#x26;token=66e24408-a84c-486a-9feb-240ee6d52c29" alt=""><figcaption></figcaption></figure>

Подробно узнать о том, какая информация отображается на экране, какие есть опции у команды вы можете введя команду

```
y mon --help
```

## Yakut subscribe

Сокращенный вариант команды

```
y sub
```

Этой командой вы подписываетесь на конкретный топик (ID) и можете видеть что в него отправляется.&#x20;

Приведем пример. У нас есть программа, которая по ID 1111 отправляет угол поворота мотора в радианах. Прочитать какие данные туда приходят можно командой:

```
 y sub 1111:uavcan.si.sample.angle.scalar
```

*uavcan.si.sample.angle.scalar* - это тип получаемого сообщения. Выше дана ссылка на репозиторий, содержащий определения регламентированных типов данных Cyphal. Настоятельно рекомендуем ознакомиться с написанной там документацией, чтобы понимать каким образом устроена структура сообщений и их ID.

Результат введенной команды:

<figure><img src="https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2F1ub2OrfUyo9X5bWdtxGp%2Fimage.png?alt=media&#x26;token=7f19301f-c54d-4ce4-9592-80786a6ce274" alt=""><figcaption></figcaption></figure>

Подробнее познакомиться с командой и посмотреть больше примеров вы можете, введя

```
y sub --help
```

## Yakut publish

Сокращенный вариант&#x20;

```
y pub
```

Примеры и описание вы можете посмотреть, набрав&#x20;

```
y pub --help
```

Рассмотрим один пример. Введите в терминале

```
 yakut pub 33:uavcan.si.unit.angle.scalar 2.31 uavcan.diagnostic.Record 'text: "2.31 radian"'
```

В топик 33 будет публиковаться сообщение типа uavcan.si.unit.angle.scalar, значение угла 2.31 радиан. Также будет публиковаться сообщение типа uavcan.diagnostic.Record. Для такого типа зарезервирован топик 8184 (см в документации о регламентированных типах данных).&#x20;

{% hint style="info" %}
Если вы публикуете отрицательное число, то в yakut возникнет неправильная интерпретация аргументов. Проблема в том, что отрицательное число (`-10, например`) воспринимается как опция, а не как значение. Чтобы исправить это, нужно явно указать, что это аргумент значения, а не флаг опции:
{% endhint %}

`yakut pub 2004:uavcan.si.unit.angular_velocity.scalar -- "-10"`

Откройте второй терминал и введите команду&#x20;

```
yakut sub 33 8184
```

На экране вы должны будете увидеть публкуемые вами сообщения:

<figure><img src="https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FCEPcFkvWPBS8WUSEdMyz%2Fimage.png?alt=media&#x26;token=1ba36fa2-8092-421a-9682-97b634b7c15c" alt=""><figcaption></figcaption></figure>
