Проект построен на основе другого довольно известного в своих кругах проекта - 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р.
- кусок фанеры, паркета - ? натирать.
*Стоимость можно снизить, заменив Teenzy на arduino mega 2560 (600 руб.
), а также заменив лидар на kinect v.1 (1000 руб.
):
Однако необходимо учитывать, что первый кинект имеет минимальную зону видимости (слепую зону) 0,5 м, что может негативно повлиять на навигацию в стесненных условиях и он довольно громоздкий.
Лидар имеет слепую зону менее 0,2 м.
kinect v.2 не подойдет к Raspberry 3b (у него нет USB 3.0).
Arduino mega уступает Teenzy по размерам (и некоторым характеристикам), кроме того, придется немного переработать код.
В целом «дизайн» выглядит так:
Вариант с кинектом:
Красоты здесь, конечно, нет, но речь не об этом.
Помимо самого робота крайне желательно иметь внешний ПК, на котором будут запускаться графические оболочки для визуализации действий робота (рвиз, беседка).
Сборка робота
Подробно описано на сайте проекта - связь , поэтому остановимся на моментах, вызывающих затруднения.Во-первых, нужно учитывать, что энкодеры на колесной паре питаются от напряжения 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 будет равен числовому значению, которое отобразится на экране после вращения колеса:
*PPR = абс(RECENT_COUNT – INITIAL_COUNT).
Это означает CPR = 1364. Вам также необходимо установить WHEEL_DIAMETER и LR_WHEELS_DISTANCE в метрах.
Причем LR_WHEELS_DISTANCE — это расстояние между центральными осями колес, а не от края до края.
Остальные показатели можно игнорировать, если робот двухколесный, дифференциальный (не омни).
Третий момент, который может вызвать затруднения – это калибровка иму .
Для этого, следуя инструкции, необходимо зафиксировать робота в определенных положениях.
Подсказки будут в коде при выполнении скрипта rosrun imu_calib do_calib :
после завершения будет сгенерирован 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:
То есть все происходит «на лету» и в это время прошивка 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:
Одна ячейка в рвизе равна 1 м, поэтому желательно, чтобы этот метр робот прошел как в визуальном редакторе, так и в реальной жизни.
Кроме того, пройденное расстояние отображается на индикаторе w:
Оно также должно стремиться к 1 м.
То же самое касается и углов поворота робота:
*В рвизе и в реальной жизни робот должен поворачиваться под одинаковыми углами.
Одометрия по лидару определяется аналогичным образом — связь .
Расстояние от лидара до ближайшей стены как в живую, так и в рвиз должно быть одинаковым.
ТФ
В РОС особое значение придается преобразованиям – тф.В общих чертах это понятие описывает соотношение объектов друг относительно друга в пространстве.
Чтобы объекты не болтались в воздухе, и программа понимала, как они представлены относительно друг друга, необходимо обратить внимание на настройку 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 "/>
В рвизе это место можно наблюдать визуально:
Пока мы недалеко от лидара, давайте настроим его частоту, чтобы он выдавал больше точек (по умолчанию дает 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д карты помещения
На сайте проекта предлагается построить карту помещения, запустив ее в двух терминалах: roslaunch linorobot bringup.launch
roslaunch linorobot slam.launch
Однако практика показала, что слэм, который идет в комплекте с проектом по умолчанию, отказывается работать в режиме работы лидара 8к:
а в режиме 4к карты не очень удачны, сильно шумят. Поэтому лучше использовать другой слэм – гектор-слэм.
Как установить указано Здесь .
После установки процедура построения карты будет такая же, но вместо roslaunch linorobot slam.launch запустим roslaunch my_hector_mapping my_launch.launch
Карты получаются чище, но их лучше потом доработать в графическом редакторе, удалив лишнее, особенно если при построении карты лидар столкнулся с зеркалами:
Не забудьте сохранить карту помещения: rosrun map_server map_saver -f my-map
*Карты выглядят лучше в приятных сумерках, это позволит вам максимально эффективно использовать бюджетный лидар.
А что насчет производительности?
raspberry pi 3b+ с работающими узлами навигации/управления (версия для робота с kinect):Нагрузка не такая уж серьезная, но учитывая, что у робота нет рабочей камеры и других дополнительных датчиков, можно сказать, что ее необходимо учитывать.
Продолжение следует. Теги: #Сделай сам или сделай сам #Разработка Raspberry Pi #Разработка робототехники #Робототехника #ros #raspberry pi 3 #linorobot
-
Подставка Для Плоскопанельного Монитора Dell
19 Oct, 24 -
Как Тайно Делать Снимки Экрана На Mac
19 Oct, 24 -
Ипохондрия
19 Oct, 24 -
Park.nic.ru: Участие В Закрытом Тестировании
19 Oct, 24 -
Qaкачество Связи – 5 Октября, Онлайн
19 Oct, 24 -
Медо В Регионах
19 Oct, 24 -
Убогие И Грязные Комментарии, Темы И Т.д.
19 Oct, 24