Перейти к основному содержимому
Версия: Bbrain 2.0

Документация: ROS2 пакет sensor_driver

Назначение: Пакет sensor_driver обеспечивает взаимодействие с датчиком тока и напряжения INA219 (монитор питания) через шину I2C и публикует данные о состоянии батареи в стандартном формате sensor_msgs/msg/BatteryState.


📁 Структура пакета

sensor_driver/
├── CMakeLists.txt # Правила сборки (ament_cmake)
├── package.xml # Зависимости и метаданные пакета
├── README.md # Краткое описание
├── src/
│ └── main.cpp # Исходный код ноды (C++17)
├── config/
│ └── sensor_driver.yaml # Параметры конфигурации
└── launch/
└── sensor_driver.launch.py # Launch-файл для запуска

📡 Топики

Публикуемые

<namespace>/battery

ПараметрЗначение
Тип сообщенияsensor_msgs/msg/BatteryState
Имя по умолчаниюbattery (настраивается параметром topic_name)
Частота публикациизадаётся параметром publish_rate (по умолчанию 5 Гц)
QoSглубина очереди 10
Пространство имёнзадаётся в launch-файле (по умолчанию: sensor_driver)

Заполняемые поля сообщения

ПолеТипОписание
header.stampTimeВременная метка момента считывания данных
voltagefloat32Напряжение на шине, В
currentfloat32Ток через батарею, А (> 0 — зарядка, < 0 — разрядка)
power_supply_statusuint8Статус питания (см. таблицу ниже)
power_supply_technologyuint8POWER_SUPPLY_TECHNOLOGY_LION (Li-Ion)
power_supply_healthuint8POWER_SUPPLY_HEALTH_UNKNOWN
presentboolВсегда true (датчик обнаружен)
locationstring"main_battery"
charge, capacity, design_capacity, percentagefloat32NaN (не определяются данным датчиком)
cell_voltagefloat32[]Пустой массив
serial_numberstringПустая строка

Логика определения power_supply_status

УсловиеЗначениеКонстанта ROS2
current > charge_thresholdЗарядкаPOWER_SUPPLY_STATUS_CHARGING
current < -charge_thresholdРазрядкаPOWER_SUPPLY_STATUS_DISCHARGING
-charge_threshold ≤ current ≤ charge_thresholdНе заряжаетсяPOWER_SUPPLY_STATUS_NOT_CHARGING

💡 Порог charge_threshold (по умолчанию 0.1 А) необходим для фильтрации шумов измерения.


⚙️ Параметры конфигурации

Файл: config/sensor_driver.yaml

ПараметрТипПо умолчаниюОписание
topic_namestring"battery"Имя топика (без префикса пространства имён)
publish_rateint5Частота публикации данных
i2c_addressint67I2C-адрес INA219 в десятичном формате
i2c_busint1Номер I2C-шины (соответствует /dev/i2c-<N>)
charge_thresholdfloat0.1Порог тока (А) для определения статуса зарядки

⚠️ Важно: Параметр i2c_address указывается в десятичной системе счисления.
Пример: адрес 0x43 → записывайте как 67.


🔧 Конфигурация INA219

Датчик инициализируется со следующими аппаратными настройками:

ПараметрЗначениеОписание
Диапазон напряжения16 ВBusVoltageRange::RANGE_16V
Усиление шунта×2 (±80 мВ)Gain::DIV_2_80MV
Разрешение АЦП12 бит, 32 выборкиADCResolution::ADCRES_12BIT_32S
Режим работыНепрерывныйMode::SANDBVOLT_CONTINUOUS
Значение калибровки26868Регистр REG_CALIBRATION
LSB тока0.1524 мАШаг квантования тока

📐 Расчёт тока: I [мА] = raw_value × 0.1524
📐 Расчёт напряжения: U [В] = (raw_value >> 3) × 0.004


🛠️ Сборка и запуск

Сборка пакета

# В корневой директории workspace
colcon build --symlink-install --packages-select sensor_driver
source install/setup.bash

💡 Флаг --symlink-install позволяет редактировать файлы конфигурации и launch-файлы без повторной сборки.

Запуск через launch-файл

ros2 launch sensor_driver sensor_driver.launch.py

Ожидаемый вывод при успешном запуске:

[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [sensor_driver_node-1]: process started with pid [4608]
[sensor_driver_node-1] [INFO] [1776683390.095654952] [sensor_driver.sensor_driver]: INITED

Проверка работы

# Просмотр данных в реальном времени
ros2 topic echo /sensor_driver/battery

# Однократное чтение
ros2 topic echo /sensor_driver/battery --once

# Проверка частоты публикации
ros2 topic hz /sensor_driver/battery

# Просмотр структуры сообщения
ros2 interface show sensor_msgs/msg/BatteryState

🐛 Режим отладки

По-умолчанию пакет sensor_driver запускается автоматически вместе со всеми остальными зависимостями пакета robohead_controller (внутри namespace /robohead/...) за счёт системного сервиса robohead.service. Для отладки рекомендуется остановить сервис (и соответственно все зависимости) и вручную запустить только sensor_driver.

Шаг 1. Остановка фоновых сервисов

sudo systemctl stop robohead.service

После перезагрузки системы сервис снова запустится автоматически. Или, для ручного возобновления работы без перезагрузки используйте sudo systemctl start robohead.service

Шаг 2. Запуск ноды вручную

# В терминале 1: запуск драйвера
ros2 launch sensor_driver sensor_driver.launch.py

# В терминале 2: просмотр данных
ros2 topic echo /sensor_driver/battery

Особенности режима отладки

Аспектrobohead_controllerОтладка
Пространство имёнЗадаётся пакетом robohead_controller: /robohead/sensor_driver/batteryФиксировано: /sensor_driver/battery
КонфигурацияИспользуется robohead_controller/config/sensor_driver.yamlИспользуется sensor_driver/config/sensor_driver.yaml

❗ Возможные ошибки и решения

ОшибкаВозможная причинаРешение
Failed to open I2C deviceНет прав доступа к /dev/i2c-*sudo usermod -aG i2c $USER + перелогин
Failed to set I2C slave addressНеверный адрес или устройство не отвечаетПроверьте i2cdetect -y 1, убедитесь, что адрес 0x43 отображается
I2C read/write failedПроблема с подключением или помехи на шинеПроверьте пайку, подтягивающие резисторы (4.7 кОм), длину проводов
Нода не публикует данныеОшибка инициализации, нода упалаПроверьте ros2 node list и journalctl / вывод в консоль
Неверные значения токаНеверная калибровка или параметры INA219Убедитесь, что setCalibration_16V_5A() соответствует вашей схеме

Диагностика I2C

# Поиск устройств на шине 1
i2cdetect -y 1

# Чтение регистра (пример: конфиг)
i2cget -y 1 0x43 0x00 w

# Тестовая запись (осторожно!)
i2cset -y 1 0x43 0x00 0x3995 w