V-REP симулятор роботов

разделы: myRobot , дата: 24 марта 2016г.

    Разработку робота можно разделить на несколько этапов:
  • разработка математической модели;
  • составление алгоритма;
  • написание программы;
  • разработка проекта;
  • изготовление;
  • испытание.

Симулятор роботов позволит проверить математическую модель и алгоритм перед тем как приступать к изготовлению робота. 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 можно по следующей ссылке: скачать