Папка sdgazelle - ROS package для управления автомобилем.
Для запуска необходимо или скопировать папку sdgazelle в ~/catkin_ws/src или создать символическую ссылку командой
sudo ln -s /media/nvidia/data/repositories/robocross/sdgazelle ~/catkin_ws/src/sdgazelle
нужно прописать правильно пути, первая папка - что, вторая - куда.
Перед каждым запуском
cd ~/catkin_ws
source devel/setup.bash
source venv/bin/activate
Отображение текущего состояния робота в web-среде cherrypy (http://localhost:8800/static):
- Глобальная карта openstreetmap и положение на этой карте (готово +-): subscribe ROS topic "gpspos"
- Путь (начальная, конечная и промежуточные точки) (готово +-): список GPS координат из файла gpspath.csv
- Текущая скорость (готово): subscribe ROS topic "gpspos", "carstate"
- Текущие обороты двигателя: subscribe ROS topic "carstate"
- Текущая передача (1, 0, -1): subscribe ROS topic "carstate"
- Текущее значение педали газа (1, 0, -1): subscribe ROS topic "carstate"
- Текущее положение руля (вектор направления на карте): subscribe ROS topic "carstate"
- Локальная карта (линии дорожной разметки, распознанный знак, сигнал светофора, границы отбойников, препятствия-бочки): subscribe ROS topic "roadlane", "roadsign", "lightswitch", "obstaclepos", "roadfrontier"
Определение положения автомобиля по GPS. Фильтрация данных publisher ROS topic "gpspos": текущая позиция автмобиля, после калмановской фильтрации, а также скорость в формате "lat: {}; lon: {}; klat: {}; klon: {}; velocity: {}". lat, lon - значения координат без фильтрации, klat, klon - значения координат после фильтрации. Перед запуском нужно разрешить доступ скрипту к серийному порту, например, так "sudo chmod 666 /dev/ttyS11".
Публикация состояния автомобиля, прием сигналов об управлении и передача этих сигналов в управляющие контроллеры
- публикация состояния автомобиля: publish ROS topic "carstate" в формате: "rpm:{0-6000};transmission:{-1,0,1};throttle:{0-255?};velocity:{0-160};wheel:{-100?-100?}". Знаками вопроса помечены значения, которые требуют уточнения
- прием сигналов для управления автомобилем: subscribe ROS topic "carcontrol": "velocity:{0:15};transmission:{-1,0,1};wheel:{-100? - 100?}" контроль и проверка значений, исходя из физических возможностей автомобиля и передача сигналов в контроллеры. Необходимо прописать логику контроля значений.
- хранение текущих и предыдущих значений параметров автомобиля: rpm:{0-6000}; transmission:{-1,0,1}; throttle:{0-255?}; velocity:{0-160}; wheel:{-100?-100?}
- Контроль безопасности на основе датчиков:
- Обработка сигналов кнопки стопа
- Начальная инициализация автомобиля в режиме автономного управления и ручного управления
Распознавание объектов дороги нейронными сетями
- публикация сообщений о распознавании дорожных знаков: publisher ROS topic "roadsign" со значениями: "time:{время};position:{lon,lat};type:{stop, forward, left, right, forwardleft, forwardright и др}". Для получения GPS координат нужно слушать топик "gpspos" для получения отфильтрованных значений klat, klon.
- публикация сообщений о распознавании линий дорожной разметки: publisher ROS topic "roadlane" со значениями: "time:{время};position:{lon,lat};angle:{-180 - 180}". Angle - угол отклонения продольной горизонтальной оси автомобиля от направления, заданного двумя точками: центр автомобиля и точка на горизонте, где встречаются линии дорожной разметки.
- публикация сообщений о распознавании сигналов светофора: publisher ROS topic "lightswitch" со значениями: "time:{время};position:{lon,lat};value:{red, green, yellow}"
- публикация необходимых сообщений для управления автомобилем (Канин, Волков): publisher ROS topic "carcontrol". Нужно решить задачу в динамике: расчет изменения поворота руля для движения вдоль линий дорожной разметки.
Распознавание препятствий, отбойников, ограничивающих движение
- публикация 2D локальной карты: publisher ROS topic "localmap":
- включается после публикации в topic "carcmd" значения параметра cmd "start"
- двумерный массив значений, в котором разными типами значений помечены: позиция автомобиля (координаты, ориентация в пространстве), позиция границ дороги, заданная отбойниками, препятствия (бочки)
- целевая точка на границе карты. Определяется как пересечение с границей локальной карты линии, заданной двумя точками: автомобиль и целевая точка на глобальной карте, до которой нужно доехать. Для этого нужно определить соответствие положения локальной карты и GPS координатам (позиция и ориентация).
- размер карты соответствует области видимости стереокамеры.
- публикация необходимых сообщений для управления автомобилем (Акимов, Волков): publisher ROS topic "carcontrol". Нужно решить задачу в динамике: расчет изменения поворота руля для объезда препятствия в текущей локальной карте с учетом того, что на локальной карте отображаются зашумленные данные.
Управление перемещением автомобиля по глобальной карте.
- Хранение координат ключевых точек: старт, разворот, финиш.
- Мониторинг положения автомобиля, определение действия и публикация в ROS topic "carcmd" соответствующих действиям сообщений для старта, разворота, остановки автомобиля в формате "time:{time};lat:{latitude}; lon:{longitude};cmd:{init,start,stop,turn,finish}".
- gpsreader.py (Святов) - класс, позволяющий считывать значения из GPS сенсора
- rpmreader.py (Святов, Волков) - простой скрипт, который позволяет считывать показания оборотов двигателя по OBD протоколу
- sdgazelle.launch - файл для запуска ROS nodes. Каждому разработчику лучше создать свой файл, а не править чужие. При переносе решения нужно подправить пути.
- Инструкция по установке opencv на ubuntu 16.04: https://www.pyimagesearch.com/2016/10/24/ubuntu-16-04-how-to-install-opencv/
- Инструкция по установке opencv на ubuntu 18.04: https://andreyex.ru/ubuntu/kak-ustanovit-opencv-na-ubuntu-18-04/
- Перед запуском нужно разрешить доступ на все устройства, которые подключаются по USB: "sudo chmod 777 /dev/ttyACM0" (GPS) и "sudo chmod 777 /dev/ttyUSB0" (OBD)
- При запуске C++ компонент может появиться ошибка "Couldn't find an AF_INET address for []". Для ее устранения нужно в ~/.bashrc прописать в конце
machine_ip=(
hostname -I
) export ROS_IP=${machine_ip[0]} =======