Робот-Тележка 2.0. Часть 1. Автономная Навигация Домашнего Робота На Базе Ros

Проект построен на основе другого довольно известного в своих кругах проекта - linorobot (linorobot.org), и использованы доступные обычному человеку компоненты.

Были поставлены цели: добиться автономного передвижения робота в домашних условиях с использованием недорогих комплектующих, оценить работоспособность мини-ПК для заявленных целей, настроить навигационный стек для перемещения в узких пространствах хрущевской эпохи.

здания.

Статьи из серии: Робот-тележка 2.0. Часть 3. Внутри навигационного стека ROS маленький мажордом Робот-тележка 2.0. Часть 2. Управление в рвизе и без.

Элементы красоты в рвизе Робот-тележка 2.0. Часть 1. Автономная навигация домашнего робота на базе ROS



Железо

Перечень компонентов в сухом остатке выглядит следующим образом:
  • малина пи 3б — 2800 руб.

    ;

  • лидар рплидар а1 – 7500 руб.

    ;

  • силовые мосты л298н -2 шт. - 400 руб.

    ;

  • колесная пара с энкодерами типа А и Б - 2000 руб.

    (210 об/мин - связь )

  • подростковый 3.2 — 2100 руб.

    ;

  • иму 9250 (либо 9150, либо 6050) – 240 рублей;
  • павербанк на 10000мГн - 1500 руб.

  • 3 батарейки 18650 и держатель - 600 руб.

  • Понижающий преобразователь DC-DC с 5В на 3,3В - 20р.

  • кусок фанеры, паркета - ? натирать.

Итого: 17160 руб.

*Стоимость можно снизить, заменив Teenzy на arduino mega 2560 (600 руб.

), а также заменив лидар на kinect v.1 (1000 руб.

):

Робот-тележка 2.0. Часть 1. Автономная навигация домашнего робота на базе ROS

Однако необходимо учитывать, что первый кинект имеет минимальную зону видимости (слепую зону) 0,5 м, что может негативно повлиять на навигацию в стесненных условиях и он довольно громоздкий.

Лидар имеет слепую зону менее 0,2 м.

kinect v.2 не подойдет к Raspberry 3b (у него нет USB 3.0).

Arduino mega уступает Teenzy по размерам (и некоторым характеристикам), кроме того, придется немного переработать код. В целом «дизайн» выглядит так:

Робот-тележка 2.0. Часть 1. Автономная навигация домашнего робота на базе ROS



Робот-тележка 2.0. Часть 1. Автономная навигация домашнего робота на базе ROS

Вариант с кинектом:

Робот-тележка 2.0. Часть 1. Автономная навигация домашнего робота на базе ROS

Красоты здесь, конечно, нет, но речь не об этом.

Помимо самого робота крайне желательно иметь внешний ПК, на котором будут запускаться графические оболочки для визуализации действий робота (рвиз, беседка).



Сборка робота

Подробно описано на сайте проекта - связь , поэтому остановимся на моментах, вызывающих затруднения.

Во-первых, нужно учитывать, что энкодеры на колесной паре питаются от напряжения 3,3В и при подаче 5В прекрасно выходят из строя.

Скрипт установки линоробота успешно устанавливается на ubuntu 16.04, ubuntu 18.04. Версии ROS: кинетическая ROS или мелодичная ROS. На Raspberry 3b вам сначала придется создать файл подкачки.

Основной код, загруженный в Teenzy, находится по пути:

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   

roscd linorobot/teensy/firmware/lib/config nano lino_base_config.h

И заполняет его командой:

roscd linorobot/teensy/firmware platformio run --target upload

Вышеуказанные цепочки команд будут использоваться довольно часто, поэтому имеет смысл добавить их в псевдонимы.

Одной из сложностей при сборке робота может стать правильное соотношение соединяемых контактов идущих от l298n к teenzy. Несмотря на предельно понятную схему подключения, колеса могут вести себя по-разному и придется экспериментировать, подбирая правильное соотношение контактов в коде.

В моем случае получилось так:

/// ENCODER PINS #define MOTOR1_ENCODER_A 14 #define MOTOR1_ENCODER_B 15 #define MOTOR2_ENCODER_A 11 #define MOTOR2_ENCODER_B 12 //MOTOR PINS #ifdef USE_L298_DRIVER #define MOTOR_DRIVER L298 #define MOTOR1_PWM 21 #define MOTOR1_IN_A 1 #define MOTOR1_IN_B 20 #define MOTOR2_PWM 5 #define MOTOR2_IN_A 8 #define MOTOR2_IN_B 6

Второй момент — записать спецификацию колес робота:

//define your robot' specs here #define MAX_RPM 210 // motor's maximum RPM #define COUNTS_PER_REV 1365 // wheel encoder's no of ticks per rev #define WHEEL_DIAMETER 0.065 // wheel's diameter in meters #define PWM_BITS 8 // PWM Resolution of the microcontroller #define LR_WHEELS_DISTANCE 0.235 // distance between left and right wheels #define FR_WHEELS_DISTANCE 0.30 // distance between front and rear wheels. Ignore this if you're on 2WD/ACKERMANN #define MAX_STEERING_ANGLE 0.415 // max steering angle. This only applies to Ackermann st

Число оборотов в минуту можно найти в спецификации колеса, но CPR (COUNTS_PER_REV) — это расчетное значение.

CPR = PPR х 4. PPR наших колес — 341. *PPR можно просмотреть в спецификации или запустить код на роботе.

roslaunch линоробот минимальный.

запуск и поверните колесо на 360 градусов.

PPR будет равен числовому значению, которое отобразится на экране после вращения колеса:

Робот-тележка 2.0. Часть 1. Автономная навигация домашнего робота на базе ROS

*PPR = абс(RECENT_COUNT – INITIAL_COUNT).

Это означает CPR = 1364. Вам также необходимо установить WHEEL_DIAMETER и LR_WHEELS_DISTANCE в метрах.

Причем LR_WHEELS_DISTANCE — это расстояние между центральными осями колес, а не от края до края.

Остальные показатели можно игнорировать, если робот двухколесный, дифференциальный (не омни).

Третий момент, который может вызвать затруднения – это калибровка иму .

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

Подсказки будут в коде при выполнении скрипта rosrun imu_calib do_calib :

Робот-тележка 2.0. Часть 1. Автономная навигация домашнего робота на базе ROS

после завершения будет сгенерирован imu_calib.yaml с настройками.

Лучше провести калибровку, несмотря на то, что есть дефолтный файл с настройками imu. *Кроме того, выяснилось, что калибровка imu может влиять на направления движения робота через телеоп (влево вместо правого и наоборот, при этом движение вперед-назад было правильным).

Ситуацию не удалось решить перестановкой пинов в коде.

Сам imu был установлен и откалиброван в перевернутом виде, потому что.

прикреплен к задней части базы робота.

Его (иму) дальнейшее перелистывание без перекалибровки решило проблему.

Четвертый пункт – калибровка пид .

На сайте проекта подробно описана процедура реализации корректировки - связь .

Однако новичку будет сложно разобраться, что это такое и как с этим работать.

В общих чертах, пид-регулирование нужно для того, чтобы робот двигался равномерно, без рывков/резких торможений.

За это отвечают три параметра: p,i,d. Их значения содержатся в основном коде, загруженном в Teenzy:

#define K_P 2.0 // P constant angle #define K_I 0.3 // I constant #define K_D 0.1 // D constant

Вы можете поэкспериментировать с ними, запустив на роботе:

roslaunch linorobot minimal.launch

Далее на внешнем ПК в трёх разных терминалах:

rosrun lino_pid pid_configure rosrun teleop_twist_keyboard teleop_twist_keyboard.py rqt

Перемещая ползунки p,d,i в терминале rqt, а затем управляя роботом в терминале teleop_twist_keyboard, можно добиться желаемых результатов без необходимости каждый раз загружать код с новыми параметрами pid в Teenzy:

Робот-тележка 2.0. Часть 1. Автономная навигация домашнего робота на базе ROS

То есть все происходит «на лету» и в это время прошивка Teenzy может содержать совершенно другие значения.

*На графики полагаться не придется, потому что.

визуально будет понятно, КАК робот ездит. Рекомендуется начать с установки значений p=1,0, d=0,1, i=0,1. Для нашего случая значения следующие (получены опытным путем) p=2,0, i=0,3, d=0,1. Далее эти значения необходимо задать в коде и загрузить в Teenzy. Вам также необходимо не забыть установить в коде (DEBUG 0 вместо DEBUG 1):

#define DEBUG 0



Одометрия

Для ориентации робота и последующей навигации используются данные лидара, imu и энкодера колес.

Если калибровка imu выполнена правильно, лидар установлен правильно и значения энкодера правильные, то проблем с одометрией быть не должно.

Для проверки правильности одометрии нужно немного покататься на роботе через телеоп и посмотреть значения в теме одом, об этом написано на странице проекта - связь .

А также посмотрите в визуальной оболочке rviz:

Робот-тележка 2.0. Часть 1. Автономная навигация домашнего робота на базе ROS

Одна ячейка в рвизе равна 1 м, поэтому желательно, чтобы этот метр робот прошел как в визуальном редакторе, так и в реальной жизни.

Кроме того, пройденное расстояние отображается на индикаторе w:

Робот-тележка 2.0. Часть 1. Автономная навигация домашнего робота на базе ROS

Оно также должно стремиться к 1 м.

То же самое касается и углов поворота робота:

Робот-тележка 2.0. Часть 1. Автономная навигация домашнего робота на базе ROS

*В рвизе и в реальной жизни робот должен поворачиваться под одинаковыми углами.

Одометрия по лидару определяется аналогичным образом — связь .

Расстояние от лидара до ближайшей стены как в живую, так и в рвиз должно быть одинаковым.



ТФ

В РОС особое значение придается преобразованиям – тф.

В общих чертах это понятие описывает соотношение объектов друг относительно друга в пространстве.

Чтобы объекты не болтались в воздухе, и программа понимала, как они представлены относительно друг друга, необходимо обратить внимание на настройку tf. В проекте все соединения тф относительно друг друга уже настроены и вам нужно только подкорректировать показатели, например указать, как расположен лидар.

Это необходимо для того, чтобы робот понял, что препятствие возникло не непосредственно перед ним, а перед лидаром, который находится на определенном расстоянии от центра робота.

Перейдем в соответствующий каталог:

roscd linorobot/launch nano bringup.launch

Само основание находится на расстоянии 0,065 м от пола:

<node pkg="tf_ros" type="static_transform_publisher" name="base_footprint_to_base_link" args="0 0 0.065 0 0 0 /base_footprint /base_link "/>

В laser.launch нужно задать расположение лидара относительно центра базы робота:

roscd linorobot/launch/include nano laser.launch

В моем случае лидар смещается по оси x: -0,08, y: 0,04 и «поднимается» над базой (ось z): 0,08 м:

<node pkg="tf2_ros" type="static_transform_publisher" name="base_link_to_laser" args="-0.08 0.04 0.08 0 0 0 /base_link /laser "/>

В рвизе это место можно наблюдать визуально:

Робот-тележка 2.0. Часть 1. Автономная навигация домашнего робота на базе ROS

Пока мы недалеко от лидара, давайте настроим его частоту, чтобы он выдавал больше точек (по умолчанию дает 4к), это поможет при построении карты:

cd linorobot/launch/include/lidar nano rplidar.launch

Добавим параметр:

<param name="scan_mode" type="string" value="Boost"/>

и изменить

<param name="angle_compensate" type="bool" value="false"/>

Теперь 8к в нашем распоряжении:

Робот-тележка 2.0. Часть 1. Автономная навигация домашнего робота на базе ROS

Также имеет значение физическое расположение лидара на роботе:

Робот-тележка 2.0. Часть 1. Автономная навигация домашнего робота на базе ROS



Построение 2д карты помещения

На сайте проекта предлагается построить карту помещения, запустив ее в двух терминалах:

roslaunch linorobot bringup.launch roslaunch linorobot slam.launch

Однако практика показала, что слэм, который идет в комплекте с проектом по умолчанию, отказывается работать в режиме работы лидара 8к:

Робот-тележка 2.0. Часть 1. Автономная навигация домашнего робота на базе ROS

а в режиме 4к карты не очень удачны, сильно шумят. Поэтому лучше использовать другой слэм – гектор-слэм.

Как установить указано Здесь .

После установки процедура построения карты будет такая же, но вместо roslaunch linorobot slam.launch запустим roslaunch my_hector_mapping my_launch.launch Карты получаются чище, но их лучше потом доработать в графическом редакторе, удалив лишнее, особенно если при построении карты лидар столкнулся с зеркалами:

Робот-тележка 2.0. Часть 1. Автономная навигация домашнего робота на базе ROS

Не забудьте сохранить карту помещения:

rosrun map_server map_saver -f my-map

*Карты выглядят лучше в приятных сумерках, это позволит вам максимально эффективно использовать бюджетный лидар.



А что насчет производительности?

raspberry pi 3b+ с работающими узлами навигации/управления (версия для робота с kinect):

Робот-тележка 2.0. Часть 1. Автономная навигация домашнего робота на базе ROS

Нагрузка не такая уж серьезная, но учитывая, что у робота нет рабочей камеры и других дополнительных датчиков, можно сказать, что ее необходимо учитывать.

Продолжение следует. Теги: #Сделай сам или сделай сам #Разработка Raspberry Pi #Разработка робототехники #Робототехника #ros #raspberry pi 3 #linorobot

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.