Робот-Тележка На Рос. Часть 2. Программное Обеспечение

Посты из серии: 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, приступим к настройке сети.

Первоначальные настройки сети следующие:

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   

interface wlan0 static ip_address=192.168.43.174/24 static routers=192.168.43.1 static domain_name_servers=192.168.43.1

Содержится в /etc/dhcpcd.conf. Поэтому не обязательно подключать шланги к малинке, чтобы все поменять, а просто создать точку доступа с пафосным именем босс и паролем 1234554321. Адрес малины будет 192.168.43.174. Помимо ssh, по этому адресу можно также зайти через VNC: логин — pi, пароль — 123qweasdzxcV. Настроим мастер ROS Небольшая заметка для тех, кто не сталкивался с ROS (роботизированной операционной системой).

Мастер 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. Система сообщит, что узел работает:

Робот-тележка на РОС.
</p><p>
 Часть 2. Программное обеспечение

Здесь вы можете видеть, что радиус колес и расстояние между ними определены.

Исправить эти значения, а также другие, связанные с движением, можно в файле robot.py по пути

/home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/examples/coursera_control_of_mobile_robots/part2/full/controller

поскольку сам part2_cmr.py не содержит этих параметров.

Откройте второй терминал и введите список ростопиков:

Робот-тележка на РОС.
</p><p>
 Часть 2. Программное обеспечение

Здесь вы можете видеть, что появилась тема /part2_cmr/cmd_vel. В этом топике /part2_cmr «слушает» то, что ему говорят другие узлы и в зависимости от того, что они говорят, будет управлять движением.

Что именно «слушает», а не «говорит», можно понять с помощью команды.



rostopic info /part2_cmr/cmd_vel



Робот-тележка на РОС.
</p><p>
 Часть 2. Программное обеспечение

Здесь видно, что /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. Узел управления запустился и можно путешествовать, нажимая клавиши на клавиатуре:

Робот-тележка на РОС.
</p><p>
 Часть 2. Программное обеспечение

Если вы не можете ехать или из-под колес раздается едва уловимый скрип, нужно увеличить скорость, нажав «w» в терминале при работающем узле.

То же самое (увеличить или уменьшить) можно сделать и со скоростью вращения – кнопкой «е».

Также важно находиться в терминале с работающим узлом, при переключении на другой терминал кнопки управления работать не будут. Кнопка «k» на терминале управления останавливает работу.

В отдельном терминале посмотрите тему /part2_cmr/cmd_vel:

Робот-тележка на РОС.
</p><p>
 Часть 2. Программное обеспечение

Теперь в теме /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, а не мой, то этой программы там нет. Откроется два окна:

Робот-тележка на РОС.
</p><p>
 Часть 2. Программное обеспечение

Вот цветовые диапазоны в HSV. Что такое hsv и почему не rgb, погуглите сами.

h1,s1,v1 - нижний и h2,s2,v2 - соответственно верхний диапазон.

Теперь нужно разметить изолентой (возможно, не изолентой, а скотчем) линию на полу, перемещая ползунки в окне.

В окне результатов должна остаться только линия изоленты:

Робот-тележка на РОС.
</p><p>
 Часть 2. Программное обеспечение

Линия изоленты необычно белая, все остальное черное.

Этот результат необходим.

Запишем и запомним номера диапазонов 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

Если все прошло успешно, робот будет двигаться вдоль линии и появится дополнительное окно:

Робот-тележка на РОС.
</p><p>
 Часть 2. Программное обеспечение

В этом окне изолента будет отмечена красным кружком.

Общий смысл кода — выбрать цветовой сегмент на определенном расстоянии от камеры, нарисовать красный круг и ехать к этому кругу, стараясь удерживать его в центре.



Наконец о важном - о котах и улыбках.

Поскольку наша цель — перейти к коту или улыбающемуся человеку, нам придется использовать в нашем коде что-то более сложное.

Еще нам понадобятся коты и улыбчивые люди.

Со вторым сейчас сложнее: мало кто улыбается в это трудное, тревожное время.

Итак, начнем с кошек.

Для экспериментов подойдут фотографии кошек спереди.

Запустим узел камеры в 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

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

Робот-тележка на РОС.
</p><p>
 Часть 2. Программное обеспечение

Сейчас нам нужен волонтер, умеющий улыбаться.

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

В третьем терминале можно закрыть узел поиска кота — ctrl+c и вместо него начать поиск улыбки на лице малоизвестного публичного деятеля:

python follow_smile.py

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

Робот-тележка на РОС.
</p><p>
 Часть 2. Программное обеспечение

Как многие, возможно, уже догадались, скрипты, которые мы запускали, используют каскады Хаара.

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

К сожалению, производительность 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 #домашняя прислуга

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