Симулятор роботов позволит проверить математическую модель и алгоритм перед тем как приступать к изготовлению робота. V-REP компании Coppelia Robotics - один из самых совершенных симуляторов в настоящее время. Программный комплекс является кроссплатформенным и бесплатным для использования в образовательных целях. Симулятор состоит из физического и графического движка, что позволяет достаточно комфортно работать с программой.
На скорую руку я отметил важнейшие элементы в интерфейсе V-REP:
Остальное можно узнать из приведенных выше ссылок.
Нашей целью будет являться моделирование двухколесного робота. В каталоге готовых моделей есть робот такого типа, он называется Pioneer 3dx. Робот вполне реальный, видео с ним можно посмотреть на youtube:
Сейчас нужно будет найти его в браузере моделей и перетащить на сцену. Повторюсь,что робот полностью функционален и если нажать на кнопку "старт" он поедет. И сразу упадет доехав до конца сцены. Нажав на "стоп", сцена вернется в исходное состояние. Что бы он не падал, нужно в браузере моделей найти каталог "инфраструктура", там будет вложенный каталог "стены/walls". Подходящими стенами следует обнести сцену по периметру, чтобы робот перестал сваливаться. После этого можно еще раз нажать "старт". В этот раз роботу будет кружить в замкнутом пространстве, огибая препятствия. Примерно так:
Уход от препятствий вроде бы выглядит убедительно. Но когда я экспериментировал с подобным роботом, я заметил что самое трудным для обнаружения ультразвуковым сенсором, являются различные мелкогабаритные предметы: ножки столов и стульев. Если на сцену добавить подходящую фурнитуру, то можно будет остановить и этого монстра с 16-ю ультразвуковыми сенсорами:
В конце видео ясно видно как робот "проглядев" препятствие, упирается в него и просто тупо буксует. Собственно, насмотревшись таких сцен со своей первой поделкой, мне и пришла в голову идея размещать сенсоры "крестом", чтобы не было слепых зон.
Теперь стоит взглянуть на робота повнимательнее. В окне "иерархия объектов" представлены все объекты из которых состоит модель робота:
Сенсоры расстояния здесь называются proximity sensors. Произведя двойной щелчок по одному из сенсоров, можно посмотреть на его параметры.
Из иерархии объектов можно открыть так же управляющий моделью робота скрипт:
Скрипт написан на Lua и реализует один из вариантов машинки Брайтенберга
-- This is a very simple EXAMPLE navigation program, which avoids obstacles using the Braitenberg algorithm if (sim_call_type==sim_childscriptcall_initialization) then usensors={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} for i=1,16,1 do usensors[i]=simGetObjectHandle("Pioneer_p3dx_ultrasonicSensor"..i) end motorLeft=simGetObjectHandle("Pioneer_p3dx_leftMotor") motorRight=simGetObjectHandle("Pioneer_p3dx_rightMotor") noDetectionDist=0.5 maxDetectionDist=0.2 detect={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} braitenbergL={-0.2,-0.4,-0.6,-0.8,-1,-1.2,-1.4,-1.6, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0} braitenbergR={-1.6,-1.4,-1.2,-1,-0.8,-0.6,-0.4,-0.2, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0} v0=2 end if (sim_call_type==sim_childscriptcall_cleanup) then end if (sim_call_type==sim_childscriptcall_actuation) then for i=1,16,1 do res,dist=simReadProximitySensor(usensors[i]) if (res>0) and (dist<noDetectionDist) then if (dist<maxDetectionDist) then dist=maxDetectionDist end detect[i]=1-((dist-maxDetectionDist)/(noDetectionDist-maxDetectionDist)) else detect[i]=0 end end vLeft=v0 vRight=v0 for i=1,16,1 do vLeft=vLeft+braitenbergL[i]*detect[i] vRight=vRight+braitenbergR[i]*detect[i] end simSetJointTargetVelocity(motorLeft,vLeft) simSetJointTargetVelocity(motorRight,vRight) end
Алгоритм достаточно интересный, настолько, что его хотелось бы разобрать отдельным постом. Пока же можно попытаться задать свой алгоритм поведения робота. Сенсор номер пять расположен прямо впереди на корпусе, и можно написать программу, которая будет опрашивать сенсор и если он видит препятствие, то будет поворачивать направо. Это наверное самой простой вариант робота с одним сенсором расположенным спереди. Скрипт:
-- This is a very simple EXAMPLE navigation program, which avoids obstacles using the Braitenberg algorithm if (sim_call_type==sim_childscriptcall_initialization) then usensors={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} for i=1,16,1 do usensors[i]=simGetObjectHandle("Pioneer_p3dx_ultrasonicSensor"..i) end motorLeft=simGetObjectHandle("Pioneer_p3dx_leftMotor") motorRight=simGetObjectHandle("Pioneer_p3dx_rightMotor") noDetectionDist=0.8 maxDetectionDist=0.1 v0=2 rot=0 end if (sim_call_type==sim_childscriptcall_cleanup) then end if (sim_call_type==sim_childscriptcall_actuation) then res,dist=simReadProximitySensor(usensors[5]) if (res>0) and (dist<noDetectionDist) then rot = rot + v0 else rot=0 end vLeft=v0+rot vRight=v0 simSetJointTargetVelocity(motorLeft,vLeft) simSetJointTargetVelocity(motorRight,vRight) end
Видео работы скрипта:
Скачать готовую сцену для V-REP можно по следующей ссылке: скачать