Перейти к основному содержимому
Версия: 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