Посты из серии: 8. Управление с телефона - ROS Control, узел GPS 7. Локализация робота: gmapping, AMCL, ориентиры на карте помещения 6. Одометрия с помощью колесных энкодеров, карты помещения, лидара.
5. Работаем в рвизе и беседке: хакро, новые датчики.
4. Создайте симуляцию робота с помощью редакторов rviz и беседки.
3. Ускориться, сменить камеру, исправить походку 2. Программное обеспечение 1. Утюг
Двигаемся к улыбке
Сборка «бургера» по схеме из прошлого.почта , перейдем к программному содержанию.
Поскольку мы собираем из готового проекта, логично предоставить указанную в нем инструкцию.
Они есть Здесь .
Все очень удобно и там можно скачать готовый образ из Raspbian Stretch+ROS+OpenCV и записать его на SD-карту для малины.
(ROS Kinetic, OpenCV 3.4.1. Да, есть и поновее, но иногда лучше взять и пойти, чем собирать всё самому из исходников).
Однако, несмотря на удобство, мне все же пришлось немного подкорректировать изображение.
Так как стали понятны некоторые неудобные детали исходного изображения:
- нет GUI (графического интерфейса).
Это не критично, особенно для ROS, но для езды по трассе нужно откалибровать камеру на самой малине, и посмотреть, как она (камера) передает цвета (об этом ниже);
- сборка OpenCV не выводит изображение на экран, даже если вы сами устанавливаете GUI. Видимо в проекте rosbots opencv был собран без этой опции.
- нет мелких костылей (VNC, текстовый редактор для записей, mc).
- Поэтому OpenCV был пересобран с поддержкой отображения изображений в GUI (собран openCV 3.4.3), установлен GUI и мелкие костыли.
Настроим сеть (wi-fi) и ROS-master на raspberry pi
.Настоятельно рекомендую для экспериментов использовать отдельный роутер с собственным Wi-Fi. Для этих целей можно просто создать точку доступа на телефоне.
Это связано с тем, что по Wi-Fi будет летать довольно много пакетов и желательно, чтобы они не тонули в общем трафике.
Загрузив образ на SD-карту Raspberry, приступим к настройке сети.
Первоначальные настройки сети следующие:
Содержится в /etc/dhcpcd.conf. Поэтому не обязательно подключать шланги к малинке, чтобы все поменять, а просто создать точку доступа с пафосным именем босс и паролем 1234554321. Адрес малины будет 192.168.43.174. Помимо ssh, по этому адресу можно также зайти через VNC: логин — pi, пароль — 123qweasdzxcV. Настроим мастер ROS Небольшая заметка для тех, кто не сталкивался с ROS (роботизированной операционной системой).interface wlan0 static ip_address=192.168.43.174/24 static routers=192.168.43.1 static domain_name_servers=192.168.43.1
Мастер ROS является посредником, через который различные узлы (узлы, сервисы и т. д.) обмениваются данными в ros. Если мастер ros не запущен или работает по неправильному адресу, узлы не увидят друг друга.
В нашей ROS-системе мастер запускается автоматически при загрузке ОС и все что от нас требуется — это указать IP-адрес для ROS-мастера в соответствующем системном файле.
Если вы не меняли перечисленные выше сетевые настройки, то вам не нужно ничего настраивать.
В противном случае отредактируйте bashrc: nano ~/.
bashrc
В самом конце файла поправьте IP-адреса (оба) под ваш случай: export ROS_MASTER_URI= http://192.168.43.174:11311
export ROS_HOSTNAME=192.168.43.174
Перезагрузить.
Теперь при запуске терминала на корзине вывод будет такой (или тот, который вы указали в настройках): For all slaves, "export ROS_MASTER_URI= http://192.168.43.174:11311 "
Это означает, что мастер ROS работает по указанному IP-адресу.
Управляем тележкой по Wi-Fi
Для начала давайте проверим, что наши узлы работают. В терминале: rosnode list
Вывод будет таким: /rosout /uno_serial_node Если ничего не выходит, проверьте, прописали ли вы ROS-master в настройках, как указано выше, подключили usb-шланг к ардуино и перезагрузились.
После проверки запустим 1-й узел, отвечающий за движение: rosrun rosbots_driver part2_cmr.py
*специальная команда ros запускает файл part2_cmr.py из пакета Python rosbots_driver.
Система сообщит, что узел работает:
Здесь вы можете видеть, что радиус колес и расстояние между ними определены.
Исправить эти значения, а также другие, связанные с движением, можно в файле robot.py по пути /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/examples/coursera_control_of_mobile_robots/part2/full/controller
поскольку сам part2_cmr.py не содержит этих параметров.
Откройте второй терминал и введите список ростопиков:
Здесь вы можете видеть, что появилась тема /part2_cmr/cmd_vel. В этом топике /part2_cmr «слушает» то, что ему говорят другие узлы и в зависимости от того, что они говорят, будет управлять движением.
Что именно «слушает», а не «говорит», можно понять с помощью команды.
rostopic info /part2_cmr/cmd_vel
Здесь видно, что /part2_cmr подписчик (подписался) на тему и слушает.
*Вы можете «сказать» что-то в теме самостоятельно, без узлов.
Например: rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: 1.0}'
повернуть левое колесо вперед rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: 0.0}'
остановить левое колесо rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: -1.0}'
Поворот назад с помощью колеса rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: -0.5}'
Медленнее поворачивайте левое колесо назад.
Синтаксис следующий: rostopic pub - желание высказаться в теме, -1 - единоразовое желание, /wheel_power_left - тема, в которой мы говорим, std_msgs/Float32 - язык (формат сообщения), '{data: -0.5} ' - то, что мы говорим.
Теперь запустим того, кто будет выступать в теме /part2_cmr/cmd_vel. Это будет узел отправки команд с клавиатуры.
Не закрывая предыдущий терминал с работающей нодой, запустим другой и введем: rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel
*Поскольку публикация по умолчанию находится в теме/cmd_vel, мы перенаправляем ее с помощью
/cmd_vel:=/part2_cmr/cmd_vel, чтобы сообщения отправлялись именно в /part2_cmr/cmd_vel.
Узел управления запустился и можно путешествовать, нажимая клавиши на клавиатуре:
Если вы не можете ехать или из-под колес раздается едва уловимый скрип, нужно увеличить скорость, нажав «w» в терминале при работающем узле.
То же самое (увеличить или уменьшить) можно сделать и со скоростью вращения – кнопкой «е».
Также важно находиться в терминале с работающим узлом, при переключении на другой терминал кнопки управления работать не будут. Кнопка «k» на терминале управления останавливает работу.
В отдельном терминале посмотрите тему /part2_cmr/cmd_vel:
Теперь в теме /part2_cmr/cmd_vel есть и говорящий, и слушатель.
Идем по линии на OpenCV
Прежде чем куда-либо отправиться, необходимо убедиться, что робот едет при управлении с клавиатуры.Здесь необходимо сделать важное замечание.
При управлении с клавиатуры в примере выше поворот влево должен соответствовать нажатию клавиши j, вправо l (латиница l), вперед i, назад (запятая).
Если в вашем случае это не так, то с вашей поездкой могут возникнуть проблемы.
Чтобы привести все в норму, нам нужно поменять пары проводов на ардуино в нашем бургере идущие от драйвера мотора к ножкам ардуино 4,5,6,7: поменять местами 4,5 на 6,7 или 4 и 5, 6 и 7 друг с другом в зависимости от того, куда повернутся колеса.
Также это можно сделать программно, подправив код для ардуино по пути - /home/pi/gitspace/rosbots_driver/platformio/rosbots_firmware/examples/motor_driver/src/main.cpp #define M_LEFT_PWM 6
#define M_LEFT_FR 7
#define M_RIGHT_PWM 5
#define M_RIGHT_FR 4
и повторно загрузим его в arduino командой: upload_firmware ~/gitspace/rosbots_driver/platformio/rosbots_firmware/examples/motor_driver
Давайте поработаем с цветами
Наш опыт работы в саду будет заключаться в определении линии на полу, по которой будет ходить робот, и определении ее цвета.
По умолчанию робот его не видит. В качестве линии можно использовать либо скотч (желтый), либо изоленту, либо что-то другое характерного цвета и достаточно широкое.
*Прозрачная лента вряд ли подойдет, потому что.
ее будет сложно отличить от фона.
Зайдем в папку и запустим скрипт: cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver
python bgr-to-hsv.py
*Внимание! Если вы используете оригинальный образ от rosbots, а не мой, то этой программы там нет.
Откроется два окна:
Вот цветовые диапазоны в HSV. Что такое hsv и почему не rgb, погуглите сами.
h1,s1,v1 - нижний и h2,s2,v2 - соответственно верхний диапазон.
Теперь нужно разметить изолентой (возможно, не изолентой, а скотчем) линию на полу, перемещая ползунки в окне.
В окне результатов должна остаться только линия изоленты:
Линия изоленты необычно белая, все остальное черное.
Этот результат необходим.
Запишем и запомним номера диапазонов HSV. Мой случай 56 155,40 и 136 255 255. Диапазоны HSV будут различаться в зависимости от условий освещения рядом с камерой робота.
Давайте закроем окна, введя ctrl+c в терминале, и добавим диапазоны HSV в файл Follow_line_step_hsv.py: cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver
nano follow_line_step_hsv.py
В строках: lower_yellow = np.array([21,80,160])
upper_yellow = np.array([255,255,255])
Поставим цифры наших диапазонов HSV. Время ездить по линии
Запускаем моторный узел в терминале 1: rosrun rosbots_driver part2_cmr.py
Запустите узел камеры во втором терминале: sudo modprobe bcm2835-v4l2
roslaunch usb_cam usb_cam-test.launch
Запускаем узел opencv в третьем терминале: cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver
python follow_line_step_hsv.py
Если все прошло успешно, робот будет двигаться вдоль линии и появится дополнительное окно:
В этом окне изолента будет отмечена красным кружком.
Общий смысл кода — выбрать цветовой сегмент на определенном расстоянии от камеры, нарисовать красный круг и ехать к этому кругу, стараясь удерживать его в центре.
Наконец о важном - о котах и улыбках.
Поскольку наша цель — перейти к коту или улыбающемуся человеку, нам придется использовать в нашем коде что-то более сложное.
Еще нам понадобятся коты и улыбчивые люди.
Со вторым сейчас сложнее: мало кто улыбается в это трудное, тревожное время.
Итак, начнем с кошек.
Для экспериментов подойдут фотографии кошек спереди.
Запустим узел камеры в 1-м терминале: cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver
python pi_camera_driver.py
Во 2-м терминале узел-мотор: rosrun rosbots_driver part2_cmr.py
В 3-м терминале узел поиска кошек: cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver
python follow_cat2.py
Тележка постепенно будет двигаться в сторону кота:
Сейчас нам нужен волонтер, умеющий улыбаться.
Возьмем портрет малоизвестного общественного деятеля из маленькой страны.
В третьем терминале можно закрыть узел поиска кота — ctrl+c и вместо него начать поиск улыбки на лице малоизвестного публичного деятеля: python follow_smile.py
Тележке придется медленно, недоверчиво двигаться навстречу улыбке малоизвестного человека:
Как многие, возможно, уже догадались, скрипты, которые мы запускали, используют каскады Хаара.
По тому же принципу, что и при движении по линии, выбирается квадрат нужной площади и программа пытается удержать его в центре, перемещая робота.
К сожалению, производительность Raspberry 3b оставляет желать лучшего, несмотря на настройки камеры 320х240 и 15 кадров в секунду.
Задержки становятся заметными по мере увеличения времени.
Не каждая кошка с этим справится.
Как это можно улучшить? Попробуйте пересобрать оптимизированный opencv, как рекомендует Адриан ( https://www.pyimagesearch.com/2017/10/09/optimizing-opencv-on-the-raspberry-pi/ )? Использовать внешние ресурсы ПК для обработки изображений? Попробуйте не сжимать изображения в формате JPEG, отправляемые в процессор Haar? И еще один большой минус – кошки должны быть большими и на виду.
Расстояние 15 см на листе А4. При удалении от камеры кот уже неузнаваем и неуязвим.
На малиновую камеру поставить монокль с 8-кратным увеличением?
P.S.: Если у вас есть время поэкспериментировать с изображением, которое приведено в статье, то вы также можете путешествовать по различным частям тела, соответственно, запустив вместо этого кошачий узел: python follow_fullbody.py
python follow_upperbody.py
python follow_lowerbody.py
лицо или глаз: python follow_face.py
python follow_right_eye.py
Если вас интересует, как плавно отойти, чтобы робот не пролил чай, а также как им управлять не с самой малины, пишите.
Теги: #Сделай сам или Сделай сам #Разработка Raspberry Pi #Разработка робототехники #Робототехника #ros #Разработка Arduino #raspberry pi 3 #домашняя прислуга
-
Внедрение Dynamics Gp Для Розничной Торговли
19 Oct, 24 -
Статистика Телефонных Платежей
19 Oct, 24