Skip to content

Repository files navigation

Cyphal ROS2 Bridge

Этот проект реализует мост между ROS2 и протоколом Cyphal позволяя обмениваться сообщениями и сервисами между ROS и узлами Cyphal.

Возможности

  • Поддержка обмена сообщениями между ROS2 и Cyphal.
  • Трансляция сообщений и сервисов
  • Гибкая настройка через JSON-конфиг.
  • Использование стандартных и пользовательских типов сообщений.

Quickstart

1. Установка зависимостей

Убедитесь, что у вас установлен ROS2 (тестировали на jazzy) и все необходимые зависимости. Добавьте этот пакет в свой ROS-workspace (не забудьте скачать сабмодули - git clone --recurse-submodules или после клонирования - git submodule update --init --recursive) и соберите пакет (catkin_make, source devel/setup.bash).

2. Конфигурация

Конфигурационный файл (JSON) определяет параметры работы моста и правила трансляции между ROS и Cyphal. Пример файла — examples/test_node.json. Там же лежит и пример cyphal-ноды (examples/test_node.py), реализующей все сервисы и порты из этого конфига.

Общая структура

{
    "node_id": 42,
    "interface": "<string>",
    "connections": [ {}, {} ]
}
  • node_id — уникальный идентификатор узла Cyphal.
  • interface — CAN-интерфейс (например, can0).
  • connections — массив объектов, описывающих отдельные правила трансляции между ROS и Cyphal.

Описание объекта connections

Каждое подключение описывает связь между сущностями ROS и Cyphal.

Главные поля:

  • type — тип сообщения/сервиса/регистра (например, Diagnostic, HMI.Led, Boolean, Float32, Angle и т.д.).
  • cyphal — параметры для Cyphal-стороны.
  • ros — параметры для ROS-стороны.

Поле cyphal:

  • port — номер порта (или объект с полями read и write для bidirectional топиков).
  • node — (опционально) ID удалённого Cyphal-узла.
  • register — (опционально) имя регистра для работы с Cyphal Register API.

Поле ros:

  • type — тип сущности ROS, topic или service.
  • direction — направление передачи для топиков: read (Cyphal→ROS), write (ROS→Cyphal), bi (двунаправленно).
  • name — имя ROS-топика или сервиса.

Примеры

Топик диагностики (bi-directional):

{
    "type": "Diagnostic",
    "cyphal": { "port": 8184 },
    "ros": {
        "type": "topic",
        "direction": "bi",
        "name": "/diagnostic"
    }
}

Сервис управления светодиодом на Cyphal-ноде с id 13:

{
    "type": "HMI.Led",
    "cyphal": { "port": 172, "node": 13 },
    "ros": {
        "type": "service",
        "name": "/hmi/led"
    }
}

Работа с регистром (bool-типа):

TODO: регистры пока не реализованы (со стороны ROS)

{
    "type": "Boolean",
    "ros": {
        "type": "service",
        "name": "/node13/storage/static_value"
    },
    "cyphal": {
        "register": "storage.static_value",
        "node": 13
    }
}

Bidirectional топик с разными портами:

{
    "type": "Angle",
    "cyphal": {
        "port": { "read": 6998, "write": 7011 },
        "node": 13
    },
    "ros": {
        "type": "topic",
        "direction": "bi",
        "name": "/node13/angle"
    }
}

3. Запуск

ros2 run cyphal_ros2_bridge cyphal_bridge --ros-args -p "config_file:=/path/to/config.json"

Как добавить новый тип сообщения

  1. Определите соответствие между ROS и Cyphal типами в src/translators/_translate_msg.hpp.

  2. Используйте макросы MATCH_TYPE_RTC и MATCH_TYPE_CTR для регистрации новых типов в src/translators/_ros_to_cyphal.hpp и src/translators/_cyphal_to_ros.hpp.


Примечания

Сервисы ROS<->Cyphal поддерживаются, но они немного бьют по производительности из-за того, что ROS-сервисы на C++ ожидают ответа сразу же (return из функции обработчика), а cyphal-сервисы могут выполняться неопределенно долго. Поэтому на каждый вызов сервиса (или регистра) используется thread, который ждет ответа из cyphal до определенного таймаут. В будущем надо переписать это на асинхронный код, но пока и так сойдет.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages