Программируем роботов — бесплатный робосимулятор V-REP. Первые шаги

9660c4e950ee4b9ab93873cf9564a4c9.jpgПрограммирование роботов — это интересно.

Многие наверное видели японских гуманоидных роботов, или французский учебный робот NAO, интересным выглядит проект обучаемого робота-манипулятор Baxter. Промышленные манипуляторы KUKA из Германии — это классика. Кто-то программирует системы конвейерной обработки (фильтрации, сортировки). Дельта роботы. Есть целый пласт — управление квадрокоптером/алгоритмы стабилизации. И конечно же простые трудяги на складе — Line Follower.

Но всё это как правило — не дешевые игрушки, поэтому доступ к роботам есть в специализированных лабораториях или институтах/школах где получили финансирование и есть эти направления. Всем же остальным разработчикам (кому интересна робототехника) — остаётся завистливо смотреть.

Некоторое время назад я вышел на достаточно интересную систему — 3д робосимулятор V-REP, от швейцарской компании Coppelia Robotics.

К своему (приятному) удивлению я обнаружил, что эта система:

имеет большой функционал (система разрабатывается с марта 2010 года) полностью open-source (выложена в открытый доступ в 2013 году) кроссплатформенная — windows, mac, linux (работает на Qt) имеет API и библиотеки для работы с роботами через C/C++, Python, Java, Lua, Matlab, Octave или Urbi бесплатная для некоммерческого использования! Все объекты, которые программируются в этой системе — «живут» в реальном с точки зрения физических законов мире — есть гравитация, можно захватывать предметы, столкновения, датчики расстояния, видео датчики и т.п.Поработав некоторое время с этой системой, я решил рассказать про неё читателям хабра.

Да, и на картинке скриншот из V-REP, и модели роботов — которые вы можете программировать, и смотреть поведение, прямо на вашем компьютере.

УстановкаУстановим на компьютер эту систему, в разделе Download: 6511ce22736b46ee835510e6e207da53.jpgВидим три варианта: образовательный (EDU), триальный (EVAL), и плеер (player).

Плеер — это программа с помощью которой можно проиграть сцены созданные в полноценной версии (то есть нет возможности редактирования) — бесплатная.

Триальная — это полнофункциональная версия, в которой нет возможности сохранить. Нет лицензионных ограничений.

Образовательный — это полнофункциональный пакет, имеющий лицензионные ограничения, текст лицензии можно прочитать здесь. Суть его в том, что институты, школы, хоббисты — могут использовать бесплатно это программное обеспечение. При том, что использование не коммерческое (а образовательное).

Мы с вами вполне подходим под определение хоббистов (т.к. хотим образовательно по-программировать роботов), поэтому смело скачиваем версию EDU PRO для своей операционной системы.

В данный момент версия 3.2.0, вот прямая ссылка на windows вариант: V-REP_PRO_EDU_V3_2_0_Setup (98 Mb)

Старт После установки, и старта мы увидим экран: da8c56f691a248b9851dbed81d6a95e9.jpgЗдесь мы видим следующие объекты:

— сцена — здесь и происходит всё действо, на данный момент она пуста (есть только пол)— слева видим блок с библиотекой моделей — сверху папки, и под ней — отображается содержимое выбранной папки (выбраны robots/non-mobile — то есть стационарные роботы — манипуляторы)— далее отображается иерархия мира

Иерархия включает в себя — корневой объект (мир), в котором находятся все объекты.

В нашем примере это: 448523f48ae04c8684249a8a412ae4d7.jpg

Видим источники света, видим объект для реализации пола (а это твердая поверхность, с текстурой), и группу для камер.

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

Вверху и слева мы видим toolbar — меню. Самой главной кнопкой является кнопка Play (Start Simulation) — после которой стартует симуляция сцены: 5a02baf2c0754a00a0896ca17f98033a.jpg

Сценарий работы следующий: — мы перетаскиваем с помощью DragAndDrop объекты из библиотеки моделей.— корректируем их местоположение— настраиваем скрипты— стартуем симулятор— останавливаем симулятор

Попробуем что-нибудь на практике.

Быстрый старт Попробуем оживить робота.Для этого выбираем слева папку robots/mobile и в списке выбираем Ansi, захватываем, переносим на сцену и отпускаем, робот появляется на нашей сцене и появляется информация об авторе: 7ced4009a54345168c0563f8d9c5c1fc.jpg

Теперь нажимаем на Start Simulation, и видим движение робота, и можем управлять положение головы, рук (реализовано через Custom User Interface), вот видео:

c5e9f8576949465c8eb5e01c389d1128.jpg

Далее останавливаем симуляцию: 3b61f5a316f54825851a0bb4b15fa307.jpg

Скрипт управления Можем открыть и увидеть код, который научил робота идти (управляет автономным передвижением робота). Для этого на иерархии объектов, напротив модели Asti, дважды кликаем на иконке «файл»: 02433234222d41ddb793c8d5f1edc099.jpgВот Lua программа, которая осуществляет движение робота:

Скрипт управления движением робота Asti if (sim_call_type==sim_childscriptcall_initialization) then asti=simGetObjectHandle («Asti») lFoot=simGetObjectHandle («leftFootTarget») rFoot=simGetObjectHandle («rightFootTarget») lPath=simGetObjectHandle («leftFootPath») rPath=simGetObjectHandle («rightFootPath») lPathLength=simGetPathLength (lPath) rPathLength=simGetPathLength (rPath) ui=simGetUIHandle («astiUserInterface») simSetUIButtonLabel (ui,0, simGetObjectName (asti)…» user interface») dist=0 correction=0.0305 minVal={0, — Step size 0, — Walking speed -math.pi/2, — Neck 1 -math.pi/8, — Neck 2 -math.pi/2, — Left shoulder 1 0, — Left shoulder 2 -math.pi/2, — Left forearm -math.pi/2, — Right shoulder 1 0, — Right shoulder 2 -math.pi/2} — Right forearm rangeVal={ 2, — Step size 0.8, — Walking speed math.pi, — Neck 1 math.pi/4, — Neck 2 math.pi/2, — Left shoulder 1 math.pi/2, — Left shoulder 2 math.pi/2, — Left forearm math.pi/2, — Right shoulder 1 math.pi/2, — Right shoulder 2 math.pi/2} — Right forearm uiSliderIDs={3,4,5,6,7,8,9,10,11,12}

relativeStepSize=1 nominalVelocity=0.4 neckJoints={simGetObjectHandle («neckJoint0»), simGetObjectHandle («neckJoint1»)} leftArmJoints={simGetObjectHandle («leftArmJoint0»), simGetObjectHandle («leftArmJoint1»), simGetObjectHandle («leftArmJoint2»)} rightArmJoints={simGetObjectHandle («rightArmJoint0»), simGetObjectHandle («rightArmJoint1»), simGetObjectHandle («rightArmJoint2»)}  — Now apply current values to the user interface: simSetUISlider (ui, uiSliderIDs[1],(relativeStepSize-minVal[1])*1000/rangeVal[1]) simSetUISlider (ui, uiSliderIDs[2],(nominalVelocity-minVal[2])*1000/rangeVal[2]) simSetUISlider (ui, uiSliderIDs[3],(simGetJointPosition (neckJoints[1])-minVal[3])*1000/rangeVal[3]) simSetUISlider (ui, uiSliderIDs[4],(simGetJointPosition (neckJoints[2])-minVal[4])*1000/rangeVal[4]) simSetUISlider (ui, uiSliderIDs[5],(simGetJointPosition (leftArmJoints[1])-minVal[5])*1000/rangeVal[5]) simSetUISlider (ui, uiSliderIDs[6],(simGetJointPosition (leftArmJoints[2])-minVal[6])*1000/rangeVal[6]) simSetUISlider (ui, uiSliderIDs[7],(simGetJointPosition (leftArmJoints[3])-minVal[7])*1000/rangeVal[7]) simSetUISlider (ui, uiSliderIDs[8],(simGetJointPosition (rightArmJoints[1])-minVal[8])*1000/rangeVal[8]) simSetUISlider (ui, uiSliderIDs[9],(simGetJointPosition (rightArmJoints[2])-minVal[9])*1000/rangeVal[9]) simSetUISlider (ui, uiSliderIDs[10],(simGetJointPosition (rightArmJoints[3])-minVal[10])*1000/rangeVal[10]) end

if (sim_call_type==sim_childscriptcall_cleanup) then end

if (sim_call_type==sim_childscriptcall_actuation) then  — Read desired values from the user interface: relativeStepSize=minVal[1]+simGetUISlider (ui, uiSliderIDs[1])*rangeVal[1]/1000 nominalVelocity=minVal[2]+simGetUISlider (ui, uiSliderIDs[2])*rangeVal[2]/1000 simSetJointTargetPosition (neckJoints[1], minVal[3]+simGetUISlider (ui, uiSliderIDs[3])*rangeVal[3]/1000) simSetJointTargetPosition (neckJoints[2], minVal[4]+simGetUISlider (ui, uiSliderIDs[4])*rangeVal[4]/1000) simSetJointTargetPosition (leftArmJoints[1], minVal[5]+simGetUISlider (ui, uiSliderIDs[5])*rangeVal[5]/1000) simSetJointTargetPosition (leftArmJoints[2], minVal[6]+simGetUISlider (ui, uiSliderIDs[6])*rangeVal[6]/1000) simSetJointTargetPosition (leftArmJoints[3], minVal[7]+simGetUISlider (ui, uiSliderIDs[7])*rangeVal[7]/1000) simSetJointTargetPosition (rightArmJoints[1], minVal[8]+simGetUISlider (ui, uiSliderIDs[8])*rangeVal[8]/1000) simSetJointTargetPosition (rightArmJoints[2], minVal[9]+simGetUISlider (ui, uiSliderIDs[9])*rangeVal[9]/1000) simSetJointTargetPosition (rightArmJoints[3], minVal[10]+simGetUISlider (ui, uiSliderIDs[10])*rangeVal[10]/1000)  — Get the desired position and orientation of each foot from the paths (you can also use a table of values for that): t=simGetSimulationTimeStep ()*nominalVelocity dist=dist+t lPos=simGetPositionOnPath (lPath, dist/lPathLength) lOr=simGetOrientationOnPath (lPath, dist/lPathLength) p=simGetPathPosition (rPath) rPos=simGetPositionOnPath (rPath,(dist+correction)/rPathLength) rOr=simGetOrientationOnPath (rPath,(dist+correction)/rPathLength)  — Now we have the desired absolute position and orientation for each foot.  — Now transform the absolute position/orientation to position/orientation relative to asimo  — Then modulate the movement forward/backward with the desired «step size»  — Then transform back into absolute position/orientation: astiM=simGetObjectMatrix (asti,-1) astiMInverse=simGetInvertedMatrix (astiM) m=simMultiplyMatrices (astiMInverse, simBuildMatrix (lPos, lOr)) m[8]=m[8]*relativeStepSize m=simMultiplyMatrices (astiM, m) lPos={m[4], m[8], m[12]} lOr=simGetEulerAnglesFromMatrix (m) m=simMultiplyMatrices (astiMInverse, simBuildMatrix (rPos, rOr)) m[8]=m[8]*relativeStepSize m=simMultiplyMatrices (astiM, m) rPos={m[4], m[8], m[12]} rOr=simGetEulerAnglesFromMatrix (m)  — Finally apply the desired positions/orientations to each foot  — We simply apply them to two dummy objects that are then handled  — by the IK module to automatically calculate all leg joint desired values  — Since the leg joints operate in hybrid mode, the IK calculation results  — are then automatically applied as the desired values during dynamics calculation simSetObjectPosition (lFoot,-1, lPos) simSetObjectOrientation (lFoot,-1, lOr) simSetObjectPosition (rFoot,-1, rPos) simSetObjectOrientation (rFoot,-1, rOr) end Другие модели Вы можете удалить модель — для этого надо её выбрать, и нажать на Del. И можете попробовать посмотреть другие модели в работе, у некоторых есть скрипты для автономной работы.Мобильные роботыcb715a9e60d942c6a48507e6f38ee6d1.jpg

Стационарные роботы (манипуляторы)dd25353af82e428eb1d9f33fa0d52781.jpg

Примеры сцен Так же есть большое количество примеров (сцен), которые поставляются сразу с программой. Для этого надо выбрать в меню «File/Open scenes» и там перейти в папку: «V-REP3/V-REP_PRO_EDU/scenes».Вот примеры сцен (файлы с расширением *.ttt):

Файлы сцен-примеров 2IndustrialRobots.ttt3DoFHolonomicPathPlanning.ttt6DoFHolonomicPathPlanning.tttBarrettHandPickAndPlace.tttblobDetectionWithPickAndPlace.tttConstraintSolverExample.tttcontrolTypeExamples.ttte-puckDemo.tttenvironmentMapping.tttexternalIkDemo.tttfabricationBlocks.tttfastClientServerCommunication.tttforwardAndInverseKinematics1.tttforwardAndInverseKinematics2.tttgearMechanism.tttgenericDialogDemo.tttghostDemo.tttImageProcessingExample.tttinverseKinematicsOf144DofManipulator.tttjansenMechanism.tttkatanaRobotWithCableSimulation.tttkhepera3.tttLineTracer-threaded.tttmillingMachine.tttmillingRobot.tttmotionPlanningAndGraspingDemo.tttmotionPlanningDemo1.tttmotionPlanningDemo2.tttmotionPlanningDemo3.tttmouseTestScene.tttnaturalSelectionAlgo.tttNonHolonomicPathPlanning.tttobjectHandling.tttPaintingRobot.tttParallelForwardAndInverseKinematics.tttpracticalPathPlanningDemo.tttproximitySensorDemo.tttreflexxesMotionLibraryType4Demo.tttrobotCollaboration1.tttrobotCollaboration2.tttrobotLanguageControl.tttrosTopicPublisherAndSubscriber.tttSocketAndTubeCommunicationExample.tttStripeScanner.tttweldingRobot.tttwirelessTransmission.tttyouBotAndHanoiTower.ttt

Ссылки * основной сайт V-REP* руководство пользователя (на английском)* большое количество видео, примеров из V-REPЧтобы поддержать популяризацию этой интересной системы на русском языке — создана русскоязычная группа по V-REP.

Применение в учебном процессе На мой взгляд, у V-REP есть хороший потенциал применения в учебных процессах. Если вас интересует применение системы в учебном процессе — в школе, институте, в клубе робототехники и т.п. — то можете заполнить анкету. Может быть получиться консолидировать усилия и сделать учебные русскоязычные материалы.Планы на будущее 24057fb359f74a6c9598e4eaf2a5daaf.jpgКонечно это лишь малая часть возможностей V-REP системы. В следующей публикации на примере рассмотрим создание задачи гоночного симулятора на робо-машинке от первого лица. Рассмотрим API. Создание объектов, настройка сцены и взаимодействие с пользователем.

© Habrahabr.ru