Этот проект реализует мост между ROS2 и протоколом Cyphal позволяя обмениваться сообщениями и сервисами между ROS и узлами Cyphal.
- Поддержка обмена сообщениями между ROS2 и Cyphal.
- Трансляция сообщений и сервисов
- Гибкая настройка через JSON-конфиг.
- Использование стандартных и пользовательских типов сообщений.
Убедитесь, что у вас установлен ROS2 (тестировали на jazzy) и все необходимые зависимости. Добавьте этот пакет в свой ROS-workspace (не забудьте скачать сабмодули - git clone --recurse-submodules или после клонирования - git submodule update --init --recursive) и соберите пакет (catkin_make, source devel/setup.bash).
Конфигурационный файл (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.
Каждое подключение описывает связь между сущностями 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"
}
}ros2 run cyphal_ros2_bridge cyphal_bridge --ros-args -p "config_file:=/path/to/config.json"
-
Определите соответствие между ROS и Cyphal типами в
src/translators/_translate_msg.hpp. -
Используйте макросы
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 до определенного таймаут. В будущем надо переписать это на асинхронный код, но пока и так сойдет.