the-eye.eu · table of contents learning robotics using python credits about the author about the...

Post on 13-Oct-2020

2 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

LearningRoboticsUsingPython

TableofContents

LearningRoboticsUsingPythonCreditsAbouttheAuthorAbouttheReviewerswww.PacktPub.com

Supportfiles,eBooks,discountoffers,andmoreWhysubscribe?FreeaccessforPacktaccountholders

PrefaceWhatthisbookcoversWhatyouneedforthisbookWhothisbookisforConventionsReaderfeedbackCustomersupport

DownloadingtheexamplecodeDownloadingthecolorimagesofthisbookErrataPiracyQuestions

1.IntroductiontoRoboticsWhatisarobot?

HistoryofthetermrobotModerndefinitionofarobot

Wheredorobotscomefrom?Whatcanwefindinarobot?

ThephysicalbodySensorsEffectorsControllers

Howdowebuildarobot?ReactivecontrolHierarchical(deliberative)controlHybridcontrol

Summary2.MechanicalDesignofaServiceRobot

TheRequirementsofaservicerobotRobotdrivemechanism

SelectionofmotorsandwheelsCalculationofRPMofmotorsCalculationofmotortorque

ThedesignsummaryRobotchassisdesign

InstallingLibreCAD,Blender,andMeshLabInstallingLibreCADInstallingBlenderInstallingMeshLab

Creatinga2DCADdrawingoftherobotusingLibreCADThebaseplatedesignBaseplatepoledesignWheel,motor,andmotorclampdesignCasterwheeldesignMiddleplatedesignTopplatedesign

Workingwitha3DmodeloftherobotusingBlenderPythonscriptinginBlenderIntroductiontoBlenderPythonAPIsPythonscriptoftherobotmodel

QuestionsSummary

3.WorkingwithRobotSimulationUsingROSandGazeboUnderstandingroboticsimulation

MathematicalmodelingoftherobotIntroductiontothedifferentialsteeringsystemandrobotkinematicsExplainingoftheforwardkinematicsequationInversekinematics

IntroductiontoROSandGazeboROSConcepts

TheROSfilesystemTheROSComputationGraphTheROScommunitylevel

InstallingROSIndigoonUbuntu14.04.2IntroducingcatkinCreatinganROSpackageHello_world_publisher.pyHello_world_subscriber.pyIntroducingGazeboInstallingGazeboTestingGazebowiththeROSinterfaceInstallingTurtleBotRobotpackagesonROSIndigoInstallingTurtleBotROSpackagesusingtheaptpackagemanagerinUbuntuSimulatingTurtleBotusingGazeboandROSCreatingtheGazebomodelfromTurtleBotpackagesWhatisarobotmodel,URDF,xacro,androbotstatepublisher?CreatingaChefBotdescriptionROSpackage

chefbot_base_gazebo.urdf.xacro

kinect.urdf.xacrochefbot_base.urdf.xacro

SimulatingChefBotandTurtleBotinahotelenvironmentQuestionsSummary

4.DesigningChefBotHardwareSpecificationsoftheChefBothardwareBlockdiagramoftherobot

MotorandencoderSelectingmotors,encoders,andwheelsfortherobot

MotordriverSelectingamotordriver/controller

InputpinsOutputpinsPowersupplypins

EmbeddedcontrollerboardUltrasonicsensors

SelectingtheultrasonicsensorInertialMeasurementUnitKinectCentralProcessingUnitSpeakers/micPowersupply/battery

WorkingoftheChefBothardwareQuestionsSummary

5.WorkingwithRoboticActuatorsandWheelEncodersInterfacingDCgearedmotorwithTivaCLaunchPad

DifferentialwheeledrobotInstallingtheEnergiaIDEInterfacingcode

InterfacingquadratureencoderwithTivaCLaunchpadProcessingencoderdataQuadratureencoderinterfacingcode

WorkingwithDynamixelactuatorsQuestionsSummary

6.WorkingwithRoboticSensorsWorkingwithultrasonicdistancesensors

InterfacingHC-SR04toTivaCLaunchPadWorkingofHC-SR04InterfacingcodeofTivaCLaunchPadInterfacingTivaCLaunchPadwithPython

WorkingwiththeIRproximitysensorWorkingwithInertialMeasurementUnit

InertialNavigationInterfacingMPU6050withTivaCLaunchPad

SettinguptheMPU6050libraryinEnergiaInterfacingcodeofEnergia

InterfacingMPU6050toLaunchpadwiththeDMPsupportusingEnergiaQuestionsSummary

7.ProgrammingVisionSensorsUsingPythonandROSListofroboticvisionsensorsandimageprocessinglibrariesIntroductiontoOpenCV,OpenNI,andPCL

WhatisOpenCV?InstallationofOpenCVfromsourcecodeinUbuntu14.04.2ReadinganddisplayinganimageusingthePython-OpenCVinterfaceCapturingfromwebcamera

WhatisOpenNIInstallingOpenNIinUbuntu14.04.2

WhatisPCL?ProgrammingKinectwithPythonusingROS,OpenCV,andOpenNI

HowtolaunchOpenNIdriverTheROSinterfaceofOpenCV

CreatingROSpackagewithOpenCVsupportDisplayingKinectimagesusingPython,ROS,andcv_bridge

WorkingwithPointCloudsusingKinect,ROS,OpenNI,andPCLOpeningdeviceandPointCloudgeneration

ConversionofPointCloudtolaserscandataWorkingwithSLAMusingROSandKinectQuestionsSummary

8.WorkingwithSpeechRecognitionandSynthesisUsingPythonandROSUnderstandingspeechrecognition

BlockdiagramofaspeechrecognitionsystemSpeechrecognitionlibraries

CMUSphinx/PocketSphinxJulius

WindowsSpeechSDKSpeechsynthesisSpeechsynthesislibraries

eSpeakFestival

WorkingwithspeechrecognitionandsynthesisinUbuntu14.04.2usingPythonSettingupPocketSphinxanditsPythonbindinginUbuntu14.04.2WorkingwithPocketSphinxPythonbindinginUbuntu14.04.2Output

Real-timespeechrecognitionusingPocketSphinx,GStreamer,andPythoninUbuntu14.04.2SpeechrecognitionusingJuliusandPythoninUbuntu14.04.2

InstallationofJuliusspeechrecognizerandPythonmodulePython-JuliusclientcodeImprovingspeechrecognitionaccuracyinPocketSphinxandJuliusSettingupeSpeakandFestivalinUbuntu14.04.2

WorkingwithspeechrecognitionandsynthesisinWindowsusingPythonInstallationoftheSpeechSDK

WorkingwithSpeechrecognitioninROSIndigoandPythonInstallationofthepocketsphinxpackageinROSIndigo

WorkingwithspeechsynthesisinROSIndigoandPythonQuestionsSummary

9.ApplyingArtificialIntelligencetoChefBotUsingPythonBlockdiagramofthecommunicationsysteminChefBotIntroductiontoAIML

IntroductiontoAIMLtagsIntroductiontoPyAIML

InstallingPyAIMLonUbuntu14.04.2InstallingPyAIMLfromsourcecode

WorkingwithAIMLandPythonLoadingasingleAIMLfilefromthecommand-lineargument

WorkingwithA.L.I.C.E.AIMLfilesLoadingAIMLfilesintomemoryLoadingAIMLfilesandsavingtheminbrainfilesLoadingAIMLandbrainfilesusingtheBootstrapmethod

IntegratingPyAIMLintoROSaiml_server.pyaiml_client.pyaiml_tts_client.pyaiml_speech_recog_client.pystart_chat.launchstart_tts_chat.launchstart_speech_chat.launch

QuestionsSummary

10.IntegrationofChefBotHardwareandInterfacingitintoROS,UsingPythonBuildingChefBothardwareConfiguringChefBotPCandsettingChefBotROSpackagesInterfacingChefBotsensorswithTivaCLaunchPad

EmbeddedcodeforChefBotWritingaROSPythondriverforChefBotUnderstandingChefBotROSlaunchfilesWorkingwithChefBotPythonnodesandlaunchfiles

WorkingwithSLAMonROStobuildthemapoftheroomWorkingwithROSlocalizationandnavigation

Questions

Summary11.DesigningaGUIforaRobotUsingQtandPython

InstallingQtonUbuntu14.04.2LTSWorkingwithPythonbindingsofQt

PyQtInstallingPyQtonUbuntu14.04.2LTS

PySideInstallingPySideonUbuntu14.04.2LTS

WorkingwithPyQtandPySideIntroducingQtDesignerQtsignalsandslotsConvertingaUIfileintoPythoncodeAddingaslotdefinitiontoPyQtcodeUpandrunningofHelloWorldGUIapplication

WorkingwithChefBot'scontrolGUIInstallingandworkingwithrqtinUbuntu14.04.2LTS

QuestionsSummary

12.TheCalibrationandTestingofChefBotTheCalibrationofXboxKinectusingROS

CalibratingtheKinectRGBcameraCalibratingtheKinectIRcamera

WheelodometrycalibrationErroranalysisofwheelodometryErrorcorrection

CalibratingtheMPU6050TestingoftherobotusingGUI

ProsandconsoftheROSnavigationQuestionsSummary

Index

LearningRoboticsUsingPython

LearningRoboticsUsingPythonCopyright©2015PacktPublishing

Allrightsreserved.Nopartofthisbookmaybereproduced,storedinaretrievalsystem,ortransmittedinanyformorbyanymeans,withoutthepriorwrittenpermissionofthepublisher,exceptinthecaseofbriefquotationsembeddedincriticalarticlesorreviews.

Everyefforthasbeenmadeinthepreparationofthisbooktoensuretheaccuracyoftheinformationpresented.However,theinformationcontainedinthisbookissoldwithoutwarranty,eitherexpressorimplied.NeithertheauthornorPacktPublishing,anditsdealersanddistributorswillbeheldliableforanydamagescausedorallegedtobecauseddirectlyorindirectlybythisbook.

PacktPublishinghasendeavoredtoprovidetrademarkinformationaboutallofthecompaniesandproductsmentionedinthisbookbytheappropriateuseofcapitals.However,PacktPublishingcannotguaranteetheaccuracyofthisinformation.

Firstpublished:May2015

Productionreference:1220515

PublishedbyPacktPublishingLtd.

LiveryPlace

35LiveryStreet

BirminghamB32PB,UK.

ISBN978-1-78328-753-6

www.packtpub.com

CoverimagebyJarekBlaminsky(<milak6@wp.pl>)

CreditsAuthor

LentinJoseph

Reviewers

AvkashChauhan

VladimirIakovlev

BlagojPetrushev

MarekSuppa

CommissioningEditor

RebeccaYoué

AcquisitionEditor

RebeccaYoué

ContentDevelopmentEditor

AthiraLaji

TechnicalEditors

AnkurGhiye

ManaliGonsalves

CopyEditors

PranjaliChury

RelinHedly

MerilynPereira

AdithiShetty

ProjectCoordinator

HarshalVed

Proofreaders

StephenCopestake

SafisEditing

Indexer

PriyaSane

Graphics

SheetalAute

ProductionCoordinator

NiteshThakur

CoverWork

NiteshThakur

AbouttheAuthorLentinJosephisanelectronicsengineer,roboticsenthusiast,machinevisionexpert,embeddedprogrammer,andthefounderandCEOofQboticsLabs(http://www.qboticslabs.com)inIndia.Hegothisbachelor'sdegreeinelectronicsandcommunicationengineeringattheFederalInstituteofScienceandTechnology(FISAT),Kerala.Inhisfinalyearengineeringproject,hecreatedasocialrobot,whichcaninteractwithpeople.Theprojectwasahugesuccessandgotmentionedinvisualandprintmedia.Themainfeatureofthisrobotwasthatitcouldcommunicatewithpeopleandreplyintelligently.Italsohassomeimage-processingcapabilities,suchasface,motion,andcolordetection.TheentireprojectwasimplementedusingthePythonprogramminglanguage.Hisinterestinrobotics,imageprocessing,andPythonbeganthisproject.

Aftergraduation,heworkedatastart-upcompanybasedonroboticsandimageprocessingfor3years.Inthemeantime,helearnedfamousroboticsoftwareplatforms—suchasRobotOperatingsystem(ROS),V-REP,andActin(aroboticsimulationtool)—andimageprocessinglibraries,suchasOpenCV,OpenNI,andPCL.Healsoknowsaboutrobot3Ddesigning,embeddedprogrammingonArduino,andStellarisLaunchpad.

After3yearsofworkexperience,hestartedanewcompanycalledQboticsLabs,whichismainlyfocusedonresearchtobuildgreatproductsindomainssuchaswearabletechnology,robotics,machinevision,greentechnology,andonlineeducation.Hemaintainsapersonalwebsite(http://www.lentinjoseph.com)andatechnologyblogcalledtechnolabsz(http://www.technolabsz.com).Hepublisheshisworksonhistechblog.HewasaspeakeratPyCon2013India,andhespokeonthetopicoflearningroboticsusingPython.

Iwouldliketodedicatethisbooktomyparentsbecausetheygavemetheinspirationtowriteit.Iwouldalsoliketoconveymyregardstomyfriendswhohelpedandinspiredmetowritethisbook.

IwouldliketothankMarekSuppaforhisvaluablecontributioninwritingChapter1,IntroductiontoRobotics,inadditiontoreviewingthisbook.

AbouttheReviewersAvkashChauhaniscurrentlyleadingateamofengineersatastart-upbasedinSanFrancisco,wherehisteamisbuildingabigdatamonitoringplatformusingmachinelearningandnewagemethodstoimprovebusinesscontinuityandgainmaximumadvantagefromtheplatformitself.HeisthefounderandprincipalofBigDataPerspective,withavisiontomaketheHadoopplatformaccessibletomainstreamenterprisesbysimplifyingitsadoption,customization,management,andsupport.BeforeBigDataPerspective,heworkedatPlatforaInc.,buildingbigdataanalyticssoftwarerunningnativelyonHadoop.Previously,heworkedfor8yearsatMicrosoft,buildingcloudandbigdataproductsandprovidingassistancetoenterprisepartnersworldwide.Avkashhasover15yearsofsoftwaredevelopmentexperienceincloudandbigdatadisciplines.Heisaprogrammeratheartinfull-stackdisciplineandhasthebusinessacumentoworkwithenterprises,meetingtheirneeds.Heispassionateabouttechnologyandenjoyssharinghisknowledgewithothersthroughvarioussocialmedia.Hehasalsowrittenafewbooksonbigdatadisciplineandisveryactiveinthetechsocialspace.Heisanaccomplishedauthor,blogger,technicalspeaker,andhelovestheoutdoors.

VladimirIakovlevisasoftwaredeveloper.Mostofthetime,hedevelopswebapplicationsusingPython,Clojure,andJavaScript.He'stheownerofafewsemi-popularopensourceprojects.HewasaspeakeratafewPython-relatedconferences.

Inhisfreetime,Vladimirlikestoplaywithelectronicdevices,suchasArduinoandPyBoard,andimage-processingdevices,suchasLeapMotion.Hehastriedtobuildsomerobots.Hehasalreadybuiltaroboticarm.

Currently,VladimirworksatUpwork,wherehedevelopswebapplications,mostlywithPython.

BlagojPetrushevisasoftwareengineerandconsultantbasedinSkopje,Macedonia.Hisworkrevolvesmainlyaroundbackends,datastores,andnetworkapplications.Amonghisinterestsaremachinelearning,NLP,dataanalysis,modelinganddatabases,anddistributedprogramming.

MarekSuppahasbeenplayingwith(kindof)smartmachinesforthepastfewyears,whicharepretentiouslycalledrobotsinsomepartsoftheworld.Rightnow,heleadsaroboticfootballteam,buildingtoolstohelpothersstartwithrobotsandsettingoffonanewventuretoseehowfarthecurrenttechnologywillletusmovetowardthegoalofcreatingarobotasitwasfirstdefined.

Iwouldliketothankeveryonewhosupportedthecreationofthisbook,whoeverandwherevertheymightbe.

www.PacktPub.comSupportfiles,eBooks,discountoffers,andmoreForsupportfilesanddownloadsrelatedtoyourbook,pleasevisitwww.PacktPub.com.

DidyouknowthatPacktofferseBookversionsofeverybookpublished,withPDFandePubfilesavailable?YoucanupgradetotheeBookversionatwww.PacktPub.comandasaprintbookcustomer,youareentitledtoadiscountontheeBookcopy.Getintouchwithusat<service@packtpub.com>formoredetails.

Atwww.PacktPub.com,youcanalsoreadacollectionoffreetechnicalarticles,signupforarangeoffreenewslettersandreceiveexclusivediscountsandoffersonPacktbooksandeBooks.

https://www2.packtpub.com/books/subscription/packtlib

DoyouneedinstantsolutionstoyourITquestions?PacktLibisPackt'sonlinedigitalbooklibrary.Here,youcansearch,access,andreadPackt'sentirelibraryofbooks.

Whysubscribe?FullysearchableacrosseverybookpublishedbyPacktCopyandpaste,print,andbookmarkcontentOndemandandaccessibleviaawebbrowser

FreeaccessforPacktaccountholdersIfyouhaveanaccountwithPacktatwww.PacktPub.com,youcanusethistoaccessPacktLibtodayandview9entirelyfreebooks.Simplyuseyourlogincredentialsforimmediateaccess.

PrefaceLearningRoboticswithPythoncontainstwelvechaptersthatmainlyaimsathowtobuildanautonomousmobilerobotfromscratchandhowtoprogramitusingPython.Therobotmentionedinthisbookisaservicerobot,whichcanbeusedtoservefoodathome,hotels,andrestaurants.Fromthebeginningtoend,thisbookdiscussesthestep-by-stepprocedureonhowtobuildthisrobot.Thebookstartswiththebasicconceptsofroboticsandthenmovesontothe3Dmodelingandsimulationoftherobot.Afterthesuccessfulsimulationoftherobot,itdiscussesthehardwarecomponentsrequiredtobuildtherobotprototypeinordertocompletetherobotnavigation.

ThesoftwarepartofthisrobotismainlyimplementedusingthePythonprogramminglanguageandsoftwareframeworks,suchasRobotOperatingSystem(ROS),Open-CV,andsoon.YouwillunderstandtheapplicationofPythonfromtheaspectsofdesigningtherobottotherobot’suserinterface.TheGazebosimulatorisusedtosimulatetherobotandmachinevisionlibraries,suchasOpen-CVandOpenNI.PCLisusedtoprocessthe2Dand3Dimagedataoftherobot.Eachchapterispresentedwithanadequatetheorytounderstandtheapplicationaspect.Thebookisreviewedbyexpertsinthisfieldwhoarepassionateaboutrobotics.

WhatthisbookcoversChapter1,IntroductiontoRobotics,containsbasicconceptsandterminologiesofrobotics.Thischapterisamustforbeginnerswhoarejuststartingwithrobotics.

Chapter2,MechanicalDesignofaServiceRobot,discussesthe2Dand3DCADdesigningaspectoftherobotusingLibreCADandBlender(freesoftware).ThischapteralsodemonstrateshowtouseBlenderPythonAPIsinordertobuildthe3Dmodel.

Chapter3,WorkingwithRobotSimulationUsingROSandGazebo,takesyouthroughthesimulationoftheservicerobotusingGazeboandROS.

Chapter4,DesigningChefBotHardware,explainsthehardwaredesigningoftherobot,includingblockdiagramandhardwarecomponentsrequiredtobuildChefBot.

Chapter5,WorkingwithRoboticActuatorsandWheelEncoders,coversinterfacingofroboticactuatorsandwheelencodersusingTivaCLaunchPad.Italsomentionshigh-endsmartactuatorslikedynamixel.

Chapter6,WorkingwithRoboticSensors,discussesinterfacingofultrasonicdistancesensors,IRproximitysensors,andIMUusingTivaCLaunchPad.

Chapter7,ProgrammingVisionSensorsUsingPythonandROS,talksabouttheintroductiontoOpen-CV,OpenNI,andPCLlibrariesandinterfacingthesetoROSandprogrammingusingPython.

Chapter8,WorkingwithSpeechRecognitionandSynthesisUsingPythonandROS,discussesspeechrecognitionandsynthesisusingvariouslibrariesandinterfacingittoROSprogrammingusingPython.

Chapter9,ApplyingArtificialIntelligencetoChefBotUsingPython,coverstutorialstobuildaChatterBot.Thiscanbeusedtomaketherobotinteractive.

Chapter10,IntegrationofChefBotHardwareandInterfacingitintoROS,UsingPython,explorestutorialstointegratethecompletehardwareandessentialsoftwaresection.ItmainlydiscussesautonomousnavigationoftheservicerobotandhowtoprogramitusingROSandPython.

Chapter11,DesigningaGUIforaRobotUsingQtandPython,coverstutorialsonhowtobuildaGUIfortheuserwhooperatestherobotinatypicalrestaurant.TheGUIisbuiltusingQtandthePyQtPythonwrapper.

Chapter12,TheCalibrationandTestingofChefBot,explorestutorialsonhowtocalibrateandtesttherobotforthefinalrun.

WhatyouneedforthisbookThebookisallabouthowtobuildarobot.Tostartwiththisbook,youshouldhavesomehardware.Therobotcanbebuiltfromscratch,oryoucanbuyadifferential-driveconfigurationrobotwithanencoderfeedback.Youshouldbuyacontrollerboard,suchasTexasInstrumentsLaunchpad,forembeddedprocessing.Youshouldhaveatleastalaptop/netbookfortheentirerobotprocess.Inthisbook,wewilluseIntelNUCforrobotprocessing.It’sverycompactinsizeanddelivershighperformance.Forthe3Dvision,youshouldhave3Dsensors,suchaslaserscanner,Kinect,andAsusXtionPro.

Inthesoftwaresection,youshouldhaveagoodunderstandingonhowtoworkwithGNU/Linuxcommands.YoushouldalsohaveagoodknowledgeofPython.YoushouldinstallUbuntu14.04.2LTStoworkwiththeexamples.IfyouhaveknowledgeaboutROS,OpenCV,OpenNI,andPCL,itwillbeagreatadd-on.YouhavetoinstallROSIndigototesttheseexamples.

WhothisbookisforLearningRoboticswithPythonisagoodcompanionforentrepreneurswhowanttoexploretheserviceroboticsdomain,professionalswhowanttoimplementmorefeaturestotheirrobots,researcherswhowanttoexploremoreaboutrobotics,andhobbyistorstudentswhowanttolearnrobotics.Thebookfollowsastep-by-stepguidethatcanbeeasilyunderstoodbyanyone.

ConventionsInthisbook,youwillfindanumberofstylesoftextthatdistinguishbetweendifferentkindsofinformation.Herearesomeexamplesofthesestyles,andanexplanationoftheirmeaning.

Codewordsintext,databasetablenames,foldernames,filenames,fileextensions,pathnames,dummyURLs,userinput,andTwitterhandlesareshownasfollows:“Thefirstprocedureistocreateaworldfileandsaveitwiththe.worldfileextension.”

Ablockofcodeissetasfollows:

<xacro:includefilename=”$(find

chefbot_description)/urdf/chefbot_gazebo.urdf.xacro”/>

<xacro:includefilename=”$(find

chefbot_description)/urdf/chefbot_properties.urdf.xacro”/>

Anycommand-lineinputoroutputiswrittenasfollows:

$roslaunchchefbot_gazebochefbot_empty_world.launch

Newtermsandimportantwordsareshowninbold.Wordsthatyouseeonthescreen,inmenusordialogboxesforexample,appearinthetextlikethis:“wecancommandtherobottonavigatetosomepositiononthemapusingthe2DNavGoalbutton”.

Note

Warningsorimportantnotesappearinaboxlikethis.

Tip

Tipsandtricksappearlikethis.

ReaderfeedbackFeedbackfromourreadersisalwayswelcome.Letusknowwhatyouthinkaboutthisbook—whatyoulikedormayhavedisliked.Readerfeedbackisimportantforustodeveloptitlesthatyoureallygetthemostoutof.

Tosendusgeneralfeedback,simplysendane-mailto<feedback@packtpub.com>,andmentionthebooktitleviathesubjectofyourmessage.

Ifthereisatopicthatyouhaveexpertiseinandyouareinterestedineitherwritingorcontributingtoabook,seeourauthorguideonwww.packtpub.com/authors.

CustomersupportNowthatyouaretheproudownerofaPacktbook,wehaveanumberofthingstohelpyoutogetthemostfromyourpurchase.

DownloadingtheexamplecodeYoucandownloadtheexamplecodefilesforallPacktbooksyouhavepurchasedfromyouraccountathttp://www.packtpub.com.Ifyoupurchasedthisbookelsewhere,youcanvisithttp://www.packtpub.com/supportandregistertohavethefilese-maileddirectlytoyou.

DownloadingthecolorimagesofthisbookWealsoprovideyouaPDFfilethathascolorimagesofthescreenshots/diagramsusedinthisbook.Thecolorimageswillhelpyoubetterunderstandthechangesintheoutput.Youcandownloadthisfilefrom:https://www.packtpub.com/sites/default/files/downloads/7536OS_ImageBundle.pdf.

ErrataAlthoughwehavetakeneverycaretoensuretheaccuracyofourcontent,mistakesdohappen.Ifyoufindamistakeinoneofourbooks—maybeamistakeinthetextorthecode—wewouldbegratefulifyouwouldreportthistous.Bydoingso,youcansaveotherreadersfromfrustrationandhelpusimprovesubsequentversionsofthisbook.Ifyoufindanyerrata,pleasereportthembyvisitinghttp://www.packtpub.com/submit-errata,selectingyourbook,clickingontheerratasubmissionformlink,andenteringthedetailsofyourerrata.Onceyourerrataareverified,yoursubmissionwillbeacceptedandtheerratawillbeuploadedonourwebsite,oraddedtoanylistofexistingerrata,undertheErratasectionofthattitle.Anyexistingerratacanbeviewedbyselectingyourtitlefromhttp://www.packtpub.com/support.

PiracyPiracyofcopyrightmaterialontheInternetisanongoingproblemacrossallmedia.AtPackt,wetaketheprotectionofourcopyrightandlicensesveryseriously.Ifyoucomeacrossanyillegalcopiesofourworks,inanyform,ontheInternet,pleaseprovideuswiththelocationaddressorwebsitenameimmediatelysothatwecanpursuearemedy.

Pleasecontactusat<copyright@packtpub.com>withalinktothesuspectedpiratedmaterial.

Weappreciateyourhelpinprotectingourauthors,andourabilitytobringyouvaluablecontent.

QuestionsYoucancontactusat<questions@packtpub.com>ifyouarehavingaproblemwithanyaspectofthebook,andwewilldoourbesttoaddressit.

Chapter1.IntroductiontoRoboticsIfyoureadanintroductorychapterinanytechnicalbook,youmayhavenoticedthatitprettymuchalwaysfollowsthesamestructure.Itbeginsbydescribinghowawesomethetopicis,whatagooddecisionitistostartreadingthebook,andhowyoushouldkeeponreadingbecausetherearemanyexcitingthingsawaitingyouinitsfurtherchapters.

Thischapterisnosuchchapter.Itstartswiththefollowingquote:

Roboticsisanart.

Although,suchastrongstatementdoesprobablydeservesomeexplanation,webelievethatafteryoufinishreadingthisbook(andbuildingyourownrobots!),nofurtherexplanationwillbeneeded.

Soifroboticsisanart,howdoesonelearnit?Toputitdifferently,whatarethedifferencesbetweenlearningtoplayamusicalinstrument,learningtopaint,learningtowrite,andlearningrobotics?Webelievethattherearenottoomanyofthem.Justasmusiciansneedtoplayontheirinstruments,paintersneedtoproducepaintings,andwritersneedtowritetheirtexts,roboticists(thetermweusetodescribepeoplewhobuildrobotics)needtobuildtheirrobots.Justasmusicians,painters,andwritersneedtolearnthejargonusedintheirtrades,roboticistsneedtofamiliarizethemselveswithafewbasictermsthattheymightrunintowhilereadingtutorials,researchingscientificliterature,andtalkingtootherroboticsenthusiasts.Also,justasanyartistneedstoknowatleastalittlebitaboutthehistoryoftheirrespectiveart,sodoesanygoodroboticistneedtoknowathingortwoaboutthehistoryofrobotics.That'swhyinthischapter,wewillcover:

Whatisarobot?Wheredorobotscomefrom?Whatcanwefindinarobot?Howdowebuildrobots?

Whatisarobot?Ratherthandefiningwhatarobotisrightaway,let'spauseforamomentanddiscusswhetherweneedtoansweraquestionlikethisafterall.Everybodyknowsthatarobotissomesortofamachinethatcanmovearoundanddependingonwhatmovieyousaworwhichbookyouread,itcaneitherhelphumansintheirday-to-daylifeormeantheendofhumanity.

It'sclearthatthereissomecontroversyandlotsofmisunderstandingsaboutrobotsandtheirroleinthepast,present,andthefuture.Inordertobetterunderstandthesituation,let'sfirstexaminecloselytheterm"robot"itself.Then,wewilltrytodefineitabitmoreformallytopreventanymisunderstandingorcontroversy.

HistoryofthetermrobotTheterm"robot"wasusedforthefirsttimebyKarelČapek,aCzechwriterinhisplayRossum'sUniversalRobots(R.U.R)thathewrotein1920,todenoteanartificialhumanmadeoutofsynthetic

organicmatter.Theserobots(robotiinCzech)weremadeinfactoriesandtheirpurposewastoreplacehumanworkers.Whiletheywereveryefficientandexecutedorderstheyweregivenperfectly,theylackedanyemotion.Itseemedthathumanswouldnotneedtoworkatallbecauserobotsseemedtobehappytoworkforthem.Thischangedafterawhileandarobotrevoltresultedinextinctionofthehumanrace.

R.U.Risquitedarkanddisturbing,butitdoesnotleavethefuturehopeless.Itwasconsideredquiteasuccessbackinthedayandwecertainlydorecommendyoutoreadit.Asitscopyrighthadalreadyexpiredinmanycountriesatthetimeofwritingthisbook,itshouldnotbeaproblemtofindaversiononline,whichisinthepublicdomain.

"Whenhe(YoungRossum)tookalookathumananatomyhesawimmediatelythatitwastoocomplexandthatagoodengineercouldsimplifyit.Soheundertooktoredesignanatomy,experimentingwithwhatwouldlenditselftoomissionorsimplification.Robotshaveaphenomenalmemory.Ifyouweretoreadthematwenty-volumeencyclopediatheycouldrepeatthecontentsinorder,buttheyneverthinkupanythingoriginal.They'dmakefineuniversityprofessors."

--KarelCapek,R.U.R.(Rossum'sUniversalRobots),1920

WhilemanyattributethetermrobottoKarelČapekashewrotetheplayinwhichitappearedforthefirsttime,therearesourcessuggestingthatitwasactuallyČapek'sbrotherJosefwhocameupwiththeterm(itseemsthattherewasanarticleinCzechdailyprintwrittenbyKarelČapekhimself,inwhichhewantstosettherecordstraightbytellingthisstory).Karelwantedtousethetermlaboři(fromLatinlabor,work),buthedidnotlikeit.Itseemedtooartificialtohim,soheaskedhisbrotherforadvice.JosefsuggestedrobotiandthatwaswhatKarelusedintheend.

Nowthatweknowwhenthetermrobotwasusedforthefirsttimeandwhoactuallycreatedit,let'sfindoutwheredoesitcomefrom.TheexplanationthatmanyuseisthatitcomesfromtheCzech

wordsrobotaandrobotník,whichliterallymeans"work"and"worker"respectively.However,thewordrobotaalsomeans"work"or"serflabor"inSlovak.Also,weshouldtakeintoaccountthatsomesourcessuggestthatbythetimeKarelwaswritingR.U.R,heandhisbrotheroftenvisitedhisfatherinasmallSlovakspatowncalledTrenčianskeTeplice.Therefore,itmightverywellbethatthetermrobotwasinspiredbytheusageoftheword"robota"inSlovaklanguage,whichiscoincidentally,thenativelanguageofoneoftheauthorsofthisbook.

WhetherthetermrobotcomesfromCzechorSlovak,thewordrobotamightbeamatterofnationalpride,butitdoesnotconcernustoomuch.Inbothcases,theliteralmeaningis"work","labor",or"hardwork"anditwasthepurposeoftheČapek'srobots.However,robotshaveevolveddramaticallyoverthepasthundredyears.Tosaythattheyareallaboutdoinghardworkwouldprobablybeanunderstatement.

So,let'strytodefinethenotionofarobotasweperceiveittoday.

ModerndefinitionofarobotWhenwetrytofindaprecisedefinitionofsometerm,ourfirststopisusuallysomesortofencyclopediaoradictionary.Let'strytodothisforthetermrobot.

OurfirststopwillbeEncyclopediaBritannica.Itsdefinitionofarobotisasfollows:

"Anyautomaticallyoperatedmachinethatreplaceshumaneffort,thoughitmightnotresemblehumanbeingsinappearanceorpreformfunctionsinahumanlikemanner."

Thisisquiteanicedefinition,buttherearequiteafewproblemswithit.

Firstofall,it'sabittoobroad.Bythisdefinition,awashingmachineshouldalsobeconsideredarobot.Itdoesoperateautomatically(well,mostofthemdo),itdoesreplacehumaneffort(althoughnotbychangingthesametasksahumanwoulddo),anditcertainlydoesnotresembleahuman.

Secondly,it'squitedifficulttoimaginewhatarobotactuallyisafterreadingthisdefinition.Withsuchabroaddefinition,therearewaytoomanythingsthatcanbeconsideredarobotandthisdefinitiondoesnotprovideuswithanyspecificfeatures.

ItturnsoutthatwhileEncyclopediaBritannica'sdefinitionofarobotdoesnotfitourneedswellenough,it'sactuallyoneofthebestonesthatonecanfind.Forexample,TheFreeDictionarydefinesarobotas"Amechanicaldevicethatsometimesresemblesahumanandiscapableofperformingavarietyofoftencomplexhumantasksoncommandorbybeingprogrammedinadvance."Thisisevenworsethanwhatwehadanditseemsthatawashingmachineshouldstillbeconsideredarobot.

Theinherentproblemwiththesedefinitionsisthattheytrytocapturevastamountofmachinesthatwecallrobotsthesedays.Theresultisthatit'sverydifficult,ifnotimpossible,tocomeupwithadefinitionthatwillbecomprehensiveenoughandnotincludeawashingmachineatthesametime.JohnEngelberger,founderoftheworld'sfirstroboticscompanyandindustrialrobotics(asweknowittoday)oncefamouslysaid,"Ican'tdefinearobot,butIknowonewhenIseeone."

So,isitevenpossibletodefinearobot?Maybenotingeneral.However,ifwelimitourselvesjusttothescopeofthisbook,theremaybeadefinitionthatwillsuitourneedswellenough.InherveryniceintroductorybookonthesubjectofroboticscalledTheRoboticsPrimer(whichwealsohighlyrecommend),MajaJ.Mataricusesthefollowingdefinition:

"Arobotisanautonomoussystemwhichexistsinthephysicalworld,cansenseitsenvironment,andcanactonittoachievesomegoals."

Atfirstsight,itmightnotseemlikeavastimprovementoverwhatwehavesofar,butlet'sdissectitpartbyparttoseewhetheritmeetsourneeds.

Thefirstpartsays,"Arobotisanautonomoussystem".Byautonomous,wemeanthatarobotmakesdecisionsonitsown—it'snotcontrolledbyahuman.Thisalreadyseemstobeanimprovementasitweedsoutanymachinethat'scontrolledbysomeone(suchasourfamouswashingmachine).Robotsthatwewilltalkaboutthroughoutthisbookmaysometimeshavesomesortofaremotefunction,whichallowsahumantocontrolitremotely,butthisfunctionalityisusuallybuilt-inassortofasafetymeasuresothatifsomethinggoeswrongandtherobot'sautonomoussystemsfailstobehaveaswewouldexpectthemto,it'sstillpossibletogettherobottosafetyanddiagnoseitsproblemsafterwards.However,themaingoalstillstaysthesame,thatis,tobuildrobotsthatcantakesomedirectionfromhumansandareabletoactandfunctionontheirown.

However,justbeinganautonomoussystemwillcertainlynotbeenoughforarobotinthisbook.Forinstance,wecanfindmanycomputerprogramsthatwecancallautonomoussystems(theyarenotcontrolledbyanindividualandmakedecisionsontheirown)andyetwedonotconsiderthemtoberobots.

Togetaroundthisobstacle,weneedtheotherpartofthesentencethatsays,"whichexistsinthephysicalworld".

Giventherecentadvancesinthefieldsofartificialintelligenceandmachinelearning,thereisnoshortageofcomputersystemsthatactontheirownandperformsomeworkforus,whichiswhatrobotsshouldbefor.Asaquitenotoriousexample,let'sconsiderspamfilters.Thesearecomputerprogramsthatreadeverye-mailthatreachesyoure-mailaddressanddecideswhetheryoumaywanttoreadit(andthatthee-mailisindeedlegitimate)orwhetherit'syetanotherexampleofanunwantede-mail.

Thereisnodoubtthatsuchasystemishelpful(ifyoudisagree,trytoreadsomeofthee-mailsinyourSpamfolder—Iamprettysureitwillbeaboringread).It'sestimatedthatover60percentofalle-mailtrafficin2014canbeattributedtospame-mails.Beingabletoautomaticallyfilterthemcansaveusalotofreadingtime.Also,asthereisanohumaninvolvedinthedecisionprocess(although,wecanhelpitbymarkingane-mailasspam),wecancallsuchasystemasautonomous.Still,wewillnotcallitatruerobot.Rather,wecallthem"softwarerobots"orjust"bots"(thefactthattheirnameisshortermaycomefromthefactthattheyareshortofthephysicalpartsoftruerobots).

Whilesoftwarerobotsaredefinitelyaninterestinggrouponitsown,it'sthephysicalworldinwhichrobotsoperatethatmakestheprocessofcreatingthemsoexcitinganddifficultatthesametime.

Whencreatingasoftwarerobot,youcancountonthefactthattheenvironmentitwillrunin(usuallytheoperatingsystem)willbequitestable(asin,nottoomanythingsmaychangeunexpectedly).However,whenyouarecreatingarealrobot,youcanneverbesure.

Thisiswhyarealrobotneedstoknowwhatishappeningintheenvironmentinwhichitoperates.Also,thisiswhythenextpartofthedefinitionsays,"cansenseitsenvironment".

Sensingwhatishappeningaroundarealrobotisarguablyitsmostimportantfeature.Tosensetheirsurroundingenvironments,robotsusuallyhavesensors.Thesearedevicesthatmeasurephysicalcharacteristicsoftheenvironmentandprovidethisinformationbacktotherobotsothatitcan,forinstance,reacttosuddenchangesoftemperature,humidity,orpressure.Thisisquiteabigdifferencefromsoftwarerobots.Whiletheyjustgettheinformationtheyneedinordertooperatesomewhatmagically,realrobotsneedtohaveasubsystemorsubsystemsthattakecareofobtainingthisinformation.Ifwelookatthedifferencesbetweenrobotsandhumans,wewillnotfindmany(inourveryhigh-levelview,ofcourse).Wecanthinkofsensoringsubsystemsasartificialreplacementsforhumanorgansthatprovidethissortofinformationtothebrain.

Oneimportantconsequenceofthisdefinitionisthatanythingthatdoesnotsenseitsenvironmentcannotbecalledarobot.Thisincludesanydevicesthatjust"driveblind"ormoveinarandomfashionbecausetheydonothaveanyinformationfromtheenvironmenttobasetheirbehavioron.

Anyroboticistwilltellyouthatrobotsareveryexcitingmachines.Manywillalsoarguethatwhatmakesthemsoexcitingisactuallytheirabilitytointeractwiththeoutsideworld(whichistomoveorotherwisechangetheenvironmenttheyarein).Withoutthis,theyarejustanotherstaticmachinethatmightbeuseful,butratherunexciting.

Ourdefinitionofarobotreflectsthisinitslastpartwhenitsays,"canactonittoachievesomegoals".

Actingontheenvironmentmightsoundlikeaverycomplextaskforarobot,butinthiscase,itjustmeanschangingtheworldinsome(evenveryslight)way.Wecallthesepartsofrobotsthatperformthisaseffectors.Ifwelookatourrobotvshumancomparison,effectorsaretheartificialequivalentsofhands,legs,andotherbodypartsthatallowittomove.Effectorsmakeuseofsomelower-levelsystemssuchasmotorsormusclesthatactuallycarryoutthemovement.Wecallthemactuators.Although,theartificialonesmayseemtofunctionsimilartothebiologicalones,acloserlookwillrevealthattheyareactuallyquitedifferent.

Youmayhavenoticedthatthispartisnotonlyaboutactingontherobot'senvironment,butalsoaboutachievingsomegoals.Whilemanyhobbyroboticistsbuildrobotsjustforthefunofit,mostrobotsarebuiltinordertocarryout(or,shouldwerathersay,tohelpwith)sometasks,suchasmovingheavypartsinafactoryorlocatingvictimsinareasaffectedbynaturaldisasters.

Aswesaidbefore,asystemoramachinethatbehavesrandomlyanddoesnotuseinformationfromitsenvironmentcannotreallybeconsideredarobot.However,howcanitusetheseinformationsomehow?Theeasiestthingtodoistodosomethinguseful,whichwecanrephraseastryingtoreachsomegoalthatweconsideruseful,whichinturnbringsusbacktoourdefinition.Agoalofarobot

doesnotnecessarilyneedtobesomethingascomplexandambitiousas"hardlaborforhuman".Itcaneasilybesomethingsimple,suchas"donotbumpintoobstacles"or"turnthelightswitchon".

Now,aswehaveatleastaslightideaofwhatarobotis,wecanmoveontobrieflydiscusswhererobotscomefrom,inotherwords,thehistoryofrobotics.

Wheredorobotscomefrom?Asthetitlesuggests,thispartofthechaptershouldbeaboutthehistoryofrobots.Wealreadyknowafewquiteimportantfacts,suchasthetermrobotwascoinedbyaCzechauthorKarelČapekin1920.Asitturnsout,therearemanymoreinterestingeventsthathappenedovertheyears,otherthanthisone.Inordertokeepthingsorganized,let'sstartfromthebeginning.

It'squitedifficulttopinpointaprecisedateinhistory,whichwecanmarkasthedateofbirthofthefirstrobot.Forone,wehaveestablishedquitearestrictivedefinitionofarobotpreviously;thus,wewillhavetowaituntilthe20thcenturytoactuallyseearobotinthepropersenseoftheword.Untilthen,let'satleastdiscussthehonorablementions.

Thefirstonethatcomesclosetoarobotisamechanicalbirdcalled"ThePigeon".ThiswaspostulatedbyaGreekmathematicianArchytasofTarentuminthe4thcenturyBCandwassupposedtobepropelledbysteam.Itcannotnotbeconsideredarobotbyourdefinition(notbeingabletosenseitsenvironmentalreadydisqualifiesit),butitcomesprettycloseforitsage.Overthefollowingcenturies,thereweremanyattemptstocreateautomaticmachines,suchasclocksmeasuringtimeusingtheflowofwater,life-sizedmechanicalfigures,orevenfirstprogrammablehumanoidrobots(itwasactuallyaboatwithfourautomaticmusiciansonit).Theproblemwithalltheseisthattheyareverydisputableasthereisverylittle(ornone)historicallytrustworthyinformationavailableaboutthesemachines.

ItwouldhavestayedlikethisforquitesometimeifitwasnotforLeonardoDaVinci'snotebooksthatwererediscoveredin1950s.Theycontainacompletedrawingofa1945humanoid(afancywordforamechanicaldevicethatresemblehumans),whichlookslikeanarmoredknight.Itseemsthatitwasdesignedsothatitcouldsitup,waveitsarms,moveitshead,andmostimportantly,amuseroyalty.Inthe18thcentury,followingtheamusementline,JacquesdeVaucansoncreatedthreeautomata:afluteplayerthatcouldplaytwelvesongs,atambourineplayer,andthemostfamousone,"TheDigestingDuck".Thisduckwascapableofmoving,quacking,flappingwings,oreveneatinganddigestingfood(notinawayyouwillprobablythink—itjustreleasedmatterstoredinahiddencompartment).Itwasanexampleof"movinganatomy"—modelinghumanoranimalanatomyusingmechanics.

Ourlistwillnotbecompleteifweomittedtheserobot-likedevicesthatcameaboutinthefollowingcentury.Manyofthemwereradio-controlled,suchasNikolaTesla'sboat,whichheshowcasedatMadisonSquareGardeninNewYork.Youcouldcommandittogoforward,stop,turnleftorright,turnitslightsonoroff,andevensubmerge.Allofthisdidnotseemtooimpressiveatthattimebecausethepressreportsattributeditto"mindcontrol".

Atthispoint,wehaveonceagainreachedthetimewhenthetermrobotwasusedforthefirsttime.Aswesaidmanytimesbefore,itwasin1920whenKarelČapekuseditinhisplay,R.U.R.Twodecadeslater,anotherveryimportanttermwascoined.IssacAsimovusedthetermroboticsforthefirsttimeinhisstory"Runaround"in1942.Asimovwrotemanyotherstoriesaboutrobotsandisconsideredtobeaprominentsci-fiauthorofhistime.

However,intheworldofrobotics,heisknownforhisthreelawsofrobotics:

Firstlaw:Arobotmaynotinjureahumanbeingorthroughinactionallowahumanbeingtocometoharm.SecondLaw:Arobotmustobeytheordersgiventoitbyhumanbeings,exceptwheresuchorderswouldconflictwiththefirstlaw.Thirdlaw:Arobotmustprotectitsownexistence,aslongassuchprotectiondoesnotconflictwiththefirstorsecondlaw.

Afterawhile,headdedazerothlaw:

Zerothlaw:Arobotmaynotharmhumanityorbyinactionallowhumanitytocometoharm.

Theselawssomehowreflectthefeelingspeoplehadaboutmachinestheycalledrobotsatthattime.Seeingenslavementbysomesortofintelligentmachineasarealpossibility,theselawsweresupposedtobesomesortofguidingprinciplesoneshouldatleastkeepinmind,ifnotdirectlyfollow,whendesigninganewintelligentmachine.Also,whilemanywereafraidoftherobotapocalypse,timehasshownthatit'sstillyettocome.Inorderforittotakeplace,machineswillneedtogetsomesortofintelligence,someabilitytothink,andactbasedontheirthoughts.Also,whilewecanseethatoverthecourseofhistory,themechanicalsideofrobotswentthroughsomedevelopment,theintelligencesimplywasnotthereyet.

Thiswaspartofthereasonwhyinthesummerof1956,agroupofverywisegentlemen(whichincludedMarvinMinsky,JohnMcCarthy,HerbertSimon,andAllanNewell)werelatercalledtobethefoundingfathersofthenewlyfoundedfieldofArtificialIntelligence.Itwasatthisveryeventwheretheygottogethertodiscusscreatingintelligenceinmachines(thus,thetermartificialintelligence).

Although,theirgoalswereveryambitious(somesourcesevenmentionthattheirideawastobuildthiswholemachineintelligenceduringthatsummer),ittookquiteawhileuntilsomeinterestingresultscouldbepresented.

OnesuchexampleisShakey,arobotbuiltbytheStanfordResearchInstitute(SRI)in1966.Itwasthefirstrobot(inourmodernsenseoftheword)capabletoreasonitsownactions.Therobotsbuiltbeforethisusuallyhadalltheactionstheycouldexecutepreprogrammed.Ontheotherhand,Shakeywasabletoanalyzeamorecomplexcommandandsplititintosmallerproblemsonhisown.ThefollowingimageofShakeyistakenfromhttps://en.wikipedia.org/wiki/File:ShakeyLivesHere.jpg:

Shakey,restingintheComputerHistoryMuseuminMountainView,California

Hishardwarewasquiteadvancedtoo.Hehadcollisiondetectors,sonarrangefinders,andatelevisioncamera.Heoperatedinasmallclosedenvironmentofrooms,whichwereusuallyfilledwithobstaclesofmanykinds.Inordertonavigatearoundtheseobstacles,itwasnecessarytofindawayaroundtheseobstacleswhilenotbumpingintosomething.Shakeydiditinaverystraightforwardway.

Atfirst,hecarefullyplannedhismovesaroundtheseobstaclesandslowly(thetechnologywasnotasadvancedbackthen)triedtomovearoundthem.Ofcourse,gettingfromastablepositiontomovementwouldn'tbepossiblewithoutsomeshakeymoves.TheproblemwasthatShakey'smovementsweremostlyofthisshakeynature,sohecouldnotbecalledanythingotherthanShakey.

ThelessonslearnedbytheresearcherswhoweretryingtoteachShakeyhowtonavigateinhisenvironmentturnedouttobeveryimportant.ItcomesasnosurprisethatoneoftheresultsoftheresearchonShakeyistheA*searchalgorithm(analgorithmthatcanveryefficientlyfindthebestpathbetweentwogoals).Thisisconsideredtobeoneofthemostfundamentalbuildingblocksnotonlyinthefieldofroboticsorartificialintelligence,butalsointhefieldofcomputerscienceasawhole.

Ourdiscussiononthehistoryofroboticscangoonandonforaverylongtime.Althoughonecandefinitelywriteabookonthistopic(asit'saveryinterestingone),it'snotthisbook;weshalltrytogetbacktothequestionwetriedtoanswer,whichwas:wheredorobotscomefrom?

Inanutshell,robotsevolvedfromtheverybasicmechanicalautomationthroughremotely-controlledobjectstodevicesorsystemsthatcanact(orevenadapt)ontheirowninordertoachievesomegoal.

Ifthissoundswaytoocomplicated,donotworry.Thetruthisthattobuildyourownrobot,youdonotreallyneedtodeeplyunderstandanyofthis.Thevastmajorityofrobotsyouwillencounterarebuiltfromsimplepartsthatarenotdifficulttounderstandwhenyouseethebigpicture.

So,let'sfigureouthowwewillbuildourownrobot.Let'sfindoutwhataretherobotsmadeof.

Whatcanwefindinarobot?Intheveryfirstpartofthischapter,wetriedtocomeupwithagood(modern)definitionofarobot.Itturnsoutthatthedefinitionwecameupwithdoesnotonlydescribearobotasweknowit(orwouldliketoknowit),butalsogivesussomegreatpointersastowhatpartscanwemostdefinitelyfindin(oron)arobot.Let'sseeourdefinitionagain:

"Arobotisanautonomoussystemwhichexistsinthephysicalworld,cansenseitsenvironment,andcanactonittoachievesomegoals."

So,whatwillthesemostimportantpartsbe?Hereiswhatwethinkshouldbeonthislist.

ThephysicalbodyItwillbehardforarobottoexistinthephysicalworldwithoutaphysicalbody.Whilethisobviouslyhasitsadvantages(havingarealworldrobotyoucanplaywithismuchmoreexcitingthanhavingacomputersimulation),thereisalsosomepricetobepaid.Forinstance,aphysicalrobotcanonlybeatoneplaceatatime,cannotreallychangeitsshape,anditsfunctionsarequitelimitedbyhowitsbodylooks.Asitsenvironmentwillbethephysicalworld,it'ssafetoassumethattherobotwillnotbetheonlyobjectinit.Thisalreadyposessomechallenges,suchasmakingsurethattherobotwon'trunintosomewall,object,human,orevenanotherrobot.Also,inordertodothis,therobotneedstobeable,asthedefinitionsays,tosenseitsenvironment.

SensorsWealreadydiscussedinquitesomedepthabouthowimportantarobot'ssensorsarebecausewithoutthem,hewouldbejustlost.Agoodquestiontoaskmightbe,"So,whatdoesarobotactuallysense?".Asinmanyotherplaces(inscienceandtechnology),itdependsonwhattherobot'spurposeandgoalinagivenenvironmentis,thedesignoftherobot,andtheamountofpoweritconsumes,andsoon.Agoodrobotdesignerandprogrammertriestotakeallthesedependenciesintoaccountsothatintheend,thefinalrobotcanhavetherightamountofinformationaboutitsenvironmenttofulfillitspurposeandreachitsgoals.

Oneimportantnotionwithregardstosensingisthatofastate.Astateofarobotbasicallymeansadescriptionofallitsparametersatanygiventime.Forinstance,ifweconsiderarobottohavesomesoundsensors(thankstowhichitcouldmeasurethenoiselevelinitsenvironment),butnowayoffiguringouthowmuchbatterypowerdoesithaveleft,wecancallitsstatepartially-observable.Ontheotherhand,ifithadasensorforeveryoutputoftherobotandeveryphysicalcharacteristicoftheenvironmenttherobotresidesin,wecancallsuchastatefullyobservable.

Nowthatweknowthestateoftherobotintheenvironment,ourrobotneedssomethingthatcanbeusedtoleavesomeeffectonitsenvironment.Somethinglikeaneffector.

Effectors

Wealreadytouched(albeitbriefly)onthetopicofeffectorswhenweweretryingtodecipherpartsofourdefinitionofarobot,sowealreadyknowthateffectorslettherobotdophysicalthingsandthesmallsubpartsofthem,actuators,areactuallythosethatdotheheavylifting.

Whatwedidnotmentionwasthat,historically,therearetwomainactivitieseffectorscanhelpwith:locomotionandmanipulation.

Ingeneral,locomotionmeansmovingaround:goingfrompointAtopointB.Thisisofgreatinterestinasubfieldofrobotics,whichiscalledmobilerobotics.Thisareaofresearchisconcernedwithallsortsofrobotsthatmoveintheair,underwater,orjustontheground.

Bymanipulation,wemeanaprocessofmovinganobjectfromoneplacetoanother.Thisprocessisofhugeinteresttomanipulatorrobotics,whichisconcernedmostlywithallsortsofroboticarmsthatinthevastmajorityofcases,areusedinindustry.

Justforthesakeofcompleteness,whatarethedifferenteffectorsourrobotscanmakeuseof?Amongthemostbasicones,itwilldefinitelybemotorsofallsortsalongwithsomewheelsthatwillallowtherobottomovearound.

Oncewehavedatafromtheenvironment,wecanalsoactonit.Thereisjustonepiecemissinghere:thelinkbetweenthem.

ControllersAfterall,wefinallycametotheconclusionofthiswholesystem.Ifitwasnotforcontrollers,arobotcouldnevereverbefullyautonomous.Thisistousedatafromsensorstodecidewhattodonextandthenexecutesomeactionsusingeffectors.Thismaylooklikeasimpledescription,butintheend,itturnsoutthatcontrollersarequitedifficulttogetright,especiallywhenyouareplayingwiththemforthefirsttime.

Formostmobilerobotsandvastmajorityofhobbyrobots,controllersareusuallymicroprocessorsthatareprogrammedinsomelow-levelprogramminglanguage.It'salsonotuncommonforarobottousemultiplecontrollers.However,whileitdefinitelyhelpstohaveabackupcontrollerreadyincaseyourmainonebrakesdownandgreattohaveamodularsysteminwhicheverythingisitsownmodule(andhasitsowncontroller),youdonotgetthisforfree.Thepriceyouhavetopayisthecommunicationbetweencontrollers,whichrequiresagooddealofexpertise.

Nowthatwehaveallthebuildingblocksforarobotready,weshouldatleastbrieflydiscussthewaysinwhichtheycanbeorganized.Thismightnotseemimportant,butitturnsoutthathavingagooddesignupfrontcansaveusalotofeffort,energy,andresources.So,let'sdiveintohowwecanputarobottogetherarchitecturally.

Howdowebuildarobot?Ifwetrytolookatthepartsofarobotfromthepreviouspartofthischapterinanabstractfashion,thereareessentiallythreeprocessestakingplace:sensing(donebysensors),acting(donebyeffectors),andthenplanning(ifthereisany,it'sdonebycontrollers).Dependingonhowweputthesethreeprocessestogether(astheyarethebuildingblockstheyarealsocalledprimitives),wecangetdifferentarchitectureswithdifferentproperties.Let'satleastsaysomethingaboutthethreeverybasicarchitectures(alsocalledparadigms).

ReactivecontrolReactivecontrolisprobablythesimplestarchitecture(orparadigm)onecanputtogetherwiththeprimitivesdescribedpreviously.Inthisparadigm,aswecanseeinthefollowingfigure,thereisnoplanningprocessinvolved.Thereisadirectconnectionbetweensensingandacting,whichmeansthatassoonassomesensorydatacomesin,theeffectorsactontheenvironmentinsomepredefinedway:

Justasthereflexesinyourbodydonotsendtheinformationaboutsomethinghappeningallthewayuptothebrain(whichwouldbequiteslow),butratherjusttothenearestspinalcordsothattheresponsecouldbefast,areactively-controlledrobotwillnothaveanycomplexcomputation,butfast,precomputedactionsthatwillbestoredsomewhere.

Hierarchical(deliberative)controlSupposeyouwereprogrammingachessplayingrobotwiththerulesofordinarychess,itwouldbeyourrobot'sturn,thenyourrobot'sopponent's,andsoon.It'sobviousthatinasettinglikethis,yourrobotdoesnotreallyneedtobeextremelyfast.However,itwillbegreatifitdidsomeplanningaboutthefuturesothatitcananticipatethefutureopponent'sturnsandthenadjustitsstrategy,basedontheopponent'scurrentturn.

Asetuplikethiswillbeperfectforhierarchical(ordeliberative)controlparadigm.Asyoucanseeinthefollowingfigure,theloopofplanning,acting,andsensingisclosed.Thus,thesystemcanactivelymovetowardsitsgoal,whateverthatmightbe:

HybridcontrolSofar,wediscussedcontrolparadigmsthatwaseitherfastbutnotveryflexible,orsmartbutquiteslow.Whatwewillreallyneedinmanycasesissomethinginbetween.Also,thisispreciselywhatahybridcontrolparadigmtriestooffer.

Howcanweusethisinareal-liferobot?Supposewewanttobuildaroboticwaiterthatwouldservedrinksinacoffeeshop(coincidentally,thatiswhatmostofthisbookisabout).Suchawaiterwoulddefinitelyneedtohaveitsowninternalrepresentationofthecoffeeshop(wherearethetablesandchairslocated,andsoon).Onceit'sgivenataskofdeliveringacupofcoffeetoagivencustomer,itwillhavetoplanitspathandthenmovealongsidethatpath.Aswecanexpectthiscoffeeshoptobequiteagoodone,theremaybeotherguestsinsidetoo.Wecannotletourrobotbumpintoanychairoratable,letalonecollidingwithacustomerrandomlywhileit'stryingtodelivercoffee.Forthis,weneedawelltunedreactivecontroller.

Thefollowingfigureshowstheschematicsofthehybridcontrolparadigm.Wecanseethattherobotatfirstplansitstask,butbreaksitdownitintoseriesofactionsthatcanbeexecutedbythereactiveparadigm.Oneinterestingthingtonotehereisthefactthatthesensorydataisavailabletoaidtheplanning(asitneedstodosomeplanning)andtheacting(asitdoesthereactivecontrol)partsofthesystem:

That'saboutit!Now,youknowwhatarobotis,whatmakesitarobot,whereitcamefrom,thepartsneededtocreatearobot,andhowyoucanarchitecturallyputittogether.It'sabouttimeyoubuildoneyourself!

SummaryInthischapter,youlearnedwhatarobotactuallyisandwherethistermcamefrom.Wedidourbesttodefinearobotasanautonomousmachinethatexistsinaphysicalworld,cansenseitsenvironment,andcanactonittoachievesomegoals.Wealsowentthroughabriefhistoryofthefieldofroboticsanddiscoveredthatmanyinterestingmachineswerebuiltpriortotheeraofrealrobots(fromourdefinition).Lateron,wediscussedthebasicbuildingblocksofarobot,thatis,effectors,sensors,andcontrollers,whichcanbecombinedinnumerousways.Finally,wedugabitdeeperintothearchitectureofcontrolsystemsthatareusefultokeepinmindwhendesigningarobot.

Inthenextchapter,wewillfinallyseesomerealrobotsalongwitharealprogramminglanguage.

Chapter2.MechanicalDesignofaServiceRobotThemainpurposeofthisbookistolearnroboticsbydesigningandbuildingrobotsandprogrammingitusingPython.Tolearnrobotics,wewillfirstlookathowtomechanicallydesignarobotfromscratch.Therobotthatwearegoingtobuildisusedasaservicerobotinhotelsandrestaurantstoservefoodanddrinks.

Inthischapter,wecanseevariousmechanicalcomponentsusedinthisrobot.Also,wecanseehowtoassembleitscomponents.WecandesignandassemblethepartsusingCADtoolandalsobuilda3Dmodelofrobotforsimulatingtherobot.

Theactualrobotdeployedinhotelsmaybebig,buthereweareintendingtobuildaminiatureversionofitonlyfortestingourtechnology.Ifyouareinterestedtobuildarobotfromscratch,thischapterisforyou.Ifyouarenotinterestedtobuildtherobot,youcanchoosesomeroboticplatformsalreadyavailableonthemarkettoworkwiththisbook.

Tobuildtherobotbody,wefirstneedtoknowtherequirementsofdesigningtherobot;aftergettingtherequirements,wecandesignitanddrawthemodelin2DCADtoolstomanufacturetherobotparts.Wecanalsodiscussthe3Dmodeltosimulatetherobotforthenextchapter.

TheRequirementsofaservicerobotBeforedesigninganyroboticsystem,thefirstprocedureistoidentifyitsrequirements.Thefollowingareasetofhardwarerequirementstobemetbythisrobot:

TherobotshouldhaveaprovisiontocarryfoodTherobotshouldbeabletocarryamaximumpayloadof5kgTherobotshouldtravelataspeedbetween0.25m/sand1m/sThegroundclearanceoftherobotshouldbegreaterthan3cmTherobotmustbeabletoworkfor2hourscontinuouslyTherobotshouldbeabletomoveandsupplyfoodtoanytableavoidingobstaclesTherobotheightshouldbebetween40cmand1meterTherobotshouldbeoflowcost

Now,wecanidentifythemechanicaldesignrequirementssuchaspayload,movingspeed,groundclearance,robotheight,andthecostoftherobot.Wewilldesignthebodyandselectcomponentsaccordingly.Let'sdiscusstherobotmechanismwecanusetomatchtheserequirements.

RobotdrivemechanismOneofthecosteffectivesolutionformobilerobotnavigationisdifferentialdrivesystems.It'soneofthesimplestdrivemechanismsforamobilerobotthatismainlyindentedforindoornavigation.Thedifferentialdriverobotconsistsoftwowheelsmountedonacommonaxiscontrolledbytwoseparatemotors.Therearetwosupportingwheelscalledcasterwheels.Itensuresstabilityandweightdistributionoftherobot.Thefollowingdiagramshowsatypicaldifferentialdrivesystem:

Differentialdrivesystem

Thenextstepistoselectthemechanicalcomponentsofthisrobotdrivesystem,thatis,mainlymotors,wheels,androbotchassis.Basedontherequirements,wewillfirstdiscusshowtoselectthemotor.

SelectionofmotorsandwheelsMotorsareselectedafterlookingattheirspecifications.SomeoftheimportantparametersformotorselectionaretorqueandRPM.Wecancomputethesevaluesfromthegivenrequirements.

CalculationofRPMofmotors

Assumetherequiredrobot'sspeedas0.35m/s.Wesawthespeedofrobotmustbewithin0.25m/sto1m/s,aspertherequirement.Takethediameterofthewheelas9cmbecauseaccordingtotherequirement,thegroundclearanceshouldbegreaterthan3cm.Usingthefollowingequation,wecancalculatetheRPMofmotors:

RPM=((60*Speed/(3.14*DiameterofWheel)

RPM=(60*0.35)/(3.14*0.09)=21/0.2826=74RPM

Tip

Youcanalsotakealookathttp://www.robotshop.com/blog/en/vehicle-speed-rpm-and-wheel-diameter-finder-9786forcomputation.

ThecalculatedRPMwith9cmdiameterwheeland0.35m/sspeedis74RPM.Wecanconsider80RPMasthestandardvalue.

Calculationofmotortorque

Let'scalculatethetorquerequiredtomovetherobot:

1. Noofwheels=Fourwheelsincludingtwocasterwheels.2. Noofmotors=Two.3. Let'sassumethecoefficientoffrictionis0.6andradiusofwheelis4.5cm.4. Taketotalweightofrobot=weightofrobot+payload=(W=mg)=(~100N+~50N)W=~

150N,whereastotalmass=15Kg5. Theweightactingonthefourwheelscanbewrittenas2*N1+2*N2=W,thatis,N1isthe

weightactingoneachcasterwheelandN2oneachmotorwheel.6. Assumethattherobotisstationary.Themaximumtorqueisrequiredwhentherobotstarts

moving.Itshouldalsoovercomefriction.7. Wecanwritethefrictionalforceasrobottorque=0untiltherobotmoves.Ifwegettherobot

torqueinthiscondition,wegetthemaximumtorqueasfollows:

µ*N*r-T=0,whereµisthecoefficientoffriction,Nistheaverageweightactingoneachwheel,ristheradiusofwheels,andTisthetorque.

N=W/4(assumingthattheweightoftherobotisequallydistributedonallthefourwheels)

Therefore,weget:

0.6*(150/4)*0.045-T=0

Hence,T=1.0125N-mor10.32Kg-cm

ThedesignsummaryAfterdesign,wecalculatedthefollowingvalues:

MotorRPM=80MotorTorque=10.32kg-cmWheeldiameter=9cm

RobotchassisdesignAftercomputingtherobot'smotorandwheelparameters,wecandesigntherobotchassisorrobot

body.Asrequired,therobotchassisshouldhaveaprovisiontoholdfood,itshouldbeabletowithstandupto5kgpayload,thegroundclearanceoftherobotshouldbegreaterthan3cmanditshouldbelowincost.Apartfromthis,therobotshouldhaveaprovisiontoplaceelectronicscomponentssuchasPersonalComputer(PC),sensors,andbattery.

Oneoftheeasiestdesignstosatisfytheserequirementsisatable-likedesign.TheTurtleBot(http://www.turtlebot.com/)designisakindoftable-likedesign.Ithasthreelayersinthechassis.ArobotplatformcalledRoombaisthedrivemechanismofthisplatform.TheRoombaplatformhasmotorsandsensorsinbuilt,sononeedtoworryaboutthedesigningofrobothardware.ThefollowingfigureshowstheTurtleBotrobotchassisdesign:

TurtleBotRobot

WewilldesignarobotsimilartoTurtleBotwithourownmovingplatformandcomponents.Ourdesignwillalsohaveathreelayerarchitecture.Let'sseewhatalltoolswewantbeforewestartdesigning.

Beforewestartdesigningtherobotchassis,weneedtoknowaboutComputer-aideddesign(CAD)tools.ThepopulartoolsavailableforCADare:

SolidWorks(http://www.solidworks.com/default.htm)AutoCAD(http://www.autodesk.com/products/autocad/overview)Maya(http://www.autodesk.com/products/maya/overview)Inventor(http://www.autodesk.com/products/inventor/overview)GoogleSketchUp(http://www.sketchup.com/)Blender(http://www.blender.org/download/)LibreCAD(http://librecad.org/cms/home.html)

Thechassisdesigncanbedesignedusinganysoftwareyouarecomfortablewith.Here,wewilldemonstratethe2DmodelinLibreCADandthe3DmodelinBlender.OneofthehighlightsoftheseapplicationsisthattheyarefreeandavailableforallOSplatforms.Wewillusea3DmeshviewingtoolcalledMeshLabtoviewandcheckthe3DmodeldesignanduseUbuntuasthemainoperatingsystem.Also,wecanseetheinstallationproceduresoftheseapplicationsinUbuntu14.04.2tostartthedesigningprocess.Wewillprovidetutoriallinkstoinstallapplicationsinotherplatformstoo.

InstallingLibreCAD,Blender,andMeshLabLibreCADisafree,opensource2DCADapplicationforWindows,OSX,andLinux.Blenderisafree,opensource3Dcomputergraphicssoftwareusedtocreate3Dmodels,animation,andvideogames.ItcomeswithaGPLlicenseasperwhichuserscanshare,modify,anddistributetheapplication.MeshLabisanopensource,portable,andextensiblesystemtoprocessandeditunstructured3Dtriangularmeshes.

ThefollowingarethelinkstoinstallLibreCADinWindows,Linux,andOSX:

Visithttp://librecad.org/cms/home.htmltodownloadLibreCADVisithttp://librecad.org/cms/home/from-source/linux.htmltobuildLibreCADfromsourceVisithttp://librecad.org/cms/home/installation/linux.htmltoinstallLibreCADinDebian/UbuntuVisithttp://librecad.org/cms/home/installation/rpm-packages.htmltoinstallLibreCADinFedoraVisithttp://librecad.org/cms/home/installation/osx.htmltoinstallLibreCADinOSXVisithttp://librecad.org/cms/home/installation/windows.htmltoinstallLibreCADinWindows

Note

WecanfindthedocumentationonLibreCADatthefollowinglink:

http://wiki.librecad.org/index.php/Main_Page.

InstallingLibreCADTheinstallationprocedureforalloperatingsystemsisprovided.IfyouareanUbuntuuser,youcansimplyinstallitfromtheUbuntuSoftwareCentreaswell.

InstallingBlenderVisitthefollowingdownloadpagetoinstallBlenderforyourOSplatform:http://www.blender.org/download/.YoucanfindthelatestversionofBlenderhere.Also,youcanfindthelatestdocumentationonBlenderathttp://wiki.blender.org/.

IfyouareusingUbuntu/Linux,youcansimplyinstallBlenderviaUbuntuSoftwareCentre.

InstallingMeshLabMeshLabisavailableforallOSplatforms.ThefollowinglinkwillprovideyouthedownloadlinksofprebuiltbinariesandsourcecodeofMeshLab:

http://meshlab.sourceforge.net/

IfyouareanUbuntuuser,youcaninstallMeshLabfromanaptpackagemanagerusingthefollowingcommand:

$sudoapt-getinstallmeshlab

Creatinga2DCADdrawingoftherobotusingLibreCADWecantakealookatthebasicinterfaceofLibreCAD.ThefollowingscreenshotshowstheinterfaceofLibreCAD:

ACADtoolbarhasthenecessarycomponentstodrawamodel.ThefollowingscreenshotshowsthedetailedoverviewoftheCADtoolbar:

AdetaileddescriptionofLibreCADtoolsisavailableatthefollowinglink:

http://wiki.librecad.org/index.php/LibreCAD_users_Manual.

CommandBox:Thisisusedtodrawfiguresbyonlyusingcommands.Wecandrawdiagramswithouttouchinganytoolbar.Adetailedexplanationabouttheusageofthecommandboxcanbefoundat:

http://wiki.librecad.org/index.php/A_short_manual_for_use_from_the_command_line.LayerList:Thiswillhavelayersusedinthecurrentdrawing.Abasicconceptincomputer-aideddraftingistheuseoflayerstoorganizeadrawing.Adetailedexplanationoflayerscanbefoundat:

http://wiki.librecad.org/index.php/Layers.Block:Thisisagroupofentitiesandcanbeinsertedinthesamedrawingmorethanoncewithdifferentattributesatdifferentlocations,differentscale,androtationangle.AdetailedexplanationofBlockscanbefoundatthefollowinglink:

http://wiki.librecad.org/index.php/Blocks.AbsoluteZero:Thisistheoriginofthedrawing(0,0).

Now,startsketchingbysettingtheunitofdrawing.Setthedrawingunittocentimeter.OpenLibreCAD,navigatetoEdit|ApplicationPreference.SetUnitasCentimeters,asshowninthefollowingscreenshot:

Let'sstartwiththebaseplatedesign.Thebaseplatehasprovisionstoconnectmotors,placebattery,andcontrolboard.

ThebaseplatedesignThefollowingfigureshowstherobot'sbaseplate.Thisplateprovidesprovisionsfortwomotorsfordifferentialdriveandeachcasterwheelonthefrontandbackofthebaseplate.MotorsarementionedasM1andM2inthediagramandcasterwheelsarerepresentedasC1andC2.Italsoholdsfourpolestoconnecttothenextplates.PolesarerepresentedasP1-1,P1-2,P1-3,andP1-4.ThescrewsareindicatedasSandwewillusethesamescrewshere.Thereisaholeatthecentertobringthewiresfromthemotortothetopoftheplate.Theplateiscutontheleft-handsideandtheright-handsidesothatthewheelscanbeattachedtothemotor.Thedistancefromthecentertocasterwheelsismentionedas12.5cmandthedistancefromthecentertomotorsismentionedas5.5cm.Thecenterofpolesisat9cminlengthand9cminheightfromthecenter.Theholesofalltheplatesfollowthesamedimensions:

Thedimensionsarenotmarkedonthediagram;instead,it'smentionedinthefollowingtable:

Parts Dimension(cm)(LengthxHeight)(radius)

M1andM2 5x4

C1andC2 Radius=1.5

S(Screw) 0.15

P1-1,P1-2,P1-3,P1-4 Outerradius0.7,Height3.5

LeftandRightWheelSections 2.5x10

Baseplate Radius=15

Wecandiscussmoreaboutmotordimensionsandclampdimensionslater.

Baseplatepoledesign

Thebaseplatehasfourpolestoextendtothenextlayer.Thepolesare3.5cminlengthwitharadiusof0.7cm.Wecanextendtothenextplatebyattachinghollowtubestothepoles.Atthetopofthehollowtube,wewillinsertahardplastictomakeascrewhole.Thisholewillbeusefultoextendtothetoplayer.Thebaseplatepoleandthehollowtubesoneachpoleisshowninthefollowingfigure.Eachhollowtubearadiusof0.75cmandlengthof15cm:

Wheel,motor,andmotorclampdesignWehavetodecidethediameterofthewheelandcomputemotorrequirements.Here,weareusingatypicalmotorandwheelthatwecanuseifthedesignissuccessful:

Themotordesigncanvaryaccordingtothemotorselection;ifnecessary,thismotorcanbetakenasperthedesignandcanbechangedaftersimulation.TheXvalueinthemotordiagramcanvaryaccordingtothespeedandtorqueofmotors.Thisisthegearassemblyofmotor.

Thefollowingfigureshowsatypicalwheelthatwecanusewithadiameterof90cm.Thewheelwithadiameterof86.5mmwillbecome90mmafterplacingthegrip.

Themotorneedstobemountedonthebaseplate;tomount,weneedaclampwhichcanbescrewedontotheplateandalsoconnectthemotortotheclamp.Thefollowingfigureshowsatypicalclampwecanuseforthispurpose.It'sanL-shapedclamp,withwhichwecanmountthemotorononesideandfitanothersidetotheplate:

Casterwheeldesign

Casterwheelsneednothaveaspecialdesign;wecanuseanycasterwheelthatcantouchthegroundsimilartothewheels.Thefollowinglinkhasacollectionofcasterwheelsthatwecanuseforthisdesign:

http://www.pololu.com/category/45/pololu-ball-casters

MiddleplatedesignThedimensionofthisplateissameasthebaseplate,andthescrewsizeisalsosimilar:

Themiddleplatecanbeheldabovethehollowtubesfromthebaseplate.Thisarrangementisconnectedusinganotherhollowtubethatextendsfromthemiddleplate.Thetubefromthemiddleplatewillhaveascrewatthebottomtofixthetubefromthebaseplatetothemiddleplate,andahollowendtoconnectthetopplate.Thetopandsideviewofthetubeextendingfromthemiddleplateisshowninthefollowingfigure:

Thistubewillconnectthemiddleplatetothebaseplateandatthesametimeprovideaprovisiontoconnectthetopplate.

TopplatedesignThetopplateissimilartootherplates;ithasfoursmallpolesof3cm,similartothebaseplate.Thesepolescanbeplacedonthehollowtubesfromthemiddleplate.Thefourpolesareconnectedtotheplate,shownasfollows:

Afterthetopplatedesign,therobotchassisdesignisalmostfinished;let'sseethe3DmodelbuildingofthisrobotusingBlender.The3Dmodelisbuiltforsimulationpurposeandthe2Ddesignwebuildismainlyformanufacturingpurpose.

Workingwitha3DmodeloftherobotusingBlenderInthissection,wewilldesigna3Dmodeloftherobot.The3Dmodelismainlyusedforsimulationpurpose.ThemodelingwillbedoneusingBlender.Theversionmustbegreaterthan2.6becauseweonlytestedthetutorialsontheseversions.

Thefollowingscreenshotshowstheblenderworkspaceandtoolsthatcanbeusedtoworkwith3Dmodels:

ThemainreasonwhyweareusingBlenderhereissothatwecanmodeltherobotusingPythonscripts.BlenderhasaninbuiltPythoninterpreterandaPythonscripteditorforcodingpurpose.WearenotdiscussingabouttheuserinterfaceofBlenderhere.WecanfindagoodtutorialofBlenderonitswebsite.RefertothefollowinglinktolearnaboutBlender'suserinterface:

http://www.blender.org/support/tutorials/

Let'sstartcodinginBlenderusingPython.

PythonscriptinginBlender

BlenderismainlywritteninC,C++,andPython.UserscanwritetheirownPythonscriptandaccessallthefunctionalitiesofBlender.IfyouareanexpertinBlenderPythonAPIs,youcanmodeltheentirerobotusingaPythonscriptinsteadofmanualmodeling.

BlenderusesPython3.x.Blender.PythonAPIisgenerallystable,butsomeareasarestillbeingaddedtoandimproved.Refertohttp://www.blender.org/documentation/blender_python_api_2_69_7/forthedocumentationonBlenderPythonAPI.

Let'sdiscussBlenderPythonAPIsthatwewilluseinourrobotmodelscript.

IntroductiontoBlenderPythonAPIsPythonAPIsinBlendercandomostofthefunctionalitiesofBlender.ThemainjobsthatcanbedonebytheseAPIsareasfollows:

EditanydatainsideBlender,suchasscenes,meshes,particles,andsoonModifyuserpreference,keymaps,andthemesCreatenewBlendertoolsDrawthe3DviewusingOpenGLcommandsfromPython

BlenderprovidesthebpymoduletothePythoninterpreter.Thismodulecanbeimportedinascriptandgivesaccesstoblenderdata,classes,andfunctions;scriptsthatdealwithBlenderdatawillneedtoimportthismodule.ThemainPythonmoduleswewilluseinbpyare:

ContextAccess:ThisprovidesaccesstoBlenderuserinterfacefunctionsfromthe(bpy.context)script.DataAccess:ThisprovidesaccesstotheBlenderinternaldata(bpy.data).Operators:ThisprovidesPythonaccesstocallingoperators,whichincludesoperatorswritteninC,Python,orMacros(bpy.ops).

ForswitchingtoscriptinginBlender,weneedtochangethescreenlayoutofBlender.ThefollowingscreenshotshowstheoptionthathelpsyoutoswitchtoScriptinglayout:

AfterselectingtheScriptingtab,wecanseeatexteditorandPythonconsolewindowinBlender.Inthetexteditor,wecancodeusingBlenderAPIsandalsotryPythoncommandsviathePythonconsole.ClickontheNewbuttontocreateanewPythonscriptandnameitrobot.py.Now,wecandesignthe3DmodelofrobotusingonlyPythonscripts.Theupcomingsectionhasthecompletescripttodesignourrobotmodel.Wecandiscussthecodebeforerunningit.WehopeyouhavereadthePythonAPIsofBlenderfromtheirsite.ThecodeintheupcomingsectionissplitintosixPythonfunctionstodrawthreerobotplates,drawmotorsandwheels,drawfoursupporttubes,andexportintotheSTereoLithography(STL)3Dfileformatforsimulation.

PythonscriptoftherobotmodelThefollowingisthePythonscriptoftherobotmodelthatwewilldesign:.

1. BeforestartingPythonscriptinBlender,wemustimportthebpymodule.ThebpymodulecontainsallthefunctionalitiesofBlenderanditcanonlybeaccessedfrominsidetheBlenderapplication:

importbpy

2. Thisfollowingfunctionwilldrawthebaseplateoftherobot.Thisfunctionwilldrawacylinderwitharadiusof5cmandcutaportionfromtheoppositesidessothatmotorscanbeconnectedusingtheBooleanmodifierinsideBlender:

#Thisfunctionwilldrawbaseplate

defDraw_Base_Plate():

3. Thefollowingtwocommandswillcreatetwocubeswitharadiusof0.05meteroneithersideofthebaseplate.Thepurposeofthesecubesistocreateamodifierthatsubtractsthecubesfromthebaseplate.Soineffect,wewillgetabaseplatewithtwocuts.Aftercuttingthetwosides,wewilldeletethecubes:

bpy.ops.mesh.primitive_cube_add(radius=0.05,location=(0.175,0,0.09))

bpy.ops.mesh.primitive_cube_add(radius=0.05,location=(-0.175,0,0.09))

####################################################

####################################################

#Addingbaseplate

bpy.ops.mesh.primitive_cylinder_add(radius=0.15,depth=0.005,location=

(0,0,0.09))

#Addingbooleandifferencemodifierfromfirstcube

bpy.ops.object.modifier_add(type='BOOLEAN')

bpy.context.object.modifiers["Boolean"].operation='DIFFERENCE'

bpy.context.object.modifiers["Boolean"].object=bpy.data.objects["Cube"]

bpy.ops.object.modifier_apply(modifier="Boolean")

######################################################

######################################################

#Addingbooleandifferencemodifierfromsecondcube

bpy.ops.object.modifier_add(type='BOOLEAN')

bpy.context.object.modifiers["Boolean"].operation='DIFFERENCE'

bpy.context.object.modifiers["Boolean"].object=

bpy.data.objects["Cube.001"]

bpy.ops.object.modifier_apply(modifier="Boolean")

###############################################################################

###############################

#Deselectcylinderanddeletecubes

bpy.ops.object.select_pattern(pattern="Cube")

bpy.ops.object.select_pattern(pattern="Cube.001")

bpy.data.objects['Cylinder'].select=False

bpy.ops.object.delete(use_global=False)

4. Thefollowingfunctionwilldrawthemotorsandwheelsattachedtothebaseplate:

#Thisfunctionwilldrawmotorsandwheels

defDraw_Motors_Wheels():

5. Thefollowingcommandswilldrawacylinderwitharadiusof0.045and0.01meterindepthforthewheels.Aftercreatingthewheels,itwillberotatedandtranslatedintothecutportionofthebaseplate:

#CreatefirstWheel

bpy.ops.mesh.primitive_cylinder_add(radius=0.045,depth=0.01,location=

(0,0,0.07))

#Rotate

bpy.context.object.rotation_euler[1]=1.5708

#Transalation

bpy.context.object.location[0]=0.135

#Createsecondwheel

bpy.ops.mesh.primitive_cylinder_add(radius=0.045,depth=0.01,location=

(0,0,0.07))

#Rotate

bpy.context.object.rotation_euler[1]=1.5708

#Transalation

bpy.context.object.location[0]=-0.135

6. Thefollowingcodewilladdtwodummymotorstothebaseplate.Thedimensionsofmotorsarementionedinthe2Ddesign.Themotorisbasicallyacylinderanditwillberotatedandplacedinthebaseplate:

#Addingmotors

bpy.ops.mesh.primitive_cylinder_add(radius=0.018,depth=0.06,location=

(0.075,0,0.075))

bpy.context.object.rotation_euler[1]=1.5708

bpy.ops.mesh.primitive_cylinder_add(radius=0.018,depth=0.06,location=

(-0.075,0,0.075))

bpy.context.object.rotation_euler[1]=1.5708

7. Thefollowingcodewilladdashafttothemotors,similartothemotormodel;theshaftisalsoacylinderanditwillberotatedandinsertedintothemotormodel:

#Addingmotorshaft

bpy.ops.mesh.primitive_cylinder_add(radius=0.006,depth=0.04,location=

(0.12,0,0.075))

bpy.context.object.rotation_euler[1]=1.5708

bpy.ops.mesh.primitive_cylinder_add(radius=0.006,depth=0.04,location=

(-0.12,0,0.075))

bpy.context.object.rotation_euler[1]=1.5708

###############################################################################

###############################

8. Thefollowingcodewilladdtwocasterwheelsonthebaseplate.Currently,weareaddingacylinderaswheel.Inthesimulation,wecanassignitasawheel:

#AddingCasterWheel

bpy.ops.mesh.primitive_cylinder_add(radius=0.015,depth=0.05,location=

(0,0.125,0.065))

bpy.ops.mesh.primitive_cylinder_add(radius=0.015,depth=0.05,location=

(0,-0.125,0.065))

9. ThefollowingcodewilladdadummyKinectsensor:

#AddingKinect

bpy.ops.mesh.primitive_cube_add(radius=0.04,location=(0,0,0.26))

10. Thisfunctionwilldrawthemiddleplateoftherobot:

#Drawmiddleplate

defDraw_Middle_Plate():

bpy.ops.mesh.primitive_cylinder_add(radius=0.15,depth=0.005,location=

(0,0,0.22))

#Addingtopplate

defDraw_Top_Plate():

bpy.ops.mesh.primitive_cylinder_add(radius=0.15,depth=0.005,location=

(0,0,0.37))

11. Thisfunctionwilldrawallthefoursupportinghollowtubesforallthethreeplates:

#Addingsupporttubes

defDraw_Support_Tubes():

###############################################################################

##############

#Cylinders

bpy.ops.mesh.primitive_cylinder_add(radius=0.007,depth=0.30,location=

(0.09,0.09,0.23))

bpy.ops.mesh.primitive_cylinder_add(radius=0.007,depth=0.30,location=

(-0.09,0.09,0.23))

bpy.ops.mesh.primitive_cylinder_add(radius=0.007,depth=0.30,location=

(-0.09,-0.09,0.23))

bpy.ops.mesh.primitive_cylinder_add(radius=0.007,depth=0.30,location=

(0.09,-0.09,0.23))

12. ThisfunctionwillexportthedesignedrobottoSTL.WehavetochangetheSTLfilepathbeforeexecutingthescript:

#ExportingintoSTL

defSave_to_STL():

bpy.ops.object.select_all(action='SELECT')

#bpy.ops.mesh.select_all(action='TOGGLE')

bpy.ops.export_mesh.stl(check_existing=True,

filepath="/home/lentin/Desktop/exported.stl",filter_glob="*.stl",ascii=False,

use_mesh_modifiers=True,axis_forward='Y',axis_up='Z',global_scale=1.0)

#Maincode

if__name__=="__main__":

Draw_Base_Plate()

Draw_Motors_Wheels()

Draw_Middle_Plate()

Draw_Top_Plate()

Draw_Support_Tubes()

Save_to_STL()

13. Afterenteringthecodeinthetexteditor,executethescriptbypressingtheRunScriptbutton,asshowninthefollowingscreenshot.Theoutput3Dmodelwillbeshownonthe3DviewofBlender.Also,ifwecheckthedesktop,wecanseetheexported.stlfileforthesimulation

purposes:

Theexported.stlfilecanbeopenedwithMeshLabandthefollowingisascreenshotofMeshLab:

Tip

Downloadingtheexamplecode

YoucandownloadtheexamplecodefilesforallPacktbooksyouhavepurchasedfromyouraccountathttp://www.packtpub.com.Ifyoupurchasedthisbookelsewhere,youcanvisithttp://www.packtpub.com/supportandregistertohavethefilese-maileddirectlytoyou.

Questions1. Whatisrobotmodelingandwhatareitsuses?2. Whatistheaimof2Drobotmodel?3. Whatistheaimof3Drobotmodel?4. WhatistheadvantageofPythonscriptingovermanualmodeling?

SummaryThischapterwasmainlyaimedatrobotmechanicaldesigning.Italsoincludedtherobotparametercalculationandrobotchassisdesign.Inrobotdesigning,wefirstneedtohavetheprerequisitesready.Onceit'sready,wecancalculatetherequirementsofthecomponentstobeusedintherobot.Afterthecomponentrequirementsaremet,wedesigntherobotchassisaccordingtothegivenrequirements.Therobotchassisdesigninvolves2Ddesignofallthepartsrequiredtobuildtherobot.After2Ddesigning,wesawhowtobuildthe3DrobotmodelusingBlenderandPythonscript.The3Dmodelwasbuiltusingthedimensionsthatweusedin2Ddrawing.WealsocoveredtheBlenderPythonscripttobuildtheentire3Dmodel.Inthischapter,wegotthedesignoftherobotthatcanbeusedtomanufactureit,andalsodevelopeda3Dmodelforsimulation.Inthenextchapter,wewilldiscussthesimulationofthisrobotmodelandsomepopularsimulationtools.

Chapter3.WorkingwithRobotSimulationUsingROSandGazeboInthelastchapter,welookedatthemechanicaldesigningofourrobotanddesignedits2Dand3Dmodels.Inthischapter,wewillsimulatetherobotthatwedesigned.Beforedivingintosimulation,wewilllookattheusesofrobotsimulation,advantages,disadvantages,andvariousroboticsoftwaresimulationtools.

Wewillalsodiscusskinematicsandthedynamicparametersoftherobotthatwillhelpyoutounderstandthefunctioningoftherobot.Afterdiscussingtheseconcepts,wewilldiscussthesoftwareplatformsthatareusedforthissimulation.WeareplanningtoperformthissimulationusingGazebowiththehelpofRobotOperatingSystem(ROS).AfterwediscussthebasicconceptsofROSandGazebo,wewillimplementtherobotkinematicanddynamicmodeloftherobotaccordingtotheGazebodescriptions.Finally,wewillsimulatetherobotinatypicalhotelenvironmentandtesttheautonomousnavigationabilityoftherobottoservefood.

UnderstandingroboticsimulationIngeneral,roboticsimulationisaprocessofdevelopingavirtualmodelcapableofemulatingthereal-worldprocess.Throughsimulation,wecancreateavirtualmodeloftherobotandtestitsdesignandprogrammingcode.

OneofthedefinitionsofsimulationaccordingtoSystemsSimulation:TheArtandScience,RobertE.Shannon,PrenticeHallis:

Itistheprocessofdesigningamodelofarealsystemandconductingexperimentswiththismodelforthepurposeofunderstandingthebehaviorofthesystemandforevaluatingvariousstrategiesfortheoperationofthesystem.Thusitiscriticalthatthemodebedesignedinsuchawaythatthemodelbehaviormimicstheresponsebehavioroftherealsystemtoeventsthattakeplaceovertime.

Theterm'smodelandsystemarekeycomponentsofourdefinitionofsimulation.Byamodelwemeanarepresentationofagroupofobjectsorideasinsomeformotherthanthatoftheentityitself.Byasystemwemeanagrouporcollectionofinterrelatedelementsthatcooperatetoaccomplishsomestatedobjective.

Roboticsimulatorsaresoftwareapplicationsthatcanmodeltherobotandrenderthevirtualenvironmentthatmimicstherealenvironmentoftherobot.Inourcase,theenvironmentisatypicalhotel/restaurantwithtablesandchairs.Wehavetomakethissamearrangementinsimulatorstotestitsworking.

ThefollowingfigureshowsarobotsimulatorcalledGazebo.ItalsoshowsarobotcalledTurtleBot,alongwithsomerandomobjects.YouwilllearnmoreaboutGazeboandTurtleBotintheupcomingsectionsofthischapter.

RobotsimulatorGazebo

Welookedattherequirementstobuildtherobotandthemechanicaldesignoftherobot.Thenextstepistosimulatethedesignprocess.Itallowsdeveloperstotesttheprogrammingcodeandvalidatethemechanicaldesignoftherobotaccordingtothedesignproposalrequest.Thevirtualmodeloftherobotcanbemodifiedwithoutanyadditionalcosts.

Oneofthemainadvantagesofperformingthesimulationprocessisthatwecanbuildavirtualprototypeofacomplexrobotwithlesscostthatbehavessimilartotheactualdesignoftherobot,andtestthevirtualrobotuntilitmeetsthespecifications.Thedisadvantageisthat,usingsimulators,wecannotcovertheentirescenariothatmayoccurintherealworld.

Theadvantagesofsimulationare:

LowcosttobuildarobotfromscratchTheactualrobotcodecanbetestedwiththesimulatedrobotThedesignoftherobotcanbemodifiedwithoutanycostAnypartoftherobotcanbetestedIfit'sacomplexproject,thentherobotcanbesimulatedinstagesAcompletesimulationcandeterminewhethertherobotmeetsthespecificationsAlmostallsimulationsoftwarearecompatiblewithawiderangeofprogramminglanguages

Someofthedisadvantageare:

Intherealworld,theremaybemoreparametersthanthevirtualworld;wecan'tmodelalltheseparametersinsimulationAllsimulationprogramssimulatewhattheyareprogrammedtosimulate

Let'stakealookatsomeofthelatestroboticsimulatorapplications:

Gazebo:Thisisamultirobotsimulatorwithsupportformanysensors.Thesoftwareis

compatiblewithROS.It'safreeandopensourcesimulatorusedextensivelyforroboticresearch.TheofficialwebsiteofGazeboiswww.gazebosim.org.V-REP:Thisisoneofthemostadvanced3DsimulatorsforindustrialrobotsdesignedbyCoppeliaRobotics.Thistoolofferssupportforawiderangeofprogramminglanguages,includingC/C++,Python,Java,Lua,Matlab,andUrbi.Thissimulatorhasbuilt-insupporttodevelopalgorithmsinordertosimulateautomationscenarios.Theplatformisusedineducationaswellbyengineers.TheofficialwebsiteofV-REPishttp://www.coppeliarobotics.com/.Webots:Thisisa3DsimulationplatformdevelopedbyCyberboticsandisusedinserviceandindustrialrobotsimulations.ThistoolofferssupportforWindows,Linux,andAppleplatforms.It'soneofthemostcommonsimulationsoftwareusedineducationorforresearchpurposes.Anyrobotcanbemodeled,programmed,andsimulatedinC,C++,Java,Python,Matlab,orURBI.ThissoftwareiscompatiblewithexternallibrariessuchasOpenSourceComputerVision(OpenCV).RoboLogix:Thisisa3DindustrialsimulationsoftwaredevelopedbyLogicDesign.TheRoboLogixplatformwasdesignedtoemulatereal-worldroboticsapplicationswithfive-axisindustrialrobot.Theprograminstalledontherobotcanbedevelopedandtestedinawiderangeofpracticalapplications.Theplatformofferssupportforawiderangeofindustrialrobots,includingABB,Fanuc,andKawasaki.

Beforeperformingthesimulation,let'scheckhowtherobotworksandwhatisthemathbehindthis.

MathematicalmodelingoftherobotTheimportantpartofamobilerobotisitssteeringsystem.Thiswillhelptherobottonavigateintheenvironment.Wewillusethedifferentialdrivemodeltoreducethecomplexity,cost,andsizeoftherobot.Adifferential-driverobotconsistsoftwomainwheelsmountedonacommonaxiscontrolledbyseparatemotors.Adifferentialdrivesystem/steeringsystemisanonholonomicsystem,whichmeansithasconstraintsontheposechange.Acarisanexampleofanonholonomicsystem,asitcannotchangeitspositionwithoutchangingitspose.Let'slookathowourrobotworksandhowwemodeltherobotintermsofitsmathematics.

Introductiontothedifferentialsteeringsystemandrobotkinematics

Robotkinematicsisthestudyofthemathematicsofmotionwithoutconsideringtheforcesthataffectmotion.Itmainlydealswiththegeometricrelationshipsthatgovernthesystem.Robotdynamicsisthestudyofmotioninwhichalltheforcesaremodeled.

Amobilerobotorvehiclehassixdegreesoffreedom(DOF)expressedbythepose(x,y,z,roll,pitch,andyaw).Itconsistsofposition(x,y,z)andattitude(roll,pitch,andyaw).Rollreferstosidewiserotation,pitchreferstoforwardandbackwardrotation,andyaw(calledtheheadingororientation)referstothedirectioninwhichtherobotmovesinthex-yplane.Thedifferential-driverobotmovesfromx-yintheplane,sothe2Dposeconsistsmainlyofx,y,andθ,whereθistheheadoftherobotthatpointsintheforwarddirectionoftherobot.Thismuchinformationissufficienttodescribeadifferentialrobotpose.

Theposeoftherobotinx,y,andθintheglobalcoordinatesystem

Inadifferential-driverobot,themotioncanbecontrolledbyadjustingthevelocityoftwoindependentlycontrolledmotorsontheleft-handsideandtheright-handside,thatis,V-leftandV-rightrespectively.Thefollowingfigureshowsacoupleofpopulardifferentialdriverobotsavailableonthemarket:

iRobot,Roomba,andPioneer3DX

Theforwardkinematicsequationsforarobotwithadifferential-drivesystemareusedtosolvethefollowingproblem:

Ifrobotisstandinginaposition(x,y,θ)attimet,determinethepose(x',y',θ')att+δtgiventhecontrolparametersV-leftandV-right.

Thistechniquecanbeusedintherobottofollowaparticulartrajectory.

Explainingoftheforwardkinematicsequation

Wecanstartbyformulatingasolutionforforwardkinematics.Thefollowingfigureisanillustrationofoneofthewheelsoftherobot:

AsinglewheeloftherobotrotatingalongthelocalYaxis

Themotionaroundtheyaxisisknownasroll;everythingelsecanbeconsideredasslip.Let'sassumethatnoslipoccursinthiscase.Whenthewheelcompletesonefullrotation,thecantermovesatadistanceof2πr,whereristheradiusofthewheel.Wewillassumethatthemovementistwo-dimensional.Thismeansthatthesurfaceisflatandeven.

Whentherobotisabouttoperformarollingmotion,therobotmustrotatearoundapointthatliesalongitscommonleftandrightwheelaxes.ThepointthattherobotrotatesaroundisknownasICC-InstantaneousCenterofCurvature(ICC).Thefollowingdiagramshowsthewheelconfigurationofdifferential-drivewithICC:

Wheelconfigurationforarobotwithdifferential-drive

Thecentralconceptforthederivationofthekinematicequationistheωangularvelocityoftherobot.EachwheelontherobotrotatesaroundICCalongacirclewithawheelradiusofr.

Thespeedofthewheelisv=2πr/T,whereTisthetimetakentocompleteonefullturnaroundICC.Theωangularvelocityisdefinedas2π/Tandtypicallyhastheunitradians(ordegrees)persecond.Combiningtheequationsforvandwyieldsω=2π/T.

Note

Adetailedmodelofthedifferential-drivesystemisshowninthefollowingfigure:

Ifweapplythepreviousequationinbothwheels,theresultwillbethesame,thatis,ω:

Note

Where,RisthedistancebetweenICCandthemidpointofthewheelaxisandlisthelengthofthewheelaxis.AftersolvingωandR,wegetthefollowingresult:

Note

Thepreviousequationisusefulforsolvingtheforwardkinematicsproblem.Supposetherobotmoveswithanangularvelocityofωforδtseconds,itcanchangetherobot'sorientationorwhereitisheadingto:

Note

Where,thecenterofICCrotationisgivenbybasictrigonometryas:

Note

RotatingtherobotωδtdegreesaroundICC

Givenastartingposition(x,y),thenewposition(x',y')canbecomputedusingthe2Drotationmatrix.TherotationaroundICCwithangularvelocityωforδtsecondsyieldsthefollowingpositionatt+δttime:

Note

Thenewpose(x',y',andθ')canbecomputedfromequations(6)and(8),givenω,δt,andR.

ωcanbecomputedfromequation(5);VrandVlareoftendifficulttomeasureaccurately.Insteadofmeasuringthevelocity,therotationofeachwheelcanbemeasuredusingasensorcalledwheelencoders.Thedatafromthewheelencodersistherobot'sodometryvalues.Thesesensorsaremountedonthewheelaxesanddeliverbinarysignalsforeachstepthewheelrotates(eachstepmaybeintheorderof0.1mm).Thesesignalsarefedtoacountersuchthatvδtisthedistancetravelledfromtimettot+δt.Wecanwrite:

n*step=vδt

Fromthis,wecancomputev:

Note

Ifweinsertequation(9)inequations(3)and(4),wegetthefollowingresult:

Note

Here,nlandnraretheencodercountsoftheleftandrightwheels.VlandVrarethespeedoftheleftandrightwheelsrespectively.Thus,therobotstandsinpose(x,y,θ)andmovesnlandnrcountsduringatimestepδt;thenewpose(x',y',θ')isgivenby:

Note

where,

Note

Thederivedkinematicequationdependsmainlyonthedesignandgeometryoftherobot.Differentdesignscanleadtodifferentequations.

Inversekinematics

Theforwardkinematicsequationprovidesanupdatedposeatagivenwheelspeed.Wecannowthinkabouttheinverseproblem.

Standinpose(x,y,θ)attimetanddeterminetheV-leftandV-rightcontrolparameterssuchthattheposeattimet+δtis(x',y',θ').

Indifferential-drive,thisproblemmaynothaveasolutionbecausethiskindofrobotcan'tbemovedtoanyposebysimplysettingthewheelvelocity.It'sbecauseoftherobotconstraintscallednonholonomicrobotsthatthisproblemcanbesolved,becausethesekindsofrobotscanmovetoanypose.

Innonholonomicrobots,therearesomewaystoincreasetheconstrainedmobilityifweallowadifferentsequence(V-left,V-right).Ifweinsertvaluesfromequations(12)to(15),wecanidentifysomespecialcasesofcontrol:

IfV-right=V-left=>nr=nl=>R=∞,ωδT=0=>:Thismeanstherobotmovesinastraightlineandθremainsthesame

IfV-right=-V-left=>nr=-nl=>R=0,ωδt=2nl*step/land =>x'=x,y'=y,θ'=θ+ωδt=>:ThismeanstherobotrotatesinthepositionaroundICC,thatis,anyθisreachable,while(x,y)remainsunchanged

Combiningtheseoperations,thefollowingalgorithmcanbeusedtoreachanytargetposefromthestartingpose:

1. Rotateuntiltherobot'sorientationcoincideswiththelinefromthestartingpositiontothetargetposition,V-right=-V-left=V-rot.

2. Drivestraightuntiltherobot'spositioncoincideswiththetargetposition,V-right=V-left=V-ahead.

3. Rotateuntiltherobot'sorientationcoincideswiththetargetorientation,V-right=-V-left=V-rot.

where,V-rotandV-aheadcanbechosenarbitrarily.

Note

Refertohttp://www8.cs.umu.se/~thomash/reports/KinematicsEquationsForDifferentialDriveAndArticulatedSteeringUMINF-11.19.pdfformoreinformationonkinematicsequations.

Wecanswitchtothedetailsoftoolsweareusingtosimulatethisrobot.Understandingthekinematicsoftherobotwillhelpyoutobuildthesimulationoftherobot.Italsohelpsyoutowritethesoftwarefortherobot.Thetoolswewilluseforthesimulationare:

RobotOperatingSystem(ROS)Gazebo

Thesearesomeofthepopulartoolsavailableforroboticsprogrammingandsimulation.Let'slookatthefeaturesandashortintroductionofROSandGazebo.Later,wewilldiscusshowtoperformsimulationusingthesetools.

IntroductiontoROSandGazeboROSisasoftwareframeworkforwritingrobotsoftware.ThemainaimofROSistoreusetheroboticsoftwareacrosstheglobe.ROSconsistsofacollectionoftools,libraries,andconventionsthataimtosimplifythetaskofcreatingcomplexandrobustrobotbehavioracrossawidevarietyofroboticplatforms.

TheofficialdefinitionofROSis:

ROSisanopen-source,meta-operatingsystemforyourrobot.Itprovidestheservicesyouwouldexpectfromanoperatingsystem,includinghardwareabstraction,low-leveldevicecontrol,implementationofcommonly-usedfunctionality,message-passingbetweenprocesses,andpackagemanagement.Italsoprovidestoolsandlibrariesforobtaining,building,writing,andrunningcodeacrossmultiplecomputers.ROSissimilarinsomerespectsto'robotframeworks,suchasPlayer,YARP,Orocos,CARMEN,Orca,MOOS,andMicrosoftRoboticsStudio.

Note

Refertohttp://wiki.ros.org/ROS/IntroductionformoreinformationonROS.

SomeofthemainfeaturesofROSare:

DistributedFramework:ROSisadistributedframeworkthatcanrunonmultiplemachines,sothecomputationoftherobotcanbedividedoverdifferentmachines.Itcanreducetheonboardprocessingoftherobot.Codereuse:ThemaingoalofROSistoreusecode.Codereuseenablesthegrowthofagoodresearchanddevelopmentcommunityaroundtheworld.ROSexecutablesarecallednodes.TheseexecutablescanbegroupedintoasingleentitycalledROSpackages.Agroupofpackagesiscalledastackandthesestackscanbesharedanddistributed.Languageindependence:TheROSframeworkcanbeprogrammedusingpopularlanguages(suchasPython,C++,andLisp).ThenodescanbewritteninanylanguageandcancommunicatethroughROSwithoutanyissues.Easytesting:ROShasabuilt-inunit/integrationtestframeworkcalledrostesttotestROSpackages.Scaling:ROSisappropriateforlargeruntimesystemsandforlargedevelopmentprocesses.FreeandOpenSource:ThesourcecodeofROSisopenandit'sabsolutelyfreetouse.ThecorepartofROSislicensedunderBSDlicenseanditcanbereusedincommercialandclosedsourceproducts.

SomeofthemainconceptsofROSarediscussedintheupcomingsection.

ROSConcepts

TherearemainlythreelevelsofROS:

TheROSfilesystemTheROSComputationGraphTheROScommunity

TheROSfilesystem

TheROSfilesystemmainlycovershowROSfilesareorganizedonthedisk.Themaintermswehavetounderstandare:

Packages:ROSpackagesarethemainunitofanROSsoftwareframework.AROSpackagemaycontainexecutables,ROS-dependentlibrary,configurationfiles,andsoon.ROSpackagescanbereusedandshared.PackageManifests:Themanifests(package.xml)filewillhaveallthedetailsofthepackages,includingname,description,license,anddependencies.Message(msg)types:Messagedescriptionsarestoredinthemsgfolderinapackage.ROSmessagesaredatastructuresforsendingdatathroughROS.Messagedefinitionsarestoredinafilewiththe.msgextension.Service(srv)types:Servicedescriptionsarestoredinthesrvfolderwiththe.srvextension.ThesrvfilesdefinetherequestandresponsedatastructureforserviceinROS.

TheROSComputationGraph

TheROSComputationGraphisthepeer-to-peernetworkoftheROSprocessthatprocessesdatatogether.ThebasicconceptsofROSComputationGrapharenodes,ROSMaster,parameterserver,

messages,andservices.

Nodes:Theseareprocessesthatperformcomputation.Forexample,onenodeofarobotpublishestheodometrydataoftherobot,anothernodepublishesthelaserscannerdata,andsoon.AnROSnodeiswrittenwiththehelpofanROSclientlibrary(suchasroscppandrospy).Wewilllookatthislibraryduringthesamplenodecreation.ROSMaster:ThisprovidesnameregistrationandalookupfortherestoftheComputationGraph.Withoutstartingthemaster,nodeswillnotfindeachothernorsendmessages.Parameterserver:Thisallowsdatatobestoredinacentrallocation.Messages:Nodescommunicatewitheachotherbypassingmessages.Amessageissimplyadatastructurecomprisingoftypedfields.Thiswillsupportdatatypes,suchasinteger,floatingpoint,Boolean,andsoon.Topics:NodesexchangedataintheformofmessagesviaROStransportsystemwithaspecificnamecalledtopics.Topicisthenameusedtoidentifythecontentofthemessage.Anodeinterestedinacertainkindofdatawillsubscribetotheappropriatetopic.Ingeneral,publishersandsubscribersarenotawareofeachother'sexistence.Theideaistodecoupletheproductionofinformationfromitsconsumption.Logically,onecanthinkofatopicasastronglytypedmessagebus.Eachbushasanameandanyonecanconnecttothebustosendorreceivemessagesaslongastheyaretherighttype.Services:Thepublish/subscribemodelisaveryflexiblecommunicationparadigm,butitsmany-to-many,one-waytransportisnotappropriateforrequest/replyinteractions,whichareoftenrequiredinadistributedsystem.Request/replyisdoneviaservices,whicharedefinedbyapairofmessagestructures:onefortherequestandoneforthereply.Aprovidingnodeoffersaserviceunderanameandaclientusestheservicebysendingtherequestmessageandawaitingthereply.ROSclientlibrariesgenerallypresentthisinteractiontotheprogrammerasifitwerearemoteprocedurecall.Bags:TheseareformatstosaveandplaybacktheROSmessagedata.Bagsareanimportantmechanismtostoredata(suchassensordata)thatcanbedifficulttocollect,butit'snecessarytodevelopandtestalgorithms.

TheROSMasteractsasanameserviceintheROSComputationGraph.ItstorestopicsandservicesregistrationinformationforROSnodes.NodescommunicatewiththeMastertoreporttheirregistrationinformation.AsthesenodescommunicatewiththeMaster,theycanreceiveinformationaboutotherregisterednodesandmakeconnectionsasappropriate.Themasterwillalsomakecallbackstothesenodeswhenthisregistrationinformationchanges,whichallowsnodestodynamicallycreateconnectionsasnewnodesarerun.

Nodesconnecttoothernodesdirectly;theMasteronlyprovidesthelookupinformation,muchlikeaDNSserver.Nodesthatsubscribetoatopicwillrequestconnectionsfromnodesthatpublishthattopicandwillestablishthatconnectionoveranagreeduponconnectionprotocol.ThemostcommonprotocolusedinanROSiscalledTCPROS,whichusesstandardTCP/IPsockets.

ThefollowingfigureshowshowtopicsandserviceworksbetweennodesandMaster:

TheROScommunitylevel

TheROScommunitylevelconceptsareROSresourcesthatenableseparatecommunitiestoexchangesoftwareandknowledge.Theseresourcesinclude:

Distributions:ROSDistributionsarecollectionsofversionedstacksthatyoucaninstall.DistributionsplayasimilarroletoLinuxdistributions:theymakeiteasiertoinstallsoftwareandmaintainconsistentversionsofit.Repositories:ROSreliesonafederatednetworkofcoderepositories,wheredifferentinstitutionscandevelopandreleasetheirownrobotsoftwarecomponents.TheROSWiki:ThisisthemainforumtodocumentinformationaboutROS.Anyonecansignupforanaccountandcontributetheirowndocumentation,providecorrectionsorupdates,writetutorials,andsoon.MailingLists:Theros-usersmailinglististheprimarycommunicationchannelaboutnewupdatestoROS.ThisisalsoaforumtoaskquestionsabouttheROSsoftware.

ThereareenoughconceptstobediscussedaboutROS;youcanrefertotheROSofficialwebsiteatwww.ros.orgformoreinformation.Now,wewilllookattheinstallationprocedureofROS.

InstallingROSIndigoonUbuntu14.04.2Asperourpreviousdiscussion,weknowthatROSisametaoperatingsystemtobeinstalledonahostsystem.ROSiscompletelysupportedonUbuntu/LinuxandintheexperimentalstagesonWindowsandOSX.SomeofthelatestROSdistributionsare:

Distribution ReleasedDate

ROSIndigoIgloo July22,2014

ROSHydroMedusa September4,2013

ROSGroovyGalapagos December31,2012

WewilldiscusstheinstallationprocedureofthelatestdistributionofROScalledIndigoIglooonUbuntu14.04.2LTS.ROSIndigoIgloowillbeprimarilytargetedattheUbuntu14.04LTS.IfyouareaWindowsorOSXuser,youcanpreferablyinstallUbuntuinaVirtualBoxapplicationandinstallROSonit.ThelinktodownloadVirtualBoxishttps://www.virtualbox.org/wiki/Downloads.

Theinstallationinstructionsareasfollows:

1. ConfigureyourUbunturepositoriestoallowrestricted,universe,andmultiversedownloadable.WecanconfigureitusingUbuntu'sSoftware&Updatetool.WecangetthisbytoolbysimplysearchingontheUbuntuUnitysearchmenuandtickthefollowingoptions,asshowninthefollowingscreenshot:

Ubuntu'sSoftwareandUpdatetool

2. SetupyoursystemtoacceptROSpackagesfrompackages.ros.org.ROSIndigoissupportedonlyonUbuntu13.10andUbuntu14.04.Thefollowingcommandwillstorepackages.ros.orgtoUbuntu'saptrepositorylist:

$sudosh-c'echo"debhttp://packages.ros.org/ros/ubuntutrustymain">

/etc/apt/sources.list.d/ros-latest.list'

3. Next,wehavetoaddapt-keys.Theapt-keyisusedtomanagethelistofkeysusedbyapttoauthenticatethepackages.Packagesthathavebeenauthenticatedusingthesekeyswillbeconsideredtrusted.Thefollowingcommandwilladdapt-keysforROSpackages:

$wgethttps://raw.githubusercontent.com/ros/rosdistro/master/ros.key-O-|

sudoapt-keyadd-

4. Afteraddingapt-keys,wehavetoupdatetheUbuntupackageindex.ThefollowingcommandwilladdandupdatetheROSpackagesalongwiththeUbuntupackages:

$sudoapt-getupdate

5. AfterupdatingtheROSpackages,wecaninstallthepackages.ThefollowingcommandwillinstallthenecessarytoolsandlibrariesofROS:

$sudoapt-getinstallros-indigo-desktop-full

6. Wemayneedtoinstalladditionalpackagesevenafterthedesktop-fullinstallation;eachadditionalinstallationwillbementionedintheappropriatesection.Thedesktop-fullinstallwilltakesometime.AftertheinstallationofROS,youarealmostdone.Thenextstepistoinitializerosdep,whichenablesyoutoeasilyinstallthesystemdependenciesforROSsourcepackagesyouwanttocompileandisrequiredtorunsomecorecomponentsinROS:

$sudorosdepinit

$rosdepupdate

7. ToaccesstheROStoolsandcommandsonthecurrentbashshell,wecanaddROSenvironmentalvariablestothe.bashrcfile.Thiswillexecuteinthebeginningofeachbashsession.ThefollowingisacommandtoaddtheROSvariableto.bashrc:

echo"source/opt/ros/indigo/setup.bash">>~/.bashrc

Thefollowingcommandwillexecutethe.bashrcscriptonthecurrentshelltogeneratethechangeinthecurrentshell:

source~/.bashrc

8. Oneoftheusefultoolstoinstallisrosinstall.Thistoolhastobeinstalledseparately.ItenablesyoutoeasilydownloadmanysourcetreesfortheROSpackagewithonecommand:

$sudoapt-getinstallpython-rosinstall

AftertheinstallationofROS,wewilldiscusshowtocreateasamplepackageinROS.Beforecreatingapackage,wehavetobuildanROSworkspace.ThepackagesarecreatedintheROSworkspace.Wewillusethecatkinbuildsystem,asetoftoolstobuildpackagesinROS.Thecatkinbuildsystemgeneratesexecutableorsharedlibrariesfromthesourcecode.ROSIndigousesthecatkinbuildsystemtobuildpackages.Let'sseewhatcatkinis.

Introducingcatkin

CatkinistheofficialbuildsystemofROS.Beforecatkin,ROSusedtherosbuildsystemtobuildpackages.ItsreplacementiscatkinonthelatestROSversion.CatkincombinesCMakemacrosand

PythonscriptstoprovidethesameCMakenormalworkflow.Catkinprovidesabetterdistributionofpackages,bettercross-compilation,andbetterportabilitythantherosbuildsystem.Formoreinformation,refertowiki.ros.org/catkin.

Catkinworkspaceisafolderwhereyoucanmodify,build,andinstallcatkinpackages.

Let'scheckhowtocreateanROScatkinworkspace.

Thefollowingcommandwillcreateaparentdirectorycalledcatkin_wsandasubfoldercalledsrc:

$mkdir-p~/catkin_ws/src

Switchdirectorytothesrcfolderusingthefollowingcommand.Wewillcreateourpackagesinthesrcfolder:

$cd~/catkin_ws/src

Initializethecatkinworkspaceusingthefollowingcommand:

$catkin_init_workspace

Afteryouinitializethecatkinworkspace,youcansimplybuildthepackage(evenifthereisnosourcefile)usingthefollowingcommand:

$cd~/catkin_ws/

$catkin_make

Thecatkin_makecommandisusedtobuildpackagesinsidethesrcdirectory.Afterbuildingthepackages,wewillseeabuildanddevelfolderincatkin_ws.Theexecutablesarestoredinthebuildfolderandinthedevelfolder,thereareshellscriptfilestoaddtotheworkspaceontheROSenvironment.

CreatinganROSpackage

Inthissection,wewillseehowtocreateasamplepackagethatcontainstwoPythonnodes.OneofthenodesisusedtopublishaHelloWorldmessageonatopic,andtheothernodewillsubscribetothistopic.

AcatkinROSpackagecanbecreatedusingthecatkin_create_pkgcommandinROS.

Thepackageiscreatedinsidethesrcfolderthatwecreatedduringthecreationofworkspace.Beforecreatingpackages,switchtothesrcfolderusingthefollowingcommand:

$cd~/catkin_ws/src

Thefollowingcommandwillcreateahello_worldpackagewithstd_msgsdependencies,whichcontainstandardmessagedefinitions.TherospyisthePythonclientlibraryforROS:

$catkin_create_pkghello_worldstd_msgsrospy

Thisisthemessagewegetafterthesuccessfulcreation:

Createdfilehello_world/package.xml

Createdfilehello_world/CMakeLists.txt

Createdfolderhello_world/src

Successfullycreatedfilesin/home/lentin/catkin_ws/src/hello_world.Pleaseadjust

thevaluesinpackage.xml.

Afterthesuccessfulcreationofthehello_worldpackage,weneedtoaddtwoPythonnodesorscriptstodemonstratethesubscribingandpublishingoftopics.

First,createafoldernamedscriptsinthehello_worldpackageusingthefollowingcommand:

$mkdirscripts

Switchtothescriptsfolderandcreateascriptnamedhello_world_publisher.pyandanotherscriptcalledhello_world_subscriber.pytopublishandsubscribetothehelloworldmessage.Thefollowingsectioncoversthecodeandexplanationofthesescriptsornodes:

Hello_world_publisher.py

Thehello_world_publisher.pynodebasicallypublishesagreetingmessagecalledhelloworldtoatopic/hello_pub.Thegreetingmessageispublishedtothetopicattherateof10Hz.

Thestepbystepexplanationofthiscodeisasfollows:

1. WeneedtoimportrospyifwearewritinganROSPythonnode.ItcontainsPythonAPI'stointeractwithROStopics,services,andsoon.

2. Tosendthehelloworldmessage,wehavetoimportaStringdatatypefromthestd_msgspackage.Ithasamessagedefinitionforstandarddatatypes.Wecanimportusingthefollowingcommand:

#!/usr/bin/envpython

importrospy

fromstd_msgs.msgimportString

3. Thefollowinglineofcodecreatesapublisherobjecttoatopiccalledhello_pub.ThedatatypeisStringandqueue_sizeis10.Ifthesubscriberisnotfastenoughtoreceivethedata,wecanusethequeue_sizeoptiontoadjustit:

deftalker():

pub=rospy.Publisher('hello_pub',String,queue_size=10)

4. ThefollowinglineofcodeismandatoryforallROSPythonnodes.Itinitializesandassignsanametothenode.Thenodecannotbelauncheduntilitgetsaname.Itcancommunicatewithothernodesusingitsname.Iftwonodesarerunningwiththesamenodename,onewillshutdown.Ifwewanttorunbothnodes,usetheanonymous=Trueflagasshownhere:

rospy.init_node('hello_world_publisher',anonymous=True)

5. Thefollowinglinecreatesarateobjectcalledr.Usingasleep()methodintheRateobject,wecanupdatetheloopinadesiredrate.Here,wearegivenatrate10:

r=rospy.Rate(10)#10hz

6. Thefollowingloopwillcheckwhetherrospyconstructstherospy.is_shutdown()flag.Then,itexecutestheloop.IfweclickonCtr+C,thisloopwillexit.

Insidetheloop,ahelloworldmessageisprintedontheterminalandpublishedonthehello_pubtopicwitharateof10Hz:

whilenotrospy.is_shutdown():

str="helloworld%s"%rospy.get_time()

rospy.loginfo(str)

pub.publish(str)

r.sleep()

7. InadditiontothestandardPython__main__check,thefollowingcodecatchesarospy.ROSInterruptExceptionexception,whichcanbethrownbytherospy.sleep()method,andtherospy.Rate.sleep()method,whenCtrl+Cisclickedonoryournodeisotherwiseshutdown.Thereasonthisexceptionisraisedissothatyoudon'taccidentallycontinueexecutingcodeafterthesleep()method:

if__name__=='__main__':

try:

talker()

exceptrospy.ROSInterruptException:pass

Afterpublishingthetopic,wewillseehowtosubscribeit.Thefollowingsectioncoversthecodetosubscribethehello_pubtopic.

Hello_world_subscriber.py

Thesubscribercodeisasfollows:

#!/usr/bin/envpython

importrospy

fromstd_msgs.msgimportString

Thefollowingcodeisacallbackfunctionthatisexecutedwhenamessagereachesthehello_pubtopic.Thedatavariablecontainsthemessagefromthetopicanditwillprintusingrospy.loginfo():

defcallback(data):

rospy.loginfo(rospy.get_caller_id()+"Iheard%s",data.data)

Thefollowingsectionwillstartthenodewithahello_world_subscribernameandstartsubscribingtothe/hello_pubtopic.

1. ThedatatypeofthemessageisStringandwhenamessagearrivesonthistopic,amethodcalledcallbackwillbecalled:

deflistener():

rospy.init_node('hello_world_subscriber',anonymous=True)

rospy.Subscriber("hello_pub",String,callback)

2. Thiswillkeepyournodefromexitinguntilthenodeisshutdown:

rospy.spin()

3. ThefollowingisthemaincheckofthePythoncode.Themainsectionwillcallthelistener()method,whichwillsubscribetothe/hello_pubtopic:

if__name__=='__main__':

listener()

4. AftersavingtwoPythonnodes,youneedtochangethepermissiontoexecutableusingthechmodcommands:

chmod+xhello_world_publisher.py

chmod+xhello_world_subscriber.py

5. Afterchangingthefilepermission,buildthepackageusingthecatkin_makecommand:

cd~/catkin_ws

catkin_make

6. FollowingcommandaddsthecurrentROSworkspacepathinallterminalsothatwecanaccesstheROSpackagesinsidethisworkspace:

echo"source~/catkin_ws/devel/setup.bash">>~/.bashrc

source~/.bashrc

Thefollowingistheoutputofthesubscriberandpublishernodes:

1. First,weneedtorunroscorebeforestartingthenodes.TheroscorecommandorROSmasterisneededtocommunicatebetweennodes.So,thefirstcommandis:

$roscore

2. Afterexecutingroscore,runeachnodeusingthefollowingcommands.3. Thefollowingcommandwillrunthepublisher:

$rosrunhello_worldhello_world_publisher.py

4. Thefollowingcommandwillrunthesubscribernode.Thisnodesubscribestothehello_pubtopic,asshowninthefollowingscreenshot:

$rosrunhello_worldhello_world_subscriber.py

WecoveredsomebasicsofROS.Now,wewillseewhatisGazeboisandhowwecanworkwithGazebousingROS.

IntroducingGazebo

Gazeboisafreeandopensourcerobotsimulatorinwhichwecantestalgorithms,designrobots,andperformregressiontestingusingrealisticscenarios.Gazebocanaccuratelyandefficientlysimulateapopulationofrobotsincomplexindoorandoutdoorenvironments.Gazeboisbuiltinarobustphysicsenginewithhighqualitygraphicsandaconvenientprogrammaticandgraphicalinterface.

ThefeaturesofGazeboareasfollows:

Dynamicsimulation:GazebocansimulatedynamicsofarobotusingaphysicsenginesuchasOpenDynamicsEngine(ODE).(http://opende.sourceforge.net/),Bullet(http://bulletphysics.org/wordpress/),Simbody(https://simtk.org/home/simbody/),andDART(http://dartsim.github.io/).Advanced3DGraphics:Gazeboprovideshighqualityrendering,lighting,shadows,andtexturingusingtheOGREframework(http://www.ogre3d.org/).Sensorssupport:Gazebosupportsawiderangeofsensors,includinglaserrangefinders,kinectstylesensors,2D/3Dcamera,andsoon.Wecansimulateeitherwithnoiseorwithoutnoise.Plug-in:Wecandevelopcustompluginsfortherobot,sensor,andenvironmentalcontrol.PluginscanaccessGazebo'sAPI.RobotModels:Gazeboprovidesmodelsforpopularrobots,suchasPR2,Pioneer2DX,iRobotCreate,andTurtleBot.Wecanalsobuildcustommodelsofrobots.TCP//IPTransport:WecanrunsimulationonaremotemachineandaGazebointerface

throughasocket-basedmessagepassingservice.CloudSimulation:WecanrunsimulationontheCloudserverusingtheCloudSimframework(http://cloudsim.io/).CommandLineTools:Extensivecommand-linetoolsareusedtocheckandlogsimulation.

InstallingGazebo

GazebocanbeinstalledasastandaloneapplicationoranintegratedapplicationalongwithROS.Inthischapter,wewilluseGazeboalongwithROSforsimulationandtotestourwrittencodeusingtheROSframework.

IfyouwanttotrythelatestGazebosimulatorindependently,youcanfollowtheproceduregivenathttp://gazebosim.org/download.

ToworkwithGazeboandROS,wedon'tneedtoinstallitseparatelybecauseGazeboisbuilt-inalongwiththeROSdesktop-fullinstallation.

TheROSpackageintegratesGazebowithROSnamedgazebo_ros_pkgs,whichhascreatedwrappersaroundastandaloneGazebo.ThispackageprovidesthenecessaryinterfacetosimulatearobotinGazebousingROSmessageservices.

ThecompleteGazebo_ros_pkgscanbeinstalledinROSIndigousingthefollowingcommand:

$sudoapt-getinstallros-indigo-gazebo-ros-pkgsros-indigo-gazebo-ros-control

TestingGazebowiththeROSinterface

AssumingthattheROSenvironmentisproperlysetup,wecanstartroscorebeforestartingGazebousingthefollowingcommand:

$roscore

ThefollowingcommandwillrunGazebousingROS:

$rosrungazebo_rosgazebo

Gazeboisrunningastwoexecutables,thatis,theGazeboserverandtheGazeboclient.TheGazeboserverwillexecutethesimulationprocessandtheGazeboclientcanbetheGazeboGUI.Usingthepreviouscommand,theGazeboclientandserverwillruninparallel.

TheGazeboGUIisshowninthefollowingscreenshot:

AfterstartingGazebo,wewillseethefollowingtopicsgenerated.Usingtherostopiccommand,wewillfindthefollowinglistoftopics:

$rostopiclist

/gazebo/link_states

/gazebo/model_states

/gazebo/parameter_descriptions

/gazebo/parameter_updates

/gazebo/set_link_state

/gazebo/set_model_state

Wecanruntheserverandclientseparatelyusingthefollowingcommand:

RuntheGazeboserverusingthefollowingcommand:

$rosrungazebo_rosgzserver

RuntheGazeboclientusingthefollowingcommand:

$rosrungazebo_rosgzclient

WehaveinstalledthebasicpackagesofGazeboinROS.Ifyouarenotplanningtobuildthehardwareforthisrobot,thealternativeplanistobuyanotherrobotcalledTurtleBot(http://store.clearpathrobotics.com/products/turtlebot-2).Now,wewillseehowtoinstalltheTurtleBotstackonROS.

InstallingTurtleBotRobotpackagesonROSIndigo

TheTurtleBotinstallationprocedurefromitssourceismentionedathttp://wiki.ros.org/Robots/TurtleBot.

ThefollowingisaquickproceduretoinstalltheTurtleBotstackanditsdependenciesfromtheaptpackagemanager:

1. First,youneedtoinstallthesynapticpackagemanagerusingthefollowingcommand.Synapticisagraphicalpackagemanagementprogramforapt.Itprovidesthesamefeaturesastheapt-getcommand-lineutilitywithaGUIfrontendbasedonGTK+:

$sudoapt-getinstallsynaptic

2. Aftertheinstallationofthesynapticpackagemanager,openitandfilteritssearchesusingtheros-indigo-roconkeyword.

3. Installallthepackageslistedonsynaptic,asshowninthefollowingscreenshot:

Rocon,alsoknownasroboticsinconcert,isadependencyoftheTurtleBotstack.ThispackagemainlyaimstobringROStomultirobotdevicetablets.Youcanreadmoreaboutroconathttp://wiki.ros.org/rocon.

Aftertheinstallationofrocon,weneedtoinstallanotherdependencycalledthekobukipackage.KobukiisasimilarroboticmobileplatformfromYujinRobots(http://wiki.ros.org/kobuki).TurtleBotpackagesaredependentonthesepackages.

Theros-indigo-kobukipackagecanbeinstalledusingsynaptic,suchastheroconpackage.The

followingisascreenshotoftheinstallation:

FollowingisthestepbystepproceduretobuildandinstallTurtleBot'slatestROSpackagesfromthesourcecodeinROSIndigo.Thedependenciesforinstallingthesepackagesarealreadymetinthepreviousprocedure.

1. Createafoldercalledturtlebotinthehomefolderusingthefollowingcommand:

$mkdir~/turtlebot

2. Switchthedirectorytoturtlebotusingthefollowingcommand:

$cd~/turtlebot

3. DownloadthelatestsourcecodeofTurtleBotusingthefollowingcommand:

$wstoolinitsrc-j5

https://raw.github.com/yujinrobot/yujin_tools/master/rosinstalls/indigo/turtleb

ot.rosinstall

4. Installallthedependenciesofthesourcecodeusingthefollowingcommand:

$rosdepinstall--from-pathssrc-i-y

5. Buildthesourcecodeusing:

$catkin_make

6. ToaccessTurtleBotpackagesfromallterminals,wehavetoaddsource

~/turtlebot/devel/setup.bashcommandtothe.bashrcfile.Thefollowingcommandwilldothisjob:

$echo"source~/turtlebot/devel/setup.bash">>~/.bashrc

7. Thiscommandwillexecutethe.bashrcfile:

$source~/.bashrc

InstallingTurtleBotROSpackagesusingtheaptpackagemanagerinUbuntu

IfyouwanttoinstallTurtleBotpackageswithoutcompilingsourcecode,wecanuseaptpackagemanager.ThefollowingisthecommandtoinstallTurtleBotpackagesinROS:

$sudoapt-getinstallros-indigo-turtlebotros-indigo-turtlebot-appsros-indigo-

turtlebot-interactionsros-indigo-turtlebot-simulatorros-indigo-kobuki-ftdiros-

indigo-rocon-remocon

Let'scheckhowtosimulateTurtleBotinGazeboandmovetherobotonanemptyenvironment.

SimulatingTurtleBotusingGazeboandROS

TheTurtleBotsimulatorpackagecontainstheturtlebot_gazebopackagestosimulateTurtleBotonGazebo.

AfterthesuccessfulinstallationoftheTurtleBotpackage,wecanenterthefollowingcommandtobringuptheTurtleBotsimulationusingROSandGazebo:

$roslaunchturtlebot_gazeboturtlebot_empty_world.launch

Onanotherterminal,runthefollowingcommand.ThiswillexecuteaPythonscripttocontrolTurtleBotusingakeyboard;thisiscalledkeyboardteleoperation:

$roslaunchturtlebot_teleopkeyboard_teleop.launch

Followingisthescreenshotoftheoutput:

Thetop-leftterminalexecutesthesimulationcommandandthebottom-leftwindowexecutestheteleopcommand.

Wecanmovearoundtherobotwithkeyboardteleoperationusingthekeysmentionedonthescreen.Wecanalsomonitorthevaluesfromthemodelusingtherostopicscommand.Wecanviewthecurrenttopicsusingthefollowingcommand:

$rostopiclist

Itpublishesallthevaluesfromthesensors,suchasthekinectsensor,theodometryvaluesfromwheelencoders,theIMUsensorvalueforodometry,andGazebo'sstatevalues.

WewillusethecloneoftheTurtleBotpackageinwhichtherobotmodelandsimulationparametersaredifferent.Wecanperformthiscloningformostofthemobilerobotthathasadifferentialsteeringsystem.WewillcreatethepackagesforourrobotbycloningtheTurtleBotcode.Wewillnameourcustomrobotaschefbotinsteadofturtlebot,andallourpackageswillbenamedaccordingtothis.

CreatingtheGazebomodelfromTurtleBotpackages

InTurtleBotpackages,thesimulationandkinematicmodelsareimplementedusingtwopackages,thatis,turtlebot_gazeboandturtlebot_description.Theturtlebot_gazebopackagehasfilestolaunchsimulationinGazebo.Theturtlebot_descriptionpackagecontainstheGazeboandthekinematicmodeloftherobot.

Wecustomizedandreusedtheturtlebotpackagesandrecreatedthesamepackagesforourrobot.Wenamedourrobotaschefbot;wecancreatechefbot_gazebo,whichcontainsthesimulationlaunchfiles.ThelaunchfilesinROSareakindofanXMLfileinwhichwecanlaunchmultiplenodesandsetmultipleparametersbyrunningasinglefile.Torunthelaunchfile,wehavetousetheroslaunchcommand.

Note

WecancheckouttheimplementedROSpackagesofChefBotathttp://wiki.ros.org/roslaunchforreference.

ThefollowingcommandclonesthecompleteROSpackagesoftheChefBot:

$gitclonehttps://github.com/qboticslabs/Chefbot_ROS_pkg.git

Thechefbot_descriptionpackagecontainsthekinematicmodelandtheGazebomodeloftherobot.Thefollowingfigureshowsthevariousfilesinthesetwopackages:

TheChefbot_descriptionandtheChefbot_Gazebopackage

Switchtocatkin_ws,whichwecreatedtodevelopROSpackages.Inthesrcfolder,firstcreateafoldercalledchefbot.Then,wecancreateallthepackagesofChefBotinit,usingthefollowingcommands:

$cd~/catkin_ws/src

$mkdirchefbot

$cdchefbot

Thechefbot_gazebocanbecreatedusingthefollowingcommandwiththerequireddependencies:

$catkin_create_pkgchefbot_gazebodepthimage_to_laserscandiagnostic_aggregator

gazebo_roskobuki_gazebo_pluginsrobot_pose_ekfrobot_state_publisherxacro

yocs_cmd_vel_muxcreate_gazebo_pluginscreate_descriptioncreate_drivercreate_node

Aftercreatingthepackage,youcancopythetwofoldersinchefbot_gazebofromthesourcecodeofthechapterthatcanbedownloadedfromthePacktPublishingwebsite.Thiscodeisadaptedfromtheturtlebot_gazebopackage;youcanalsorefertoitscodeforfurtherreference.

Hereistheexplanationofeachfileusage.First,wediscussedthechefbot_gazebopackage.Inthelaunchfolder,therearelaunchfilesforeachfunctionality:

chefbot_empty_world.launch:ThisfilewilllaunchtheChefBotmodelinGazebowithanemptyworld,wheretheworldisaGazebofilecontaininginformationabouttherobotenvironment.chefbot_playground.launch:ThisfilewilllaunchtheChefbotmodelinGazebo.ThesimulatedGazeboenvironmentcontainssomerandomobjectslikecylindersandboxes.gmapping_demo.launch:ThisfilewillstartSimultaneousLocalizationAndMapping(SLAM).UsingSLAM,wecanmaptheenvironmentandstoreitforfutureuse.Inourcase,wecanmapahotelenvironmentusingthispackage.Wewilldiscussmoreongmappingintheupcomingchapter.FormoreinformationonSLAM,refertohttp://wiki.ros.org/gmapping.amcl_demo.launch:AMCLstandsforAdaptiveMonteCarloLocalization(http://wiki.ros.org/amcl).Aftermappingtheenvironment,therobotcanautonomouslynavigatebylocalizingitselfonthemapandalsobygivingthefeedbackfromwheels.Thefeedbackfromtherobotiscalledodometry.ThelocalizationalgorithmAMCLandthenavigationalgorithm,suchaspathplanningisperformedinthislaunchfile.chefbot_base.launch.xml:ThisXMLfilewillparseanxacrofilecalledchefbot_circles_kinect.urdf.xacrotoURDFpresentinthechefbot_descriptionfolder.AfterconvertingthexacrofiletoURDF,itwillgeneratetherobotmodelequivalenttoROS.WewilllearnmoreaboutURDFandxacroafterthissection.

AftergeneratingtherobotmodelinURDF,thisfilewillgeneratetheGazebo-compatiblemodelfromtheURDFrobotdescription.Also,itwillstartavelocitymuxernodethatwillprioritizethecommandvelocityoftherobot.Anexampleofcommandvelocityistheteleoperationbykeyboardorjoystick.Accordingtothepriorityassigned,thecommandvelocitywillreachtherobot.Let'sdiscussmoreonURDFandxacrotogetaclearpictureofthedescriptionoftherobot.

Whatisarobotmodel,URDF,xacro,androbotstatepublisher?

RobotmodelinROScontainspackagestomodelthevariousaspectsoftherobot,whichisspecifiedintheXMLRobotDescriptionFormat(URDF).ThecorepackageofthisstackisURDF,whichparsesURDFfilesandconstructsanobjectmodeloftherobot.

UnifiedRobotDescriptionFormat(URDF)isanXMLspecificationtodescribethemodelofarobot.WecanrepresentthefollowingfeaturesoftherobotusingURDF:

ThekinematicanddynamicdescriptionoftherobotThevisualrepresentationoftherobotThecollisionmodeloftherobot

Thedescriptionoftherobotconsistsofasetoflink(part),elements,andasetofjointelements,whichconnecttheselinkstogether.Atypicalrobotdescriptionisshowninthefollowingcode:

<robotname="chefbot">

<link>...</link>

<link>...</link>

<link>...</link>

<joint>....</joint>

<joint>....</joint>

<joint>....</joint>

</robot>

Note

ItwillbegoodifyourefertothefollowinglinksformoreinformationonURDF:

http://wiki.ros.org/urdf

http://wiki.ros.org/urdf/Tutorials

Xacro(XMLMacros)isanXMLmacrolanguage.Withxacro,wecancreateshorterandreadableXMLfiles.WecanusexacroalongwithURDFtosimplifytheURDFfile.Ifweaddxacrotourdf,wehavetocalltheadditionalparsernodetoconvertxacrotourdf.

Note

Thefollowinglinkcangiveyoumoreideaaboutxacro:

http://wiki.ros.org/xacro

robot_state_publisherallowsyoutopublishthestateoftherobottotf(http://wiki.ros.org/tf).Oncethestategetspublished,it'savailabletoallthecomponentsinthesystemthatalsousetf.Thepackagetakesthejointanglesoftherobotasinputandpublishesthe3Dposesoftherobotlinksusingthekinematictreemodeloftherobot.ThepackagecanbeusedasalibraryandasanROSnode.Thispackagehasbeenwelltestedandthecodeisstable.Nomajorchangesareplannedinthenearfuture.

Worldfiles:TheserepresenttheenvironmentofGazebo,whichhavetobeloadedalongwiththerobot.Theempty.worldandplayground.worldworldfilesareincludedinthelaunchfiles,soitwillloadwhenGazebostarts.CMakeList.txtandpackage.xml:Thesefilesarecreatedduringthecreationofpackage.CmakeList.txtfilehelpstobuildthenodesorlibrarieswithinapackageandthepackage.xmlfileholdsthelistofallthedependenciesofthispackage.

CreatingaChefBotdescriptionROSpackage

Thechefbot_descriptionpackagecontainstheurdfmodelofourrobot.Beforecreatingthis

packagebyyourown,youcangothroughthedownloadedpackagesofChefBot.Itcanhelpyoutospeeduptheprocess.

Let'scheckhowtocreatethechefbot_descriptionpackage.Followingprocedurewillguideyouincreatingthispackage:

1. First,weneedtoswitchtothechefbotfolderinthesrcfolder:

$cd~/catkin_ws/src/chefbot

2. Thefollowingcommandwillcreatetherobotdescriptionpackagealongwithdependencies,suchasurdf,xacro,andthedescriptionpackageofKobuki,andcreatemobilerobots:

$catkin_create_pkgchefbot_descriptionurdfxacrokobuki_description

create_description

3. Copythemeshes,urdf,androbotsfoldersfromthedownloadedsourcetothepackagefolder.Themeshfolderholdsthe3Dpartsoftherobotandtheurdffoldercontainstheurdfdescriptionandthesensorsoftherobot.Theentirerobotmodelisdividedintoasetofxacrofilesforeasierdebuggingandbetterreadability.

Let'sseethefunctionalityofeachfilesinsidethispackage.Youcanreferthedownloadedsourcecodeforcheckingthesefiles,andyoucanalsocopythesefilesfromthedownloadedfilestothenewlycreatedfolder.Thefunctionalityofeachurdffolderisasfollows:

chefbot_base.urdf.xacro:Thisxacrorepresentsthekinematicmodeloftheentirerobot.ItmodelstheentirejointsoftherobotusingtheURDFtags.Thejointincludestwowheels,twocasterwheels,gyrosensors,andsoon.The3Dkinectsensorisnotmodeledinthisfile.Itwillalsoattachmeshestoeachlinks.ThisfileisreusedfromtheKobukimobile-basedpackage.chefbot_base_gazebo.urdf.xacro:ThisistheGazebomodelrepresentationofeachlinkoftherobot.Itincludestheactuatordefinition,sensordefinitions,theparametersettingofthedifferentialrobot,andsoon.Gazebousesthisvaluetoperformthesimulation.Therobotparameterscanchangebychangingthevaluesinthisfile.chefbot_gazebo.urdf.xacro:ThepreviousGazebourdfdoesnothavethedefinitionsofthe3Dsensorkinect.Thisfilestartsthekinect_openniGazeboplugintosimulatethekinectsensorontherobot.chefbot_library.urdf.xacro:Thisfileincludesallthexacrofilesandsensorsoftherobot.Thissinglefilecanlaunchallthedescriptionsoftherobot.chefbot_properties.urdf.xacro:Thisfileincludesthe3Dkinectsensorpositionontherobotmodel.common_properties.urdf.xacro:Thisfilecontainspropertiesofmeshessuchascolor.kinect.urdf.xacro:ThisfilecontainstheGazeboparameterofkinectandispresentinsidethesensorsfolder.Thisfileisincludedinthechefbot_gazebo.urdf.xacroandchefbot_properties.urdf.xacrofilestosetthekinectparameters.chefbot_circles_kinect_urdf.xacro:Thisfileisinsidetherobotfolder.Itincludesthechefbot_library.urdf.xacrofile,whichwillloadalltherobotdescriptionfilesneededtostartthesimulation.

Inthemeshesfolder,wemainlyhavethewheelandthebodyoftherobot,the3DmodelpartsofChefBot.

SimilartoTurtleBot,wecanlaunchtheChefBotsimulationusingthefollowingcommand:

$roslaunchchefbot_gazebochefbot_empty_world.launch

Whenweexecutethiscommand,launchfileswillexecuteintheorder,asshowninthefollowingscreenshot:

Wehavealreadyseenthefunctionalityofeachfile.Theimportantfilesweneedtodiscussare:

chefbot_gazebo.urdf.xacro

kinect.urdf.xacro

chefbot_base.urdf.xacro

chefbot_base_gazebo.urdf.xacro

Let'stakealookatchefbot_base_gazebo.urdf.xacro.Theactualfiledefinitionisprettylong,sowewillonlydiscusstheimportantparts.

BeforediscussingGazebodefinitions,wecanrefertotheGazebotagsparametersmentionedinURDF.ThevarioustagsthatcanbeusedintheURDFcanbefoundathttp://osrf-distributions.s3.amazonaws.com/sdformat/api/1.5.html.

TheGazebodefinitionforeachlinkismentionedinURDFas<gazebo></gazebo>.ThefollowingURDFdefinitionsforindividualjointsoftherobotaremodeledusingtheGazeboparameters.Thejointsincludewheeljointsandcasterwheeljoints.Themu1andmu2parametersarecoefficientsoffriction.Kpandkdindicatethedynamicalstiffnessanddampingofajoint.MinDepthistheminimumallowabledepthbeforethecontactcorrectionimpulseisapplied.MaxVelisthemaximumcontactcorrectionvelocitytruncationterm:

<?xmlversion="1.0"?>

<robotname="kobuki_sim"xmlns:xacro="http://ros.org/wiki/xacro">

<xacro:macroname="kobuki_sim">

<gazeboreference="wheel_left_link">

<mu1>1.0</mu1>

<mu2>1.0</mu2>

<kp>1000000.0</kp>

<kd>100.0</kd>

<minDepth>0.001</minDepth>

<maxVel>1.0</maxVel>

</gazebo>

<gazeboreference="wheel_right_link">

<mu1>1.0</mu1>

<mu2>1.0</mu2>

<kp>1000000.0</kp>

<kd>100.0</kd>

<minDepth>0.001</minDepth>

<maxVel>1.0</maxVel>

</gazebo>

<gazeboreference="caster_front_link">

<mu1>0.0</mu1>

<mu2>0.0</mu2>

<kp>1000000.0</kp>

<kd>100.0</kd>

<minDepth>0.001</minDepth>

<maxVel>1.0</maxVel>

</gazebo>

<gazeboreference="caster_back_link">

<mu1>0.0</mu1>

<mu2>0.0</mu2>

<kp>1000000.0</kp>

<kd>100.0</kd>

<minDepth>0.001</minDepth>

<maxVel>1.0</maxVel>

</gazebo>

ThefollowingsectionisusedfortheInertialMeasurementUnit(IMU)sensorintherobot(http://en.wikipedia.org/wiki/Inertial_measurement_unit)modeledinGazebo.ThemainuseofIMUintherobotistogenerateagoododometryvalue:

<gazeboreference="gyro_link">

<sensortype="imu"name="imu">

<always_on>true</always_on>

<update_rate>50</update_rate>

<visualize>false</visualize>

<imu>

<noise>

<type>gaussian</type>

<rate>

<mean>0.0</mean>

<stddev>${0.0014*0.0014}</stddev><!--0.25x0.25(deg/s)-->

<bias_mean>0.0</bias_mean>

<bias_stddev>0.0</bias_stddev>

</rate>

<accel><!--notusedinthepluginandrealrobot,henceusingtutorial

values-->

<mean>0.0</mean>

<stddev>1.7e-2</stddev>

<bias_mean>0.1</bias_mean>

<bias_stddev>0.001</bias_stddev>

</accel>

</noise>

</imu>

</sensor>

</gazebo>

Thedifferential-drivecontrollerpluginforGazeboisgiveninthefollowingcode.WewillreusetheKobukidifferential-drivepluginforthedrivesystem.Wewillalsomentionthemainmeasurementsoftherobot,suchasthewheelseparation,wheeldiameter,torqueofthemotor,andsoon,inthissection.Thissectionwillalsoincludethecliffsensor,whichwillnotbeusedinourmodel.Wemayignorethissectionifwedon'twanttouseit:

<gazebo>

<pluginname="kobuki_controller"filename="libgazebo_ros_kobuki.so">

<publish_tf>1</publish_tf>

<left_wheel_joint_name>wheel_left_joint</left_wheel_joint_name>

<right_wheel_joint_name>wheel_right_joint</right_wheel_joint_name>

<wheel_separation>.30</wheel_separation>

<wheel_diameter>0.09</wheel_diameter>

<torque>18.0</torque>

<velocity_command_timeout>0.6</velocity_command_timeout>

<cliff_sensor_left_name>cliff_sensor_left</cliff_sensor_left_name>

<cliff_sensor_center_name>cliff_sensor_front</cliff_sensor_center_name>

<cliff_sensor_right_name>cliff_sensor_right</cliff_sensor_right_name>

<cliff_detection_threshold>0.04</cliff_detection_threshold>

<bumper_name>bumpers</bumper_name>

<imu_name>imu</imu_name>

</plugin>

</gazebo>

kinect.urdf.xacro

Thisfilemainlyhasthedefinitionsofjointsandlinksofthekinectsensor.Thisfilealsoincludestwolaunchfiles:

<xacro:includefilename="$(find

chefbot_description)/urdf/chefbot_gazebo.urdf.xacro"/>

<xacro:includefilename="$(find

chefbot_description)/urdf/chefbot_properties.urdf.xacro"/>

Thechefbot_gazebo.urdf.xacrofileconsistsofthekinectpluginforGazebo.WewillreusethispluginfromTurtleBot.Thekinectpluginisactuallythelibgazebo_ros_openni_kinect.sofile;wecanalsodefinetheparametersofKinect,asshowninthefollowingcode:

<pluginname="kinect_camera_controller"

filename="libgazebo_ros_openni_kinect.so">

<cameraName>camera</cameraName>

<alwaysOn>true</alwaysOn>

<updateRate>10</updateRate>

<imageTopicName>rgb/image_raw</imageTopicName>

<depthImageTopicName>depth/image_raw</depthImageTopicName>

<pointCloudTopicName>depth/points</pointCloudTopicName>

<cameraInfoTopicName>rgb/camera_info</cameraInfoTopicName>

<depthImageCameraInfoTopicName>depth/camera_info</depthImageCameraInfoTopicName>

<frameName>camera_depth_optical_frame</frameName>

<baseline>0.1</baseline>

<distortion_k1>0.0</distortion_k1>

<distortion_k2>0.0</distortion_k2>

<distortion_k3>0.0</distortion_k3>

<distortion_t1>0.0</distortion_t1>

<distortion_t2>0.0</distortion_t2>

<pointCloudCutoff>0.4</pointCloudCutoff>

</plugin>

chefbot_base.urdf.xacro

Thisfiledefinesthelinksandjointsoftherobotandalsoincludesthechefbot_gazebo.urdf.xacrofile.Thejointsoftherobotarewheels,casterwheels,andsoon.HereistheXMLdefinitionofthebodyoftherobot,thewheeloftherobot,andthecasterwheeloftherobot.

Thebaselinkoftherobotincludestherobotbody,excludingthewheels.Wecanexporttherobotbodymeshfromtheblenderandexportittothe.DAEextensionusingMeshLab(http://en.wikipedia.org/wiki/COLLADA).Thebasejointisafixedtype.Thereisnomovementonthebaseplate.Wecandefinethecollisionprofileandinertiaforeachlinkoftherobot.ThesefilesarereusedfromTurtleBot,asshowninthefollowingcode:

<xacro:macroname="kobuki">

<linkname="base_footprint"/>

<!--

Baselinkissetatthebottomofthebasemould.

Thisisdonetobecompatiblewiththewaybaselink

wasconfiguredforturtlebot1.Referto

https://github.com/turtlebot/turtlebot/issues/40

Toputthebaselinkatthemoreoftusedwheel

axis,setthez-distancefromthebase_footprint

to0.352.

-->

<jointname="base_joint"type="fixed">

<originxyz="000.0102"rpy="000"/>

<parentlink="base_footprint"/>

<childlink="base_link"/>

</joint>

<linkname="base_link">

<visual>

<geometry>

<!--newmesh-->

<meshfilename="package://chefbot_description/meshes/base_plate.dae"/>

</geometry>

<!--<originxyz="0.00100.05199"rpy="00${M_PI/2}"/>-->

<originxyz="0.0010-0.034"rpy="00${M_PI/2}"/>

</visual>

<collision>

<geometry>

<cylinderlength="0.10938"radius="0.178"/>

</geometry>

<originxyz="0.000.05949"rpy="000"/>

</collision>

<inertial>

<!--COMexperimentallydetermined-->

<originxyz="0.0100"/>

<massvalue="2.4"/><!--2.4/2.6kgforsmall/bigbatterypack-->

<!--Kobuki'sinertiatensorisapproximatedbyacylinderwithhomogeneous

massdistribution

Moredetails:

http://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensors

m=2.4kg;h=0.09m;r=0.175m

ixx=1/12*m*(3*r^2+h^2)

iyy=1/12*m*(3*r^2+h^2)

izz=1/2*m*r^2

-->

<inertiaixx="0.019995"ixy="0.0"ixz="0.0"

iyy="0.019995"iyz="0.0"

izz="0.03675"/>

</inertial>

</link>

<!--Oneofthewheeljointisgivenbelow.Thekindofjointusedhereisa

continuousjoint.-->

<jointname="wheel_left_joint"type="continuous">

<parentlink="base_link"/>

<childlink="wheel_left_link"/>

<originxyz="0${0.28/2}0.026"rpy="${-M_PI/2}00"/>

<axisxyz="001"/>

</joint>

<linkname="wheel_left_link">

<visual>

<geometry>

<meshfilename="package://chefbot_description/meshes/wheel.dae"/>

</geometry>

<originxyz="000"rpy="000"/>

</visual>

<collision>

<geometry>

<cylinderlength="0.0206"radius="0.0352"/>

</geometry>

<originrpy="000"xyz="000"/>

</collision>

<inertial>

<massvalue="0.01"/>

<originxyz="000"/>

<inertiaixx="0.001"ixy="0.0"ixz="0.0"

iyy="0.001"iyz="0.0"

izz="0.001"/>

</inertial>

</link>

SimulatingChefBotandTurtleBotinahotelenvironmentAfterdiscussingeachfile,wecantrythesimulationoftworobotsinahotelenvironment.Theproceduresandscreenshotsofthesimulationareasfollows.

SimilartoTurtleBot,wecanstartChefBotusingthefollowingcommands:

$roslaunchchefbot_gazebochefbot_empty_world.launch

ItwillshowtherobotinGazebo,asshowninthefollowingscreenshot:

WecanexitGazeboandstartbuildingthehotelenvironmentfortherobot.

Thefirstprocedureistocreateaworldfileandsaveitwiththe.worldfileextension.Atypicalhotelenvironmentwithnineblock-liketablesisshowninthefollowingscreenshot.YoucantakeanemptyGazeboworldusingthefollowingcommandandmakeanenvironmentusingthebasicshapesavailableinGazebo:

1. Startroscoreusingthefollowingcommand:

$roscore

2. StartGazebowithanemptyworldusingthefollowingcommand:

$rosrungazebo_rosgazebo

3. Nowwehavecreatedanenvironment,asshowninthefollowingscreenshot,andsaveditasempty.world.

4. Copyempty.worldtotheworldfolderinthechefbot_decriptionpackage.Starttherobotwiththisenvironmentusingthefollowingcommand:

$roslaunchchefbot_gazebochefbot_empty_world.launch

ThiswillbringthesameenvironmentthatwecreatedbeforealongwithChefBot.TheprocedureremainsthesameforTurtleBot.

Insteadofchefbot_description,wehavetocopytheturtlebot_descriptionfolderforTurtleBotusers:

1. Startthegmappinglaunchfiletostartmappingthisarea.Wecanusethefollowingcommandtolaunchthegmappingprocess:

$roslaunchchefbot_gazebogmapping_demo.launch

2. InTurtleBot,usethefollowingcommand:

$roslaunchturtlebot_gazebogmapping_demo.launch

3. Itwillstartthegmappingprocessandifwewanttoviewthemappingprocess,startrviz,atoolinROStovisualizesensordata(http://wiki.ros.org/rviz).ThecommandisthesameasitwasforTurtleBot:

$roslaunchturtlebot_rviz_launchersview_navigation.launch

Thescreenshotofrvizisasfollows:

Tocreateamapoftheroom,wehavetostartthekeyboardteleoperation:

1. Usingthekeyboardteleoperationfunction,wecanmovetherobotusingthekeyboardsothatitcanmaptheentirearea:

$roslaunchturtlebot_teleopkeyboard_teleop.launch

2. ThecommandissameforTurtleBot.Acompletemapofthesurroundingisshowninthefollowingscreenshot:

3. Afterbuildingthemap,wecansavethenamehotel_worldusingthefollowingcommand:

$rosrunmap_servermap_saver-f~/hotel_world

ThecommandissameforTurtleBot4. Aftersavingthemap,exitalltheotherapplicationsthatarecurrentlyinuse.5. Afterthemapisgenerated,thenextstepisautonomousnavigationandthelocalizationofthe

robotusingthebuiltmap.6. StartGazebousingthefollowingcommand:

$roslaunchchefbot_gazebochefbot_empty_world.launch

7. InTurtleBot,usethefollowingcommand:

$roslaunchturtlebotbot_gazebochefbot_empty_world.launch

8. StarttheamcldemoinChefBot.Notethepathbecauseitmayvaryforeachuser.9. ForChefBot,usethefollowingcommands:

$roslaunchchefbot_gazeboamcl_demo.launch

map_file:=/home/lentin/hotel_world.yaml

10. ForTurtleBot,usethefollowingcommands:

$roslaunchturtlebot_gazeboamcl_demo.launch

map_file:=/home/lentin/hotel_world.yaml

11. Startrvizusingthefollowingcommand.Thisisthesameforbothrobots:

$roslaunchturtlebot_rviz_launchersview_navigation.launch

Nowwecancommandtherobottonavigatetoapositiononthemapusingthe2DNavGoalbutton.Clickonthisbuttonandselectapositionthatisnearatable.Afterclickingonthisposition,itwillplanthepathtothatpointandnavigatetothatposition,asshowninthefollowingscreenshot:

Therobotcanavoidobstaclesandalsoplantheshortestpathtothegoalposition.Afterseveralruns,wefoundthattherobotworksperfectlyifthemapwebuildwasaccurate.Themapbuildingprocedurecanbefine-tunedusingtheinstructionsat(http://wiki.ros.org/costmap_2d).Foranapplicationsuchasservingfood,itrequiresprettygoodaccuracyinthemap,sothattherobotcandeliverfoodtothecorrectposition.

Questions1. Whatisrobotsimulationandwhatarethepopularrobotsimulators?2. WhatisROSandGazebo?3. WhatistherobotmodelinROS?4. WhatisgmappingandAMCL?

SummaryInthischapter,youlearnedhowtosimulateacustomrobotcalledChefBot.Wediscussedthedesignofthetherobotinthepreviouschapter.Aftertherobotdesign,wemovedontosimulatetherobotinavirtualenvironmenttotestthedesignoftherobot,andcheckedwhetheritmetourspecifications.Inthischapter,youlearnedaboutsimulationandvarioussimulatorapplicationsusedinindustry,research,andeducationindetail.Afterthat,wediscussedhowtheROSframeworkandGazebosimulatorwasusedtoperformthesimulatorwork.Wealsocreatedasamplehello_worldpackageusingROS.WeinstalledtheTurtleBotstackandcreatedROSpackagesfromtheTurtleBotstack.Finally,wesimulatedtherobotandperformedgmappingandautonomousnavigationinahotelenvironment.Wegottoknowthattheaccuracyofthesimulationdependsonthemap,andthattherobotwillworkbetterinsimulationifthegeneratedmapisperfect.

Chapter4.DesigningChefBotHardwareInthischapter,wewilldiscussthedesignandworkingofChefBothardwareandselectionofitshardwarecomponents.Inthepreviouschapter,wedesignedandsimulatedthebasicrobotframeworkinahotelenvironmentusingGazeboandROS,andtestedvariousmeasurementslikerobotbodymass,motortorque,wheeldiameter,andsoon.Also,wetestedtheautonomousnavigationcapabilityofChefBotinahotelenvironment.

Toachievethisgoalinhardware,weneedtoselectallhardwarecomponentsandfindhowtointerconnectallthesecomponents.Weknowthatthemainfunctionalityofthisrobotisnavigation;thisrobotwillhavetheabilitytonavigatefromthestartpositiontotheendpositionwithoutanycollisionwithitssurroundings.Wewilldiscussthedifferentsensorsandhardwarecomponentsrequiredtoachievethisgoal.Wewillseeablockdiagramrepresentationanditsexplanation,andalsodiscussthemainworkingoftherobot.Finally,weneedtoselectthecomponentsrequiredtobuildtherobot.Wecanalsoseetheonlinestoreswherewecanpurchasethesecomponents.

IfyouhaveaTurtleBot,youmayskipthischapterbecauseitisonlyforthosewhoneedtocreatetherobothardware.Let'sseewhatspecificationswehavetomeetinthehardwaredesign.Therobothardwaremainlyincludesrobotchassis,sensors,actuators,controllerboards,andPC.

SpecificationsoftheChefBothardwareInthissection,wewilldiscussingsomeoftheimportantspecificationsthatwementionedinChapter2,MechanicalDesignofaServiceRobot.Thefinalrobotprototypewillmeetthefollowingspecifications:

Simpleandcosteffectiverobotchassisdesign:Therobotchassisdesignshouldbesimpleandcosteffective.Autonomousnavigationfunctionality:Therobotshouldautonomouslynavigateanditshouldcontainnecessarysensorsfordoingthis.LongBatterylife:Therobotshouldhavealongbatterylifeinordertoworkcontinuously.Theworkingtimeshouldbegreaterthan1hour.Obstacleavoidance:Therobotshouldbeabletoavoidstaticanddynamicobjectsinthesurroundings.

Therobothardwaredesignshouldmeetthesespecifications.Let'slookatoneofthepossiblewaysofinterconnectingthecomponentsinthisrobot.Thenextsectionshowstheblockdiagramofarobotandexplainsit.

BlockdiagramoftherobotTherobot'smovementiscontrolledbytwoDirectCurrent(DC)gearmotorswithanencoder.Thetwomotorsaredrivenusingamotordriver.Themotordriverisinterfacedintoanembeddedcontrollerboard,whichwillsendcommandstothemotordrivertocontrolthemotormovements.Theencoderofthemotorisinterfacedintothecontrollerboardforcountingthenumberofrotationsofthemotorshaft.Thisdataistheodometrydatafromtherobot.Thereareultrasonicsensors,whichareinterfacedintothecontrollerboardforsensingtheobstaclesandmeasuringthedistancefromtheobstacles.ThereisanIMUsensortoimproveodometrycalculation.TheembeddedcontrollerboardisinterfacedintoaPC,whichdoesallthehigh-endprocessingintherobot.VisionandsoundsensorsareinterfacedintothePCandWi-Fiisattachedforremoteoperations.

Eachblockoftherobotisexplainedinthefollowingdiagram:

RobotHardwareblockDiagram

MotorandencoderTherobotthatwearegoingtodesignisadifferentialdriverobotwithtwowheels,sowerequiretwomotorsforitslocomotion.Eachmotorconsistsofquadratureencoders(http://letsmakerobots.com/node/24031)togetthemotorrotationfeedback.

Thequadratureencoderwillgiveafeedbackoftherotationofthemotorassquarepulses;wecandecodethepulsetogetthenumberofticksoftheencoder,whichcanbeusedforfeedback.Ifweknowthewheeldiameterandthenumberofticksofthemotor,wecancomputethedisplacementandtheangleoftherobotthattraversed.Thiscomputationisveryusefulfornavigationoftherobot.

Selectingmotors,encoders,andwheelsfortherobot

Fromthesimulation,wegotanideaabouttherobotparameters.Onthesimulationparameters,wementionedthatthemotortorqueneededtodrivetherobotis18kg-cm,butthecalculatedtorqueislessthanthis;weareselectingahightorquemotorforbetterperformance.OneoftheeconomicalmotorsthatwemightconsiderusingisfromPololu.WecanselectahightorqueDCgearmotorwithanencoderworkingat12VDCandhavingspeedof80RPMaccordingtoourdesign.Wearechoosingthefollowingmotorforthedrivesysteminthisrobot:

http://www.pololu.com/product/1447

Thefollowingfigureshowstheimageoftheselectedmotorforthisrobot.Themotorcomeswithanintegratedquadratureencoderwitharesolutionof64countsperrevolutionofthemotorshaft,whichcorrespondsto8400countsperrevolutionofthegearbox'soutputshaft.

DCGearmotorwithencoderandwheel

Thismotorhas6pinswithdifferentcolors.Thepindescriptionofthismotorisgiveninthefollowingtable:

Color Function

Red Motorpower(connectstoonemotorterminal)

Black Motorpower(connectstotheothermotorterminal)

Green EncoderGND

Blue EncoderVcc(3.5V-20V)

Yellow EncoderAoutput

White EncoderBoutput

Accordingtoourdesign,wechoseawheeldiameterof90mm.Pololuprovidesa90mmwheel,whichisavailableathttp://www.pololu.com/product/1439.Theprecedingfigureshowedthemotorassembledwiththiswheel.

Theotherconnectorsneededtoconnectthemotorsandwheelstogetherareavailableasfollows:

Themountinghubrequiredtomountthewheeltothemotorshaftisavailableathttp://www.pololu.com/product/1083TheL-bracketforthemotortomountonrobotchassisisavailableathttp://www.pololu.com/product/1084

MotordriverAmotordriverormotorcontrollerisacircuitthatcancontrolthespeedofthemotor.Controllingmotorsmeansthatwecancontrolthevoltageacrossthemotorandcanalsocontrolthedirectionandspeedofthemotor.Motorscanrotateclockwiseorcounterclockwise,ifwechangethepolarityofmotorterminal.

H-bridgecircuitsarecommonlyusedinmotorcontrollers.H-bridgeisanelectroniccircuitthatcanapplyvoltageineitherdirectionofload.Ithashighcurrenthandlingpropertiesandcanchangethedirectionofcurrentflow.

ThefollowingscreenshotshowsabasicH-bridgecircuitusingswitches:

HBridgecircuit

Thedirectionofthemotor,dependingonthefourswitches,isgivenasfollows:

S1 S2 S3 S4 Result

1 0 0 1 Motormovesright

0 1 1 0 Motormovesleft

0 0 0 0 Motorfreeruns

0 1 0 1 Motorbrakes

1 0 1 0 Motorbrakes

1 1 0 0 Motorshootsthrough

0 0 1 1 Motorshootsthrough

1 1 1 1 Motorshootsthrough

WehaveseenthebasicsofanH-bridgecircuitonthemotordrivercircuit.Now,wecanselectoneofthemotordriversforourapplicationanddiscusshowitworks.

Selectingamotordriver/controller

TherearesomemotordriversavailablewithPololu,whicharecompatiblewiththeselectedmotor.Thefollowingfigureshowsoneofthemotordriversthatwewilluseinourrobot:

DualVNH2SP30MotorDriverCarrierMD03A

Thismotordriverisavailableathttp://www.pololu.com/product/708.

Thisdrivercandrivetwomotorswithacombinedmaximumcurrentratingof30A,andcontainstwointegratedICfordrivingeachofthemotors.Thepindescriptionofthisdriverisgivenintheupcomingsections.

Inputpins

Thefollowingpinsaretheinputpinsofthemotordriver,bywhichwecancontrolmainlythemotorspeedanddirection:

PinName Function

1DIAG/EN,2DIAG/EN Thismonitorsthefaultconditionofmotordriver1and2.Innormaloperation,itwillremaindisconnected.

1INa,1INb,2INa,2INb

Thesepinswillcontrolthedirectionofmotor1and2inthefollowingmanner:

IfINA=INB=0,motorwillbreakIfINA=1,INB=0,motorwillrotateclockwiseIfINA=0,INB=1,motorrotatecounterclockwiseIfINA=INB=1,motorwillbreak

1PWM,2PWM Thiswillcontrolthespeedofmotor1and2byrapidlyturningthemonandoff.

1CS,2CS Thisisthecurrentsensingpinforeachmotor.

Outputpins

Theoutputpinsofthemotordriverwilldrivethetwomotors.Thefollowingaretheoutputpins:

PinName Function

OUT1A,OUT1B Thesepinsconnecttomotor1powerterminals

OUT2A,OUT2B Thesepinsconnecttomotor2powerterminals

Powersupplypins

Thefollowingarethepowersupplypins:

Pinname Function

VIN(+),GND(-) Thesearethesupplypinsofthetwomotors.Thevoltagerangesfrom5.5Vto16V.

+5VIN,GND(-) Thisisthesupplyofmotordriver.Thevoltageshouldbe5V.

EmbeddedcontrollerboardControllerboardsaretypicallyI/Oboards,whichcansendcontrolsignalsintheformofdigital

pulsestotheH-Bridge/motordriverboardandcanreceiveinputsfromsensorssuchasultrasonicandIRsensors.Wecanalsointerfacemotorencoderstothecontrolboardforthemotorfeedback.

ThemainfunctionalitiesofLaunchpadinthisrobotare:

InterfacingthemotordriverandencoderInterfacingtheultrasonicsoundsensorSendingandreceivingsensorvaluestoPCandfromPC

WewilldealwithI/Oboardsandinterfacingwithdifferentcomponentsintheupcomingchapters.SomeofthepopularI/OboardsareArduino(arduino.cc)andTivaCLaunchPad(http://www.ti.com/tool/EK-TM4C123GXL)byTexasInstruments.WeareselectingTivaCLaunchPadoverArduinobecauseoffollowingfactors:

TivaCLaunchPadhasamicrocontrollerbasedon32-bitARMCortex-M4with256KBFlashmemory,32KBSRAM,and80MHzoperation;however,mostoftheArduinoboardsrunbelowthisspecification.Outstandingprocessingperformance,combinedwithfastinterrupthandling.12Timers.16PWMOutputs.Twoquadratureencoderinputs.EightUniversalAsynchronousReceiver/Transmitter(UART).5VtolerantGeneral-PurposeInput/Output(GPIO).LowcostandsizecomparedtoArduinoboards.EasyprogrammableinterfaceIDEcalledEnergia(http://energia.nu/).ThecodewritteninEnergiaisArduinoboardcompatible.

ThefollowingimageshowstheTexasInstrument'sTivaCLaunchPad:

TivaCLaunchpad

ThepinoutofTexasInstrumentLaunchpadseriesisgivenathttp://energia.nu/pin-maps/guide_stellarislaunchpad/.ThispinoutiscompatiblewithalltheLaunchpadseries.ThisisalsousedwhileprogramminginEnergiaIDE.

UltrasonicsensorsUltrasonicsensorsarealsocalledpingsensors,andaremainlyusedtomeasuretherobot'sdistancefromanobject.Themainapplicationofpingsensorsistoavoidobstacles.Theultrasonicsensorsendshighfrequencysoundwavesandevaluatestheechoesthatarereceivedfromtheobject.Thesensorwillcalculatethedelaybetweensendingandreceivingtheecho,andfromthat,determineitsdistancefromanobject.

Inourrobot,collision-freenavigationisanimportantaspect,otherwisetherewillbedamagetotherobot.Youwillseeafigureshowinganultrasonicsensorinthenextsection.Thissensorcanbeemployedonthesidesofarobottodetectcollisiononthesidesandbackoftherobot.Thekinectisalsomainlyusedforobstacledetectionandcollisionavoidance.Theaccuracyofkinectcanonlybeexpectedfrom0.8m,sothatdistanceinbetween0.8mcanbedetectedusingultrasonicsensor.Itisactuallyanadd-ontoourrobotforincreasingcollisionavoidanceanddetection.

Selectingtheultrasonicsensor

OneofthepopularandcheapultrasonicsensorsavailableisHC-SR04.Weareselectingthissensorforourrobotbecauseofthefollowingfactors:

Rangeofdetectionisfrom2cmto4mWorkingvoltageis5VWorkingcurrentisverylowtypically15mA

Wecanusethissensorforaccuratedetectionofobstacles;italsoworkswith5V.HereistheimageofHC-SR04anditspinout:

Ultrasonicsoundsensor

Thepinsanddescriptionaregivenasfollows:

Pins Function

Vcc,GND Thesearethesupplypinsofultrasonicsensor.Normally,weneedtoapply5Vforanormaloperation.

Trig Thisistheinputpinofthesensor.Weneedtoapplyapulsewithaparticulardurationtothispintosendtheultrasonicsoundwaves.

Echo Thisistheoutputpinofthesensor.Itwillgenerateapulseonthispinwithatimeduration,accordingtothedelayinreceivingthetriggeredpulse.

InertialMeasurementUnitWewilluseInertialMeasurementUnit(IMU)inthisrobottogetagoodestimateoftheodometryvalueandtherobotpose.Theodometryvaluescomputedfromtheencoderalonemaynotbesufficientforefficientnavigation,itcouldcontainerrors.Tocompensateforerrorsduringtherobot'smovement,wewilluseIMUinthisrobot.WeareselectingMPU6050forIMUbecauseoffollowingreasons:

InMPU6050,theaccelerometerandgyroscopeareintegratedonasinglechipItprovideshighaccuracyandsensitivityThereisprovisiontointerfacemagnetometerforbetterIMUperformanceThebreakoutboardofMPU6050isverycheapTheMPU6050candirectlyinterfacetoLaunchpad,bothare3.3Vcompatibleandsoftwarelibrariesarealsoavailableforeasierinterfacing

ThefollowingfigureshowsthebreakoutboardofMPU6050:

Thepinsandtheirdescriptionsaregivenasfollows:

Pins Functions

VDD,GND Supplyvoltage2.3V-3.4V

INT Thispinwillgenerateaninterruptwhendatacomestothedevicebuffer

SCL,SDA SerialDataLine (SDA)andSerialClockLine (SCL)areusedforI2Ccommunication

ASCL,ASDA AuxiliaryI2CforcommunicationwithMagnetometer

Wecanpurchasethebreakoutboardfromhttps://www.sparkfun.com/products/11028.

KinectKinectisa3Dvisionsensor,mainlyusedin3Dvisionapplicationandmotiongaming.Weareusingkinectfor3Dvision.Usingkinect,therobotwillgetthe3Dimageofitssurroundings.The3Dimagesareconvertedtofinerpointscalledpointcloud.Thepointclouddatawillhaveall3Dparametersofthesurrounding.

Themainuseofkinectontherobotistomockthefunctionalityofalaserscanner.ThelaserscannerdataisessentialforanalgorithmcalledSLAM,usedforbuildingamapoftheenvironment.Thelaserscannerisaverycostlydevice,soinsteadofbuyinganexpensivelaserscanner,wecanconvertakinectintoavirtuallaserscanner.AnotheralternativetokinectisAsusXtionPRO(http://www.asus.com/Multimedia/Xtion_PRO/).Thiswillsupportthesamesoftwarewrittenforkinect.Thepointcloudtolaserdataconversionisdoneonthesoftware,sononeedtochangethehardwareparts.Aftergeneratingamapoftheenvironment,therobotcannavigateitssurroundings.

Thefollowingimageshowsthevariouspartsofakinectsensor:

Kinect

ThekinectmainlyhasanIRcameraandIRprojectorandalsohasanRGBcamera.TheIRcameraandprojectorgeneratesthe3Dpointcloudofthesurroundings.Italsohasamicarrayandmotorizedtiltformovingthekinectupanddown.

Wecanpurchasekinectfromhttp://www.amazon.co.uk/Xbox-360-Kinect-Sensor-Adventures/dp/B0036DDW2G.

CentralProcessingUnitTherobotismainlycontrolledbyitsnavigationalalgorithmthatisrunningonitsPC.WecanchoosealaptoporminiPCornetbookfortheprocessing.Recently,IntellaunchedaminicomputercalledIntelNextUnitofComputing(NUC).Ithasanultrasmallformfactor(smallsize),islightweight,andhasagoodcomputingprocessorwithIntelCeleron,Corei3,orCorei5.Itcansupportupto16GBofRAMandhasintegratedWi-Fi/Bluetooth.WearechoosingIntelNUCbecauseofitsperformance,ultrasmallformfactor,andlightweight.Wearenotgoingforapopularboard,suchasRaspberryPi(http://www.raspberrypi.org/)orBeagleBone(http://beagleboard.org/)becausewerequirehighcomputingpowerinthiscase,whichcannotbeprovidedbytheseboards.

TheNUCweareusingisIntelDN2820FYKH.Herearethespecificationsofthiscomputer:

IntelCeleronDualCoreprocessorwith2.39GHz4GBRAM500GBharddiskIntelintegratedgraphicsHeadphone/microphonejack12Vsupply

ThefollowingimageshowstheIntelNUCminicomputer:

IntelNUCDN2820FYKH

WecanpurchaseNUCfromhttp://goo.gl/Quzi7a.

Speakers/micThemainfunctionoftherobotisautonomousnavigation.Weareaddinganadditionalfeatureinwhichtherobotcaninteractwithusersthroughspeech.Therobotcanbegivencommandsusingvoiceandcanspeaktotheuserusingatexttospeech(TTS)engine,whichcanconverttexttospeechformat.Amicrophoneandspeakersareessentialforthisapplication.Thereisnoparticularselectionforthishardware.IfthespeakerandmicareUSBcompatible,thenitwillbegreat.AnotheralternativeisaBluetoothheadset.

Powersupply/batteryOneoftheimportanthardwarecomponentisthepowersupply.Wesawinthespecificationthattherobothastoworkformorethan1hour;itwillbegoodifthesupplyvoltageofthebatteryiscommontothecomponents.Also,ifthesizeandweightofthebatteryisless,itwillnotaffecttherobot'spayload.Anotherconcernisthatthemaximumcurrentneededfortheentirecircuitshouldnotexceedthebattery'smaximumcurrent,whichitcansource.Themaximumvoltageandcurrent

distributionofeachpartofthecircuitisasfollows:

Components Maximumcurrent(Ampere)

IntelNUCPC 12V,3A

Kinect 12V,1A

Motors 12V,0.7A

Motordriver,Ultrasonicsensor,IMU,Speakers 5V,<0.5A

Tomeetthesespecifications,weareselectinga12V,9AHLi-Polymerbatteryforouroperation.Thisbatterycanalsosourcemaximumcurrentupto5Ampere.

Thefollowingimageshowsourselectedbatteryforthisrobot:

Wecanbuythefollowingbatteryfromhttp://goo.gl/Clzk6I.

WorkingoftheChefBothardwareWecanexplaintheworkingoftheChefBothardwareusingthefollowingblockdiagram.Thisimprovedversionofourfirstblockdiagrammentionsthevoltageofeachcomponentanditsinterconnection:

ThemainaimofthischapterwastodesignthehardwareforChefBot,whichincludedfindingtheappropriatehardwarecomponentsandfindingtheinterconnectionbetweeneachpart.Themainfunctionalityofthisrobotistoperformautonomousnavigation.Thehardwaredesignofrobotisoptimizedforautonomousnavigation.

Therobotdriveisbasedondifferentialdrivesystem,whichconsistsoftwomotorsandtwowheels.Therearecasterwheelsforsupportingthemainwheels.Thesetwomotorscanmovetherobotinanyposeina2Dplanebyadjustingtheirvelocitiesanddirection.

Forcontrollingthevelocityanddirectionofthewheels,wehavetointerfaceamotorcontroller,whichcandothesefunctions.Themotordriverwechoseshouldabletocontroltwomotorsatatimeandchangethedirectionandspeed.

ThemotordriverpinsareinterfacedtoamicrocontrollerboardcalledTivaCLaunchPad,whichcansendthecommandstochangethedirectionandspeedofthemotor.ThemotordriverisinterfacedintoLaunchpadwiththehelpofalevelshifter.Thelevelshifterisacircuit,whichcanshiftvoltage

levelsfrom3.3Vto5Vandviceversa.Weareusingalevelshifterbecausethemotordriverisoperatingat5Vlevel,buttheLaunchpadisoperatingat3.3V.

Eachmotorhasarotationfeedbacksensorcalledtheencoder,whichcanbeusedtoestimatetherobot'sposition.TheencodersareinterfacedintotheLaunchpadalongwiththelevelshifter.

OthersensorsinterfacedintoLaunchpadincludeultrasonicsoundsensorandIMU.Ultrasonicsoundsensorcandetectobjectsthatarecloseby,butcannotbedetectedbythekinectsensor.IMUisusedalongwiththeencoders,togetagoodrobotposeestimation.

AllsensorvaluesarereceivedontheLaunchpadandsenttoPCviaUSB.TheLaunchpadrunsafirmwarecodethatcanreceiveallsensorvaluesandsendtothePC.

ThePCisinterfacedtokinect,Launchpad,Speaker,andMic.ThePChasROSrunningonitanditwillreceivekinectdataandconvertedtodataequivalenttolaserscanner.ThisdatacanbeusedtobuildthemapoftheenvironmentusingSLAM.Thespeaker/micisusedforcommunicationbetweentheuserandrobot.ThespeedcommandsgeneratedinROSnodesaresenttoLaunchpad.LaunchpadwillthenprocessthespeedcommandsandsendappropriatePWMvaluestothemotordrivercircuit.

Afterdesigninganddiscussingtheworkingoftherobothardware,wewilldiscussthedetailedinterfacingofeachcomponentandthefirmwarecodingnecessaryfortheinterfacing.

Questions1. Whatisrobothardwaredesigningallabout?2. WhatisH-bridgeandwhatareitsfunctions?3. Whicharethecomponentsessentialfortherobotnavigationalgorithm?4. Whatisthecriteriathathastobekeptinmindwhileselectingroboticcomponents?5. WhatarethemainapplicationsofKinectonthisrobot?

SummaryInthischapter,wehaveseenthefeaturesoftherobotthatwearegoingtodesign.Themainfeatureofthisrobotisautonomousnavigation.Therobotcannavigateinitssurroundingbyanalyzingsensorreadings.Wewentthroughtherobotblockdiagraminwhichwediscussedtheroleofeachblock,andwethenselectedappropriatecomponentsthatsatisfytheserequirements.Thischapteralsosuggestedsomeeconomicalcomponentstobuildthisrobot.Inthenextchapter,wewillfindoutmoreaboutactuatorsandtheirinterfacingthatweusingonthisrobot.

Chapter5.WorkingwithRoboticActuatorsandWheelEncodersInthischapter,wewillcover:

InterfacingaDCGearedmotorwithTivaCLaunchPadInterfacingaquadratureencoderwithTivaCLaunchPadExplanationofinterfacingcodeInterfacingDynamixelactuators

Inthepreviouschapter,wehavediscussedtheselectionofhardwarecomponentsneededtobuildourrobot.Oneoftheimportantcomponentsinrobothardwareistheactuator.Actuatorsprovidemobilitytotherobot.Inthischapter,weareconcentratingonthedifferenttypesofactuatorsthatwearegoingtouseinthisrobotandhowtheycanbeinterfacedwithTivaCLaunchPad,whichisa32-bitARMmicrocontrollerboardfromTexasInstrumentthatworksat80MHz.ThefirstactuatorthatwearegoingtodiscussisaDCgearedmotorwithanencoder.ADCgearedmotorworksusingdirectcurrent,andhasgearreductiontoreducetheshaftspeedandincreasethetorqueofthefinalshaft.Thesekindofmotorsareveryeconomicandwecanusethiskindofmotorinourrobotprototype.

Inthefirstsectionofthischapter,wewilldealwiththedesignofourrobotdrivesystem.TheDrivesystemofourrobotconsistsoftwoDCgearedmotorswithencodersandamotordriver.ThemotordriveriscontrolledbyTivaCLaunchPad.WewillseeinterfacingofmotordriverandquadratureencoderwithTivaCLaunchpad.

Inthelastsection,wewillexploresomeofthelatestactuatorswhichcanreplacetheexistingDCgearedmotorwithencoder.Ifthedesiredrobotneedsmorepayloadandaccuracy,wehaveswitchtothesekindofactuators.

InterfacingDCgearedmotorwithTivaCLaunchPadInthepreviouschapter,weselectedaDCgearedmotorwithanencoderfromPololuandtheembeddedboardfromTexasInstrumentscalledTivaCLaunchPad.WeneedthefollowingcomponentstointerfacethemotorwithLaunchpad:

TwoPololumetalgearmotors37Dx57Lmmwith64countperrevolutionencoderPololuwheel90x10mmandamatchinghubPololudualVNH2SP30motordrivercarrierMD03AAsealedleadacid/LithiumIonbatteryof12VAlogiclevelconvertorof3.3Vto5Vhttps://www.sparkfun.com/products/11978.ATivaCLaunchPadanditscompatibleinterfacingwires

ThefollowingfigureshowstheinterfacingcircuitoftwomotorsusingPololuH-Bridge:

Motorinterfacingcircuit

TointerfacewithLaunchpad,wehavetoconnectalevelshifterboardinbetweenthesetwo.Themotordriverworksin5VbuttheLaunchpadworksin3.3V,sowehavetoconnectalevelshifter,asshowninthefollowingfigure:

Levelshiftercircuit

ThetwogearedDCmotorsareconnectedtoOUT1A,OUT1B,andOUT2A,OUT2Bofthemotordriver.VIN(+)andGND(-)arethesupplyvoltagesofthemotor.TheseDCmotorscanworkwith12Voltsupply,sowegive12Voltastheinputvoltage.Themotordriverwillsupportaninputvoltage

rangeof5.5Vto16V.

Thecontrolsignals/inputpinsofmotordriversareontheleft-handsideofthedriver.Thefirstpinis1DIAG/EN,inmostcasesweleavethispindisconnected.Thesepinsareexternallypulledhighinthedriverboarditself.ThemainuseofthispinistoenableordisabletheH-bridgechip.ItisalsousedtomonitorthefaultyconditionoftheH-bridgeIC.Pins1INAand1INBcontrolthedirectionofrotationofthemotor.The1PWMpinwillswitchthemotortoONandOFFstate.WeachievespeedcontrolusingPWMpins.TheCSpinwillsensetheoutputcurrent.Itwilloutput0.13VoltsperAmpereoftheoutputcurrent.TheVINandGNDpinsgivethesameinputvoltagethatwesuppliedtothemotor.Wearenotusingthesepinshere.The+5V(IN)andGNDpinsarethesupplyforthemotordriverIC.Thesupplytothemotordriverandmotorsisdifferent.

Thefollowingtableshowsthetruthtableoftheinputandoutputcombinations:

INA INB DIAGA/ENA DIAGB/ENB OUTA OUTB CS Operatingmode

1 1 1 1 H H HighImp BraketoVcc

1 0 1 1 H L Isense=Iout/K Clockwise(CW)

0 1 1 1 L H Isense=Iout/K Counterclockwise(CCW)

0 0 1 1 L L HighImp BrakertoGND

ThevalueDIAG/ENpinsarealwayshighbecausethispinisexternallypulledhighinthedriverboarditself.Usingthesesignalcombinations,wecanmovetherobotinanydirectionandbyadjustingthePWMSignal,wecanadjustthespeedofthemotortoo.ThisisthebasiclogicbehindcontrollingaDCmotorusinganH-bridgecircuit.

WhileinterfacingmotortoLaunchpad,wemayrequirealevelshifter.ThisisbecausetheoutputpinsofLaunchpadcanonlysupply3.3Voltbutthemotordriverneeds5Vtotrigger;so,wehavetoconnect3.3Vtoa5Vlogiclevelconvertortostartworking.

Thetwomotorsworkinadifferentialdrivemechanism.Thefollowingsectiondiscussesdifferentialdriveanditsoperation.

DifferentialwheeledrobotTherobotwehavedesignedisadifferentialwheeledrobot.Inadifferentialwheeledrobot,themovementisbasedontwoseparatelydrivenwheelsplacedoneithersideoftherobot'sbody.Itcanchangeitsdirectionbychangingtherelativerateofrotationofitswheels,andhence,doesn'trequireadditionalsteeringmotion.Tobalancetherobot,afreeturningwheelorcasterwheelsmaybeadded.

Thefollowingfigureshowsatypicalrepresentationofdifferentialdrive:

Ifthetwomotorsaremovinginthesamedirection,therobotwillmoveforwardorbackward.Ifonemotorhasmorespeedthantheother,thentherobotturnstotheslowermotorside;sototurnleft,stoptheleftmotorandmovetherightmotor.Thefollowingfigureshowshowweconnectthetwomotorsinourrobot.Thetwomotorsaremountedontheoppositesidesofthebaseplateandweputtwocastersinfrontandbackoftherobotinordertobalanceit:

Topviewofrobotbase

Next,wecanprogramthemotorcontrollerusingLaunchpadaccordingtothetruthtabledata.ProgrammingisdoneusinganIDEcalledEnergia(http://energia.nu/).WeareprogrammingLaunchpadusingalanguagecalledWiring(http://wiring.org.co/).

InstallingtheEnergiaIDEWecandownloadthelatestversionofEnergiafromthefollowinglink:

http://energia.nu/download/

WewilldiscusstheinstallationproceduremainlyonUbuntu14.04.2,64-bit.TheEnergiaversionthatwewilluseis0101E0013:

1. DownloadEnergiaforLinux64-bitfromtheabovelink.2. ExtracttheEnergiacompressedfileintotheHomefolderoftheuser.3. AddrulestosetreadandwritepermissiontoTivaCLaunchPad.Thisisessentialforwriting

firmwaretoLaunchpad.ThefollowingcommandwilladdpermissionforUSBdevice:

$echo'ATTRS{idVendor}=="1cbe",ATTRS{idProduct}=="00fd",GROUP="users",

MODE="0660"'|\

sudotee/etc/udev/rules.d/99-tiva-launchpad.rules

4. Afterenteringthecommand,plugLaunchpadtoPC.5. StartEnergiausingthefollowingcommandinsidethefolder:

$./energia

ThefollowingscreenshotshowstheEnergiaIDE:

6. Now,selecttheboardbynavigatingtoTools|Boards|Launchpad(TivaC)w/tm4c123(80MHz)asshowninthefollowingscreenshot:

7. Then,selecttheSerialPortbynavigatingtoTools|SerialPort|/dev/ttyACM0asshowninthefollowingscreenshot:

8. Compilethecodeusingthecompilebutton.Thescreenshotofasuccessfulcompilationisgivenhere:

9. Aftersuccessfulcompilation,uploadthecodeintotheboardbyclickingontheUploadbutton.Theuploadedcodewasanemptycodewhichperformsnooperations.

Iftheuploadingissuccessful,thefollowingmessagewillbeshown:

UsethefollowingtutorialtoinstallEnergiaonMacOSXandWindows:

Refertohttp://energia.nu/Guide_MacOSX.htmlforMacOSXRefertohttp://energia.nu/Guide_Windows.htmlforWindows

InterfacingcodeThefollowingcodecanbeusedtotestthetwomotorsindifferentialdriveconfiguration.Thiscodecanmovetherobotforwardfor5secondsandbackwardfor5seconds.Then,itmovestherobottotheleftfor5secondsandrightfor5seconds.Aftereachmovement,therobotwillstopfor1second.

Atthebeginningofthecode,wedefinepinsforINA,INB,andPWMofthetwomotorsasfollows:

///LeftMotorPins

#defineINA_112

#defineINB_113

#definePWM_1PC_6

///RightMotorPins

#defineINA_25

#defineINB_26

#definePWM_2PC_5

ThepinoutforLaunchpadisgivenat:

http://energia.nu/pin-maps/guide_tm4c123launchpad/

Thefollowingcodeshowsthefivefunctionstomovetherobotforward,backward,leftandright.Thefifthfunctionistostoptherobot.WewillusethedigitalWrite()functiontowriteadigitalvaluetoapin.ThefirstargumentofdigitalWrite()isthepinnumberandsecondargumentisthevaluetobewrittentothepin.ThevaluecanbeHIGHorLOW.WewillusetheanalogWrite()functiontowriteaPWMvaluetoapin.ThefirstargumentofthisfunctionisthepinnumberandsecondisthePWMvalue.Therangeofthisvalueisfrom0-255.AthighPWM,themotordriverwillswitchfastandhavemorespeed.AtlowPWM,switchinginsidethemotordriverwillbeslow,sothemotorwillalsobeslow.Currently,wearerunningatfullspeed.

voidmove_forward()

{

//SettingCWrotationtoandLeftMotorandCCWtoRightMotor

//LeftMotor

digitalWrite(INA_1,HIGH);

digitalWrite(INB_1,LOW);

analogWrite(PWM_1,255);

//RightMotor

digitalWrite(INA_2,LOW);

digitalWrite(INB_2,HIGH);

analogWrite(PWM_2,255);

}

///////////////////////////////////////////////////////

voidmove_left()

{

//LeftMotor

digitalWrite(INA_1,HIGH);

digitalWrite(INB_1,HIGH);

analogWrite(PWM_1,0);

//RightMotor

digitalWrite(INA_2,LOW);

digitalWrite(INB_2,HIGH);

analogWrite(PWM_2,255);

}

//////////////////////////////////////////////////////

voidmove_right()

{

//LeftMotor

digitalWrite(INA_1,HIGH);

digitalWrite(INB_1,LOW);

analogWrite(PWM_1,255);

//RightMotor

digitalWrite(INA_2,HIGH);

digitalWrite(INB_2,HIGH);

analogWrite(PWM_2,0);

}

////////////////////////////////////////////////////////

voidstop()

{

//LeftMotor

digitalWrite(INA_1,HIGH);

digitalWrite(INB_1,HIGH);

analogWrite(PWM_1,0);

//RightMotor

digitalWrite(INA_2,HIGH);

digitalWrite(INB_2,HIGH);

analogWrite(PWM_2,0);

}

/////////////////////////////////////////////////

voidmove_backward()

{

//LeftMotor

digitalWrite(INA_1,LOW);

digitalWrite(INB_1,HIGH);

analogWrite(PWM_1,255);

//RightMotor

digitalWrite(INA_2,HIGH);

digitalWrite(INB_2,LOW);

analogWrite(PWM_2,255);

}

WefirstsettheINA,INBpinsofthetwomotortotheOUTPUTmode,sothatwecanwriteHIGHorLOWvaluestothesepins.ThefunctionpinMode()isusedtosetthemodeoftheI/Opin.ThefirstargumentofpinMode()isthepinnumberandsecondargumentisthemode.Wecansetapinasinputoroutput.Tosetapinasoutput,giveOUTPUTargumentasthesecondargument;tosetitasinput,giveINPUTasthesecondargumentasshowninfollowingcode.ThereisnoneedtosetthePWMpinastheoutputbecauseanalogWrite()writesthePWMsignalwithoutsettingpinMode():

voidsetup()

{

//SettingLeftMotorpinasOUTPUT

pinMode(INA_1,OUTPUT);

pinMode(INB_1,OUTPUT);

pinMode(PWM_1,OUTPUT);

//SettingRightMotorpinasOUTPUT

pinMode(INA_2,OUTPUT);

pinMode(INB_2,OUTPUT);

pinMode(PWM_2,OUTPUT);

}

Thefollowingsnippetisthemainloopofthecode.Itwillcalleachfunction,moveforward(),move_backward(),move_left(),andmove_right()for5seconds.Aftercallingeachfunction,therobotstopsfor1second.

voidloop()

{

//Moveforwardfor5sec

move_forward();

delay(5000);

//Stopfor1sec

stop();

delay(1000);

//Movebackwardfor5sec

move_backward();

delay(5000);

//Stopfor1sec

stop();

delay(1000);

//Moveleftfor5sec

move_left();

delay(5000);

//Stopfor1sec

stop();

delay(1000);

//Moverightfor5sec

move_right();

delay(5000);

//Stopfor1sec

stop();

delay(1000);

}

InterfacingquadratureencoderwithTivaCLaunchpadThewheelencoderisasensorattachedtothemotortosensethenumberofrotationsofthewheel.Ifweknowthenumberofrotations,wecancomputethedisplacement,velocity,acceleration,andangleofthewheel.

Forthisrobot,wehavechosenamotorwithanin-builtencoder.Thisencoderisaquadraturetype,whichcansenseboththedirectionandspeedofthemotor.Encodersusedifferenttypesofsensors,suchasopticalandhallsensors,todetecttheseparameters.ThisencoderusesHalleffecttosensetherotation.Thequadratureencoderhastwochannels,namelyChannelAandChannelB.Eachchannelwillgeneratedigitalsignalswithninetydegreephaseshift.Thefollowingfigureshowsthewaveformofatypicalquadratureencoder:

Quadratureencoderwaveforms

Ifthemotorrotatesclockwise,ChannelAwillleadChannelB,andifthemotorrotatescounterclockwise,ChannelBwillleadChannelA.Thisreadingwillbeusefultosensethedirectionofrotationofthemotor.Thefollowingsectiondiscusseshowwecantranslatetheencoderoutputtousefulmeasurementslikedisplacementandvelocity.

ProcessingencoderdataEncoderdataisatwochannelpulseoutwith90degreeoutofphase.Usingthisdata,wecanfindthedirectionofrotationandhowmanytimesthemotorhasrotated,andtherebyfindthedisplacementandvelocity.

Someofthetermsthatspecifyencoderresolutionarepulsesperrevolution(PPR)orlinesperrevolution(LPR)andcountsperrevolution(CPR).PPRspecifieshowmanyelectricalpulses(0to1transitions)therewillbeduringonerevolutionofamotor'sfinalshaft.SomemanufacturersusethenameCPRinsteadofPPR.Becauseeachpulsewillcontaintwoedges(risingandfalling)andthere

aretwopulsechannels(AandB)witha90degreephaseshift,thetotalnumberofedgeswillbefourtimesthenumberofPPR.Mostquadraturereceiversusethesocalled4Xdecodingtocountalltheedgesfromanencoder'sAandBchannelsyielding4XresolutioncomparedtotherawPPRvalue.

Inourmotor,PololuspecifiesthattheCPRis64forthemotorshaft,whichcorrespondsto8400CPRofthegearbox'soutputshaft.Ineffect,weget8400countsfromthegearboxoutputshaftwhenthemotor'sfinalshaftcompletesonerevolution.Thefollowingfigureshowshowwecancomputethecountfromtheencoderpulses:

Encoderwaveformwithcountwaveform

Inthisencoderspecification,theygivethecountperrevolution;itiscalculatedbytheencoderchanneledgetransitions.Onepulseofanencoderchannelcorrespondstofourcounts.Sotoget8400countsinourmotor,thePPRwillbe8400/4=2100.Fromtheprecedingfigure,wewillbeabletocalculatethenumberofcountsinonerevolution,butwealsoneedtosensethedirectionofthemovement.Thisisbecauseirrespectiveofwhethertherobotmovesforwardorbackward,thecountsthatwegetwillbesame;sosensingthedirectionisimportantinordertodecodethesignal.Thefollowingfigureshowshowwecandecodetheencoderpulses:

Ifweobservethecodepattern,wecanunderstandthatitfollowsthe2-bitGraycode.AGraycodeisencodingofnumbers,suchthatadjacentnumbershaveasingledigitdifferingby1.Graycodes(http://en.wikipedia.org/wiki/Gray_code)arecommonlyusedinrotaryencodersforefficientcoding.

Wecanpredictthedirectionofrotationofamotorbystatetransitions.Thestatetransitiontableisgiveninthefollowingfigure:

State Clockwisetransition Counterclockwisetransition

0,0 0,1to0,0 1,0to0,0

1,0 0,0to1,0 1,1to1,0

1,1 1,0to1,1 0,1to1,1

0,1 1,1to0,1 0,0to0,1

Itwillbemoreconvenientifwerepresentitinastatetransitiondiagram:

AftergettingthisGraycode,wecanprocessthepulsesusingamicrocontroller.Thechannelpinsofthemotorhavetobeconnectedtotheinterruptpinsofthemicrocontroller.Sowhenthechannelhasedgetransitions,itwillgenerateaninterruptortriggerinthepins,andifanyinterruptsarrivesinthatpin,aninterruptserviceroutineorsimplyafunctionwillbeexecutedinsidethemicrocontrollerprogram.Itcanreadthecurrentstateofthetwopins.Accordingtothecurrentstateofpinsandpreviousvalues,wecandeterminethedirectionofrotationandcandecidewhetherwehavetoincrementordecrementthecount.Thisisthebasiclogicofencoderhandling.

Aftergettingthecount,wecancalculatetheangleofrotation(indegrees)usingAngle=(CountValue/CPR)*360.Here,ifwesubstituteCPRwith8400,theequationbecomesAngle=0.04285*CountValue,thatis,forturningonedegree,24countshavetobereceivedor6encodedchannelpulseshavetocome.

ThefollowingfigureshowstheinterfacingcircuitofonemotorencoderwithTivaCLaunchPad:

InterfacingMotorencoderwithTivaCLaunchpad

Themaximumlevelofoutputpulseisbetween0Vto5Vfromtheencoder.Inthiscase,wecandirectlyinterfacetheencoderwithLaunchpadbecauseitcanreceiveinputofupto5V,orwecanusea3.3Vto5Vlevelshifterlikeweusedformotordriverinterfacingearlier.

Inthenextsection,wewillwriteacodeinEnergiatotestthequadratureencodersignal.Weneedtocheckwhetherwegetapropercountfromencoder.

QuadratureencoderinterfacingcodeThiscodewillprintthecountoftheleftandrightmotorencoderviaaserialport.Thetwoencodersarein2Xdecodingscheme,sowewillget4200CPR.Inthefirstsectionofthecode,wearedefiningpinsfortwochanneloutputsoftwoencodersandwearedeclaringthecountvariablefortwoencoders.Theencodervariableusesavolatilekeywordbeforethevariabledatatype.

ThemainuseofvolatileisthatthevariablewithvolatilekeywordwillbestoredintheRAM,whereasnormalvariablesareinCPUregisters.Encodervalueswillchangeveryquickly,sousinganordinaryvariablewillnotbeaccurate.Inordertogetaccuracy,wewillusevolatileforencodervariables,asfollows:

//Encoderpinsdefinition

//Leftencoder

#defineLeft_Encoder_PinA31

#defineLeft_Encoder_PinB32

volatilelongLeft_Encoder_Ticks=0;

//Variabletoreadcurrentstateofleftencoderpin

volatileboolLeftEncoderBSet;

//RightEncoder

#defineRight_Encoder_PinA33

#defineRight_Encoder_PinB34

volatilelongRight_Encoder_Ticks=0;

//Variabletoreadcurrentstateofrightencoderpin

volatileboolRightEncoderBSet;

Thefollowingcodesnippetisthedefinitionofthesetup()function.Inwiringlanguage,setup()isabuilt-infunctionusedforinitializationandforone-timeexecutionofvariablesandfunctions.Insidesetup(),weinitializetheserialdatacommunicationwithabaudrateof115200andcallauser-definedfunctionSetupEncoders()toinitializepinsoftheencoders.Theserialdatacommunicationismainlydonetochecktheencodercountviatheserialterminal.

voidsetup()

{

//InitSerialportwith115200buadrate

Serial.begin(115200);

SetupEncoders();

}

ThedefinitionofSetupEncoders()isgiveninthecodethatfollows.Toreceivetheencoderpulse,weneedtwopinsinLaunchpadastheinput.ConfiguretheencoderpinstoLaunchpadastheinputandactivateitspull-upresistor.TheattachInterrupt()functionwillconfigureoneoftheencoderpinsasaninterrupt.TheattachInterrupt()functionhasthreearguments.Firstargumentisthepinnumber,secondargumentistheInterruptServiceRoutine(ISR),andthethirdargumentistheinterruptcondition,thatis,theconditioninwhichtheinterrupthastofireISR.Inthiscode,weareconfiguringPinAoftheleftandrightencoderpinsastheinterrupt;itcallstheISRwhenthereisariseinthepulse.

voidSetupEncoders()

{

//Quadratureencoders

//Leftencoder

pinMode(Left_Encoder_PinA,INPUT_PULLUP);

//setspinAasinput

pinMode(Left_Encoder_PinB,INPUT_PULLUP);

//setspinBasinput

attachInterrupt(Left_Encoder_PinA,do_Left_Encoder,RISING);

//Rightencoder

pinMode(Right_Encoder_PinA,INPUT_PULLUP);

//setspinAasinput

pinMode(Right_Encoder_PinB,INPUT_PULLUP);

//setspinBasinput

attachInterrupt(Right_Encoder_PinA,do_Right_Encoder,RISING);

}

Thefollowingcodeisthebuilt-inloop()functioninwiringlanguage.Theloop()functionisaninfiniteloopwhereweputourmaincode.Inthiscode,wecalltheUpdate_Encoders()functiontoprinttheencodervaluecontinuouslythroughserialterminal.

voidloop()

{

Update_Encoders();

}

ThefollowingcodeisthefunctiondefinitionoftheUpdate_Encoders()function.Itprintstwoencodervaluesinalinewithastartingcharacter"e",andthevaluesareseparatedbytabspaces.TheSerial.print()functionisabuilt-infunctionthatwillprintthecharacter/stringgivenastheargument.

voidUpdate_Encoders()

{

Serial.print("e");

Serial.print("\t");

Serial.print(Left_Encoder_Ticks);

Serial.print("\t");

Serial.print(Right_Encoder_Ticks);

Serial.print("\n");

}

ThefollowingcodeistheISRdefinitionoftheleftandrightencoders.Whenarisingedgeisdetectedoneachofthepins,oneoftheISRswillbecalled.ThecurrentinterruptpinsarePinAofeachoftheencoders.Aftergettingtheinterrupt,wecanassumethattherisingPinAhasahighervaluestate,sothereisnoneedtoreadthatpin.ReadPinBofboththeencodersandstorethepinstatetoLeftEncoderBSetorRightEncoderBSet.ThecurrentstateiscomparedtothepreviousstateofPinBandcandetectthedirectionanddecidewhetherthecounthastobeincrementedordecrementedaccordingtothestatetransitiontable.

voiddo_Left_Encoder()

{

LeftEncoderBSet=digitalRead(Left_Encoder_PinB);

//readtheinputpin

Left_Encoder_Ticks-=LeftEncoderBSet?-1:+1;

}

voiddo_Right_Encoder()

{

RightEncoderBSet=digitalRead(Right_Encoder_PinB);

//readtheinputpin

Right_Encoder_Ticks+=RightEncoderBSet?-1:+1;

}

UploadthesketchandviewtheoutputusingtheserialmonitorinEnergia.NavigatetoTools|Serial

monitor.Movethetwomotorsmanuallyandyoucanseethecountchanging.Setthebaudrateintheserialmonitor,whichisthesameasinitializedinthecode;inthiscase,itis115200.

Theoutputwilllooklikethis:

Ifwewanttoupgradetherobottohighaccuracyandpayload,wehavetothinkabouthighqualityactuatorssuchasDynamixel.Dynamixelsareintelligentactuators,whichhavein-builtPIDcontrolandmonitoringoftheservoandencoderparameters,suchastorque,position,andsoon.

WorkingwithDynamixelactuatorsDynamixelisakindofnetworkedactuatorforrobotsdevelopedbyKoreanmanufactureROBOTIS.Itiswidelyusedbycompanies,universities,andhobbyistsduetoitsversatileexpansioncapability,powerfeedbackfunction,position,speed,internaltemperature,inputvoltage,andsoon.

TheDynamixelservoscanbeconnectedinadaisychain;itisamethodofconnectingdeviceinaserialfashion,thatis,connectingonedevicetoanotherthroughtheconnecteddevices,andcancontrolalltheconnectedservosfromonecontroller.DynamixelservoscommunicateviaRS485orTTL.ThelistofavailableDynamixelservosisgivenathttp://www.robotis.com/xe/dynamixel_en.

TheinterfacingofDynamixelisveryeasy.DynamixelcomeswithacontrollercalledUSB2Dyanmixel,whichwillconvertUSBtoDynamixelcompatibleTTL/RS485levels.ThefollowingfigureshowstheinterfacingdiagramofDynamixel:

ROBOTISprovidesDynamixelSDKforaccessingmotorregisters;wecanreadandwritevaluestoDynamixelregistersandretrievedatasuchasposition,temperature,voltage,andsoon.

Note

TheinstructionstosetUSB2DynamixelandDynamixelSDKaregivenatsupport.robotis.com/en/.

DynamixelcanbeprogramedusingPythonlibraries.OneofthePythonlibrariesforhandlingDynamixelservosispydynamixel.ThispackageisavailableforWindowsandLinux.PydynamixelwillsupportRX,MX,andEXseriesservos.

WecandownloadthepydynamixelPythonpackagefromhttps://pypi.python.org/pypi/dynamixel/.

Downloadthepackageandextractittothehomefolder.Openaterminal/DOSpromptandexecutethefollowingcommand:

sudopythonsetup.pyinstall

Afterinstallingthepackage,wecantrythefollowingPythonexample,whichwilldetecttheservoattachedtotheUSB2Dynamixelandwritesomerandompositiontotheservo.ThisexamplewillworkwithRXandMXservos.

#!/usr/bin/envpython

ThefollowingcodewillimportthenecessaryPythonmodulesrequiredforthisexample.ThisincludesDynamixelPythonmodulestoo:

importos

importdynamixel

importtime

importrandom

ThefollowingcodedefinesthemainparametersneededforDynamixelcommunicationparameters.ThenServosvariabledenotednumberofDynamixelservosconnectedtothebus.TheportNamevariableindicatestheserialportofUSB2DynamixeltowhichDynamixelservosareconnected.ThebaudRatevariableisthecommunicationspeedofUSB2DynamixelandDynamixel.

#ThenumberofDynamixelsonourbus.

nServos=1

#Setyourserialportaccordingly.

ifos.name=="posix":

portName="/dev/ttyUSB0"

else:

portName="COM6"

#DefaultbaudrateoftheUSB2Dynamixeldevice.

baudRate=1000000

ThefollowingcodeistheDynamixelPythonfunctiontoconnecttoDynamixelservos.Ifitisconnected,theprogramwillprintitandscanthecommunicationbustofindthenumberofservosstartingfromID1to255.TheServoIDistheidentificationofeachservo.WearegivennServosas1,soitwillstopscanningaftergettingoneservoonthebus:

#Connecttotheserialport

print"Connectingtoserialport",portName,'...',

serial=dynamixel.serial_stream.SerialStream(port=portName,baudrate=baudRate,

timeout=1)

print"Connected!"

net=dynamixel.dynamixel_network.DynamixelNetwork(serial)

net.scan(1,nServos)

ThefollowingcodewillappendtheDynamixelIDandtheservoobjecttothemyActuatorslist.Wecanwriteservovaluestoeachservousingservoidandservoobject.WecanusethemyActuatorslistforfurtherprocessing:

#Alisttoholdthedynamixels

myActuators=list()

printmyActuators

Thiswillcreatealistforstoringdynamixelactuatorsdetails.

print"ScanningforDynamixels...",

fordyninnet.get_dynamixels():

printdyn.id,

myActuators.append(net[dyn.id])

print"...Done"

Thefollowingcodewillwriterandompositionsfrom450to600toeachDynamixelactuatorthatisavailableonthebus.TherangeofpositionsinDynamixelis0to1023.Thiswillsettheservoparameterssuchasspeed,torque,torque_limt,max_torque,andsoon:

#Setthedefaultspeedandtorque

foractuatorinmyActuators:

actuator.moving_speed=50

actuator.synchronized=True

actuator.torque_enable=True

actuator.torque_limit=800

actuator.max_torque=800

Thefollowingcodewillprintthecurrentpositionofthecurrentactuator:

#Movetheservosrandomlyandprintouttheircurrentpositions

whileTrue:

foractuatorinmyActuators:

actuator.goal_position=random.randrange(450,600)

net.synchronize()

Thefollowingcodewillreadalldatafromactuators:

foractuatorinmyActuators:

actuator.read_all()

time.sleep(0.01)

foractuatorinmyActuators:

printactuator.cache[dynamixel.defs.REGISTER['Id']],

actuator.cache[dynamixel.defs.REGISTER['CurrentPosition']]

time.sleep(2)

Questions1. WhatistheH-Bridgecircuit?2. Whatisaquadratureencoder?3. Whatisthe4Xencodingscheme?4. Howdowecalculatedisplacementfromencoderdata?5. WhatarethefeaturesoftheDynamixelactuator?

SummaryInthischapterwehavediscussedtheinterfacingofmotorthatweareusinginourrobot.WehaveseenmotorandencoderinterfacingwithacontrollerboardcalledTivaCLaunchPad.Wehavediscussedthecontrollercodeforinterfacingmotorandencoder.Inthefuture,iftherobotrequireshighaccuracyandtorque,wehaveseenDynamixelservosthatcansubstitutecurrentDCmotors.Inthenextchapter,wewillseedifferentkindsofsensorsthatcanbeusedinrobotsanditsinterfacing.

Chapter6.WorkingwithRoboticSensorsInthepreviouschapter,wehaveseentheinterfacingofsomeactuatorsforourservicerobot.Thenextimportantsectionthatweneedtocoverisabouttheroboticsensorsusedinthisrobot.

Weareusingsensorsinthisrobottofindthedistancefromanobstacle,togettherobotodometrydata,andforroboticvisionandacoustics.

Thesensorsareultrasonicdistancesensors,orIRproximitysensorsareusedtodetecttheobstaclesandtoavoidcollisions.ThevisionsensorssuchasKinecttoacquire3Ddataoftheenvironment,forvisualodometry;objectdetection,forcollisionavoidance;andaudiodevicessuchasspeakersandmics,forspeechrecognitionandsynthesis.

Inthischapter,wearenotincludingvisionandaudiosensorsinterfacingbecauseintheupcomingchapterwewilldiscussthemandtheirinterfacingindetail.

WorkingwithultrasonicdistancesensorsOneofthemostimportantfeaturesofamobilerobotisnavigation.Anidealnavigationmeansarobotcanplanitspathfromitscurrentpositiontothedestinationandcanmovewithoutanyobstacles.Weuseultrasonicdistancesensorsinthisrobotfordetectingobjectsincloseproximitythatcan'tbedetectedusingtheKinectsensor.AcombinationofKinectandultrasonicsoundsensorsprovidesidealcollisionavoidanceforthisrobot.

Ultrasonicdistancesensorsworkinthefollowingmanner.Thetransmitterwillsendanultrasonicsoundwhichisnotaudibletohumanears.Aftersendinganultrasonicwave,itwillwaitforanechoofthetransmittedwave.Ifthereisnoecho,itmeanstherearenoobstaclesinfrontoftherobot.Ifthereceivingsensorreceivesanecho,apulsewillbegeneratedonthereceiver,anditcancalculatethetotaltimethewavewilltaketotraveltotheobjectandreturntothereceiversensors.Ifwegetthistime,wecancomputethedistancetotheobstacleusingthefollowingformula:

SpeedofSound*TimePassed/2=DistancefromObject.

Here,thespeedofsoundcanbetakenas340m/s.

Mostoftheultrasonicrangesensorshaveadistancerangefrom2cmto400cm.Inthisrobot,weuseasensormodulecalledHC-SR04.WecanseehowtointerfaceHC-SR04withTivaCLaunchPadtogetthedistancefromtheobstacles.

InterfacingHC-SR04toTivaCLaunchPadThefollowingfigureistheinterfacingcircuitoftheHC-SR04ultrasonicsoundsensorwithTivaCLaunchPad:

InterfacingdiagramofLaunchpadandHC-SR04

Theworkingvoltageoftheultrasonicsensoris5Vandtheinput/outputofthissensorisalso5Volt,soweneedalevelshifterontheTrigandEchopinsfortheinterfacingintothe3.3VlevelLaunchpad.Inthelevelshifter,weneedtoapplyhighvoltage,thatis,5Volt,andlowvoltage,thatis,3.3Volt,asshowninthefigure,toswitchfromoneleveltoanotherlevel.TrigandEchopinsareconnectedonthehighvoltagesideofthelevelshifterandthelowvoltagesidepinsareconnectedtoLaunchpad.TheTrigpinandEchopinareconnectedtothe10thand9thpinsofLaunchpad.Afterinterfacingthesensor,wecanseehowtoprogramthetwoI/Opins.

WorkingofHC-SR04

Thetimingdiagramofwaveformoneachpinisshowninthefollowingdiagram.Weneedtoapplyashort10µspulsetothetriggerinputtostarttherangingandthenthemodulewillsendoutaneightcycleburstofultrasoundat40KHzandraiseitsecho.Theechoisadistanceobjectthatispulsewidthandtherangeinproportion.Youcancalculatetherangethroughthetimeintervalbetweensendingtriggersignalsandreceivingechosignalsusingthefollowingformula:

Range=highleveltimeofechopinoutput*velocity(340M/S)/2.

Itwillbebettertouseadelayof60msbeforeeachtrigger,toavoidoverlappingbetweenthetriggerandecho:

InterfacingcodeofTivaCLaunchPad

ThefollowingEnergiacodeforLaunchpadreadsvaluesfromtheultrasoundsensorandmonitorsthevaluesthroughaserialport.

ThefollowingcodedefinesthepinsinLaunchpadtohandleultrasonicechoandtriggerpinsandalsodefinesvariablesforthedurationofthepulseandthedistanceincentimeters:

constintecho=9,Trig=10;

longduration,cm;

Thefollowingcodesnippetisthesetup()function.Thesetup()functioniscalledwhenasketch/codestarts.Usethistoinitializevariables,pinmodes,startusinglibraries,andsoon.Thesetupfunctionwillonlyrunonce,aftereachpoweruporresetoftheLaunchpadboard.Insidesetup(),weinitializeserialcommunicationwithabaudrateof115200andsetupthemodeofultrasonichandlingpinsbycallingafunctionSetupUltrasonic();

voidsetup()

{

//InitSerialportwith115200buadrate

Serial.begin(115200);

SetupUltrasonic();

}

Thefollowingisthesetupfunctionfortheultrasonicsensor;itwillconfiguretheTriggerpinasOUTPUTandtheEchopinasINPUT.ThepinMode()functionisusedtosetthepinasINPUTorOUTPUT.

voidSetupUltrasonic()

{

pinMode(Trig,OUTPUT);

pinMode(echo,INPUT);

}

Aftercreatingasetup()function,whichinitializesandsetstheinitialvalues,theloop()functiondoespreciselywhatitsnamesuggests,andloopsconsecutively,allowingyourprogramtochangeandrespond.UseittoactivelycontroltheLaunchpadboard.

Themainloopofthisisinthefollowingcode.ThisfunctionisaninfiniteloopandcallstheUpdate_Ultra_Sonic()functiontoupdateandprinttheultrasonicreadingsthroughaserialport:

voidloop()

{

Update_Ultra_Sonic();

delay(200);

}

ThefollowingcodeisthedefinitionoftheUpdate_Ultra_Sonic()function.Thisfunctionwilldothefollowingoperations.First,itwilltakethetriggerpintotheLOWstatefor2microsecondsandHIGHfor10microseconds.After10microseconds,itwillagainreturnthepintotheLOWstate.Thisisaccordingtothetimingdiagram.Wealreadysawthat10µsisthetriggerpulsewidth.

Aftertriggeringwith10µs,wehavetoreadthetimedurationfromtheEchopin.Thetimedurationisthetimetakenforthesoundtotravelfromthesensortotheobjectandfromtheobjecttothesensorreceiver.WecanreadthepulsedurationbyusingthepulseIn()function.Aftergettingthetimeduration,wecanconvertthetimeintocentimetersbyusingthemicrosecondsToCentimeters()function,asshowninthefollowingcode:

voidUpdate_Ultra_Sonic()

{

digitalWrite(Trig,LOW);

delayMicroseconds(2);

digitalWrite(Trig,HIGH);

delayMicroseconds(10);

digitalWrite(Trig,LOW);

duration=pulseIn(echo,HIGH);

//convertthetimeintoadistance

cm=microsecondsToCentimeters(duration);

//Sendingthroughserialport

Serial.print("distance=");

Serial.print("\t");

Serial.print(cm);

Serial.print("\n");

}

Thefollowingcodeistheconversionfunctionfrommicrosecondstodistanceincentimeters.Thespeedofsoundis340m/s,thatis,29microsecondspercentimeter.Sowegetthetotaldistancebydividingthetotalmicrosecondsby29/2:

longmicrosecondsToCentimeters(longmicroseconds)

{

returnmicroseconds/29/2;

}

Afteruploadingthecode,opentheserialmonitorfromtheEnergiamenuunderTools|SerialMonitorandchangethebaudrateinto115200.Youcanseethevaluesfromtheultrasonicsensor,likethis:

Outputoftheenergiaserialmonitor

InterfacingTivaCLaunchPadwithPython

Inthissection,wecanseehowtoconnectTivaCLaunchPadwithPythontoreceivedatafromLaunchpad.

ThePySerialmodulecanbeusedforinterfacingLaunchpadtoPython.ThedetaileddocumentationofPySerialanditsinstallationprocedureforWindow,Linux,andOSXisonthefollowinglink:

http://pyserial.sourceforge.net/pyserial.html

PySerialisavailableintheUbuntupackagemanageranditcanbeeasilyinstalledinUbuntuusingthefollowingcommandinterminal:

$sudoapt-getinstallpython-serial

Afterinstallingthepython-serialpackage,wecanwriteapythoncodetointerfaceLaunchpad.Theinterfacingcodeisgiveninfollowingsection.

Thefollowingcodeimportsthepythonserialmoduleandthesysmodule.TheserialmodulehandlestheserialportsofLaunchpadandperformsoperationssuchasreading,writing,andsoon.Thesysmoduleprovidesaccesstosomevariablesusedormaintainedbytheinterpreterandtofunctionsthatinteractstronglywiththeinterpreter.Itisalwaysavailable:

#!/usr/bin/envpython

importserial

importsys

WhenweplugLaunchpadtothecomputer,thedeviceregistersontheOSasavirtualserialport.InUbuntu,thedevicenamelookslike/dev/ttyACMx.Wherexcanbeanumber,ifthereisonlyonedevice,itwillprobablybe0.TointeractwiththeLaunchpad,weneedtohandlethisdevicefileonly.

Thefollowingcodewilltrytoopentheserialport/dev/ttyACM0ofLaunchpadwithabaudrateof115200.Ifitfails,itwillprintUnabletoopenserialport.

try:

ser=serial.Serial('/dev/ttyACM0',115200)

except:

print"Unabletoopenserialport"

Thefollowingcodewillreadtheserialdatauntiltheserialcharacterbecomesanewline('\n')andprintsitontheterminal.IfwepressCtrl+Conthekeyboard,toquittheprogram,itwillexitbycallingsys.exit(0).

whileTrue:

try:

line=ser.readline()

printline

except:

print"Unabletoreadfromdevice"

sys.exit(0)

Aftersavingthefile,changethepermissionofthefiletoexecutableusingthefollowingcommand:

$sudochmod+Xscript_name

$./script_name

Theoutputofthescriptwilllooklikethis:

WorkingwiththeIRproximitysensorInfraredsensorsareanothermethodtofindobstaclesandthedistancefromtherobot.Theprincipleofinfrareddistancesensorsisbasedontheinfraredlightthatisreflectedfromasurfacewhenhittinganobstacle.AnIRreceiverwillcapturethereflectedlightandthevoltageismeasuredbasedontheamountoflightreceived.

OneofthepopularIRrangesensorsisSharpGP2D12,theproductlinkisasfollows:

http://www.robotshop.com/en/sharp-gp2y0a21yk0f-ir-range-sensor.html

ThefollowingfigureshowstheSharpGP2D12sensor:

ThesensorsendsoutabeamofIRlightandusestriangulationtomeasurethedistance.ThedetectionrangeoftheGP2D12isbetween10cmand80cm.Thebeamis6cmwideatadistanceof80cm.ThetransmissionandreflectionoftheIRlightsensorisillustratedinthefollowingfigure:

OntheleftofthesensorisanIRtransmitter,whichcontinuouslysendsIRradiation,afterhittingintosomeobjects,theIRlightwillreflectanditwillbereceivedbytheIRreceiver.TheinterfacingcircuitoftheIRsensorisshownhere:

TheanalogoutpinVocanbeconnectedtotheADCpinofLaunchpad.TheinterfacingcodeoftheSharpdistancesensorwiththeTivaCLaunchpadisgivenfurtherinthissection.Inthiscode,weselectthe18thpinofLaunchpadandsetittotheADCmodeandreadthevoltagelevelsfromtheSharpdistancesensor.TherangeequationoftheGP2D12IRsensorisgivenasfollows:

Range=(6787/(Volt-3))–4

Here,VoltistheanalogvoltagevaluefromADCoftheVoutpin.

Inthisfirstsectionofthecode,wesetthe18thpinofTivaCLaunchPadastheinputpinandstartaserialcommunicationatabaudrateof115200:

intIR_SENSOR=18;//SensorisconnectedtotheanalogA3

intintSensorResult=0;//Sensorresult

floatfltSensorCalc=0;//Calculatedvalue

voidsetup()

{

Serial.begin(115200);//Setupcommunicationwithcomputertopresentresults

serialmonitor

}

Inthefollowingsectionofcode,thecontrollercontinuouslyreadstheanalogpinandconvertsittothedistancevalueincentimeters:

voidloop()

{

//readthevaluefromtheirsensor

intSensorResult=analogRead(IR_SENSOR);//Getsensorvalue

//Calculatedistanceincmaccordingtotherangeequation

fltSensorCalc=(6787.0/(intSensorResult-3.0))-4.0;

Serial.print(fltSensorCalc);//Senddistancetocomputer

Serial.println("cm");//Addcmtoresult

delay(200);//Wait

}

ThisisthebasiccodetointerfaceaSharpdistancesensor.TherearesomedrawbackswiththeIRsensors.Someofthemareasfollows:

Wecan'tusethemindirectorindirectsunlight,soit'sdifficulttousetheminanoutdoorrobotTheymaynotworkifanobjectisreflectiveTherangeequationonlyworkswithintherange

Inthenextsection,wecandiscussIMUanditsinterfacingwithTivaCLaunchPad.IMUcangivetheodometrydataanditcanbeusedastheinputtonavigationalgorithms.

WorkingwithInertialMeasurementUnitAnInertialMeasurementUnit(IMU)isanelectronicdevicethatmeasuresvelocity,orientation,andgravitationalforcesusingacombinationofaccelerometers,gyroscopes,andmagnetometers.AnIMUhasalotofapplicationsinrobotics;someoftheapplicationsareinbalancingofUnmannedAerialVehicles(UAVs)androbotnavigation.

Inthissection,wediscusstheroleofIMUinmobilerobotnavigationandsomeofthelatestIMUsonthemarketanditsinterfacingwithLaunchpad.

InertialNavigationAnIMUprovidesaccelerationandorientationrelativetoinertialspace,ifyouknowtheinitialposition,velocity,andorientation,youcancalculatethevelocitybyintegratingthesensedaccelerationandthesecondintegrationgivestheposition.Togetthecorrectdirectionoftherobot,theorientationoftherobotisrequired;thiscanbeobtainedbyintegratingsensedangularvelocityfromgyroscope.

Thefollowingfigureillustratesaninertialnavigationsystem,whichwillconvertIMUvaluestoodometricdata:

ThevalueswegetfromtheIMUareconvertedintonavigationalinformationusingnavigationequationsandfeedingintoestimationfilterssuchastheKalmanfilter.TheKalmanfilterisanalgorithmthatestimatesthestateofasystemfromthemeasureddata(http://en.wikipedia.org/wiki/Kalman_filter).ThedatafromInertialNavigationSystem(INS)willhavesomedriftbecauseoftheerrorfromtheaccelerometerandgyroscope.Tolimitthedrift,anINSisusuallyaidedbyothersensorsthatprovidedirectmeasurementsoftheintegratedquantities.Basedonthemeasurementsandsensorerrormodels,theKalmanfilterestimateserrorsinthenavigationequationsandallthecoloredsensors'errors.ThefollowingfigureshowsadiagramofanaidedinertialnavigationsystemusingtheKalmanfilter:

Alongwiththemotorencoders,thevaluefromtheIMUcanbetakenastheodometervalueanditcanbeusedfordeadreckoning,theprocessoffindingthecurrentpositionofamovingobjectbyusingapreviouslydeterminedposition.

Inthenextsection,wearegoingtoseeoneofthemostpopularIMUsfromInvenSensecalledMPU6050.

InterfacingMPU6050withTivaCLaunchPadTheMPU-6000/MPU-6050familyofpartsaretheworld'sfirstandonly6-axismotiontrackingdevicesdesignedforthelowpower,lowcost,andhighperformancerequirementsofsmartphones,tablets,wearablesensors,androbotics.

TheMPU-6000/6050devicescombinea3-axisgyroscopeand3-axisaccelerometeronthesilicondietogetherwithanonboarddigitalmotionprocessorcapableofprocessingcomplex9-axismotionfusionalgorithms.ThefollowingfigureshowsthesystemdiagramofMPU6050andbreakoutofMPU6050:

ThebreakoutboardofMPU6050isshowninthefollowingfigureanditcanbepurchasedfromthefollowinglink:

https://www.sparkfun.com/products/110286

TheconnectionfromLaunchpadtoMPU6050isgiveninthefollowingtable.Theremainingpinscanbeleftdisconnected:

Launchpadpins MPU6050pins

+3.3V VCC/VDD

GND GND

PD0 SCL

PD1 SDA

ThefollowingfigureshowstheinterfacingdiagramofMPU6050andTivaCLaunchpad:

TheMPU6050andLaunchpadcommunicateusingtheI2Cprotocol,thesupplyvoltageis3.3VoltanditistakenfromLaunchpad.

SettinguptheMPU6050libraryinEnergia

TheinterfacingcodeofEnergiaisdiscussedinthissection.Theinterfacingcodeusesthehttps://github.com/jrowberg/i2cdevlib/zipball/masterlibraryforinterfacingMPU6050.

DownloadtheZIPfilefromtheprecedinglinkandnavigatetoPreferencefromFile|PreferenceinEnergia,asshowninthefollowingscreenshot:

GotoSketchbooklocationunderPreferences,asseenintheprecedingscreenshot,andcreateafoldercalledlibraries.ExtractthefilesinsidetheArduinofolderinsidetheZIPfiletothesketchbook/librarieslocation.TheArduinopackagesinthisrepositoryarealsocompatiblewithLaunchpad.TheextractedfilescontaintheI2Cdev,Wire,andMPU6050packagesthatarerequiredfortheinterfacingoftheMPU6050sensor.Thereareothersensorspackagesthatarepresentinthelibrariesfolderbutwearenotusingthemnow.

TheprecedingprocedureisdoneinUbuntu,butitisthesameforWindowsandMacOSX.

InterfacingcodeofEnergiaThiscodeisusedtoreadtherawvaluefromMPU6050toLaunchpad,itusesaMPU6050third-partylibrarythatiscompatiblewithEnergiaIDE.Thefollowingaretheexplanationsofeachblockofthecode.

Inthisfirstsectionofcode,weincludethenecessaryheadersforinterfacingMPU6050toLaunchpadsuchas12C,WireandtheMPU6050libraryandcreateanobjectofMPU6050withthenameaccelgyro.TheMPU6050.hlibrarycontainsaclassnamedMPU6050tosendandreceivedatatoandfromthesensor:

#include"Wire.h"

#include"I2Cdev.h"

#include"MPU6050.h"

MPU6050accelgyro;

Inthefollowingsection,westarttheI2CandserialcommunicationtocommunicatewithMPU6050andprintsensorvaluesthroughtheserialport.Theserialcommunicationbaudrateis115200andSetup_MPU6050()isthecustomfunctiontoinitializetheMPU6050communication:

voidsetup()

{

//InitSerialportwith115200buadrate

Serial.begin(115200);

Setup_MPU6050();

}

ThefollowingsectionisthedefinitionoftheSetup_MPU6050()function.TheWirelibraryallowsyoutocommunicatewiththeI2Cdevices.MPU6050cancommunicateusingI2C.TheWire.begin()functionwillstarttheI2CcommunicationbetweenMPU6050andLaunchpad;also,itwillinitializetheMPU6050deviceusingtheinitialize()methoddefinedintheMPU6050class.Ifeverythingissuccessful,itwillprintconnectionsuccessful,otherwiseitwillprintconnectionfailed:

voidSetup_MPU6050()

{

Wire.begin();

//initializedevice

Serial.println("InitializingI2Cdevices...");

accelgyro.initialize();

//verifyconnection

Serial.println("Testingdeviceconnections...");

Serial.println(accelgyro.testConnection()?"MPU6050connectionsuccessful":

"MPU6050connectionfailed");

}

Thefollowingcodeistheloop()function,whichcontinuouslyreadsthesensorvalueandprintsitsvaluesthroughtheserialport:TheUpdate_MPU6050()customfunctionisresponsibleforprintingtheupdatedvaluefromMPU6050:

voidloop()

{

//UpdateMPU6050

Update_MPU6050();

}

ThedefinitionofUpdate_MPU6050()isgivenasfollows.Itdeclaressixvariablestohandletheaccelerometerandgyroscopevaluein3-axis.ThegetMotion6()functionintheMPU6050classisresponsibleforreadingthenewvaluesfromthesensor.Afterreading,itwillprintviatheserialport:

voidUpdate_MPU6050()

{

int16_tax,ay,az;

int16_tgx,gy,gz;

//readrawaccel/gyromeasurementsfromdevice

accelgyro.getMotion6(&ax,&ay,&az,&gx,&gy,&gz);

//displaytab-separatedaccel/gyrox/y/zvalues

Serial.print("i");Serial.print("\t");

Serial.print(ax);Serial.print("\t");

Serial.print(ay);Serial.print("\t");

Serial.print(az);Serial.print("\t");

Serial.print(gx);Serial.print("\t");

Serial.print(gy);Serial.print("\t");

Serial.println(gz);

Serial.print("\n");

}

Theoutputfromtheserialmonitorisshownhere:

Wecanreadthesevaluesusingthepythoncodethatweusedforultrasonic.Thefollowingisthescreenshotoftheterminalwhenwerunthepythonscript:

InterfacingMPU6050toLaunchpadwiththeDMPsupportusingEnergiaInthissection,wewillseetheinterfacingcodeofMPU6050byactivatingDMP,whichcangiveusdirectorientationvaluesinquaternionoryaw,pitch,androll.Thisvaluecanbedirectlyappliedtoourroboticapplicationtoo.

ThefollowingsectionofcodeimportsallthenecessaryheaderfilestointerfaceandcreateanMPU6050objectlikethepreviouscode:

#include"Wire.h"

#include"I2Cdev.h"

#include"MPU6050_6Axis_MotionApps20.h"

//CreatingMPU6050Object

MPU6050accelgyro(0x68);

ThefollowingcodeinitializesanddeclaresvariablestohandleDMP:

//DMPoptions

//SettrueifDMPinitializationwassuccessful

booldmpReady=false;

//HoldsactualinterruptstatusbytefromMPU

uint8_tmpuIntStatus;

//returnstatusaftereachdeviceoperation

uint8_tdevStatus;

//ExpectedDMPpacketsize

uint16_tpacketSize;

//countofallbytescurrentlyinFIFO

uint16_tfifoCount;

//FIFOstoratebuffer

uint8_tfifoBuffer[64];

//Outputformatwillbeinquaternion

#defineOUTPUT_READABLE_QUATERNION

Thefollowingcodedeclaresvariousvariablestohandleorientationvariables:

//quaternionvariable

Quaternionq;

Thefollowingfunctionisaninterruptserviceroutine,whichiscalledwhenMPU6050INT pingeneratesaninterrupt:

//InterruptdetectionroutineforDMPhandling

volatileboolmpuInterrupt=false;

//indicateswhetherMPUinterruptpinhasgonehigh

voiddmpDataReady(){

mpuInterrupt=true;

}

Thefollowingcodeisthedefinitionofthesetup()function.Itinitializestheserialportwithabaudrateof115200andcallstheSetup_MPU6050()function:

voidsetup()

{

//InitSerialportwith115200buadrate

Serial.begin(115200);

Setup_MPU6050();

}

ThefollowingcodeisthedefinitionoftheSetup_MPU6050()function.ItwillinitializeMPU6050andcheckswhetherit'sinitializedornot.Ifit'sinitialized,itwillinitializeDMPbycallingtheSetup_MPU6050_DMP()function:

voidSetup_MPU6050()

{

Wire.begin();

//initializedevice

Serial.println("InitializingI2Cdevices...");

accelgyro.initialize();

//verifyconnection

Serial.println("Testingdeviceconnections...");

Serial.println(accelgyro.testConnection()?"MPU6050connectionsuccessful":

"MPU6050connectionfailed");

//InitializeDMPinMPU6050

Setup_MPU6050_DMP();

}

ThefollowingcodeisthedefinitionoftheSetup_MPU6050_DMP()function.ItinitializesDMPandsetsoffsetinthreeaxis.IfDMPisinitialized,itwillstartfunctioningandconfigurethePF_0/PUSH2pinasaninterrupt.WhenthedataisreadyontheMPU6050buffer,aninterruptwillbegenerated,whichwillreadvaluesfromthebus:

//SetupMPU6050DMP

voidSetup_MPU6050_DMP()

{

//DMPInitialization

devStatus=accelgyro.dmpInitialize();

accelgyro.setXGyroOffset(220);

accelgyro.setXGyroOffset(76);

accelgyro.setXGyroOffset(-85);

accelgyro.setXGyroOffset(1788);

if(devStatus==0){

accelgyro.setDMPEnabled(true);

pinMode(PUSH2,INPUT_PULLUP);

attachInterrupt(PUSH2,dmpDataReady,RISING);

mpuIntStatus=accelgyro.getIntStatus();

dmpReady=true;

packetSize=accelgyro.dmpGetFIFOPacketSize();

}

else{

//Donothing

;

}

}

Thefollowingcodeisthedefinitiontheoftheloop()function.ItwillcallUpdate_MPU6050(),whichwillreadbuffervaluesandprintitontheserialterminal:

voidloop()

{

//UpdateMPU6050

Update_MPU6050();

}

ThisisthedefinitionofUpdate_MPU6050(),whichwillcalltheUpdate_MPU6050_DMP()function:

voidUpdate_MPU6050()

{

Update_MPU6050_DMP();

}

ThefollowingfunctionreadsfromtheFIFOregisterofMPU6050andthequaternionvaluegetsprintedontheserialterminal:

//UpdateMPU6050DMPfunctions

voidUpdate_MPU6050_DMP()

{

//DMPProcessing

if(!dmpReady)return;

while(!mpuInterrupt&&fifoCount<packetSize)

{

;

}

mpuInterrupt=false;

mpuIntStatus=accelgyro.getIntStatus();

//getcurrentFIFOcount

fifoCount=accelgyro.getFIFOCount();

if((mpuIntStatus&0x10)||fifoCount>512){

//resetsowecancontinuecleanly

accelgyro.resetFIFO();

}

elseif(mpuIntStatus&0x02){

//waitforcorrectavailabledatalength,shouldbeaVERYshortwait

while(fifoCount<packetSize)fifoCount=accelgyro.getFIFOCount();

//readapacketfromFIFO

accelgyro.getFIFOBytes(fifoBuffer,packetSize);

//trackFIFOcounthereincasethereis>1packetavailable

//(thisletsusimmediatelyreadmorewithoutwaitingforaninterrupt)

fifoCount-=packetSize;

#ifdefOUTPUT_READABLE_QUATERNION

//displayquaternionvaluesineasymatrixform:wxyz

accelgyro.dmpGetQuaternion(&q,fifoBuffer);

Serial.print("i");Serial.print("\t");

Serial.print(q.x);Serial.print("\t");

Serial.print(q.y);Serial.print("\t");

Serial.print(q.z);Serial.print("\t");

Serial.print(q.w);

Serial.print("\n");

#endif

}

}

Theoutputfromtheserialmonitorisshowninthefollowingscreenshot.Theserialmonitorshowsthequaternionvaluesofx,y,z,andwstartingwithan"i"character:

WecanalsousethePythonscripttoviewthesevalues.TheoutputofthePythonscriptisshowninthefollowingscreenshot:

Inthenextchapters,wewillseesomeofthevisionandaudiosensorsthatcanbeusedonthisrobotanditsinterfacingwithPython.

Questions1. Whatareultrasonicsensorsandhowdotheywork?2. Howdoyoucalculatedistancefromtheultrasonicsensor?3. WhatistheIRproximitysensorandhowdoesitwork?4. HowdoyoucalculatedistancefromtheIRsensor?5. WhatisIMUandhowdoyougettheodometricdata?6. WhatistheAidedInertialNavigationsystem?7. WhatarethemainfeaturesofMPU6050?

SummaryInthischapter,wehaveseensomeroboticsensors,whichcanbeusedinourrobot.Thesensorswediscussedareultrasonicdistancesensors,IRproximitysensors,andIMUs.Thesethreesensorshelpinthenavigationoftherobot.WealsodiscussedthebasiccodetointerfacethesesensorstoTivaCLaunchPad.WewillseemoreonvisionandaudiosensorsinterfacingusingPythoninthenextchapter.

Chapter7.ProgrammingVisionSensorsUsingPythonandROSInthepreviouschapter,wehaveseensomeoftheroboticsensorsusedinourrobotanditsinterfacingwiththeLaunchpadboard.Inthischapter,wewillmainlydiscussvisionsensorsanditsinterfaceusedinourrobot.

Therobotwearedesigningwillhavea3DsensorandwecaninterfaceitwithvisionlibrariessuchasOpenCV,OpenNI,andPointCloudLibrary(PCL).Someoftheapplicationsofthe3Dvisionsensorinourrobotareautonomousnavigation,obstacleavoidance,objectdetection,peopletracking,andsoon.

WewillalsodiscusstheinterfacingofvisionsensorsandimageprocessinglibrarieswithROS.Inthelastsectionofthechapter,wewillseeanavigationalalgorithmforourrobotcalledSLAM(SimultaneousLocalizationandMapping)anditsimplementationusinga3Dsensor,ROS,andimageprocessinglibraries.

Inthefirstsection,wewillseesome2Dand3Dvisionsensorsavailableonthemarketthatwewilluseinourrobot.

ListofroboticvisionsensorsandimageprocessinglibrariesA2Dvisionsensororanordinarycameradelivers2Dimageframesofthesurroundings,whereasa3Dvisionsensordelivers2Dimageframesandanadditionalparametercalleddepthofeachimagepoint.Wecanfindthex,y,andzdistanceofeachpointfromthe3Dsensorwithrespecttothesensoraxis.

Therearequiteafewvisionsensorsavailableonthemarket.Someofthe2Dand3Dvisionsensorsthatcanbeusedinourrobotarementionedinthischapter.

Thefollowingfigureshowsthelatest2DvisionsensorcalledPixy/CMUcam5(http://www.cmucam.org/),whichisabletodetectcolorobjectswithhighspeedandaccuracyandcanbeinterfacedtoanArduinoboard.Pixycanbeusedforfastobjectdetectionandtheusercanteachwhichobjectitneedstotrack.PixymodulehasaCMOSsensorandNXP(http://www.nxp.com/)processorforimageprocessing:

Pixy/CMUCam5

Thecommonlyavailable2Dvisionsensorsarewebcams.TheycontainaCMOSsensorandUSBinterface,butthereisnoinbuiltprocessingfortheobjectdetection.ThefollowingimageshowsapopularwebcamfromLogitechthatcancapturepicturesofupto5megapixelresolutionandHDvideos:

LogitechHDCam

Wecantakealookatsomeofthe3Dvisionsensorsavailableonthemarket.SomeofthepopularsensorsareKinect,AsusXtionPro,andCarmine.

Kinect

Kinectisa3DvisionsensorusedalongwiththeMicrosoftXbox360gameconsole.ItmainlycontainsanRGBcamera,aninfraredprojector,adepthsensor,amicrophonearray,andamotorfortilt.TheRGBanddepthcameracaptureimagesataresolutionof640x480at30Hz.TheRGBcameracaptures2Dcolorimages,whereasthedepthcameracapturesmonochromedepthimages.Kinecthasadepthsensingrangefrom0.8mto4m.

SomeoftheapplicationsofKinectare3Dmotioncapture,skeletontracking,facerecognition,andvoicerecognition.

KinectcanbeinterfacedtoPCusingtheUSB2.0interfaceandprogrammedusingKinectSDK,OpenNI,andOpenCV.KinectSDKisonlyavailableforWindowsplatformsandisdevelopedandsuppliedbyMicrosoft.Theothertwolibrariesareopensourceandavailableforallplatforms.TheKinectweareusinghereisthefirstversion;thelatestversionsofKinectonlysupportKinectSDKrunningonWindows.

AsusXtionPro

AsusXtionProisa3DsensordesignedforPC-basedmotionsensingapplications.XtionProisonlyfor3Dsensinganditdoesn'thaveanysoundsensingfacilities.IthasaninfraredprojectorandamonochromeCMOSsensortocapturetheinfrareddata.XtionProcommunicatestothePCviatheUSB2.0interface.XtioncanbepoweredfromtheUSBitselfandcancalculateasensedepthfrom0.8mto3.5mfromthesensor.

TheapplicationsofKinectandXtionProarethesameexceptforvoicerecognition.ItwillworkinWindows,Linux,andMac.WecandevelopapplicationsinXtionProusingOpenNIandOpenCV.

PrimeSenseCarmine

ThePrimeSenseteamdevelopedtheMicrosoftKinect3Dvisionsystem.Later,theydevelopedtheirown3DvisionsensorcalledCarmine.ThetechnologybehindCarmineissimilartoKinect.ItworkswithanIRprojectorandadepthimageCMOSsensor.ThefollowingfigureshowstheblockdiagramofCarmine:

Carmineblockdiagram

SimilartoKinect,CarminehasanRGBCMOSsensor,adepthimageCMOS,andanIRlightsource.Italsohasanarrayofmicrophonesforvoicerecognition.AllsensorsareinterfacedinSystemOn

Chip(SOC).InterfacingandpoweringisperformedthroughUSB.

CarminecancaptureRGBanddepthframesin640x480resolutionandcansensedepthfrom0.35mto3.5m.ComparedtoKinect,theadvantagesaresmallpowerconsumption,smallformfactor,andgooddepthsensingrange.

CarminecanbeinterfacedtoaPCanditwillsupportWindows,Linux,Mac,andAndroidplatforms.CarmineissupportedbyOpenNI;developerscanprogramthedeviceusingOpenNIanditswrapperlibraries.

AppleIncboughtPrimeSenseinNovember2013.YoucanbuyCarmineatthefollowinglink:

http://www.amazon.com/dp/B00KO908MM?psc=1

IntroductiontoOpenCV,OpenNI,andPCLLet'sdiscussaboutthesoftwareframeworksandlibrariesthatweareusinginourrobots.First,wecandiscussOpenCV.Thisisoneofthelibrariesthatwearegoingtouseinthisrobotforobjectdetectionandotherimageprocessingfunctionalities.

WhatisOpenCV?OpenCVisanopensourceBSD-licensedcomputervisionbasedlibrarythatincludeshundredsofcomputervisionalgorithms.Thelibrary,mainlyaimedforreal-timecomputervision,wasdevelopedbyIntelRussiaresearch,andisnowactivelysupportedbyItseez(http://itseez.com/).

OpenCVlogo

OpenCViswrittenmainlyinCandC++anditsprimaryinterfaceisinC++.ItalsohasgoodinterfacesinPython,Java,Matlab/OctaveandwrappersinotherlanguagessuchasC#andRuby.

InthenewversionofOpenCV,thereissupportforCUDAandOpenCLtogetGPUacceleration(http://www.nvidia.com/object/cuda_home_new.html).

OpenCVwillrunonmostoftheOSplatforms(suchasWindows,Linux,MacOSX,Android,FreeBSD,OpenBSD,iOS,andBlackberry).

InUbuntu,OpenCV,andPython,wrappersarealreadyinstalledwhenweinstalltheros-indigo-desktop-fullpackage.Ifthispackageisnotinstalled,thenwecaninstalltheOpenCVlibrary,ROSinterface,andPythoninterfaceofOpenCVusingthefollowingcommand:

$sudoapt-getinstallros-indigo-vision-opencv

IfyouwanttoinstallonlytheOpenCVPythonwrapper,thenusethefollowingcommand:

$sudoapt-getinstallpython-opencv

IfyouwanttotryOpenCVinWindows,youcantrythefollowinglink:

http://docs.opencv.org/doc/tutorials/introduction/windows_install/windows_install.html

ThefollowinglinkwillguideyouthroughtheinstallationprocessofOpenCVonMacOSX:

http://jjyap.wordpress.com/2014/05/24/installing-opencv-2-4-9-on-mac-osx-with-python-support/

ThemainapplicationsofOpenCVareinthefieldof:

ObjectdetectionGesturerecognitionHuman-computerinteractionMobileroboticsMotiontrackingFacialrecognition

NowwecanseehowtoinstallOpenCVinUbuntu14.04.2fromsourcecode.

InstallationofOpenCVfromsourcecodeinUbuntu14.04.2

WecaninstallOpenCVfromsourcecodeinLinuxbasedonthefollowingdocumentationofOpenCV:

http://docs.opencv.org/doc/tutorials/introduction/linux_install/linux_install.html

AftertheinstallationofOpenCV,wecantrysomeexamplesusingthePythonwrappersofOpenCV.

ReadinganddisplayinganimageusingthePython-OpenCVinterface

Thefirstexamplewillloadanimageingrayscaleanddisplayitonscreen.

Inthefollowingsectionofcode,wewillimportthenumpymoduleforimagearraymanipulationandthecv2moduleistheOpenCVwrapperforPythoninwhichwecanaccessOpenCVPythonAPIs.NumPyisanextensiontothePythonprogramminglanguage,addingsupportforlargemultidimensionalarraysandmatricesalongwithalargelibraryofhigh-levelmathematicalfunctionstooperateonthesearrays(https://pypi.python.org/pypi/numpy):

#!/usr/bin/envpython

importnumpyasnp

importcv2

Thefollowingfunctionwillreadtherobot.jpgimageandloadthisimageingrayscale.Thefirstargumentofthecv2.imread()functionisthenameoftheimageandthenextargumentisaflagthatspecifiesthecolortypeoftheloadedimage.Iftheflagis>0,theimagereturnsathreechannelRGBcolorimage,iftheflag=0,theloadedimagewillbeagrayscaleimage,andiftheflagis<0,itwillreturnthesameimageasloaded:

img=cv2.imread('robot.jpg',0)

Thefollowingsectionofcodewillshowthereadimageusingtheimshow()function.Thecv2.waitKey(0)functionisakeyboardbindingfunction.Itsargumentistimeinmilliseconds.Ifit's0,itwillwaitindefinitelyforakeystroke:

cv2.imshow('image',img)

cv2.waitKey(0)

Thecv2.destroyAllWindows()functionsimplydestroysallthewindowswecreated:

cv2.destroyAllWindows()

Savetheprecedingcodewithanamecalledimage_read.pyandcopyaJPGfilewithrobot.jpgasitsname.Executethecodeusingthefollowingcommand:

$pythonimage_read.py

Theoutputwillloadanimageingrayscalebecauseweused0asthevalueintheimread()function:

Thefollowingexamplewilltrytoopenwebcam.Theprogramwillquitwhentheuserpressesanybutton.

Capturingfromwebcamera

Thefollowingcodewillcapturethewebcamhavingdevicename/dev/video0or/dev/video1.

WeneedtoimportthefollowingmodulesifweareusingOpenCVAPI's:

#!/usr/bin/envpython

importnumpyasnp

importcv2

ThefollowingfunctionwillcreateaVideoCaptureobject.TheVideoCaptureclassisusedtocapture

videosfromvideofilesorcameras.TheinitializationargumentsoftheVideoCaptureclassistheindexofacameraoranameofavideofile.Deviceindexisjustanumbertospecifythecamera.Thefirstcameraindexis0havingdevicename/dev/video0;that'swhyweuse0here:

cap=cv2.VideoCapture(0)

ThefollowingsectionofcodeisloopedtoreadimageframesfromtheVideoCaptureobjectandshowseachframe.Itwillquitwhenanykeyispressed:

while(True):

#Captureframe-by-frame

ret,frame=cap.read()

#Displaytheresultingframe

cv2.imshow('frame',frame)

ifcv2.waitKey(10):

break

Thefollowingisascreenshotoftheprogramoutput:

YoucanexploremoreOpenCV-Pythontutorialsfromthefollowinglink:

http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_tutorials.html

Inthenextsection,wewilllookatOpenNIlibraryanditsapplication.

WhatisOpenNIOpenNIisaMultilanguage,cross-platformframeworkthatdefinesAPI'stowriteapplicationsusingNaturalinteraction(NI).Naturalinteractionisdefinedintermsofexperience.Itmeans,peoplenaturallycommunicatethroughgestures,expressions,movements,anddiscovertheworldbylookingaroundandmanipulatingphysicalstuff.

OpenNIAPI'sarecomposedofasetofinterfacestowriteNIapplications.Thefollowingfigureshowsathree-layeredviewoftheOpenNIlibrary:

Thetoplayerrepresentstheapplicationlayerthatimplementsnaturalinteraction-basedapplication.ThemiddlelayeristheOpenNIlayeranditwillprovidecommunicationinterfacesthatinteractwithsensorsandmiddlewarecomponentsthatanalyzethedatafromthesensor.Middlewarecanbeusedforfullbodyanalysis,handpointanalysis,gesturedetection,andsoon.OneoftheexamplesofmiddlelayerisNITE,whichcandetectgestureandskeleton.

Thebottomlayershowsthehardwaredevicesthatcapturevisualsandaudioelementsofthescene.Itincludes3Dsensors,RGBcameras,anIRcamera,andamicrophone.

OpenNIiscross-platformandhasbeensuccessfullycompiledanddeployedonLinux,MacOSX,andWindows.

Inthenextsection,wewillseehowwetoinstallOpenNIinUbuntu14.04.2.

InstallingOpenNIinUbuntu14.04.2

WecaninstalltheOpenNIlibraryalongwithROSpackages.ROSisalreadyinterfacedwithOpenNI,butthecompleteinstallationofros-indigo-desktop-fullmaynotinstallOpenNIpackages;weneedtoinstallitfromthepackagemanager.

Thefollowingistheinstallationcommand:

$sudoapt-getinstallros-indigo-openni-launch

ThesourcecodeandlatestbuildofOpenNIforWindows,Linux,andMacOSXisavailableatthefollowinglink:

http://structure.io/openni

Inthenextsection,wewillseehowtoinstallPCL.

WhatisPCL?PCLisalargescale,openprojectfor2D/3Dimage,andPointCloudprocessing.ThePCLframeworkcontainsnumerousalgorithmsincludedtoperformfiltering,featureestimation,surfacereconstruction,registration,modelfitting,andsegmentation.Usingthesemethods,wecanprocessPointCloudandextractkeydescriptorstorecognizeobjectsintheworldbasedontheirgeometricappearanceandcreatesurfacesfromthePointCloudsandvisualizethem.

PCLlogo

PCLisreleasedundertheBSDlicense.It'sopensource,andfreeforcommercial,orresearchuse.PCLiscross-platformandhasbeensuccessfullycompiledanddeployedonLinux,MacOSX,Windows,andAndroid/iOS.

YoucandownloadPCLatthefollowinglink:

http://pointclouds.org/downloads/

PCLisalreadyintegratedintoROS.ThePCLlibraryanditsROSinterfacewillinstallalongwithROSfulldesktopinstallation.Inthepreviouschapter,wediscussedhowtoinstallROSfulldesktopinstallation.PCListhe3DprocessingbackboneofROS.RefertothefollowinglinkfordetailsontheROS-PCLpackage:

http://wiki.ros.org/pcl.

ProgrammingKinectwithPythonusingROS,OpenCV,andOpenNILet'slookathowwecaninterfaceandworkwiththeKinectsensorinROS.ROSisbundledwithOpenNIdriver,whichcanfetchRGBandthedepthimageofKinect.ThispackagecanbeusedforMicrosoftKinect,PrimeSenseCarmine,AsusXtionPro,andProLive.

Thisdrivermainlypublishesrawdepth,RGB,andIRimagestreams.Theopenni_launchpackagewillinstallpackagessuchasopenni_cameraandopenni_launch.Theopenni_camerapackageistheKinectdriverthatpublishesrawdataandsensorinformation,whereastheopenni_launchpackagecontainsROSlaunchfiles.It'sbasicallyanXMLfilethatlaunchesmultiplenodesatatimeandpublishesdatasuchaspointclouds.

HowtolaunchOpenNIdriverThefollowingcommandwillopentheOpenNIdeviceandloadallnodeletstoconvertrawdepth/RGB/IRstreamstodepthimages,disparityimages,andpointclouds.TheROSnodeletpackageisdesignedtoprovideawaytorunmultiplealgorithmsinthesameprocesswithzerocopytransportbetweenalgorithms.

$roslaunchopenni_launchopenni.launch

YoucanviewtheRGBimageusingaROStoolcalledimage_view

$rosrunimage_viewimage_viewimage:=/camera/rgb/image_color

Inthenextsection,wewillseehowtointerfacetheseimagestoOpenCVforimageprocessing.

TheROSinterfaceofOpenCVROSisintegratedintomanylibraries.OpenCVisalsointegratedintoROSmainlyforimageprocessing.Thevision_opencvROSstackincludesthecompleteOpenCVlibraryandinterfacetoROS.

Thevision_opencvprovidesseveralpackages:

cv_bridge:ThiscontainstheCvBridgeclass;thisclassconvertsfromROSimagemessagestoOpenCVimagedatatypeandviceversaimage_geometry:Thiscontainsacollectionofmethodstohandleimageandpixelgeometry

ThefollowingdiagramshowshowOpenCVisinterfacedtoROS:

OpenCV-ROSinterfacing

TheimagedatatypeofOpenCVareIplImageandMat.IfwewanttoworkwithOpenCVinROS,wehavetoconvertIplImageorMattoROSImagemessages.TheROSpackagevision_opencvhastheCvBridgeclass;thisclasscanconvertIplImagetoROSimageandviceversa.

ThefollowingsectionshowshowtocreateaROSpackage;thispackagecontainsnodetosubscribeRGB,depthimage,processtheRGBimagetodetectedges,anddisplayallimagesafterconvertingtoanimagetypeequivalenttoOpenCV.

CreatingROSpackagewithOpenCVsupport

Wecancreateapackagecalledsample_opencv_pkgwiththefollowingdependencies,thatis,sensor_msgs,cv_bridge,rospy,andstd_msgs.Thesensor_msgsdependencydefinesmessagesforcommonlyusedsensors,includingcamerasandscanninglaserrangefinders;cv_bridgeistheOpenCVinterfaceofROS.

ThefollowingcommandwillcreatetheROSpackagewiththeprecedingdependencies:

$catkin-create-pkgsample_opencv_pkgsensor_msgscv_bridgerospystd_msgs

Aftercreatingthepackage,createascriptsfolderinsidethepackageandsavethecodeinthementionedinthenextsection.

DisplayingKinectimagesusingPython,ROS,andcv_bridge

ThefirstsectionofthePythoncodeisgivenbelow.Itmainlyincludesimportingofrospy,sys,cv2,

sensor_msgs,cv_bridge,andthenumpymodule.Thesensor_msgsdependencyimportstheROSdatatypeofImageandCameraInfo.Thecv_bridgemoduleimportstheCvBridgeclassforconvertingROSimagedatatypetotheOpenCVdatatypeandviceversa:

importrospy

importsys

importcv2

importcv2.cvascv

fromsensor_msgs.msgimportImage,CameraInfo

fromcv_bridgeimportCvBridge,CvBridgeError

importnumpyasnp

ThefollowingsectionofcodeisaclassdefinitioninPythontodemonstrateCvBridgefunctions.TheclassisnamedascvBridgeDemo:

classcvBridgeDemo():

def__init__(self):

self.node_name="cv_bridge_demo"

#Initializetherosnode

rospy.init_node(self.node_name)

#Whatwedoduringshutdown

rospy.on_shutdown(self.cleanup)

#CreatetheOpenCVdisplaywindowfortheRGBimage

self.cv_window_name=self.node_name

cv.NamedWindow(self.cv_window_name,cv.CV_WINDOW_NORMAL)

cv.MoveWindow(self.cv_window_name,25,75)

#Andoneforthedepthimage

cv.NamedWindow("DepthImage",cv.CV_WINDOW_NORMAL)

cv.MoveWindow("DepthImage",25,350)

#Createthecv_bridgeobject

self.bridge=CvBridge()

#Subscribetothecameraimageanddepthtopicsandset

#theappropriatecallbacks

self.image_sub=rospy.Subscriber("/camera/rgb/image_color",Image,

self.image_callback)

self.depth_sub=rospy.Subscriber("/camera/depth/image_raw",Image,

self.depth_callback)

rospy.loginfo("Waitingforimagetopics...")

ThefollowingcodegivesacallbackfunctionofthecolorimagefromKinect.Whenacolorimagecomesonthe/camera/rgb/image_colortopic,itwillcallthisfunction.Thisfunctionwillprocessthecolorframeforedgedetectionandshowtheedgedetectedandrawcolorimage:

defimage_callback(self,ros_image):

#Usecv_bridge()toconverttheROSimagetoOpenCVformat

try:

frame=self.bridge.imgmsg_to_cv(ros_image,"bgr8")

exceptCvBridgeError,e:

printe

#ConverttheimagetoaNumpyarraysincemostcv2functions

#requireNumpyarrays.

frame=np.array(frame,dtype=np.uint8)

#Processtheframeusingtheprocess_image()function

display_image=self.process_image(frame)

#Displaytheimage.

cv2.imshow(self.node_name,display_image)

#Processanykeyboardcommands

self.keystroke=cv.WaitKey(5)

if32<=self.keystrokeandself.keystroke<128:

cc=chr(self.keystroke).lower()

ifcc=='q':

#Theuserhaspresstheqkey,soexit

rospy.signal_shutdown("Userhitqkeytoquit.")

ThefollowingcodegivesacallbackfunctionofthedepthimagefromKinect.Whenadepthimagecomesonthe/camera/depth/raw_imagetopic,itwillcallthisfunction.Thisfunctionwillshowtherawdepthimage:

defdepth_callback(self,ros_image):

#Usecv_bridge()toconverttheROSimagetoOpenCVformat

try:

#Thedepthimageisasingle-channelfloat32image

depth_image=self.bridge.imgmsg_to_cv(ros_image,"32FC1")

exceptCvBridgeError,e:

printe

#ConvertthedepthimagetoaNumpyarraysincemostcv2functions

#requireNumpyarrays.

depth_array=np.array(depth_image,dtype=np.float32)

#Normalizethedepthimagetofallbetween0(black)and1(white)

cv2.normalize(depth_array,depth_array,0,1,cv2.NORM_MINMAX)

#Processthedepthimage

depth_display_image=self.process_depth_image(depth_array)

#Displaytheresult

cv2.imshow("DepthImage",depth_display_image)

Thefollowingfunctioniscalledprocess_image(),whichwillconvertthecolorimagetograyscale,thenblurtheimage,andfindtheedgesusingthecannyedgefilter:

defprocess_image(self,frame):

#Converttograyscale

grey=cv2.cvtColor(frame,cv.CV_BGR2GRAY)

#Blurtheimage

grey=cv2.blur(grey,(7,7))

#ComputeedgesusingtheCannyedgefilter

edges=cv2.Canny(grey,15.0,30.0)

returnedges

Thefollowingfunctioniscalledprocess_depth_image().Itsimplyreturnsthedepthframe:

defprocess_depth_image(self,frame):

#Justreturntherawimageforthisdemo

returnframe

Thisfunctionwillclosetheimagewindowwhenthenodeshutsdown:

defcleanup(self):

print"Shuttingdownvisionnode."

cv2.destroyAllWindows()

Thefollowingcodeisthemain()function.ItwillinitializethecvBridgeDemo()classandcalltherosspin()function:

defmain(args):

try:

cvBridgeDemo()

rospy.spin()

exceptKeyboardInterrupt:

print"Shuttingdownvisionnode."

cv.DestroyAllWindows()

if__name__=='__main__':

main(sys.argv)

Savetheprecedingcodetocv_bridge_demo.pyandchangethepermissionofthenodeusingthefollowingcommand.Thenodeisonlyvisibletotherosruncommandifwegiveitexecutablepermission.

$chmod+Xcv_bridge_demo.py

Thefollowingarethecommandstostartthedriverandnode.StarttheKinectdriverusingthefollowingcommand:

$roslaunchopenni_launchopenni.launch

Runthenodeusingthefollowingcommand:

$rosrunsample_opencv_pkgcv_bridge_demo.py

Thefollowingisthescreenshotoftheoutput:

RGB,depth,andedgeimages

WorkingwithPointCloudsusingKinect,ROS,OpenNI,andPCLAPointCloudisadatastructureusedtorepresentacollectionofmultidimensionalpointsandiscommonlyusedtorepresent3Ddata.Ina3DPointCloud,thepointsusuallyrepresentthex,y,andzgeometriccoordinatesofanunderlyingsampledsurface.Whenthecolorinformationispresent,thePointCloudbecomes4D.

PointCloudscanbeacquiredfromhardwaresensors(suchasstereocameras,3Dscanners,ortime-of-flightcameras).Itcanbegeneratedfromacomputerprogramsynthetically.PCLsupportstheOpenNI3Dinterfacesnatively;thusitcanacquireandprocessdatafromdevices(suchasPrimeSensor's3Dcameras,MicrosoftKinect,orAsusXTionPRO).

PCLwillbeinstalledalongwiththeROSindigofulldesktopinstallation.Let'sseehowwecangenerateandvisualizePointCloudinRViz,adatavisualizationtoolinROS.

OpeningdeviceandPointCloudgenerationOpenanewterminalandlaunchtheROSOpenNIdriveralongwiththePointCloudgeneratornodesusingthefollowingcommand:

roslaunchopenni_launchopenni.launch

ThiscommandwillactivatetheKinectdriverandprocesstherawdataintoconvenientoutputslikePointCloud.

WewilluseRViz3DvisualizationtooltoviewPointClouds.

ThefollowingcommandwillstarttheRViztool:

$rosrunrvizrviz

SettheRVizoptionsforFixedFrame(atthetopoftheDisplayspanelunderGlobalOptions)tocamera_link.

Ontheleft-handsideoftheRVizpanel,clickontheAddbuttonandchoosethePointCloud2displayoption.Setitstopicto/camera/depth/points.

ChangeColorTransformerofPointCloud2toAxisColor.

ThefollowingfigureshowsascreenshotofRVizPointClouddata.Inthisscreenshot,thenearobjectismarkedinredandthefarobjectismarkedinvioletandblue.TheobjectinfrontofKinectisrepresentedascylinderandcube:

PointCloudofarobot

ConversionofPointCloudtolaserscandataWeareusingKinectinthisrobotforreplicatingthefunctionofexpensivelaserrangescanner.KinectcandeliverPointClouddatawhichcontainsthedepthofeachpointofsurrounding.ThePointClouddataisprocessedandconvertedtodataequivalenttoalaserscannerusingtheROSdepthimage_to_laserscanpackage.ThemainfunctionofthispackageistosliceasectionofthePointClouddataandconvertittoalaserscanequivalentdatatype.ThePointcloud2datatypeissensor_msgs/PointCloud2andforthelaserscanner,thedatatypeissensor_msgs/LaserScan.Thispackagewillperformthisprocessingandfakethelaserscanner.ThelaserscanneroutputcanbeviewedusingRViz.Inordertoruntheconversion,wehavetostarttheconvertornodeletsthatwillperformthisoperation.Wehavetospecifythisinourlaunchfiletostarttheconversion.Thefollowingistherequiredcodeinthelaunchfiletostartthedepthimage_to_laserscanconversion:

<!--Fakelaser-->

<nodepkg="nodelet"type="nodelet"name="laserscan_nodelet_manager"

args="manager"/>

<nodepkg="nodelet"type="nodelet"name="depthimage_to_laserscan"

args="loaddepthimage_to_laserscan/DepthImageToLaserScanNodelet

laserscan_nodelet_manager">

<paramname="scan_height"value="10"/>

<paramname="output_frame_id"value="/camera_depth_frame"/>

<paramname="range_min"value="0.45"/>

<remapfrom="image"to="/camera/depth/image_raw"/>

<remapfrom="scan"to="/scan"/>

</node>

Alongwithstartingthenodelet,weneedtosetcertainparametersofthenodeletforbetterconversion.Refertohttp://wiki.ros.org/depthimage_to_laserscanforadetailedexplanationofeachparameter.

Thelaserscanoftheprecedingviewisshowninthefollowingscreenshot.Toviewthelaserscan,addtheLaserScanoption.ThisissimilartohowweaddthePointCloud2optionandchangetheTopicvalueofLaserScanto/scan:

WorkingwithSLAMusingROSandKinectThemainaimofdeployingvisionsensorsinourrobotistodetectobjectsandperformrobotnavigationinanenvironment.SLAMisatechniqueusedinmobilerobotsandvehiclestobuildupamapofanunknownenvironmentorupdateamapwithinaknownenvironmentbytrackingthecurrentlocationofarobot.

Mapsareusedtoplantherobottrajectoryandtonavigatethroughthispath.Usingmaps,therobotwillgetanideaabouttheenvironment.Themaintwochallengesinmobilerobotnavigationaremappingandlocalization.

Mappinginvolvesgeneratingaprofileofobstaclesaroundtherobot.Throughmapping,therobotwillunderstandhowtheworldlooks.Localizationistheprocessofestimatingaposeoftherobotrelativetothemapwebuild.

SLAMfetchesdatafromdifferentsensorsandusesittobuildmaps.The2D/3DvisionsensorcanbeusedasaninputtoSLAM.The2Dvisionsensorssuchaslaserrangefindersand3DsensorssuchasKinectaremainlyusedasaninputforaSLAMalgorithm.

ROSisintegratedintoaSLAMlibraryusingOpenSlam(http://openslam.org/gmapping.html).Thegmappingpackageprovideslaser-basedSLAMasanodecalledslam_gmapping.Thiscancreatea2Dmapfromthelaserandposedatacollectedbyamobilerobot.

Thegmappingpackageisavailableathttp://wiki.ros.org/gmapping.

Touseslam_gmapping,youwillneedamobilerobotthatprovidesodometrydataandisequippedwithahorizontallymounted,fixed,laserrangefinder.Theslam_gmappingnodewillattempttotransformeachincomingscanintotheodom(odometry)tfframe.

Theslam_gmappingnodetakesinsensor_msgs/LaserScanmessagesandbuildsamap(nav_msgs/OccupancyGrid).ThemapcanberetrievedviaaROStopicorservice.

Thefollowingcodecanbeusedtomakeamapfromarobotwithalaserpublishingscansonthebase_scantopic:

$rosrungmappingslam_gmappingscan:=base_scan

Questions1. Whatare3Dsensorsandhowaretheydifferentfromordinarycams?2. Whatarethemainfeaturesofaroboticoperatingsystem?3. WhataretheapplicationsofOpenCV,OpenNI,andPCL?4. WhatisSLAM?5. WhatisRGB-DSLAMandhowdoesitwork?

SummaryInthischapter,wesawvisionsensorstobeusedinourrobot.WeusedKinectinourrobotanddiscussedOpenCV,OpenNI,PCLandtheirapplication.WealsodiscussedtheroleofvisionsensorsinrobotnavigationandapopularSLAMtechniqueanditsapplicationusingROS.Inthenextchapter,wewilldiscussspeechprocessingandsynthesistobeusedinthisrobot.

Chapter8.WorkingwithSpeechRecognitionandSynthesisUsingPythonandROSInthischapter,wewillmainlydiscussthefollowingtopics:

Introducingspeechrecognition,synthesis,andvariousspeechprocessingframeworksWorkingwithspeechrecognitionandsynthesisusingPythoninUbuntu/Linux,WindowsandMacOSXWorkingwithspeechrecognitionandsynthesispackagesinROSusingPython

Iftherobotsareabletorecognizeandrespondthewayhumanbeingscommunicate,thentherobot-humaninteractionwillbemuchmoreeasierandeffectivethananyothermethod.However,extractingspeechparameterssuchasmeaning,pitch,duration,andintensityfromhumanspeechisaverytoughtask.Researchersfoundnumerouswaystosolvethisproblem.Now,therearesomealgorithmsthataredoingagoodjobinspeechprocessing.

Inthischapter,wewilldiscusstheapplicationsofspeechrecognitionandsynthesisinourrobotandalsolookatsomeofthelibrariestoperformspeechrecognitionandsynthesis.

Themainobjectiveofspeechsynthesisandrecognitionsysteminthisrobotistomaketherobot-humaninteractioneasier.Ifarobothastheseabilities,itcancommunicatewiththesurroundingpeopleandtheycanaskvariousquestionsaboutthefoodandthecostofeachitem.Thespeechrecognitionandsynthesisfunctionalitycanbeaddedusingtheframeworkthatwewilldiscussinthischapter.

Inthefirstsectionofthischapter,youwilllearnaboutthestepsinvolvedinspeechrecognitionandsynthesis.

UnderstandingspeechrecognitionSpeechrecognitionbasicallymeanstalkingtoacomputerandmakingitrecognizewhatwearesayinginrealtime.Itconvertsnaturalspokenlanguagetodigitalformatthatcanbeunderstoodbyacomputer.Wearemainlydiscussingtheconversionofspeech-to-textprocesshere.Usingthespeechrecognitionsystem,therobotwillrecordthesentenceorwordcommandedbytheuser.Thetextwillbepassedtoanotherprogramandtheprogramwilldecidewhichactionithastoexecute.Wecantakealookattheblockdiagramofthespeechrecognitionsystemthatexplainshowitworks.

BlockdiagramofaspeechrecognitionsystemThefollowingisablockdiagramofatypicalspeechrecognitionsystem.Wecanseeeachblockandunderstandhowaspeechsignalisconvertedtotext:

Speechrecognitionsystemblockdiagram

ThespeechsignalisreceivedthroughamicrophoneandwillbeconvertedtoadigitalformatsuchasPCM(PulseCodeModulation)bythesoundcardinsidethePC.ThisdigitalformatcanbeprocessedbythesoftwareinsidethePC.Inaspeechrecognitionprocess,thefirstphaseistoextractthespeechfeaturesfromthedigitalsoundformat.

Inthespeechrecognitionsystem,thefollowingarethecommoncomponents:

Featureextraction:Inthisprocess,therawdigitalsoundisconvertedtosoundfeaturevectors,whichcarryinformationofsoundsandsuppresstheirrelevantsourcesofsound.Thesoundfeaturevectorscanbemathematicallyrepresentedasavectorwithrespecttotime.Aftergettingthesoundfeaturevectors,theywillbedecodedtotextfromalistofpossiblestringsandselectedaccordingtoitsprobability.Acousticmodel:Thefirststageofdecodingisacousticmodels.Acousticmodelsaretrainedstatisticalmodelsandarecapableofpredictingtheelementaryunitsofspeechcalledphonemesaftergettingthesoundfeaturevectors.PopularacousticmodelinginspeechrecognitionisHMM(HiddenMarkovModels)andanotherhybridapproachistouseartificialneuralnetworks.Lexicon:Alexicon(alsoknownasdictionary)containsthephoneticscriptofwordsthatweuseintrainingtheacousticmodel.Languagemodel:Thisprovidesastructuretothestreamofwordsthatisdetectedaccordingtotheindividualwordprobability.Thelanguagemodelistrainedusinglargeamountsoftrainingtext(whichincludesthetextusedtotraintheacousticmodel).Ithelpstoestimatetheprobabilities

andfindtheappropriateworddetected.Searchalgorithm:Thisisusedtofindthemostprobablesequenceofwordsinthesoundvectorswiththehelpofthelanguagemodelandlexicon.Recognizedwords:Theoutputofthesearchalgorithmisalistofwordsthathasthehighestprobabilityforgivensoundvectors.

SpeechrecognitionlibrariesThefollowingaresomegoodandpopularimplementationsofspeechrecognitionalgorithmsintheformoflibraries.

CMUSphinx/PocketSphinx

SphinxisagroupofspeechrecognitiontoolsdevelopedbyCarnegieMellonUniversity.Theentirelibraryisopensourceanditcomeswithacousticmodelsandsampleapplications.Theacousticmodeltrainerimprovestheaccuracyofdetection.Itallowsyoutocompileitslanguagemodelandprovidesalexiconcalledcmudict.ThecurrentSphinxversionis4.TheSphinxversioncustomizedforanembeddedsystemiscalledPocketSphinx.It'salightweightspeechrecognitionenginethatwillworkondesktopaswellasonmobiledevices.SphinxlibrariesareavailableforWindows,Linux,andMacOSX.

TherearePythonmodulesavailabletohandlePocketSphinxAPIsfromPython.ThefollowingistheofficialwebsiteofCMUSphinx:

http://cmusphinx.sourceforge.net/

Julius

ThisisahighperformanceandcontinuousspeechrecognitionlibrarybasedonHMMandcandetectcontinuousstreamofwordsorN-grams.It'sanopensourcelibrarythatisabletoworkinrealtime.TherearePythonmodulestohandleJuliusfunctionsfromPython.JuliusisavailableinWindows,Linux,andMacOSX.TheofficialwebsiteofJuliusis:

http://julius.sourceforge.jp/en_index.php

WindowsSpeechSDKMicrosoftprovidesaSDKtohandlespeechrecognitionandsynthesisoperation.SDKcontainsAPIstohandlespeech-relatedprocessingthatcanbeembeddedinsidetheMicrosoftapplication.TheSDKonlyworksonWindowsandithassomeportsforPythonlikethePySpeechmodule.ThesespeechAPIsarecomparativelyaccuratethanotheropensourcetools.

SpeechsynthesisSpeechsynthesisistheprocessofconvertingtextdatatospeech.Thefollowingblockdiagramshowstheprocessinvolvedinconvertingtexttospeech:

Blockdiagramofspeechsynthesisprocess

Formoredetails,refertopage6ofSpokenLanguageProcessing,X.Huang,A.Acero,H.-W.Hon,PrenticeHallPTR,publishedin2001.

Letustakealookatthespeechsynthesisstages:

Textanalysis:Intextanalysis,thetexttobeconvertedtospeechwillcheckforthestructureoftext,linguisticanalysis,andtextnormalizationtoconvertnumbersandabbreviationstowordsPhoneticanalysis:Inphoneticanalysis,eachindividualtextdatacalledgraphemeisconvertedtoanindividualindivisiblesequenceofsoundcalledphonemeProsodicanalysis:Inprosodicanalysis,theprosodyofspeech(suchasrhythm,stress,andintonationsofspeech)addedtothebasicsoundmakesitmorerealisticSpeechsynthesis:Thisunitfinallybindstheshortunitsofspeechandproducesthefinalspeechsignal

SpeechsynthesislibrariesLet'snowdiscussabitaboutthevariousspeechsynthesislibraries.

eSpeak

eSpeakisanopensourcelightweightspeechsynthesizermainlyforEnglishlanguageanditwillalsosupportseveralotherlanguages.UsingeSpeak,wecanchangethevoicesanditscharacteristics.eSpeakhasthemoduletoaccessitsAPIsfromPython.eSpeakworksmainlyinWindowsandLinuxandit'salsocompatiblewithMacOSX.TheofficialwebsiteofeSpeakisasfollows:

http://espeak.sourceforge.net/

Festival

FestivalisanopensourceandfreespeechsynthesizerdevelopedbyCentreofSpeechTechnologyResearch(CSTR)andiswrittencompletelyinC++.ItprovideaccesstotheAPIsfromShellintheformofcommandsandalsoinC++,Java,andPython.Ithasmultilanguagesupport(suchasEnglishandSpanish).FestivalmainlysupportsLinux-basedplatform.ThecodecanalsobebuiltinWindowsandMacOSX.ThefollowingistheofficialwebsiteoftheFestivalspeechsynthesissystem:

http://www.cstr.ed.ac.uk/projects/festival/

WorkingwithspeechrecognitionandsynthesisinUbuntu14.04.2usingPythonInthissection,wewilldiscussPythoninterfacingwithPocketSphinx,Julius,andMicrosoftSpeechSDKandspeechsynthesisframeworkssuchaseSpeakandFestival.Let'sstartwithspeechrecognitionlibrariesandtheirinstallationprocedures.

SettingupPocketSphinxanditsPythonbindinginUbuntu14.04.2ThefollowingpackagesarerequiredtoinstallPocketSphinxanditsPythonbindings:

python-pocketsphinx

pocketsphinx-hmm-wsj1

pocketsphinx-lm-wsj

Thepackagescanbeinstalledusingtheapt-getcommand.ThefollowingcommandsareusedtoinstallPocketSphinxanditsPythoninterface.

InstallingPocketSphinxinUbuntucanbedoneeitherthroughsourcecodeorbypackagemanagers.Here,wewillinstallPocketSphinxusingthepackagemanager:

ThefollowingcommandwillinstallHMMofPocketSphinx:

$sudoapt-getinstallpocketsphinx-hmm-wsj1

ThefollowingcommandwillinstallLMofPocketSphinx:

$sudoapt-getinstallpocketsphinx-lm-wsj

ThefollowingcommandwillinstallthePythonextensionofPocketSphinx:

$sudoapt-getinstallpython-pocketsphinx

Oncewearedonewiththeinstallation,wecanworkwithPythonscriptingforspeechrecognition.

WorkingwithPocketSphinxPythonbindinginUbuntu14.04.2ThefollowingisthecodetoperformspeechrecognitionusingPocketSphinxandPython.Thefollowingcodedemonstrateshowwecandecodethespeechrecognitionfromawavefile:

#!/usr/bin/envpython

importsys

#InUbuntu14.04.2,thepocketsphinxmoduleshowserrorinfirstimportandwill

workforthesecondimport.Thefollowingcodeisatemporaryfixtohandlethat

issue

try:

importpocketsphinx

except:

importpocketsphinx

TheprecedingcodewillimportthepocketsphinxPythonmoduleandPythonsysmodule.Thesysmodulecontainfunctionsthatcanbecalledduringprogramruntime.Inthiscode,wewillusethesysmoduletogetthewavefilenamefromthecommand-lineargument:

if__name__=="__main__":

hmdir="/usr/share/pocketsphinx/model/hmm/en_US/hub4wsj_sc_8k"

lmdir="/usr/share/pocketsphinx/model/lm/en_US/hub4.5000.DMP"

dictd="/usr/share/pocketsphinx/model/lm/en_US/cmu07a.dic"

Thehmdir,lmdirn,anddictdvariablesholdthepathofHMM,LM(LanguageModel),anddictionaryofPocketSphinx:

#Receivingwavefilenamefromcommandlineargument

wavfile=sys.argv[1]

ThefollowingcodewillpassHMM,LM,andthedictionarypathofPocketSphinxtoPocketSphinx'sDecoderclass.Readanddecodethewavefile.Intheend,itwillprintthedetectedtext:

speechRec=pocketsphinx.Decoder(hmm=hmdir,lm=lmdir,dict=dictd)

wavFile=file(wavfile,'rb')

speechRec.decode_raw(wavFile)

result=speechRec.get_hyp()

print"\n\n\nDetectedtext:>",result

print"\n\n\n"

OutputTheprecedingcodecanberunusingthefollowingcommand:

$python<code_name.py><wave_file_name.wav>

Thefollowingisascreenshotoftheoutput.Thedetectedtextwasnotthecontentonthewavefile.ThedetectionaccuracywiththedefaultacousticmodelandLMislow;wehavetotrainanewmodeloradaptanexistingmodeltoimproveaccuracy:

Thepreviousmethodwediscussedwasanofflinerecognition;inthenextsection,wewillseehowtoperformreal-timespeechrecognitionusingPocketSphinx,GStreamer,andPython.Inthisapproach,real-timespeechdatacomesthroughtheGStreamerframeworkandisdecodedusingPocketSphinx.ToworkwiththeGStreamerPocketSphinxinterface,installthefollowingpackages:

ThefollowingcommandwillinstalltheGStreamerpluginforPocketSphinx:

$sudoapt-getinstallgstreamer0.10-pocketsphinx

ThefollowingpackagewillinstalltheGStreamerPythonbinding.ItwillenableyoutouseGStreamerAPIsfromPython:

$sudoapt-getinstallpython-gst0.10

ThefollowingpackagewillinstalltheGStreamerplugintogetinformationfromGConf:

$sudoapt-getinstallgstreamer0.10-gconf

Real-timespeechrecognitionusingPocketSphinx,GStreamer,andPythoninUbuntu14.04.2Thefollowingisthecodeforreal-timespeechrecognitionusingGStreamer:

#!/usr/bin/envpython

#ThefollowingmodulesneedtoimportbeforehandlinggstreamerAPI's

importgobject

importsys

importpygst

pygst.require('0.10')

gobject.threads_init()

importgst

#Moduletohandlekeyboardinterruptsignal

importsignal

#Keyboardsignalhandlingroutine

defsignal_handle(signal,frame):

print"YoupressedCtrl+C"

sys.exit(0)

#ImplementationofSpeechrecognitionclass

classSpeech_Recog(object):

#Initializinggstreamerpipelineandpocketsphinxelement

def__init__(self):

self.init_gst()

#Thisfunctionwillinitializegstreamerpipeline

definit_gst(self):

#Thefollowingcodecreateagstreamerpipelinewithpipelinedescription.The

requireddescriptorsneededforthecodeisgivenasparameters.

self.pipeline=gst.parse_launch('gconfaudiosrc!audioconvert!

audioresample'

+'!vadername=vadauto-threshold=true'

+'!pocketsphinxname=asr!fakesink')

#Accessingpocketsphinxelementfromgstreamerpipeline

asr=self.pipeline.get_by_name('asr')

#Connectingtoasr_resultfunctionwhenaspeechtotextconversionis

completed

asr.connect('result',self.asr_result)

#Usercanmentionlmanddictforaccuratedetection

#asr.set_property('lm','/home/user/mylanguagemodel.lm')

#asr.set_property('dict','/home/user/mylanguagemodel.dic')

#Thisoptionwillsetalloptionsareconfiguredwellandcanstartrecognition

asr.set_property('configured',True)

#PausingtheGStreamerpipelineatfirst.

self.pipeline.set_state(gst.STATE_PAUSED)

#Definitionofasr_result

defasr_result(self,asr,text,uttid):

#Printingthedetectedtext

print"DetectedText=>",text

#Thisfunctionwillstart/stopSpeechrecognitionoperation

defstart_recognition(self):

#VADER-VoiceActivityDEtectoR,whichhelpswhenthespeechstartandwhen

itsends.CreatingVADERobjectandsetthepropertysilenttoFalse,sonospeech

willdetecteduntilkeypress

vader=self.pipeline.get_by_name('vad')

vader.set_property('silent',False)

#Waitingforakeypresstostartrecognition

raw_input("Pressanykeytostartrecognition:>")

#Startplayingthepipeline

self.pipeline.set_state(gst.STATE_PLAYING)

#Waitingforstoppingtherecognition

raw_input("Pressanykeytostoprecognition:>")

vader=self.pipeline.get_by_name('vad')

#SettingsilentpropertyofVADERtoTrue

vader.set_property('silent',True)

#PausingGStreamerpipeline

self.pipeline.set_state(gst.STATE_PAUSED)

if__name__=="__main__":

#CreatinganobjectofSpeech_Recog()class

app_object=Speech_Recog()

#Assignkeyboardinterrupthandler

signal.signal(signal.SIGINT,signal_handle)

whileTrue:

#CallingSpeechrecognitionroutine

app_object.start_recognition()

Thecodecanbesimplyexecutedusingthefollowingcommand:

$python<code_name.py>

Thefollowingisthescreenshotoftheoutputwindow:

Pressanykeytostartrecognition;afterthis,wecantalkanditwillbeconvertedandprintedontheterminalwindow.Tostopdetection,pressanykeyanditwillpausetheGStreamerpipeline.

OneoftheotherspeechrecognitiontoolisJulius.WewillseehowtoinstallitandworkwithitusingPython.

SpeechrecognitionusingJuliusandPythoninUbuntu14.04.2Inthissection,wewillseehowtoinstallthespeechrecognitionsystemofJuliusandhowtoconnectittoPython.Therequiredpackages(suchasJuliusandaudiotools)areavailableinUbuntu'spackagemanager,butwealsoneedtodownloadandinstallthePythonwrapperseparately.Let'sstartwiththerequiredcomponentsfortheinstallation.

InstallationofJuliusspeechrecognizerandPythonmoduleThefollowingaretheinstructionstoinstallJuliusandPythonbindinginUbuntu14.04.2:

ThefollowingcommandwillinstallthespeechrecognitionsystemofJulius:

$sudoapt-getinstalljulius

Thefollowingcommandwillinstallpadsp(thepulseaudiotool).ItmaybenecessarytoruntheJuliusspeechrecognizerinUbuntu14.04.2:

$sudoapt-getinstallpulseaudio-utils

ThefollowingcommandwillinstalltheOSSproxydaemontoemulatetheOSSsounddeviceandstreamthroughtheALSAdevice.Itwillemulatethe/dev/dspdeviceinUbuntuandstreamthroughALSA.Juliusneedsthe/dev/dspdeviceforitsfunctioning:

$sudoapt-getinstallosspd-alsa

ReloadtheALSAprocesstobindosspdtoalsa:

$sudoalsaforce-reload

Toinstallpyjulius,thePythonextensionforJulius,youneedtoinstallthesetuptoolsinPython.

1. Toinstallthesetuptools,thebestoptionistodownloadascriptfromthesetuptoolswebsite;it'saglobalscriptthatcanbeusedinanyOS.Thescriptcanbedownloadedfromthefollowinglinkusingthewgettool:

$wgethttps://bootstrap.pypa.io/ez_setup.py

$sudopythonez_setup.py

2. Theinstallationdetailsofsetuptoolsismentionedathttps://pypi.python.org/pypi/setuptools3. Aftertheinstallationofsetuptools,downloadpyjuliusfrom

https://pypi.python.org/pypi/pyjulius/0.34. Extracttheachieveandinstallationpackageusingthefollowingcommand:

$sudopythonsetup.pyinstall

5. Aftertheinstallationofpyjulius,installademooftheJuliustool,whichcontainsHMM,LM,anddictionaryofafewwords.DownloadtheJuliusquick-startfilesusingthefollowingcommand:

$wgethttp://www.repository.voxforge1.org/downloads/software/julius-3.5.2-

quickstart-linux.tgz

6. Extractthefilesandrunthecommandfromthefolder.7. Executethefollowingcommandintheextractedfolder.Itwillstartthespeechrecognitioninthe

commandline:

$padspjulius-inputmic-Cjulian.jconf

8. Toexitspeechrecognition,clickonCTRL+C.9. ToconnecttoPython,enterthefollowingcommand:

$padspjulius-module-inputmic-Cjulian.jconf

ThiscommandwillstartaJuliusserver.Thisserverlistenstoclients.IfwewanttouseJuliusAPIsfromPython,weneedtoconnecttoaserverusingaclientcodeasgiveninthefollowingsections.ThePythoncodeisaclientthatconnectstotheJuliusserverandprintstherecognizedtext.

Python-JuliusclientcodeThefollowingcodeisaPythonclientoftheJuliusspeechrecognitionserverthatwestartedusingthepreviouscommand.Afterconnectingtothisserver,itwilltriggerspeech-to-textconversionandfetchtheconvertedtextandprintonterminal:

#!/usr/bin/envpython

importsys

#Importingpujuliusmodule

importpyjulius

#ItanimplementationofFIFO(FirstInFirstOut)queuesuitableformultithreaded

programming.

importQueue

#InitializeJuliusClientobjectwithlocalhostipanddefaultportof10500and

tryingtoconnectserver.

client=pyjulius.Client('localhost',10500)

try:

client.connect()

#Whentheclientrunsbeforeexecutingtheserveritwillcauseaconnectionerror.

exceptpyjulius.ConnectionError:

print'Startjuliusasmodulefirst!'

sys.exit(1)

#Startlisteningtotheserver

client.start()

try:

while1:

try:

#Fetchingrecognitionresultfromserver

result=client.results.get(False)

exceptQueue.Empty:

continue

printresult

exceptKeyboardInterrupt:

print'Exiting...'

client.stop()#sendthestopsignal

client.join()#waitforthethreadtodie

client.disconnect()#disconnectfromjulius

AfterconnectingtoJuliusserver,thePythonclientwilllistentoserverandprinttheoutputfromtheserver.

Theacousticmodelsweusedintheprecedingprogramsarealreadytrained,buttheymaynotgiveaccurateresultsforourspeech.Toimprovetheaccuracyinthepreviousspeechrecognitionengines,weneedtotrainnewlanguageandacousticmodelsandcreateadictionaryorwecanadapttheexistinglanguagemodelusingourvoice.Themethodtoimproveaccuracyisbeyondthescopeofthischapter,sosomelinkstotrainoradaptbothPocketSphinxandJuliusaregiven.

ImprovingspeechrecognitionaccuracyinPocketSphinxandJuliusThefollowinglinkisusedtoadapttheexistingacousticmodeltoourvoiceforPocketSphinx:

http://cmusphinx.sourceforge.net/wiki/tutorialadapt

Juliusaccuracycanbeimprovedbywritingrecognitiongrammar.ThefollowinglinkgivesanideaabouthowtowriterecognitiongrammarinJulius:

http://julius.sourceforge.jp/en_index.php?q=en_grammar.html

Inthenextsection,wewillseehowtoconnectPythonandspeechsynthesislibraries.WewillworkwiththeeSpeakandFestivallibrarieshere.Thesearetwopopular,free,andeffectivespeechsynthesizersavailableinalltheOSplatforms.ThereareprecompiledbinariesavailableinUbuntuintheformofpackages.

SettingupeSpeakandFestivalinUbuntu14.04.2eSpeakandFestivalarespeechsynthesizersavailableintheUbuntu/Linuxplatform.TheseapplicationscanbeinstalledfromthesoftwarepackagerepositoryofUbuntu.ThefollowingaretheinstructionsandcommandstoinstallthesepackagesinUbuntu.

1. ThefollowingcommandswillinstalltheeSpeakapplicationanditswrapperforPython.WecanusethiswrapperinourprogramandaccesseSpeakAPIs:

$sudoapt-getinstallespeak

$sudoapt-getinstallpython-espeak

2. ThefollowingcommandwillinstalltheFestivaltext-to-speechengine.Festivalhassomepackagedependencies;alldependencieswillbeautomaticallyinstalledusingthiscommand:

$sudoapt-getinstallfestival

3. AftertheinstallationoftheFestivalapplication,wecandownloadandinstallPythonbindingsforFestival.

4. DownloadPythonbindingsusingthefollowingcommand.Weneedthesvntool(ApacheSubversion)todownloadthispackage.Subversionisafreesoftwareversioningandrevisioncontrolsystem:

$svncheckouthttp://pyfestival.googlecode.com/svn/trunk/pyfestival-read-only

5. Afterthedownloadingprocessiscomplete,switchtothepyfestival-read-onlyfolderandyoucaninstallthispackageusingthefollowingcommand:

$sudopythonsetup.pyinstall

HereisthecodetoworkwithPythonandeSpeak.Asyouwillsee,it'sveryeasytoworkwithPythonbindingforeSpeak.WeneedtowriteonlytwolinesofcodetosynthesizespeechusingPython:

fromespeakimportespeak

espeak.synth("HelloWorld")

ThiscodewillimporttheeSpeak-Pythonwrappermoduleandcallthesynthfunctioninthewrappermodule.Thesynthfunctionwillsynthesizethetextgivenasargument.

ThefollowingcodeshowshowtosynthesizespeechusingPythonandFestival:

importfestival

festival.say("HelloWorld")

TheprecedingcodewillimporttheFestival-PythonwrappermoduleandcallthesayfunctionintheFestivalmodule.Itwillsynthesizethetextasspeech.

WorkingwithspeechrecognitionandsynthesisinWindowsusingPythonInWindows,therearemanytoolsandframeworkstoperformspeechrecognitionandsynthesis.Thespeechrecognitionlibraries,namely,PocketSphinxandJuliusthatwediscussedwillalsobesupportedinWindows.MicrosoftalsoprovidesSAPI(SpeechApplicationProgrammingInterface),asetofAPIsthatallowsyoutousespeechrecognitionandsynthesisfromcode.TheseAPIsareeithershippedwithanoperatingsystemorwithMicrosoftSpeechSDK.

Inthissection,wewilldemonstratehowtoconnectPythonandMicrosoftSpeechSDKtoperformspeechrecognitionandsynthesis.ThisprocedurewillworkinWindows8,Windows7,32,and64bit.

InstallationoftheSpeechSDKThefollowingisthestep-by-stepproceduretoinstallSpeechSDKandthePythonwrapperofSpeechSDK:

1. DownloadSpeechSDKfromhttp://www.microsoft.com/en-in/download/details.aspx?id=272262. DownloadandinstallActiveStatePython2.7bitfrom

http://www.activestate.com/activepython/downloads3. DownloadandinstallPythonwrapperfortheWindowsSpeechSDKfrom

https://pypi.python.org/pypi/speech/.Currently,thisprojectisnotactive,butitwillworkfineinWindows7and8

4. Installthepackageusingthefollowingcommand:

pythonsetup.pyinstall

5. ThecodetodospeechrecognitionusingPythonisverysimpleandit'sgiveninthefollowingcode:

importspeech

result=speech.input("Speak")

printresult

Inthiscode,weimportthespeechmodule.Whenweimportthespeechmodule,thespeechrecognitionpanelofWindowswillpopup.Itwillbeinoffstatefirstandweneedtoturnitontoperformtherecognition.TherecognizedtextwillbeprintedonthePythoncommandline.

Next,wecanlookatthespeechsynthesisusingPython.Similartothespeechrecognitionprocess,it'sveryeasytoperformthespeechmodule.Thiscanbeusedtoperformspeechsynthesis.Hereisthecode:

importspeech

speech.say("HelloWorld")

Inthiscode,speech.say()isthemethodtoconverttexttospeech.

Wehaveseensomeofthespeechrecognitionandsynthesisplatforms.Now,wecantakealookathowwecanintegratespeechrecognitionandsynthesisinROS.ThefollowingsectiondiscussestheintegrationofspeechrecognitionandsynthesisonROS.

WorkingwithSpeechrecognitioninROSIndigoandPythonComparedtootherspeechrecognitionmethods,oneoftheeasiestandeffectivemethodstoimplementrealtimespeechrecognitionisPocketSphinxandGStreamerpipeline.WediscussedPocketSphinx,GStreameranditsinterfacingwithPythonpreviously.Next,wecanseeaROSpackagecalledpocketsphinxthatusestheGStreamerpocketsphinxinterfacetoperformspeechrecognition.ThepocketsphinxROSpackageisavailableintheROSrepository.Youwillgetthepackageinformationatthefollowinglink

http://wiki.ros.org/pocketsphinx

InstallationofthepocketsphinxpackageinROSIndigoToinstallthepocketsphinxpackage,firstswitchtothecatkinworkspacesourcefolder.

1. Downloadthesourcecodeofthepocketsphinxpackageusingthefollowingcommand:

$gitclonehttps://github.com/mikeferguson/pocketsphinx

2. Executethecatkin_makecommandfromthecatkinworkspacefoldertobuildthepackage3. Startthespeechrecognizerdemousingthefollowingcommand.Therobotcupdemohassome

basiccommandstodrivetherobot.Wecanchangethecommandbyadaptingacousticandlanguagemodels:

$roslaunchpocketsphinxrobocup.launch

4. Subscribeto/recognizer/outputusingthefollowingcommand:

$rostopicecho/recognizer/output

Thefollowingisthescreenshotoftheoutput:

ThisTopiccanbesubscribedandthecommandcanbeprocessedinsomeothernodes.Inthenextsection,wewillseehowtosynthesizespeechusingROSandPython.

WorkingwithspeechsynthesisinROSIndigoandPythonInROS,therearesomeROSpackagesthatperformspeechsynthesis.Here,wewilldiscussoneROSpackage.ThispackageusesFestivalasthebackend.Thepackagenameissound_play.Ithasnodesandlaunchscriptsthatenablespeechsynthesis.Weneedtoperformthefollowingstepsforspeechsynthesis:

1. Wecaninstallthesound_playpackageusingthefollowingcommand:

$sudoapt-getinstallros-indigo-sound-play

2. Aftertheinstallationofpackage,wehavetocreateasampleROSpackagetointeractwiththesound-playnode.ThefollowingisthecommandtocreateasamplepackageinROSwiththesound-playpackageasdependency:

$catkin_create_pkgsample_ttsrospyroscppsound_playstd_msgs

3. Wehavetocreateasound_playpythonclientcodeforsendingtexttosoundplayservernode.Thisclientwillsendthetextthatneedstobeconvertedtospeechtothesound_playservernode.TheclientwillsendthetexttoconverttospeechinaTopiccalled/robotsound.ThesoundplaynodeinthesoundplaypackagewillsubscribetothisTopicandconvertthestringfromTopictospeech.

4. Createafolderinsidethissample_ttspackagenamedscriptsandcreatethefollowingcodeinthescriptsfolderandnameittest.py.Thecodesnippetsoftest.pyisgiven.

5. Thefollowingcodewillimporttherospyandsound_playmodules.ThisscriptwillactasaSoundClient,whichwillconnecttothesound_playserverandsynthesizethespeech:

#!/usr/bin/envpython

importroslib;roslib.load_manifest('sample_tts')

importrospy,os,sys

fromsound_play.msgimportSoundRequest

fromsound_play.libsoundplayimportSoundClient

6. Thiscodewillinitializethesoundplay_testnodeandcreateanobjectofSoundClient:

if__name__=='__main__':

rospy.init_node('soundplay_test',anonymous=True)

soundhandle=SoundClient()

rospy.sleep(1)

soundhandle.stopAll()

7. Thiscodewillcallafunctiontosynthesizethespeech.Itcanbeusedtosynthesizespeechinanypackagethatincludessound_playasdependency.

print'StartingTTS'

soundhandle.say('Helloworld!')

rospy.sleep(3)

s=soundhandle.voiceSound("HelloWorld")

s.play()

rospy.sleep(3)

8. Thefollowingcommandstartsthesoundplayserver:

$roslaunchsound_playsoundplay_node.launch

9. Thefollowingcommandwillstartthetestscriptforspeechsynthesis:

$rosrunsample_ttstest.py

Questions1. Whatarethebasicproceduresinvolvedinconvertingspeechtotext?2. Whatisthefunctionoftheacousticmodelandlanguagemodelinspeechrecognition?3. Whatarethebasicproceduresinvolvedinconvertingtexttospeech?4. Whataretheproceduresinvolvedinphoneticanalysisandprosodicanalysis?5. HowcanweimprovetherecognitionaccuracyofSphinxandJulius?

SummaryThemainaimofthischapterwastodiscussspeechrecognitionandsynthesisandhowwecanimplementitonourrobot.Byaddingspeechfunctionalitiesinourrobot,wecanmaketherobotmoreinteractivethanbefore.Wesawwhataretheprocessesinvolvedinthespeechrecognitionandsynthesisprocess.Wealsosawtheblockdiagramoftheseprocessesandthefunctionsofeachblock.Afterdiscussingtheblocks,wesawsomeinterestingspeechrecognitionframeworks(suchasSphinx/PocketSphinx,Julius,andWindowsSpeechSDKandsynthesislibrariessuchaseSpeakandFestival).Afterdiscussingtheselibraries,wediscussedandworkedwiththePythoninterfacingofeachlibrary.Towardstheendofthischapter,wediscussedandworkedwiththeROSpackagesthatperformspeechrecognitionandsynthesisfunctionalities.

Chapter9.ApplyingArtificialIntelligencetoChefBotUsingPythonInthepreviouschapter,wehavediscussedandimplementedspeechrecognitionandspeechsynthesisusingPythonandROS.Inthischapter,wewilldiscusshowtoapplyAItoChefBottocommunicatewithpeopleintelligently,likeahuman.Actually,thesefeaturesareadd-onsinChefBot,whichcanincreasehuman-robotinteractionandmaketherobotresembleahumanfoodsupplier.Inthischapter,wewillmainlycoverthefollowingtopics:

BlockdiagramofChefBot'scommunicationsystemIntroductiontoAIMLandPyAIMLInterfacingChefBot'sAImoduletoROS

AI(ArtificialIntelligence)canbedefinedastheintelligentbehaviorexhibitedbycomputersormachines.UsingAI,wecancreateavirtualintelligenceinmachinestoperformaspecifictasklikeahuman.Inthischapter,wewilluseasimplemethodtoapplyAItotherobot.Thisintelligencewillworkusingpatternmatchingandsearchingalgorithms.Theinput-outputdialogpatternsbetweentheuserandrobotarestoredinfilescalledArtificialIntelligenceMarkupLanguage(AIML)andwewillinterpretthesestoredpatternsusingaPythonmodulecalledPyAIML.TheusercanstoredesiredpatternsinAIMLfilesandtheinterpretermodulewillsearchforappropriateresponsefromthedataset.Wecandevelopourownpatterndatasetforourrobotsimplybywritinglogicalpatterns.Inonesectionofthischapter,wewillseehowtowriteAIMLtagsandpatternsinarobot.Inthefirstsection,wewilldiscusswherewewilluseAIinChefBot.

BlockdiagramofthecommunicationsysteminChefBotThefollowingblockdiagramshowshowChefBotcommunicatesandinteractswithhumansusingspeech:

Robotcommunicationblockdiagram

Therobotcanconverthumanspeechtotextusingthespeechrecognitionsystemandcanconverttextualdatatospeechusingspeechsynthesis.Wehavealreadydiscussedtheseprocessesinthepreviouschapter.TheAIwewilldiscusshereiscontainedinbetweenthesetwoblocks.Afterreceivingthetextdatafromaspeechtotextconversionstage,itissenttotheAIMLinterpreter.TheAIMLinterpreterretrievesthemostmeaningfulreplyfromtheAIMLdataset.Thedatasetoftherobotcanbeanything,suchasfooddetails,casualtalks,andsoon.TheusercanwriteanykindofpatterninAIMLfiles.InthecaseofChefBot,theusercanaskaboutfooddetailsorcancommandtherobottodosomething.Therobotcommandsystemcheckswhethertheconvertedtextisacommandtotherobot.Ifit'sacommand,itisdirectlysenttothehardwarenodestoexecute.TheoutputtextfromAIMLwillbeconvertedtospeechusingatext-to-speechsystem.Also,wecanputanLCDdisplaytoshowtheresultofspeechintheformofananimatedface.Allthesefeaturesenhancetherobot'sinteraction.BeforewediscussthePythoninterpreterforAIML,wewilldiscussAIMLandAIMLtagsindetail.

IntroductiontoAIMLAIMLfilesareasubsetofExtensibleMark-upLanguage(XML)thatcanstoredifferenttextpatternsintheformoftags.AIMLwasdevelopedbytheAlicebotfreesoftwarecommunity(http://www.alicebot.org/).AIMLismainlyusedtoimplementChatbots,anaturallanguagesoftwareagentinwhichausercanaskquestionstotherobotanditcangiveanintelligentreply.ThissametechniqueisusedinChefBot.Usingspeechrecognition,therobotgetsinputtextfromtheuserandanAIMLinterpreter;asoftwareprogramthatcaninterpretAIMLfilesandretrieveanintelligentreplyfromtheAIMLdataset.Thereplywillbeconvertedtospeech.AIMLfilesmainlyconsistofvarioustags.HereareasetofcommonlyusedAIMLtags.

IntroductiontoAIMLtagsAIMLfilesconsistofasetofcommonlyusedAIMLtags.Let'stakealookatthem.

The<aiml>tag:EachAIMLcodebeginswiththistagandisclosedusingthe</aiml>tag.Thistagalsoconsistsofattributessuchastheversionandencodingschemeofthefile.TheAIMLfilecanparseevenwithouttheseattributes,butthiswillbeusefulinbigprojects.TheversionattributecorrespondstothecurrentversionofAIMLthatwewilluse.Theencodingattributeisthetypeofcharacterencodingwewilluseinthisfile.ThefollowingcodesnippetshowsanexampleusageofAIMLtags:

<aimlversion="1.0.1"encoding="UTF-8">

...

</aiml>

The<category>tag:ThebasicknowledgeblocksofAIMLarecalledcategories.Eachcategoryblockconsistsoftwosections.Oneistheuserinputintheformofasentenceandtheotherisacorrespondingresponsetouserinputwhichcomesfromrobot.Thecategorytagisrepresentedusingtheopening<category>tagandtheclosingtagisrepresentedusingthe</category>tag.Thesecategoriesmustbeinsidethe<aiml>and</aiml>tags.Thecategorytagsconsistoftwotags,namely,the<pattern>tagandthe<template>tag.Theinputgivenbyusersisinsidethe<pattern>tagandtheanswersareinthe<template>tag.Forexample,lookatthisfollowingconversation:

User:Howareyou?

Robot:Iamfine.

Inthisconversation,theuserdialogwillbeinthe<pattern>tagandtherobot'sresponsewillbeinthe<template>tag.ThefollowingcodeshowstherepresentationoftheprecedingdialogsintheAIMLformat:

<aimlversion="1.0.1"encoding="UTF-8">

<category>

<pattern>HOWAREYOU</pattern>

<template>IAMFINE</template>

</category>

</aiml>

Weneedtosavethisfileinthe.aimlor.xmlformat.

The<pattern>tag:Thepatterntagcomprisesofpossibleuserinputs.Therewillbeonlyone<pattern>taginacategoryblock.The<pattern>tagwillbethefirstelementofthe<category>tagand,inthe<pattern>tag,wordsareseparatedbysinglespaces.Thesentencein<pattern>tagmayhavewordsorwildcardssuchas"*"or"_",whichcanreplaceastringinthisposition.Intheprecedingexample,the<pattern>HOWAREYOU</pattern>codeindicatesthepossibleuserinputinthiscategory.

The<template>tag:The<template>tagcomprisesofpossibleanswersfortheuserinput.The<template>tagwillbewithinthe<category>tagandwillbeplacedafterthe<pattern>tag.The<template>tagcansaveaparticularansweroritcantriggerprograms.Also,wecangiveconditionalformofanswerstoo.Intheprecedingcode,the<template>tagsentence:"IAMFINE"willbetheanswerforthe"HOWAREYOU"pattern.Wecaninsertadditionaltagsinthe<template>tag.Thefollowingtagsareusedinthe<template>tag:

The<starindex="n"/>tag:Thistagisusedtoextractapartoftheusertextinputsentence.Thenindexindicateswhichfragmentoftexthastobeextractedandtakenfromtheentiresentence:

<starindex="1"/>:Thisindicatesthefirstfragmentofasentence<starindex="2"/>:Thisindicatesthesecondfragmentofasentence

Themainapplicationofthistagistoextractandstorethetextfromuserinput.Thefollowingisadialogbetweentherobotandtheuser.Thewildcardcanbeanything,suchasanameorsomethingelse.Usingthistag,wecanextractthiswildcardportionanduseitintheansweringsection:

User:Mynameis*

Robot:Nicetomeetyou*

So,iftheusersays,"MynameisLentin",thentherobotwillreply,"NicetomeetyouLentin".Thiskindofconversationisonlypossibleusingthe<star>tagandwildcardssuchas"*".ThecompleteAIMLexampleusingthestartagisasfollows:

<aimlversion="1.0.1"encoding="UTF-8">

<category>

<pattern>MYNAMEIS*</pattern>

<template>

NICETOMEETYOU<star/>

</template>

</category>

<category>

<pattern>MEETOURGUEST*AND*</pattern>

<template>

NICETOMEETYOU<starindex="1"/>AND<starindex="2"/>.

</template>

</category>

</aiml>

IfweloadthisexampletotheAIMLinterpreter,wewillgetthefollowingreplywhenwegivethefollowinginput:

USER:MYNAMEISLENTIN

ROBOT:NICETOMEETYOULENTIN

Thepreviousconversationusesonewildcardandthefollowingconversationwillusebothwildcards:

USER:MEETOURGUESTTOMANDJOSEPH

ROBOT:NICETOMEETYOUTOMANDJOSEPH

Here,thenameis"TOM",theindexnumberis"1",and"JOSEPH"isindexedas"2".

The<srai>tag:Usingthe<srai>tag,wecantargetmultiplepatternsfromasingle<template>tag.Usingthe<srai>tag,theAIMLinterpretercansearchrecursivelyfortheanswerthatisreplacingthecurrenttemplatetextwiththetemplatetextofanotherpattern.Thefollowingcodeisanexampleoftheusageofthe<srai>tag:

<aimlversion="1.0.1"encoding="UTF-8">

<category>

<pattern>WHATISAROBOT?</pattern>

<template>

AROBOTISAMACHINEMAINLYDESIGNEDFOREXECUTINGREPEATEDTASKWITHSPEEDAND

PRECISION.

</template>

</category>

<category>

<pattern>DOYOUKNOWWHATA*IS?</pattern>

<template>

<srai>WHATISA<star/></srai>

</template>

</category>

</aiml>

Whenauseraskstherobot,"DOYOUKNOWWHATAROBOTIS",itwillgotothesecondcategorytemplateandextractthewildcardsectionfromuserinput,"ROBOT"andputthecompletesentence,"WHATISAROBOT",andputitinthe<srai>tag.The<srai>tagcancallthepatterncalled"WHATISAROBOT"andfilltheoutputofthistemplatetotheactualtemplatetext.

FormoreAIMLtags,youcanrefertohttp://www.alicebot.org/documentation/aiml-reference.html.

AfterdiscussingAIMLfilesandtags,wewilldiscussthePythonAIMLinterpretertodecodeAIMLfiles.TheAIMLinterpretercanretrievethetemplatetextfromuserinput.WewilluseaPythonmodulecalledPyAIMLtointerpretAIMLfiles.Let'sdiscussmoreaboutPyAIML.

IntroductiontoPyAIMLPyAIMLisanopensourcePythonAIMLinterpreterwrittencompletelyinpurePythonwithoutusinganythird-partydependencies.ThemodulewillreadallthepatternsofAIMLfrommemoryandbuildadirectedpatterntree.Thebacktrackingdepth-firstsearchalgorithmisimplementedinthismoduleforpatternmatching.

Now,wecancheckwhetherwecaninstallPyAIMLonoursystem.ThePyAIMLmodulecanbeinstalledonLinux,Windows,andMacOSX.ThereareprebuiltbinariesofPyAIMLavailableonUbuntuandthesourcecodeofthismoduleisalsoavailableonGitHub.Currently,weareworkingwithPythonversion2.7,oranythinglessthan2.8,toinstallPyAIML.

InstallingPyAIMLonUbuntu14.04.2PyAIMLcanbeinstalledonUbuntuusingtheapt-getcommand.ThebinariesareavailableontheUbuntupackagerepositories.ThePythonversionweareworkingwithis2.7.6andthePyAIMLversionweareinstallingis0.86.ThefollowingcommandwillinstallPyAIMLonUbuntu14.04.2:

$sudoapt-getinstallpython-aiml

YoushouldinstallGittogetthesourcecode.Also,youshouldhavePythonversion2.7orgreaterthan2.7andlessthan2.8.Werequirethelatestversionofthemoduleifweareperformingtheinstallationviasourcecode.

InstallingPyAIMLfromsourcecodeWecanretrievethesourcecodemoduleusingthefollowinggitcommand:

$gitclonegit://pyaiml.git.sourceforge.net/gitroot/pyaiml/pyaiml

Aftercloningthecode,changethedirectorytoacloneddirectorynamedpyaiml:

$cdpyaiml

Installthemoduleusingthefollowingcommand:

$sudopythonsetup.pyinstall

WorkingwithAIMLandPythonTocheckwhetherthemoduleisproperlyinstalledonyourmachine,openaPythonIDLEandimporttheaimlmodule:

>>>importaiml

Ifthemoduleisimportedcorrectly,itwillnotshowanyerrorandcomestothenextline.Then,wecanconfirmthattheinstallationiscorrect.

ThemostimportantclasswearehandlingintheaimlmoduleisKernel().WearemainlyusingthisclasstolearnfromAIMLfilesandgetaresponsefromtheAIMLdatasettouserinput.Thefollowinglinewillcreateanobjectoftheaiml.Kernel()class:

>>>mybot=aiml.Kernel()

AftercreatingtheKernel()object,wecanassigntherobotnameusingthefollowingcommand.WewillassignChefbotasthenameforthisrobot:

>>>mybot.setBotPredicate("name","Chefbot")

ThenextstepistolearnAIMLfiles.WecanloadeitherasingleAIMLfileoragroupofAIMLfiles.ToloadasingleAIMLfile,wecanusethefollowingcommand.Notethatthesample.aimlfilemustbeinthecurrentpath:

>>>mybot.learn('sample.aiml')

Theprecedingcommandwillloadthesample.aimlfileintomemoryandtheoutputisasfollows:

Loadingsample.aiml...done(0.01seconds)s

IfyouwanttolearnmorethanoneAIML,it'sbettertouseanAIML/XMLfile,forexample,thestartup.xmlfilecanloadallotherAIMLfiles.Wewillseehowstartup.xmlworksinthenextsection.Tolearnstartup.xml,usethefollowingcommand:

>>>mybot.learn("startup.xml")

Afteryoulearnstartup.xml,let'striggerapatterninstartup.xmlcalled"LOADAIMLB".Whenwecallthispattern,itwillrespondbylearningallAIMLfilesandprinttheresponseinstringafterlearningeachAIMLfile:

>>>mybot.respond("loadaimlb")

AfterlearningAIMLfiles,wecanstartinputtingtexttothekernelobjectandretrievetheintelligenttextusingthefollowingcode:

>>>whileTrue:printk.respond(raw_input(">"))

ThecompletePythoncodetoloadoneAIMLfileandgetaresponsefromtheAIMLdatasetisgiven

inthecodesnippetinthefollowingsection.WecanpasstheAIMLfileasacommand-lineargument.

LoadingasingleAIMLfilefromthecommand-lineargumentWecanloadasingleAIMLfileusingthefollowingcode:

#!/usr/bin/envpython

importaiml

importsys

mybot=aiml.Kernel()

mybot.learn(sys.argv[1])

whileTrue:

printmybot.respond(raw_input("Enterinput>"))

ThefollowingisthesampleAIMLfilerequiredtoloadinthiscode.Savethefollowingcodewiththenamesample.aiml:

<aimlversion="1.0.1"encoding="UTF-8">

<category>

<pattern>HOWAREYOU</pattern>

<template>IAMFINE</template>

</category>

</aiml>

Savethecodeaschatbot.pyandchangethepermissionofthecodeusingthefollowingcommand:

$chmod+xchatbot.py

Executethecodeusingthefollowingcommand:

$./chatbotsample.aiml

Itwillgiveyouthefollowingresult:

PressCtrl+Ctoquitthedialog.WecancheckwhethereachAIMLexamplewepreviouslydiscussedcanbetestedusingthisexample.

IfthereismorethanoneXMLfile,wecanusethefollowingcodetoloadalltheAIMLfilesintomemory.Let'sdownloadsomeAIMLdatasetfromtheArtificialLinguisticInternetComputer

Entity(A.L.I.C.E)robotandloaditusingPyAIML.

WorkingwithA.L.I.C.E.AIMLfilesTheAIMLfilesofA.L.I.C.E.chatterarefreelyavailableathttps://code.google.com/p/aiml-en-us-foundation-alice/.

ExtracttheAIMLfilestoafolderonthedesktoporinthehomedirectoryandcopystartup.xmltotheseAIMLfiles.Thisstartup.xmlfilewillloadalltheotherAIMLfilesintomemory.Thefollowingcodeisanexampleofatypicalstartup.xmlfile:

<aimlversion="1.0">

<category>

<pattern>LOADAIMLB</pattern>

<template>

<!--LoadstandardAIMLset-->

<learn>*.aiml</learn>

</template>

</category>

</aiml>

TheprecedingXMLfilewilllearnalltheAIMLfileswhenwecalltheLOADAIMLBpattern.

LoadingAIMLfilesintomemoryThefollowingcodewillloadalltheAIMLfilesintomemory:

#!/usr/bin/envpython

importaiml

importsys

importos

#Changethecurrentpathtoyouraimlfilespath

os.chdir('/home/lentin/Desktop/aiml-files')

mybot=aiml.Kernel()

#Learnstartup.xml

mybot.learn('startup.xml')

#CallingloadaimlbforloadingallAIMLfiles

mybot.respond('loadaimlb')

whileTrue:

printmybot.respond(raw_input("Enterinput>"))

Youwillgetthefollowingoutput:

LoadingAIMLfileswilltakesometime.Toavoidinitialloadingtime,wecandumptheAIMLpatternsloadedinthememoryandsavethemtobrainfiles.Loadingbrainfileswillsaveinitialloadingtime.

LoadingAIMLfilesandsavingtheminbrainfilesThefollowingcodewillloadAIMLfilesandsavetheminbrainfiles:

#!/usr/bin/envpython

importaiml

importsys

importos

os.chdir('/home/lentin/Desktop/aiml-files')

mybot=aiml.Kernel()

mybot.learn('startup.xml')

mybot.respond('loadaimlb')

#Savingloadedpatternsintoabrainfile

mybot.saveBrain('standard.brn')

whileTrue:

printmybot.respond(raw_input("Enterinput>"))

Youwillgetthefollowingoutput:

IfwewanttoinitializetherobotfromthebrainfileorAIMLfiles,abetterwayistousethebootstrap()methodinsidetheKernel()class.Thebootstrap()methodtakesthebrainfileorAIMLfilesandsomecommandasargument.Thecodeforloadingthebrainfileifitexistsisinthefollowingsection;otherwise,loaditfromAIMLandsaveanewbrainfile.Afterthisprocessiscomplete,respondfromtheloadeddataset.

LoadingAIMLandbrainfilesusingtheBootstrapmethodThefollowingcodewillloadAIMLfilesandbrainfilesusingtheBootstrapmethod:

#!/usr/bin/envpython

importaiml

importsys

importos

#Changingcurrentdirectorytothepathofaimlfiles

#Thispathwillchangeaccordingtoyourlocationofaimlfiles

os.chdir('/home/lentin/Desktop/aiml-files')

mybot=aiml.Kernel()

#Ifthereisabrainfilenamedstandard.brn,Kernel()willinitializeusing

bootstrap()method

ifos.path.isfile("standard.brn"):

mybot.bootstrap(brainFile="standard.brn")

else:

#Ifthereisnotbrainfile,loadallAIMLfilesandsaveanewbrain

mybot.bootstrap(learnFiles="startup.xml",commands="loadaimlb")

mybot.saveBrain("standard.brn")

#ThisloopaskforresponsefromuserandprinttheoutputfromKernel()object

whileTrue:

printmybot.respond(raw_input("Enterinput>"))

IntegratingPyAIMLintoROSInthissection,wearegoingtodevelopROSPythonnodeswhichcanhandleAIMLfiles.WeareusingthePythoncodethatwedevelopedintheprecedingsection.TheROSversionwearegoingtouseisIndigoandtheUbuntuversionwewilluseis14.04.2.WealreadydiscussedtheinterfacingofspeechrecognitionandspeechsynthesisinROSandalsodiscussedthePythoncodetointerfaceAIMLfiles.Inthissection,wewillmakeapackageinROStohandleAIMLfiles.Currently,therearenoactivepackagesinROSrepositoriesthatcanhandleAIMLfiles.Wewillbuildourownpackageusingthecodethatwedevelop.

CreateaROSpackageusingthefollowingdependencies.Herethesound_playpackageisusedforspeechsynthesis:

$catkin_create_pkgros_aimlrospystd_msgssound_play

Createascriptsfolderinsidetheros_aimlpackageandcreatethefollowingPythonfilesinit.CreateafoldercalleddataandcopytheALICEAIMLdatasetwehavealreadydownloadedtothisfolder.

aiml_server.pyThefollowingcodeactsasanAIMLserverinwhichanAIMLclientcansenduserinputtotheserverthroughthe/chattertopicandretrievetheAIMLoutputresponsethroughthe/responsetopic:

#!/usr/bin/envpython

importrospy

importaiml

importos

importsys

fromstd_msgs.msgimportString

rospy.init_node('aiml_server')

mybot=aiml.Kernel()

#CreatingaROSpublisherforthe/responsetopic

response_publisher=rospy.Publisher('response',String,queue_size=10)

#FunctiontoloadAIMLfilesusingbootstrap()method

defload_aiml(xml_file):

#Getthepathofaimldataset.Wehavetomentionthispathonlaunchfileasa

rosparameter

data_path=rospy.get_param("aiml_path")

os.chdir(data_path)

ifos.path.isfile("standard.brn"):

mybot.bootstrap(brainFile="standard.brn")

else:

mybot.bootstrap(learnFiles=xml_file,commands="loadaimlb")

mybot.saveBrain("standard.brn")

#Callbackfunctionof/chattertopic.Itwillreceiveinputfromuserandfeedto

respond()methodofKernel()object.andprinttheresults

defcallback(data):

input=data.data

response=mybot.respond(input)

rospy.loginfo("Iheard::%s",data.data)

rospy.loginfo("Ispoke::%s",response)

response_publisher.publish(response)

#Methodtocreatesubscriberin/chattertopic

deflistener():

rospy.loginfo("StartingROSAIMLServer")

rospy.Subscriber("chatter",String,callback)

#spin()simplykeepspythonfromexitinguntilthisnodeisstopped

rospy.spin()

if__name__=='__main__':

load_aiml('startup.xml')

listener()

aiml_client.pyThisisasimpleclientcodethatwillsenduserinputtakenfromthekeyboardtotheAIMLserver.Theuserinputissendthroughthe/chattertopic:

#!/usr/bin/envpython

importrospy

fromstd_msgs.msgimportString

#Creatingapublisherforchattertopic

pub=rospy.Publisher('chatter',String,queue_size=10)

rospy.init_node('aiml_client')

r=rospy.Rate(1)#10hz

whilenotrospy.is_shutdown():

#Receivingtextinputfromuser

input=raw_input("Enteryourtext:>")

#Publishingtochattertopic

pub.publish(input)

r.sleep()

aiml_tts_client.pyThisclientwilltranscribetheresponsefromaiml_serverandconvertittospeech.Thiscodeisadaptedfromtheclientcode,aswediscussedinthepreviouschapterforspeechsynthesis,aswediscussedinthepreviouschapter.Wewillusethesound_playpackagetoperformTTS:

#!/usr/bin/envpython

importrospy,os,sys

fromsound_play.msgimportSoundRequest

fromsound_play.libsoundplayimportSoundClient

fromstd_msgs.msgimportString

rospy.init_node('aiml_soundplay_client',anonymous=True)

soundhandle=SoundClient()

rospy.sleep(1)

soundhandle.stopAll()

print'StartingTTS'

#Callbackmethodtoreceivetextfrom/responsetopicandconverttospeech

defget_response(data):

response=data.data

rospy.loginfo("Response::%s",response)

soundhandle.say(response)

#Methodtocreateasubscriberfor/responsetopic.

deflistener():

rospy.loginfo("Startinglisteningtoresponse")

rospy.Subscriber("response",String,get_response,queue_size=10)

rospy.spin()

if__name__=='__main__':

listener()

aiml_speech_recog_client.pyThisclientcansendthespeechtotextdatatotheAIMLserverinsteadoftypingonthekeyboard.Beforerunningthiscode,wehavetolaunchthePocketSphinxspeechrecognizer.Wecanseehowtorunthiscodeafterdiscussingit:

#!/usr/bin/envpython

importrospy

fromstd_msgs.msgimportString

rospy.init_node('aiml_speech_recog_client')

pub=rospy.Publisher('chatter',String,queue_size=10)

r=rospy.Rate(1)#10hz

#Theoutputofpocketsphinxpackageissendingconvertedtextto/recognizer/output

topic.Thefollowingfunctionisthecallbackofthistopic.Thetextwillreceive

andsendthrough/chattertopic,whichisreceivedbyAIMLserver

defget_speech(data):

speech_text=data.data

rospy.loginfo("Isaid::%s",speech_text)

pub.publish(speech_text)

#Creatingasubscriberforpocketsphinxoutputtopic/recognizer/output

deflistener():

rospy.loginfo("StartingSpeechRecognition")

rospy.Subscriber("/recognizer/output",String,get_speech)

rospy.spin()

if__name__=='__main__':

listener()

Let'sseehowthesenodescommunicatewiththeAIMLserver:

Aftercreatingallthescriptsinthescriptsfolder,createanotherfoldercalledlaunchintheros_aimlpackagetostorethelaunchfiles.Ithelpstolaunchallthenodesinasinglerun.Createthefollowinglaunchfilesinthelaunchfolder.

start_chat.launchThislaunchfilewilllaunchaiml_server.pyandaiml_client.py,inwhichtheuserwillreceivetheinputastextandtheresponseastext.Theaiml_pathROSparameterhastomentiontheminthelaunchfile:

<launch>

<paramname="aiml_path"value="/home/lentin/catkin_ws/src/ros_aiml/data"/>

<nodename="aiml_server"pkg="ros_aiml"type="aiml_server.py"output="screen">

</node>

<nodename="aiml_client"pkg="ros_aiml"type="aiml_client.py"output="screen">

</node>

</launch>

start_tts_chat.launchThislaunchfilewilllaunchthetextinputandspeechsynthesisoftheAIMLresponse:

<launch>

<paramname="aiml_path"value="/home/lentin/catkin_ws/src/ros_aiml/data"/>

<nodename="aiml_server"pkg="ros_aiml"type="aiml_server.py"output="screen">

</node>

<includefile="$(findsound_play)/soundplay_node.launch">

</include>

<nodename="aiml_tts"pkg="ros_aiml"type="aiml_tts_client.py"output="screen">

</node>

<nodename="aiml_client"pkg="ros_aiml"type="aiml_client.py"output="screen">

</node>

</launch>

start_speech_chat.launchThisfilewilllaunchthespeechrecognitionclient,synthesisclient,andAIMLserver.Thiswillnotlaunchpocketsphinx;weneedtolaunchitseparately.Thislaunchfileenablesyoutoreceivetextinputfromthespeechrecognizerandconverttheresponsetospeechtoo:

<launch>

<paramname="aiml_path"value="/home/lentin/catkin_ws/src/ros_aiml/data"/>

<nodename="aiml_server"pkg="ros_aiml"type="aiml_server.py"output="screen">

</node>

<includefile="$(findsound_play)/soundplay_node.launch"></include>

<nodename="aiml_tts"pkg="ros_aiml"type="aiml_tts_client.py"output="screen">

</node>

<nodename="aiml_speech_recog"pkg="ros_aiml"type="aiml_speech_recog_client.py"

output="screen">

</node>

</launch>

Aftercreatingallthelaunchfiles,changethepermissionofallthelaunchfilesusingthefollowingcommand,whichwehavetoexecuteinthelaunchfolder:

$chmod+x*.launch

Thefolderstructureofthispackageisgiveninthefollowingdiagram.Aftercreatingthispackage,verifyitwiththisdiagram:

LaunchtheAIMLserverandclientfortextchattingusingthefollowingcommand:

$roslaunchros_aimlstart_chat.launch

Whenyoulaunchthisfile,theusercaninputthetextandthereplywillbeprinted.

LaunchtheAIMLserverandclientwithtextchattingandspeechsynthesis,usingthefollowingcommand:

$roslaunchros_aimlstart_tts_chat.launch

Whenyoulaunchthisfile,itwillstartthetextchattinginterfaceandthereplytextwillbesynthesizedusingthespeechsynthesizer.

Startthepocketsphinxdemolaunchfiletostartspeechrecognition.Thefollowinglaunchfileisademothatwilldetectsomewordsandsentences.Ifwewantmoreaccuracy,wehavetotrainthemodel:

$roslaunchpocketsphinxrobocup.launch

LaunchtheAIMLserver,speechrecognition,andsynthesisclientusingthefollowingcommand:

$roslaunchros_aimlstart_speech_chat.launch

Afteryouruntheprecedinglaunchfiles,theusercaninteractwiththeAIMLserverusingspeechandtheuserwillgettheoutputasspeechaswell.

Questions1. WhatisArtificialIntelligence?2. WhatistheuseofanAIMLfile?3. WhicharethemostcommonlyusedAIMLtags?4. WhatistheuseofthePyAIMLmodule?

SummaryInthischapter,wediscussedhowtoaddArtificialIntelligencetoChefBotinordertointeractwithpeople.Thisfunctionisanadd-ontoChefBottoincreasetheinteractivityoftherobot.WeusedsimpleAItechniquessuchaspatternmatchingandsearchinginChefBot.ThepatterndatasetsarestoredinaspecialtypeoffilecalledAIML.ThePythoninterpretermoduleiscalledPyAIML.WeusedthistodecodeAIMLfiles.TheusercanstorethepatterndatainanAIMLformatandPyAIMLcaninterpretthispattern.Thismethodissimilartoastimulus-responsesystem.TheuserhastogiveastimulusintheformoftextdataandfromtheAIMLpattern,themodulefindstheappropriatereplytotheuserinput.Wesawtheentirecommunicationsystemoftherobotandhowtherobotcommunicateswithpeople.ItincludesspeechrecognitionandsynthesisalongwithAI.Wealreadydiscussedspeechinthepreviouschapter.WealsosawusefultagsusedinAIMLandthePyAIMLinstallation,howtheywork,andsomeexamples.Finally,weimplementedtheentirecodeinROSalongwiththespeechrecognitionandsynthesisunits.Inthenextchapter,wewilldiscusstheintegrationofcomponentsintherobot,whichwehavenotdiscusseduntilnow.

Chapter10.IntegrationofChefBotHardwareandInterfacingitintoROS,UsingPythonInChapter2,MechanicalDesignofaServiceRobot,wesawtheChefBotchassisdesignandnowwehavegotthemanufacturedpartsofthisrobot.Inthischapter,wewillseehowtoassemblethisrobotusingthesepartsandalsothefinalinterfacingofsensorsandotherelectronicscomponentsofthisrobottoTivaCLaunchPad.WehavealreadydiscussedinterfacingofindividualrobotcomponentsandsensorswithLaunchpad.Inthischapter,wewilltrytointerfacethenecessaryroboticcomponentsandsensorsofChefBotandprogramitinsuchawaythatitwillreceivethevaluesfromallsensorsandcontroltheinformationfromthePC.LaunchpadwillsendallsensorvaluesviaaserialporttothePCandalsoreceivecontrolinformation(suchasresetcommand,speed,andsoon)fromthePC.

AfterreceivingsensorvaluesfromthePC,aROSPythonnodewillreceivetheserialvaluesandconvertittoROSTopics.TherearePythonnodespresentinthePCthatsubscribetothesensor'sdataandproducesodometry.ThedatafromthewheelencodersandIMUvaluesarecombinedtocalculatetheodometryoftherobotanddetectobstaclesbysubscribingtotheultrasonicsensorandlaserscanalso,controllingthespeedofthewheelmotorsbyusingthePIDnode.Thisnodeconvertsthelinearvelocitycommandtodifferentialwheelvelocity.Afterrunningthesenodes,wecanrunSLAMtomaptheareaandafterrunningSLAM,wecanruntheAMCLnodesforlocalizationandautonomousnavigation.

Inthefirstsectionofthischapter,BuildingChefBothardware,wewillseehowtoassembletheChefBothardwareusingitsbodypartsandelectronicscomponents.

BuildingChefBothardwareThefirstsectionoftherobotthatneedstobeconfiguredisthebaseplate.Thebaseplateconsistsoftwomotorsanditswheels,casterwheels,andbaseplatesupports.Thefollowingimageshowsthetopandbottomviewofthebaseplate:

Baseplatewithmotors,wheels,andcasterwheels

Thebaseplatehasaradiusof15cmandmotorswithwheelsaremountedontheoppositesidesoftheplatebycuttingasectionfromthebaseplate.Arubbercasterwheelismountedontheoppositesideofthebaseplatetogivetherobotgoodbalanceandsupportfortherobot.Wecaneitherchooseballcasterwheelsorrubbercasterwheels.Thewiresofthetwomotorsaretakentothetopofthebaseplatethroughaholeinthecenterofthebaseplate.Toextendthelayersoftherobot,wewillputbaseplatesupportstoconnectthenextlayers.Now,wecanseethenextlayerwiththemiddleplateandconnectingtubes.Therearehollowtubes,whichconnectthebaseplateandthemiddleplate.Asupportisprovidedonthebaseplateforhollowtubes.Thefollowingfigureshowsthemiddleplateandconnectingtubes:

Middleplatewithconnectingtubes

Theconnectingtubeswillconnectthebaseplateandthemiddleplate.Therearefourhollowtubesthatconnectthebaseplatetothemiddleplate.Oneendofthesetubesishollow,whichcanfitinthebaseplatesupport,andtheotherendisinsertedwithahardplasticwithanoptiontoputascrewinthehole.Themiddleplatehasnosupportexceptfourholes:

Fullyassembledrobotbody

Themiddleplatemaleconnectorhelpstoconnectthemiddleplateandthetopofthebaseplatetubes.Atthetopofthemiddleplatetubes,wecanfitthetopplate,whichhasfoursupportsontheback.Wecaninsertthetopplatefemaleconnectorintothetopplatesupportandthisishowwewillgetthefullyassembledbodyoftherobot.

ThebottomlayeroftherobotcanbeusedtoputthePrintedCircuitBoard(PCB)andbattery.Inthemiddlelayer,wecanputKinectandIntelNUC.Wecanputaspeakerandamicifneeded.Wecanusethetopplatetocarryfood.ThefollowingfigureshowsthePCBprototypeofrobot;itconsistsofTivaCLaunchPad,amotordriver,levelshifters,andprovisionstoconnecttwomotors,ultrasonic,andIMU:

ChefBotPCBprototype

Theboardispoweredwitha12Vbatteryplacedonthebaseplate.ThetwomotorscanbedirectlyconnectedtotheM1andM2maleconnectors.TheNUCPCandKinectareplacedonthemiddleplate.TheLaunchpadboardandKinectshouldbeconnectedtotheNUCPCviaUSB.ThePCandKinectarepoweredusingthesame12Vbatteryitself.Wecanusealead-acidorlithium-polymerbattery.Here,weareusingalead-acidcellfortestingpurposes.Wewillmigratetolithium-polymerforbetterperformanceandbetterbackup.ThefollowingfigureshowsthecompleteassembleddiagramofChefBot:

Fullyassembledrobotbody

Afterassemblingallthepartsoftherobot,wewillstartworkingwiththerobotsoftware.ChefBot'sembeddedcodeandROSpackagesareavailableinGitHub.Wecanclonethecodeandstartworkingwiththesoftware.

ConfiguringChefBotPCandsettingChefBotROSpackagesInChefBot,weareusingIntel'sNUCPCtohandletherobotsensordataanditsprocessing.AfterprocuringtheNUCPC,wehavetoinstallUbuntu14.04.2orthelatestupdatesof14.04LTS.AftertheinstallationofUbuntu,installcompleteROSanditspackageswementionedinthepreviouschapters.WecanconfigurethisPCseparately,andafterthecompletionofallthesettings,wecanputthisintotherobot.ThefollowingaretheprocedurestoinstallChefBotpackagesontheNUCPC.

CloneChefBot'ssoftwarepackagesfromGitHubusingthefollowingcommand:

$gitclonehttps://github.com/qboticslabs/Chefbot_ROS_pkg.git

WecanclonethecodeinourlaptopandcopythechefbotfoldertoIntel'sNUCPC.ThechefbotfolderconsistsoftheROSpackagesofChefBot.IntheNUCPC,createaROScatkinworkspace,copythechefbotfolderandmoveitinsidethesrcdirectoryofthecatkinworkspace.

BuildandinstallthesourcecodeofChefBotbysimplyusingthefollowingcommandThisshouldbeexecutedinsidethecatkinworkspacewecreated:

$catkin_make

IfalldependenciesareproperlyinstalledinNUC,thentheChefBotpackageswillbuildandinstallinthissystem.AftersettingtheChefBotpackagesontheNUCPC,wecanswitchtotheembeddedcodeforChefBot.Now,wecanconnectallthesensorsinLaunchpad.AfteruploadingthecodeinLaunchpad,wecanagaindiscussROSpackagesandhowtorunit.TheclonedcodefromGitHubcontainsTivaCLaunchPadcode,whichisgoingtobeexplainedintheupcomingsection.

InterfacingChefBotsensorswithTivaCLaunchPadWehavediscussedinterfacingofindividualsensorsthatwearegoingtouseinChefBot.Inthissection,wewilldiscusshowtointegratesensorsintotheLaunchpadboard.TheEnergiacodetoprogramTivaCLaunchPadisavailableontheclonedfilesatGitHub.TheconnectiondiagramofTivaCLaunchPadwithsensorsisasfollows.Fromthisfigure,wegettoknowhowthesensorsareinterconnectedwithLaunchpad:

SensorinterfacingdiagramofChefBot

M1andM2aretwodifferentialdrivemotorsthatweareusinginthisrobot.ThemotorswearegoingtousehereisDCGearedmotorwithanencoderfromPololu.ThemotorterminalsareconnectedtotheVNH2SP30motordriverfromPololu.Oneofthemotorsisconnectedinreversepolaritybecauseindifferentialsteering,onemotorrotatesoppositetotheother.Ifwesendthesamecontrolsignaltoboththemotors,eachmotorwillrotateintheoppositedirection.Toavoidthiscondition,wewillconnectitinoppositepolarities.ThemotordriverisconnectedtoTivaCLaunchPadthrougha3.3V-5Vbidirectionallevelshifter.Oneofthelevelshifterwewillusehereisavailableat:https://www.sparkfun.com/products/12009.

ThetwochannelsofeachencoderareconnectedtoLaunchpadviaalevelshifter.Currently,weareusingoneultrasonicdistancesensorforobstacledetection.Infuture,wecouldexpandthisnumber,ifrequired.Togetagoododometryestimate,wewillputIMUsensorMPU6050throughanI2Cinterface.ThepinsaredirectlyconnectedtoLaunchpadbecauseMPU6050is3.3Vcompatible.ToresetLaunchpadfromROSnodes,weareallocatingonepinastheoutputandconnectedtoresetpinofLaunchpad.WhenaspecificcharacterissenttoLaunchpad,itwillsettheoutputpintohighandresetthedevice.Insomesituations,theerrorfromthecalculationmayaccumulateanditcanaffectthenavigationoftherobot.WeareresettingLaunchpadtoclearthiserror.Tomonitorthebatterylevel,weareallocatinganotherpintoreadthebatteryvalue.ThisfeatureisnotcurrentlyimplementedintheEnergiacode.

ThecodeyoudownloadedfromGitHubconsistsofembeddedcode.Wecanseethemainsectionofthecodehereandthereisnoneedtoexplainallthesectionsbecausewealreadydiscussedit.

EmbeddedcodeforChefBotThemainsectionsoftheLaunchpadcodeisdiscussedhere.Thefollowingaretheheaderfilesusedinthecode:

//LibrarytocommunicatewithI2Cdevices

#include"Wire.h"

//I2CcommunicationlibraryforMPU6050

#include"I2Cdev.h"

//MPU6050interfacinglibrary

#include"MPU6050_6Axis_MotionApps20.h"

//Processingincomingserialdata

#include<Messenger.h>

//Containdefinitionofmaximumlimitsofvariousdatatype

#include<limits.h>

ThemainlibrariesusedinthiscodeareforthepurposeofcommunicatingwithMPU6050andprocesstheincomingserialdatatoLaunchpad.MPU6050canprovidetheorientationinquaternionorEulervaluesbyusingtheinbuiltDigitalMotionProcessor(DMP).ThefunctionstoaccessDMPiswritteninMPU6050_6Axis_MotionApps20.h.ThislibraryhasdependenciessuchasI2Cdev.handWire.h;that'swhyweareincludingtheseheadersaswell.ThesetwolibrariesareusedforI2Ccommunication.TheMessenger.hlibraryallowsyoutohandleastreamoftextdatafromanysourceandhelpstoextractthedatafromit.Thelimits.hheadercontainsdefinitionsofmaximumlimitsofvariousdatatypes.

Afterweincludetheheaderfiles,weneedtocreateanobjecttohandleMPU6050andprocesstheincomingserialdatausingtheMessengerclass:

//CreatingMPU6050Object

MPU6050accelgyro(0x68);

//Messengerobject

MessengerMessenger_Handler=Messenger();

Afterdeclaringthemessengerobject,themainsectionistoassignpinsforthemotordriver,encoder,ultrasonicsensor,MPU6050,reset,andbatterypins.Afterassigningthepins,wecanseethesetup()

functionofthecode.Thedefinitionofthesetup()functionisgivenhere:

//Setupserial,encoders,ultrasonic,MPU6050andResetfunctions

voidsetup()

{

//InitSerialportwith115200baudrate

Serial.begin(115200);

//SetupEncoders

SetupEncoders();

//SetupMotors

SetupMotors();

//SetupUltrasonic

SetupUltrasonic();

//SetupMPU6050

Setup_MPU6050();

//SetupResetpins

SetupReset();

//SetupMessengerobjecthandler

Messenger_Handler.attach(OnMssageCompleted);

}

Theprecedingfunctioncontainscustomroutinetoconfigureandallocatepinsforallthesensors.Thisfunctionwillinitializeserialcommunicationwith115,200baudrateandsetpinsfortheencoder,motordriver,ultrasonic,andMPU6050.TheSetupReset()functionwillassignapintoresetthedevice,asshownintheconnectiondiagram.Wehavealreadyseenthesetuproutinesofeachsensorsinthepreviouschapters,sothereisnoneedtoexplainthedefinitionofeachfunctions.TheMessengerclasshandlerisattachedtoafunctioncalledOnMssageCompleted(),whichwillbecalledwhenadataisinputtotheMessenger_Handler.

Thefollowingisthemainloop()functionofthecode.Themainpurposeofthisfunctionistoreadandprocessserialdataandsendavailablesensorvaluesaswell:

voidloop()

{

//ReadfromSerialport

Read_From_Serial();

//Sendtimeinformationthroughserialport

Update_Time();

//Sendencodersvaluesthroughserialport

Update_Encoders();

//Sendultrasonicvaluesthroughserialport

Update_Ultra_Sonic();

//UpdatemotorspeedvalueswithcorrespondingspeedreceivedfromPCandsend

speedvaluesthroughserialport

Update_Motors();

//SendMPU6050valuesthroughserialport

Update_MPU6050();

//Sendbatteryvaluesthroughserialport

Update_Battery();

}

TheRead_From_Serial()functionwillreadserialdatafromthePCandfeeddatatotheMessenger_Handlerhandlerforprocessingpurpose.TheUpdate_Time()functionwillupdatethe

timeaftereachoperationintheembeddedboard.WecantakethistimevaluetoprocessinthePCortakethePCtimeforprocessing.

WecancompilethecodeinEnergiaIDEandcanburnthecodeinLaunchpad.Afteruploadingthecode,wecandiscusstheROSnodestohandletheLaunchpadsensorvalues.

WritingaROSPythondriverforChefBotAfteruploadingtheembeddedcodetoLaunchpad,thenextstepistohandletheserialdatafromLaunchpadandconvertittoROSTopicsforfurtherprocessing.Thelaunchpad_node.pyROSPythondrivernodeinterfacesTivaCLaunchPadtoROS.Thelaunchpad_node.pyfileisonthescriptfolder,whichisinsidethechefbot_bringuppackage.Thefollowingistheexplanationoflaunchpad_node.pyinimportantcodesections:

#ROSPythonclient

importrospy

importsys

importtime

importmath

#Thispythonmodulehelpstoreceivevaluesfromserialportwhichexecuteina

thread

fromSerialDataGatewayimportSerialDataGateway

#ImportingrequiredROSdatatypesforthecode

fromstd_msgs.msgimportInt16,Int32,Int64,Float32,String,Header,UInt64

#ImportingROSdatatypeforIMU

fromsensor_msgs.msgimportImu

Thelaunchpad_node.pyfileimportstheprecedingmodules.ThemainmoduleswecanseeisSerialDataGateway.ThisisacustommodulewrittentoreceiveserialdatafromtheLaunchpadboardinathread.WealsoneedsomedatatypesofROStohandlethesensordata.Themainfunctionofthenodeisgiveninthefollowingcodesnippet:

if__name__=='__main__':

rospy.init_node('launchpad_ros',anonymous=True)

launchpad=Launchpad_Class()

try:

launchpad.Start()

rospy.spin()

exceptrospy.ROSInterruptException:

rospy.logwarn("Errorinmainfunction")

launchpad.Reset_Launchpad()

launchpad.Stop()

ThemainclassofthisnodeiscalledLaunchpad_Class().Thisclasscontainsallthemethodstostart,stop,andconvertserialdatatoROSTopics.Inthemainfunction,wewillcreateanobjectofLaunchpad_Class().Aftercreatingtheobject,wewillcalltheStart()method,whichwillstarttheserialcommunicationbetweenTivaCLaunchPadandPC.IfweinterruptthedrivernodebypressingCtrl+C,itwillresettheLaunchpadandstoptheserialcommunicationbetweenthePCandLaunchpad.

ThefollowingcodesnippetisfromtheconstructorfunctionofLaunchpad_Class().Inthefollowingsnippet,wewillretrievetheportandbaudrateoftheLaunchpadboardfromROSparametersandinitializetheSerialDateGatewayobjectusingtheseparameters.TheSerialDataGatewayobject

callsthe_HandleReceivedLine()functioninsidethisclasswhenanyincomingserialdataarrivesontheserialport.

Thisfunctionwillprocesseachlineofserialdataandextract,convert,andinsertittotheappropriateheadersofeachROSTopicdatatype:

#GetserialportandbaudrateofTivaCLaunchpad

port=rospy.get_param("~port","/dev/ttyACM0")

baudRate=int(rospy.get_param("~baudRate",115200))

#################################################################

rospy.loginfo("Startingwithserialport:"+port+",baudrate:"+

str(baudRate))

#InitializingSerialDataGatewayobjectwithserialport,baud

rateandcallbackfunctiontohandleincomingserialdata

self._SerialDataGateway=SerialDataGateway(port,baudRate,

self._HandleReceivedLine)

rospy.loginfo("Startedserialcommunication")

###################################################################Subscribersand

Publishers

#Publisherforleftandrightwheelencodervalues

self._Left_Encoder=rospy.Publisher('lwheel',Int64,queue_size=10)

self._Right_Encoder=rospy.Publisher('rwheel',Int64,queue_size=10)

#PublisherforBatterylevel(forupgradepurpose)

self._Battery_Level=rospy.Publisher('battery_level',Float32,queue_size=10)

#PublisherforUltrasonicdistancesensor

self._Ultrasonic_Value=rospy.Publisher('ultrasonic_distance',Float32,queue_size=

10)

#PublisherforIMUrotationquaternionvalues

self._qx_=rospy.Publisher('qx',Float32,queue_size=10)

self._qy_=rospy.Publisher('qy',Float32,queue_size=10)

self._qz_=rospy.Publisher('qz',Float32,queue_size=10)

self._qw_=rospy.Publisher('qw',Float32,queue_size=10)

#Publisherforentireserialdata

self._SerialPublisher=rospy.Publisher('serial',String,queue_size=10)

WewillcreatetheROSpublisherobjectforsensorssuchastheencoder,IMU,andultrasonicsensoraswellasfortheentireserialdatafordebuggingpurpose.Wewillalsosubscribethespeedcommandsfortheleft-handsideandtheright-handsidewheeloftherobot.WhenaspeedcommandarrivesonTopic,itcallstherespectivecallbackstosendspeedcommandstotherobot'sLaunchpad:

self._left_motor_speed=

rospy.Subscriber('left_wheel_speed',Float32,self._Update_Left_Speed)

self._right_motor_speed=

rospy.Subscriber('right_wheel_speed',Float32,self._Update_Right_Speed)

AftersettingtheChefBotdrivernode,weneedtointerfacetherobottoaROSnavigationstackin

ordertoperformautonomousnavigation.Thebasicrequirementfordoingautonomousnavigationisthattherobotdrivernodes,receivevelocitycommandfromROSnavigationalstack.Therobotcanbecontrolledusingteleoperation.Inadditiontothesefeatures,therobotmustbeabletocomputeitspositionalorodometrydataandgeneratethetfdataforsendingintonavigationalstack.TheremustbeaPIDcontrollertocontroltherobotmotorvelocity.ThefollowingROSpackagehelpstoperformthesefunctions.Thedifferential_drivepackagecontainsnodestoperformtheprecedingoperation.Wearereusingthesenodesinourpackagetoimplementthesefunctionalities.Thefollowingisthelinkforthedifferential_drivepackageinROS:

http://wiki.ros.org/differential_drive

Thefollowingfigureshowshowthesenodescommunicatewitheachother.Wecanalsodiscusstheuseofothernodestoo:

Thepurposeofeachnodeinthechefbot_bringuppackageisasfollows:

twist_to_motors.py:ThisnodewillconverttheROSTwistcommandorlinearandangularvelocitytoindividualmotorvelocitytarget.Thetargetvelocitiesarepublishedatarateofthe~rateHertzandthepublishtimeout_tickstimesvelocityaftertheTwistmessagestops.ThefollowingaretheTopicsandparametersthatwillbepublishedandsubscribedbythisnode:

PublishingTopics:lwheel_vtarget(std_msgs/Float32):Thisisthethetargetvelocityoftheleftwheel(m/s).rwheel_vtarget(std_msgs/Float32):Thisisthetargetvelocityoftherightwheel(m/s).

SubscribingTopics:Twist(geometry_msgs/Twist):ThisisthetargetTwistcommandfortherobot.ThelinearvelocityinthexdirectionandangularvelocitythetaoftheTwistmessagesareusedinthisrobot.

ImportantROSparameters:~base_width(float,default:0.1):Thisisthedistancebetweentherobot'stwowheelsinmeters.~rate(int,default:50):Thisistherateatwhichvelocitytargetispublished(Hertz).~timeout_ticks(int,default:2):ThisisthenumberofthevelocitytargetmessagepublishedafterstoppingtheTwistmessages.

pid_velocity.py:ThisisasimplePIDcontrollertocontrolthespeedofeachmotorsbytakingfeedbackfromwheelencoders.Inadifferentialdrivesystem,weneedonePIDcontrollerforeachwheel.Itwillreadtheencoderdatafromeachwheelsandcontrolthespeedofeachwheels.

PublishingTopics:motor_cmd(Float32):ThisisthefinaloutputofthePIDcontrollerthatgoestothemotor.WecanchangetherangeofthePIDoutputusingtheout_minandout_maxROSparameter.wheel_vel(Float32):Thisisthecurrentvelocityoftherobotwheelinm/s.

SubscribingTopics:wheel(Int16):ThisTopicistheoutputofarotaryencoder.ThereareindividualTopicsforeachencoderoftherobot.wheel_vtarget(Float32):Thisisthetargetvelocityinm/s.

Importantparameters:~Kp(float,default:10):ThisparameteristheproportionalgainofthePIDcontroller.~Ki(float,default:10):ThisparameteristheintegralgainofthePIDcontroller.~Kd(float,default:0.001):ThisparameteristhederivativegainofthePIDcontroller.~out_min(float,default:255):Thisistheminimumlimitofthevelocityvaluetomotor.Thisparameterlimitsthevelocityvaluetomotorcalledwheel_velTopic.~out_max(float,default:255):Thisisthemaximumlimitofwheel_velTopic(Hertz).~rate(float,default:20):Thisistherateofpublishingwheel_velTopic.ticks_meter(float,default:20):Thisisthenumberofwheelencodertickspermeter.Thisisaglobalparameterbecauseit'susedinothernodestoo.vel_threshold(float,default:0.001):Iftherobotvelocitydropsbelowthisparameter,weconsiderthewheelasstopped.Ifthevelocityofthewheelislessthanvel_threshold,weconsideritaszero.encoder_min(int,default:32768):Thisistheminimumvalueofencoderreading.encoder_max(int,default:32768):Thisisthemaximumvalueofencoderreading.wheel_low_wrap(int,default:0.3*(encoder_max-encoder_min)+encoder_min):Thesevaluesdecidewhethertheodometryisinnegativeorpositive

direction.wheel_high_wrap(int,default:0.7*(encoder_max-encoder_min)+encoder_min):Thesevaluesdecidewhethertheodometryisinthenegativeorpositivedirection.

diff_tf.py:Thisnodecomputesthetransformationofodometryandbroadcastbetweentheodometryframeandtherobotbaseframe.

PublishingTopics:odom(nav_msgs/odometry):Thispublishestheodometry(currentposeandtwistoftherobot.tf:Thisprovidestransformationbetweentheodometryframeandtherobotbaselink.

SubscribingTopics:lwheel(std_msgs/Int16),rwheel(std_msgs/Int16):Thesearetheoutputvaluesfromtheleftandrightencoderoftherobot.

chefbot_keyboard_teleop.py:ThisnodesendstheTwistcommandusingcontrolsfromthekeyboard.

PublishingTopics:cmd_vel_mux/input/teleop(geometry_msgs/Twist):Thispublishesthetwistmessagesusingkeyboardcommands.

Afterdiscussingnodesinthechefbot_bringuppackage,wewilllookatthefunctionsoflaunchfiles.

UnderstandingChefBotROSlaunchfilesWewilldiscussthefunctionsofeachlaunchfilesofthechefbot_bringuppackage.

robot_standalone.launch:Themainfunctionofthislaunchfileistostartnodessuchaslaunchpad_node,pid_velocity,diff_tf,andtwist_to_motortogetsensorvaluesfromtherobotandtosendcommandvelocitytotherobot.keyboard_teleop.launch:Thislaunchfilewillstarttheteleoperationbyusingthekeyboard.Thislaunchstartsthechefbot_keyboard_teleop.pynodetoperformthekeyboardteleoperation.3dsensor.launch:ThisfilewilllaunchKinectOpenNIdriversandstartpublishingRGBanddepthstream.Itwillalsostartthedepthstreamtolaserscannernode,whichwillconvertpointcloudtolaserscandata.gmapping_demo.launch:ThislaunchfilewillstartSLAMgmappingnodestomaptheareasurroundingtherobot.amcl_demo.launch:UsingAMCL,therobotcanlocalizeandpredictwhereitstandsonthemap.Afterlocalizingonthemap,wecancommandtherobottomovetoapositiononthemap,thentherobotcanmoveautonomouslyfromitscurrentpositiontothegoalposition.view_robot.launch:ThislaunchfiledisplaystherobotURDFmodelinRViz.view_navigation.launch:Thislaunchfiledisplaysallthesensorsnecessaryforthenavigationoftherobot.

WorkingwithChefBotPythonnodesandlaunchfilesWealreadysetChefBotROSpackagesinIntel'sNUCPCanduploadedtheembeddedcodetotheLaunchpadboard.ThenextstepistoputtheNUCPContherobot,configureremoteconnectionfromthelaptoptotherobot,testingeachnodes,andworkingwithChefBotLaunchfilestoperformautonomousnavigation.

ThemaindeviceweshouldhavebeforeworkingwithChefBotisagoodwirelessrouter.Therobotandtheremotelaptophavetoconnectonthesamenetwork.IftherobotPCandremotelaptopareonthesamenetwork,theusercanconnectfromtheremotelaptoptotherobotPCthroughSSHusingitsIP.BeforeputtingtherobotPCintherobot,weshouldconnecttherobotPCinthewirelessnetwork,soonceit'sconnectedtothewirelessnetwork,itwillremembertheconnectiondetails.Whentherobotpowers,thePCshouldautomaticallyconnecttothewirelessnetwork.OncetherobotPCisconnectedtothewirelessnetwork,wecanputitintheactualrobot.ThefollowingfigureshowstheconnectiondiagramoftherobotandremotePC:

WirelessconnectiondiagramoftherobotandremotePC

TheprecedingfigureassumesthattheChefBotIPis192.168.1.106andtheremotePCIPis192.168.1.101.

WecanremotelyaccesstheChefBotterminalusingSSH.WecanusethefollowingcommandtologintoChefBot,whererobotistheusernameofChefBotPC:

$sshrobot@192.168.1.106

WhenyoulogintoChefBotPC,itwillaskfortherobotPCpassword.AfterenteringthepasswordoftherobotPC,wecanaccesstherobotPCterminal.AfterloggingintotherobotPC,wecanstarttestingtheROSnodesofChefBotandtestwhetherwecanreceivetheserialvaluesfromtheLaunchpadboardinsideChefBot.NotethatyoushouldloginagaintoChefBotPCthroughSSHifyouareusinganewterminal.

IftheChefbot_bringuppackageisproperlyinstalledonthePCandiftheLaunchpadboardisconnected,thenbeforerunningtheROSdrivernode,wecanruntheminiterm.pytooltocheckwhethertheserialvaluescomeproperlytothePCviaUSB.Wecanfindtheserialdevicenameusingthedmesgcommand.Wecanrunminiterm.pyusingthefollowingcommand:

$miniterm.py/dev/ttyACM0115200

Ifitshowsthepermissiondeniedmessage,setthepermissionoftheUSBdevicebywritingrulesontheudevfolderaswedidinChapter5,WorkingwithRoboticActuatorsandWheelEncodersofthisbookorwecantemporarilychangethepermissionusingthefollowingcommand.WeareassumingttyACM0isthedevicenameofLaunchpad.IfthedevicenameisdifferentinyourPC,thenyouhavetousethatnameinsteadofttyACM0:

$sudochmod777/dev/ttyACM0

Ifeverythingworksfine,wewillgetvalueslikethoseshowninfollowingscreenshot:

Theletterbisusedtoindicatethebatteryreadingoftherobot;currently,it'snotimplemented.Thevalueissettozeronow.Thelettertindicatesthetotaltimeinmicrosecondsaftertherobotstartsrunningtheembeddedcode.Thesecondvalueistimeinseconds;it'sthetimetakentocompleteoneentireoperationinLaunchpad.Wecanusethisvalueifweareperformingreal-timecalculationsoftheparametersoftherobot.Currently,wearenotusingthisvalue;wemayusethisinthefuture.Thelettereindicatesvaluesoftheleftandrightencoderrespectively.Boththevaluesarezeroherebecausetherobotisnotmoving.Theletteruindicatesthevaluesfromtheultrasonicdistancesensor.Thedistancevaluewegetisincentimeters.Thelettersindicatesthecurrentrobotwheelspeedofthe

robot.Thisvalueisforinspectionpurpose.Actually,speedisacontroloutputfromthePCitself.

ToconverttheseserialdatatoROSTopics,wehavetorunthedrivenodecalledlaunchpad_node.py.Thefollowingcodeshowshowtoexecutethisnode.

First,wehavetorunroscorebeforestartinganynodes:

$roscore

Runlaunchpad_node.pyusingthefollowingcommand:

$rosrunchefbot_bringuplaunchpad_node.py

Ifeverythingworksfine,wewillgetthefollowingoutputinthenoderunningterminal:

Afterrunninglaunchpad_node.py,wewillseethefollowingTopicsgenerated,asgiveninthefollowingscreenshot:

Wecanviewtheserialdatareceivedbydrivernodebysubscribing/serialTopic.Wecanuseitfordebugpurposes.IftheserialTopicshowsthesamedataaswesawonminiterm.py,thenwecanconfirmthatthenodesareworkingfine.Thefollowingscreenshotistheoutputof/serialTopic:

Aftersettingthechefbot_bringuppackage,wecanstartworkingwiththeautonomousnavigationofChefBot.Currently,weareaccessingonlytheChefBotPC'sterminal.Tovisualizetherobotmodel,sensordata,maps,andsoon,wehavetouseRVizintheuser'sPC.WehavetodosomeconfigurationintherobotanduserPCtoperformthisoperation.Itshouldbenotedthattheuser'sPCshouldhavethesamesoftwaresetupasintheChefBotPC.

Thefirstthingwehavetodois,settheChefBotPCasaROSmaster.WecansettheChefBotPCastheROSmasterbysettingtheROS_MASTER_URIvalue.ROS_MASTER_URIisarequiredsetting,ItinformsthenodesabouttheUniformResourceIdentifier(URI)oftheROSmaster.WhenyousetthesameROS_MASTER_URIfortheChefBotPCandtheremotePC,wecanaccesstheTopicsoftheChefBotPCintheremotePC.So,ifwerunRVizlocally,thenitwillvisualizetheTopicsgeneratedintheChefBotPC.

AssumethattheChefBotPCIPis192.168.1.106andtheremotePCIPis192.168.1.101.TosetROS_MASTER_URIineachsystem,thefollowingcommandshouldincludethe.bashrcfileinthehomefolder.Thefollowingfigureshowsthesetupneededtoinclude.bashrcineachsystem:

Addtheselinesatthebottomof.bashrconeachPCandchangetheIPaddressaccordingtoyournetwork.

Afterweperformthesesettings,wecanjuststartroscoreontheChefBotPCterminalandexecutecommandrostopiclistontheremotePC.

IfyouseeanyTopics,youaredonewiththesettings.Wecanfirstruntherobotusingthekeyboardteleoperationtochecktherobot'sfunctioningandconfirmwhetherwegetthesensorvalues.

Wecanstarttherobotdriverandothernodesusingthefollowingcommand.NotethatthisshouldexecuteintheChefBotterminalafterlogin,usingSSH:

$roslaunchchefbot_bringuprobot_standalone.launch

Afterlaunchingtherobotdriverandnodes,startthekeyboardteleoperationusingthefollowingcommand.ThisalsohastobedoneonthenewterminaloftheChefBotPC:

$roslaunchchefbot_bringupkeyboard_teleop.launch

ToactivateKinect,executethefollowingcommand.ThiscommandisalsoexecutedontheChefBotterminal:

$roslaunchchefbot_bringup3dsensor.launch

Toviewsensordata,wecanexecutethefollowingcommand.ThiswillviewtherobotmodelinRVizandshouldbeexecutedintheremotePC.Ifwesetupthechefbot_bringuppackageintheremotePC,wecanaccessthefollowingcommandandvisualizetherobotmodelandsensordatafromChefBotPC:

$roslaunchchefbot_bringupview_robot.launch

ThefollowingscreenshotistheoutputofRViz.WecanseeLaserScanandPointCloudinthescreenshots:

ChefBotLaserScandatainRViz

TheprecedingscreenshotshowsLaserScaninRViz.WeneedtotickLaserScanTopicfromtheleft-handsidesectionofRViztoenablethelaserscandata.Thelaserscandataismarkedontheviewport.IfyouwanttowatchthePointClouddatafromKinect,clickontheAddbuttonontheleft-handsideofRVizandselectPointCloud2fromthepopupwindow.

SelectTopic/camera/depth_registeredfromthelistandyouwillseethefollowingscreenshot:

ChefBotwithPointClouddata

Afterworkingwithsensors,wecanperformSLAMtomaptheroom.ThefollowingprocedurehelpstostartSLAMonthisrobot.

WorkingwithSLAMonROStobuildthemapoftheroomToperformgmapping,wehavetoexecutethefollowingcommands:

StartingtherobotdriverintheChefBotterminal:

$roslaunchchefbot_bringuprobot_standalone.launch

Executethefollowingcommandtostartthegmappingprocess.NotethatitshouldbeexecutedontheChefBotterminal:

$roslaunchchefbot_bringupgmapping_demo.launch

Gmappingwillonlyworkiftheodometryvaluereceivedisproper.Iftheodometryvalueisreceived

fromtherobot,wewillreceivethefollowingmessagefortheprecedingcommand.Ifwegetthismessage,wecanconfirmthatgmappingwillworkfine:

Tostartthekeyboardteleoperation,usethefollowingcommand:

$roslaunchchefbot_bringupkeyboard_teleop.launch

Toviewthemapbeingcreated,weneedtostartRVizintheremotesystemusingthefollowingcommand:

$roslaunchchefbot_bringupview_navigation.launch

AfterviewingtherobotinRViz,youcanmovetherobotusingthekeyboardandseethemapbeingcreated.Whenitmapstheentirearea,wecansavethemapusingthefollowingcommandontheChefBotPCterminal:

$rosrunmap_servermap_saver-f~/test_map

wheretest_mapisthenameofthemapbeingstoredonthehomefolder.Thefollowingscreenshotshowsthemapofaroomcreatedbytherobot:

Mappingaroom

Afterthemapisstored,wecanworkwiththelocalizationandautonomousnavigationusingROS.

WorkingwithROSlocalizationandnavigationAfterbuildingthemap,closealltheapplicationsandreruntherobotdriverusingthefollowingcommand:

$roslaunchchefbot_bringuprobot_standalone.launch

Startlocalizationandnavigationonthestoredmapusingthefollowingcommand:

$roslaunchchefbot_bringupamcl_demo.launchmap_file:=~/test_map.yaml

StartviewingtherobotusingthefollowingcommandintheremotePC:

$roslaunchchefbot_bringupview_navigation.launch

InRViz,wemayneedtospecifytheinitialposeoftherobotusingthe2DPoseEstimatebutton.Wecanchangetherobotposeonthemapusingthisbutton.Iftherobotisabletolocatethemap,thenwecanusethe2DNavGoalbuttontocommandtherobottomovetothedesiredposition.Whenwestartlocalization,wecanseetheparticlecloudbytheAMCLalgorithmaroundtherobot:

Thefollowingisascreenshotoftherobotthatnavigatesautonomouslyfromthecurrentpositiontothegoalposition.Thegoalpositionismarkedasablackdot:

Theblacklinefromtherobottotheblackdotistherobot'splannedpathtoreachthegoalposition.Iftherobotisnotabletolocatethemap,wemightneedtofine-tunetheparameterfilesintheChefbot_bringupparamfolder.Formorefinetuningdetails,youcangothroughtheAMCLpackageonROS.Youcanvisitthefollowinglink:

http://wiki.ros.org/amcl?distro=indigo

Questions1. WhatisuseoftherobotROSdrivernode?2. WhatistheroleofthePIDcontrollerinnavigation?3. Howtoconverttheencoderdatatoodometrydata?4. WhatisroleofSLAMinrobotnavigation?5. WhatisroleofAMCLinrobotnavigation?

SummaryThischapterwasaboutassemblingthehardwareofChefBotandintegratingtheembeddedandROScodeintotherobottoperformautonomousnavigation.WesawtherobothardwarepartsthatweremanufacturedusingthedesignfromChapter5,WorkingwithRoboticActuatorsandWheelEncoders.WeassembledindividualsectionsoftherobotandconnectedtheprototypePCBthatwedesignedfortherobot.ThisconsistsoftheLaunchpadboard,motordriver,leftshifter,ultrasonic,andIMU.TheLaunchpadboardwasflashedwiththenewembeddedcode,whichcaninterfaceallsensorsintherobotandcansendorreceivedatafromthePC.Afterdiscussingtheembeddedcode,wewrotetheROSPythondrivernodetointerfacetheserialdatafromtheLaunchpadboard.AfterinterfacingtheLaunchpadboard,wecomputedtheodometrydataanddifferentialdrivecontrollingusingnodesfromthedifferential_drivepackagethatexistedintheROSrepository.WeinterfacedtherobottoROSnavigationstack.ThisenablestoperformSLAMandAMCLforautonomousnavigation.WealsodiscussedSLAM,AMCL,createdmap,andexecutedautonomousnavigationontherobot.

Chapter11.DesigningaGUIforaRobotUsingQtandPythonInthelastchapter,wediscussedtheintegrationofrobotichardwarecomponentsandsoftwarepackagesforperformingautonomousnavigation.Aftertheintegration,thenextstepistobuildaGUItocontroltherobot.WearebuildingaGUIthatcanactasatriggerfortheunderlyingROScommands.Insteadofrunningallthecommandsontheterminal,theusercanworkwiththeGUIbuttons.TheGUIwearegoingtodesignisforatypicalhotelroomwithninetables.Theusercansetatablepositioninthemapofthehotelroomandcommandtherobottogotoaparticulartabletodeliverfood.Afterdeliveringthefood,theusercancommandtherobottogotoitshomeposition.

SomeofthemostpopularGUIframeworkscurrentlyavailableareQt(http://qt.digia.com)andGTK+(http://www.gtk.org/),QtandGTK+areopensource,cross-platformuserinterfacetoolkitsanddevelopmentplatforms.ThesetwosoftwareframeworksarewidelyusedinLinuxdesktopenvironments,likeGNOMEandKDE.

Inthischapter,wewillbeusingPythonbindingoftheQtframeworktoimplementtheGUIbecausePythonbindingofQtismorestablethanotherUIPythonbindings.WecanseehowtodevelopaGUIfromscratchandprogramitusingPython.AfterdiscussingbasicPythonandQtprogramming,wewilldiscussROSinterfacesofQt,whicharealreadyavailableinROS.WewillfirstlookatwhatistheQtUIframeworkisandhowtoinstallitonourPC.

InstallingQtonUbuntu14.04.2LTSQtisacross-platformapplicationframeworkthatiswidelyusedtodevelopapplicationsoftwarewithaGUIinterfaceaswellascommandlinetools.Qtisavailableonalmostalloperatingsystems,likeWindows,MacOSX,Android,andsoon.ThemainprogramminglanguageusedfordevelopingQtapplicationsisC++buttherearebindingsavailableforlanguagessuchasPython,Ruby,Java,andsoon.Let'stakealookathowtoinstallQtSDKonUbuntu14.04.2.WewillinstallQtfromtheAdvancePackagingTool(APT)inUbuntu.TheAPTalreadycomeswiththeUbuntuinstallation.SoforinstallingQt/QtSDK,wecansimplyusethefollowingcommand,whichwillinstallQtSDKanditsrequireddependenciesfromtheUbuntupackagerepository.WecaninstallQtversion4usingthefollowingcommand:

$sudoapt-getinstallqt-sdk

ThiscommandwillinstalltheentireQtSDKanditslibrariesrequiredforourproject.ThepackagesavailableonUbunturepositoriesmaynotbethelatestversions.TogetthelatestversionofQt,wecandownloadtheonlineorofflineinstallerofQtforvariousOSplatformsfromthefollowinglink:

http://qt-project.org/downloads

AfterinstallingQtonoursystem,wecanseehowwecandevelopaGUIusingQtandinterfacewithPython.

WorkingwithPythonbindingsofQtLet'sseehowwecaninterfacePythonandQt.Ingeneral,therearetwomodulesavailableinPythonforconnectingtotheQtuserinterface.Thetwomostpopularframeworksare:

PyQtPySide

PyQtPyQtisoneofthepopularmostPythonbindingsforQtcross-platform.PyQtisdevelopedandmaintainedbyRiverbankComputingLimited.ItprovidesbindingforQtversion4andQtversion5,andcomeswithGPL(version2or3)alongwithacommerciallicense.PyQtisavailableforQtversion4and5,calledPyQt4andPyQt5,respectively.ThesetwomodulesarecompatiblewithPythonversions2and3.PyQtcontainsmorethan620classesthatcoveruserinterface,XML,networkcommunication,web,andsoon.

PyQtisavailableonWindows,Linux,andMacOSX.ItisaprerequisitetoinstallQtSDKandPythoninordertoinstallPyQt.ThebinariesforWindowsandMacOSXareavailableonthefollowinglink:

http://www.riverbankcomputing.com/software/pyqt/download

WecanseehowtoinstallPyQt4onUbuntu14.04.2usingPython2.7.

InstallingPyQtonUbuntu14.04.2LTS

IfyouwanttoinstallPyQtonUbuntu/Linux,usethefollowingcommand.ThiscommandwillinstallthePyQtlibrary,itsdependencies,andsomeQttools:

$sudoapt-getinstallpython-qt4pyqt4-dev-tools

PySidePySideisanopensourcesoftwareprojectthatprovidesPythonbindingfortheQtframework.ThePySideprojectwasinitiatedbyNokia,andoffersafullsetofQtbindingformultipleplatforms.ThetechniqueusedinPySidetowraptheQtlibraryisdifferentfromPyQt,buttheAPIofbothissimilar.PySideiscurrentlynotsupportedonQt5.PySideisavailableforWindows,Linux,andMacOSX.ThefollowinglinkwillguideyoutosetupPySideonWindowsandMacOSX:

http://qt-project.org/wiki/Category:LanguageBindings::PySide::Downloads

TheprerequisitesofPySidearethesameasPyQt.Let'sseehowwecaninstallPySideonUbuntu14.04.2LTS.

InstallingPySideonUbuntu14.04.2LTS

ThePySidepackageisavailableontheUbuntupackagerepository.ThefollowingcommandwillinstallthePySidemoduleandQttoolsonUbuntu:

$sudoapt-getinstallpython-pysidepyside-tools

Let'sworkwithbothmodulesandseethedifferencesbetweenboth.

WorkingwithPyQtandPySideAfterinstallingthePyQtandPySidepackages,wecanseehowtowriteaHelloWorldGUIusingPyQtandPySide.ThemaindifferencebetweenPyQtandPySideisonlyinsomecommands;mostofthestepsarethesame.Let'sseehowtomakeaQtGUIandconvertitintoPythoncode.

IntroducingQtDesignerQtDesigneristhetoolfordesigningandinsertingcontrolintoQtGUI.QtGUIisbasicallyanXMLfilethatcontainstheinformationofitscomponentsandcontrols.ThefirststeptoworkwithGUIisitsdesigning.TheQtDesignertoolprovidesvariousoptionstomakeexcellentGUIs.

StartQtDesignerbyenteringthecommanddesigner-qt4intheterminal.Thefollowingimageshowswhatyouwillbeabletoseeafterrunningthiscommand:

TheprecedingimageshowstheQtdesignerinterface.SelecttheWidgetoptionfromtheNewFormwindowandclickontheCreatebutton.Thiswillcreateanemptywidget;wecandragvariousGUIcontrolsfromtheleft-handsideofQt4designertotheemptywidget.QtwidgetsarethebasicbuildingblocksofQtGUI.

ThefollowingimageshowsaformwithaPushButtondraggedfromtheleft-handsidewindowofQtDesigner:

TheHelloWorldapplicationthatwearegoingtobuildhasaPushButton,whenweclickonthePushButton,aHelloWorldmessagewillbeprintedontheterminal.BeforebuildingtheHelloWorldapplication,weneedtounderstandwhatQtsignalsandslotsare,becausewehavetousethesefeaturesforbuildingtheHelloWorldapplication.

QtsignalsandslotsInQt,GUIeventsarehandledusingthesignalsandslotsfeatures.AsignalisemittedfromtheGUIwhenaneventoccurs.QtWidgetshavemanypredefinedsignals,anduserscanaddcustomsignalsforGUIevents.Aslotisafunctionthatiscalledinresponsetoaparticularsignal.Inthisexample,weareusingtheclicked()signalofPushButtonandcreatingacustomslotforthissignal.Wecanwriteourowncodeonthiscustomfunction.Let'sseehowwecancreateabutton,connectasignaltoaslot,andconverttheentireGUItoPython.

HerearethestepsinvolvedincreatingtheHelloWorldGUIapplication:

1. DragandcreateaPushButtonfromQtDesignertotheemptyForm.2. Assignaslotforthebuttonclickedevent,whichemitsasignalcalledclicked().3. SavethedesignedUIfileinthe.uiextension.4. ConvertUIfilestoPython.5. Writethedefinitionofthecustomslot.6. PrinttheHelloWorldmessageinsidethedefinedslot/function.

WehavealreadydraggedabuttonfromQtDesignertoanemptyForm.PresstheF4keytoinsertaslotonthebutton.WhenwepressF4,thePushButtonturnsred,andwecandragalinefromthebuttonandplacethegroundsymbol( )inthemainwindow.Thisisshowninthefollowingscreenshot:

Selecttheclicked()signalfromtheleft-handsideandclickontheEdit..buttontocreateanewcustomslot.WhenweclickontheEdit..button,anotherwindowwillpopuptocreateacustomfunction.Youcancreateacustomfunctionbyclickingonthe+symbol.

Wecreatedacustomslotcalledmessage(),asshowninthescreenshotbelow:

ClickontheOKbuttonandsavetheUIfileashello_world.ui,andquittheQtdesigner.AftersavingtheUIfile,let'sseehowwecanconvertaQtUIfileintoaPythonfile.

ConvertingaUIfileintoPythoncodeAfterdesigningtheUIfile,wecanconverttheUIfileintoitsequivalentPythoncode.Theconversionisdoneusingapyuiccompiler.WehavealreadyinstalledthistoolwhileinstallingPyQt/PySide.ThefollowingarethecommandstoconvertaQtUIfileintoaPythonfile.

WehavetousedifferentcommandsforPyQtandPySide.ThefollowingcommandistoconvertUIintoitsPyQtequivalentfile:

$pyuic4-xhello_world.ui-ohello_world.py

Thepyuic4isaUIcompilertoconvertaUIfileintoitsequivalentPythoncode.WeneedtomentiontheUIfilenameafterthe-xargumentandmentiontheoutputfilenameafterthe-oargument.

TherearenotmanychangesforthePySidecommand,insteadofpyuic4,PySideusespyside-uictoconvertUIfilesintoPythonfiles.Theremainingargumentsarethesame:

$pyside-uic-xhello_world.ui-ohello_world.py

TheprecedingcommandwillgenerateanequivalentPythoncodefortheUIfile.IfwerunthisPythoncode,theUIdesignedinQtDesignerwillpopup.Thegeneratedscriptwillnothavethedefinitionofthecustomfunctionmessage().Weshouldaddthiscustomfunctiontogeneratethecode.The

followingprocedurewillguideyouthroughaddingthecustomfunction;sowhenyouclickonthebutton,thecustomfunctionmessage()willbeexecuted.

AddingaslotdefinitiontoPyQtcodeThegeneratedPythoncodefromPyQtisgivenhere.Thecodegeneratedbypyuic4andpyside-uicarethesame,exceptinimportingmodulenames.Allotherpartsarethesame.TheexplanationofthecodegeneratedusingPyQtisalsoapplicabletoPySidecode.Thecodegeneratedfromtheaboveconversionisasfollows.ThecodestructureandparameterscanchangeaccordingtotheUIfilethatyouhavedesigned:

fromPyQt4importQtCore,QtGui

try:

_fromUtf8=QtCore.QString.fromUtf8

exceptAttributeError:

_fromUtf8=lambdas:s

classUi_Form(object):

defsetupUi(self,Form):

Form.setObjectName(_fromUtf8("Form"))

Form.resize(514,355)

self.pushButton=QtGui.QPushButton(Form)

self.pushButton.setGeometry(QtCore.QRect(150,80,191,61))

self.pushButton.setObjectName(_fromUtf8("pushButton"))

self.retranslateUi(Form)

QtCore.QObject.connect(self.pushButton,

QtCore.SIGNAL(_fromUtf8("clicked()")),Form.message)

QtCore.QMetaObject.connectSlotsByName(Form)

defretranslateUi(self,Form):

Form.setWindowTitle(QtGui.QApplication.translate("Form","Form",None,

QtGui.QApplication.UnicodeUTF8))

self.pushButton.setText(QtGui.QApplication.translate("Form","Press",None,

QtGui.QApplication.UnicodeUTF8))

if__name__=="__main__":

importsys

app=QtGui.QApplication(sys.argv)

Form=QtGui.QWidget()

ui=Ui_Form()

ui.setupUi(Form)

Form.show()

sys.exit(app.exec_())

TheprecedingcodeistheequivalentPythonscriptoftheQtUIfilethatwedesignedintheQtdesignerapplication.Hereisthestep-by-stepprocedureoftheworkingofthiscode:

1. Thecodewillstartexecutingfromif__name__=="__main__":.ThefirstthinginaPyQt

codeistocreateaQApplicationobject.AQApplicationclassmanagestheGUIapplication'scontrolflowandmainsettings.TheQApplicationclasscontainsthemaineventloop,wherealleventsfromtheWindowssystemandothersourcesareprocessedanddispatched.Italsohandlesinitializationandfinalizationofanapplication.TheQApplicationclassisinsidetheQtGuimodule.ThiscodecreatesanobjectofQApplicationcalledapp.

2. TheForm=QtGui.QWidget()linecreatesanobjectcalledFormfromtheQWidgetclassthatispresentinsidetheQtGuimodule.TheQWidgetclassisthebaseclassofalltheuserinterfaceobjectsofQt.ItcanreceivethemouseandkeyboardeventfromthemainWindowssystem.

3. Theui=Ui_Form()linecreatesanobjectcalleduifromtheUi_Form()classdefinedinthecode.TheUi_Form()objectcanaccepttheQWidgetclassthatwecreatedinthepreviouslineanditcanaddbuttons,text,buttoncontrol,andotherUIcomponentsintothisQWidgetobject.TheUi_Form()classcontainstwofunctions:setupUi()andretranslateUi().WecanpasstheQWidgetobjecttothefunctioncalledsetupUi().ThisfunctionwilladdUIcomponentsonthiswidgetobjectsuchasbuttons,assigningslotsforsignals,andsoon.TheretranslateUi()functionwilltranslatethelanguageoftheUItootherlanguagesifneeded,forexample,ifweneedtranslationfromEnglishtoSpanish,wecanmentionthecorrespondingSpanishwordinthisfunction.

4. TheForm.show()linedisplaysthefinalwindowwithbuttonsandtext.

Thenextthingistocreatetheslotfunction,whichprintstheHelloWorldmessage.TheslotdefinitioniscreatedinsidetheUi_Form()class.Thefollowingstepsinserttheslotcalledmessage()intotheUi_Form()class.

Themessage()functiondefinitionisasfollows:

defmessage(self):

print"HelloWorld"

ThisshouldbeinsertedasafunctioninsidetheUi_Form()class.Also,changethefollowinglineinthesetupUi()functioninsidetheUi_Form()class:

QtCore.QObject.connect(self.pushButton,QtCore.SIGNAL(_fromUtf8("clicked()")),

Form.message)

TheForm.messageparametershouldbereplacedwiththeself.messageparameter.TheprecedinglineconnectsthePushBbuttonsignalclicked()totheself.message()slotthatwealreadyinsertedintheUi_Form()class.

UpandrunningofHelloWorldGUIapplicationAfterreplacingtheForm.messageparameterwiththeself.messageparameter,wecanexecutethecodeandtheoutputwilllooklikethis:

WhenweclickonthePressbutton,itwillprinttheHelloworldmessage.ThisisallaboutsettingacustomGUIwithPythonandQt.

Inthenextsection,wewillseetheactualGUIthatwearedesigningfortherobot.

WorkingwithChefBot'scontrolGUIAftercompletingtheHelloWorldapplicationinPyQt,nextwecandiscussaGUIforcontrollingChefBot.ThemainuseofbuildingaGUIistocreateaneasierwaytocontroltherobot,forexample,iftherobotisdeployedinahoteltoservefood,thepersonwhocontrolsthisrobotneednothaveknowledgeaboutthecomplexcommandstostartandstopthisrobot;sobuildingaGUIforChefBotcanreducethecomplexityandmakeiteasierfortheuser.WeareplanningtobuildaGUIusingPyQt,ROSandPythoninterface.TheChefBotROSpackageisavailableonGitHubonthefollowinglink:

https://github.com/qboticslabs/Chefbot_ROS_pkg.git

Ifyouhaven'tclonedthecodeyet,youcandoitnowusingfollowingcommand:

$gitclonehttps://github.com/qboticslabs/Chefbot_ROS_pkg.git

TheGUIcodenamedrobot_gui.pyisplacedinthescriptsfolder,whichisinsidethechefbot_bringuppackage.

ThefollowingscreenshotshowstheGUIthatwehavedesignedforChefBot:

TheGUIhasthefollowingfeatures:

Itcanmonitorrobotbatterystatusandrobotstatus.Robotstatusindicatestheworkingstatusoftherobot,forexample,iftherobotencountersanerror,itwillindicatetheerroronthisGUI.Itcancommandtherobottomoveintoatablepositionfordeliveringfood.ThereisaspinboxwidgetontheGUItoinputthetableposition.Currently,weareplanningthisGUIforaninetableroom,butwemayexpanditintoanynumberaccordingtorequirement.Afterinputtingthetablenumber,wecancommandtherobottogotothattablebyclickingontheGobutton;therobot

willgetintothatposition.Ifwewanttoreturntherobottotheinitialposition,wecanclickontheHomebutton.Ifwewanttocancelthecurrentrobotmovement,clickonCanceltostoptherobot.TheworkingofthisGUIapplicationisasfollows:

WhenwehavetodeployChefBotinahotel,thefirstprocedurethatwehavetodoistocreateamapoftheroom.Aftermappingtheentireroomproperly,wehavetosavethemapontherobot'sPC.Therobotdoesthemappingonlyonce,aftermappingwecanrunthelocalizationandnavigationroutines,andcommandtherobottogetintoapositiononthemap.TheChefBotROSpackagecomeswithamapandsimulationmodelofahotel-likeenvironment.WecanrunthissimulationandlocalizationnowfortestingtheGUIandinthenextchapter,wecandiscusshowtocontrolthehardwareusingtheGUI.IfyouinstallChefBotROSpackagesonyourlocalsystem,wecansimulateahotelenvironmentandtesttheGUI.

StarttheChefBotsimulationinahotel-likearrangementusingthefollowingcommand:

$roslaunchchefbot_gazebochefbot_hotel_world.launch

AfterstartingtheChefBotsimulation,wecanrunthelocalizationandnavigationroutinesusinganalreadybuiltmap.Themapisplacedonthechefbot_bringuppackage.Wecanseeamapfolderinsidethispackage.Here,wewillusethismapforperformingthistest.Wecanloadthelocalizationandnavigationroutineusingthefollowingcommand:

$roslaunchchefbot_gazeboamcl_demo.launch

map_file:=/home/lentin/catkin_ws/src/chefbot/chefbot_bringup/map/hotel1.yaml

Thepathofthemapfilecanchangeinadifferentsystem,sousethepathinyoursysteminsteadofthispath.

Ifthepathmentionediscorrect,itwillstartrunningtheROSnavigationstack.Ifwewanttoseetherobotpositiononthemapormanuallysettheinitialpositionofrobot,wecanuseRVizusingthefollowingcommand:

$roslaunchchefbot_bringupview_navigation.launch

InRViz,wecancommandtherobottogotoanymapcoordinatesusingthe2DNavGoalbutton.

Wecancommandtherobottogotoanymapcoordinatesusingprogrammingtoo.TheROSnavigationstackisworkingusingtheROSactionliblibrary.TheROSactionliblibraryisforperformingpreemptabletasks,itissimilartoROSServices.AnadvantageoverROSservicesisthatwecancanceltherequestifwedon'twantitatthattime.

IntheGUI,wecancommandtherobottogotoamapcoordinateusingPythonactionliblibrary.Wecangetthetablepositiononthemapusingthefollowingtechnique.

AfterstartingthesimulatorandAMCLnodes,launchthekeyboardteleoperationandmovetherobotneareachtable.Usethefollowingcommandtogetthetranslationandrotationoftherobot:

$rosruntftf_echo/map/base_link

WhenweclickontheGobutton,thatpositionisfedtothenavigationstackandtherobotplansitspathandreachesitsgoal.Wecanevencancelthetaskatanytime.SotheChefBotGUIactsasanactionlibclient,whichsendsmapcoordinatestotheactionlibserver,thatis,thenavigationstack.

WecanruntherobotGUInowtocontroltherobotusingthefollowingcommand:

$rosrunchefbot_bringuprobot_gui.py

WecanselectatablenumberandclickontheGobuttonformovingrobottoeachtable.

Assumingthatyouclonedthefilesandgottherobot_gui.pyfile,wecandiscussthemainslotsweaddedintotheUi_Form()classfortheactionlibclientandtogetvaluesofbatterylevelandrobotstatus.

WeneedtoimportthefollowingPythonmodulesforthisGUIapplication:

importrospy

importactionlib

frommove_base_msgs.msgimport*

importtime

fromPyQt4importQtCore,QtGui

TheadditionalmoduleswerequireareROSPythonclientrospy,andtheactionlibmoduletosendvaluestothenavigationstack.Themove_base_msgsmodulecontainsthemessagedefinitionofthegoalthatneedstobesenttothenavigationstack.

TherobotpositionneareachtableismentionedinaPythondictionary.Thefollowingcodeshowshardcodevaluesoftherobot'spositionneareachtable:

table_position=dict()

table_position[0]=(-0.465,0.37,0.010,0,0,0.998,0.069)

table_position[1]=(0.599,1.03,0.010,0,0,1.00,-0.020)

table_position[2]=(4.415,0.645,0.010,0,0,-0.034,0.999)

table_position[3]=(7.409,0.812,0.010,0,0,-0.119,0.993)

table_position[4]=(1.757,4.377,0.010,0,0,-0.040,0.999)

table_position[5]=(1.757,4.377,0.010,0,0,-0.040,0.999)

table_position[6]=(1.757,4.377,0.010,0,0,-0.040,0.999)

table_position[7]=(1.757,4.377,0.010,0,0,-0.040,0.999)

table_position[8]=(1.757,4.377,0.010,0,0,-0.040,0.999)

table_position[9]=(1.757,4.377,0.010,0,0,-0.040,0.999)

Wecanaccessthepositionoftherobotneareachtablebyaccessingthisdictionary.

Currently,wehaveinsertedonlyfourvaluesforademonstrationpurpose.Youcanaddmorevaluesbyfindingthepositionofothertables.

Weareassigningsomevariablestohandlethetablenumber,thepositionofrobotandtheactionlibclientinsidetheUi_Form()class.

#Handletablenumberfromspinbox

self.table_no=0

#Storescurrenttablerobotposition

self.current_table_position=0

#CreatingActionlibclient

self.client=actionlib.SimpleActionClient('move_base',MoveBaseAction)

#Creatinggoalmessagedefinition

self.goal=MoveBaseGoal()

#Startthisfunctionforupdatingbatteryandrobotstatus

self.update_values()

Thefollowingcodeshowsthesignalsandslotsassignmentinthiscodeforbuttonsandspinboxwidgets:

#Handlespinboxsignalandassigntoslotset_table_number()

QtCore.QObject.connect(self.spinBox,QtCore.SIGNAL(_fromUtf8("valueChanged(int)")),

self.set_table_number)

#HandleHomebuttonsignalandassigntoslotHome()

QtCore.QObject.connect(self.pushButton_3,QtCore.SIGNAL(_fromUtf8("clicked()")),

self.Home)

#HandleGobuttonsignalandassigntoslotGo()

QtCore.QObject.connect(self.pushButton,QtCore.SIGNAL(_fromUtf8("clicked()")),

self.Go)

#HandleCancelbuttonsignalandassigntoslotCancel()

QtCore.QObject.connect(self.pushButton_2,QtCore.SIGNAL(_fromUtf8("clicked()")),

self.Cancel)

ThefollowingslothandlesthespinboxvaluefromtheUIandassignsatablenumber.Also,itconvertsthetablenumbertothecorrespondingrobotposition:

defset_table_number(self):

self.table_no=self.spinBox.value()

self.current_table_position=table_position[self.table_no]

HereisthedefinitionoftheGoslotfortheGobutton.Thisfunctionwillinsertintotherobotpositionoftheselectedtableinagoalmessageheaderandsendittothenavigationstack:

defGo(self):

#Assigningx,y,zposeandorientationtotarget_posemessage

self.goal.target_pose.pose.position.x=float(self.current_table_position[0])

self.goal.target_pose.pose.position.y=float(self.current_table_position[1])

self.goal.target_pose.pose.position.z=float(self.current_table_position[2])

self.goal.target_pose.pose.orientation.x=

float(self.current_table_position[3])

self.goal.target_pose.pose.orientation.y=float(self.current_table_position[4])

self.goal.target_pose.pose.orientation.z=float(self.current_table_position[5])

#Frameid

self.goal.target_pose.header.frame_id='map'

#Timestamp

self.goal.target_pose.header.stamp=rospy.Time.now()

#Sendinggoaltonavigationstack

self.client.send_goal(self.goal)

ThefollowingcodeistheCancel()slotdefinition.Thiswillcancelalltherobotpathsthatitwasplanningtoperformatthattime.

defCancel(self):

self.client.cancel_all_goals()

ThefollowingcodeisthedefinitionofHome().Thiswillsetthetablepositiontozero,andcalltheGo()function.Thetableatpositionzeroisthehomepositionoftherobot:

defHome(self):

self.current_table_position=table_position[0]

self.Go()

Thefollowingdefinitionsarefortheupdate_values()andadd()functions.Theupdate_values()methodwillstartupdatingthebatterylevelandrobotstatusinathread.Theadd()functionwillretrievetheROSparametersofthebatterystatusandrobotstatus,andsetthemtotheprogressbarandlabel,respectively:

defupdate_values(self):

self.thread=WorkThread()

QtCore.QObject.connect(self.thread,QtCore.SIGNAL("update(QString)"),

self.add)

self.thread.start()

defadd(self,text):

battery_value=rospy.get_param("battery_value")

robot_status=rospy.get_param("robot_status")

self.progressBar.setProperty("value",battery_value)

self.label_4.setText(_fromUtf8(robot_status))

TheWorkThread()classusedintheprecedingfunctionisgivenhere.TheWorkThread()classisinheritedfromQThreadprovidedbyQtforthreading.Thethreadsimplyemitsthesignalupdate(Qstring)withaparticulardelay.Intheprecedingfunctionupdate_values(),theupdate(QString)signalisconnectedtotheself.add()slot;sowhenasignalupdate(QString)isemittedfromthread,itwillcalltheadd()slotandupdatethebatteryandstatusvalue:

classWorkThread(QtCore.QThread):

def__init__(self):

QtCore.QThread.__init__(self)

def__del__(self):

self.wait()

defrun(self):

whileTrue:

time.sleep(0.3)#artificialtimedelay

self.emit(QtCore.SIGNAL('update(QString)'),"")

return

WehavediscussedhowtomakeaGUIforChefBot,butthisGUIisonlyfortheuserwhocontrolsChefBot.Ifsomeonewantstodebugandinspecttherobotdata,wemayhavetogoforothertools.ROSprovidesanexcellentdebuggingtooltovisualizedatafromtherobot.

TherqttoolisoneofthemostpopularROStools,whichisbasedonaQt-basedframeworkforGUIdevelopmentforROS.Let'sdiscusstherqttool,installationprocedure,andhowwecaninspectthesensordatafromtherobot.

InstallingandworkingwithrqtinUbuntu14.04.2LTSrqtisasoftwareframeworkinROS,whichimplementsvariousGUItoolsintheformofplugins.Wecanaddpluginsasdockablewindowsinrqt.

InstallingrqtinUbuntu14.04.2canbedoneusingthefollowingcommand.Beforeinstalling,ensurethatyouhavethefullinstallationofROSIndigo.

$sudoapt-getinstallros-indigo-rqt

Afterinstallingtherqtpackages,wecanaccesstheGUIimplementationofrqtcalledrqt_gui,inwhichwecandockrqtpluginsinasinglewindow.

Let'sstartusingrqt_gui.

Runtheroscorecommandbeforerunningrqt_gui:

$roscore

Runthefollowingcommandtostartrqt_gui:

$rosrunrqt_guirqt_gui

Wewillgetthefollowingwindowifthecommandsworkfine:

Wecanloadandunloadpluginsatruntime.ToanalyzetheROSmessagelog,wecanloadtheConsolepluginfromPlugins|Logging|Console.Inthefollowingexample,weloadtheConsolepluginandrunatalkernodeinsiderospy_tutorials,whichwillsendaHelloWorldmessagetoaTopiccalled/chatter.

Runthefollowingcommandtostartthenodetalker.py:

$rosrunrospy_tutorialstalker.py

Inthefollowingscreenshot,rqt_guiisloadedwithtwopluginsnamedConsoleandTopicMonitor.TheTopicMonitorplugincanbeloadedfromPlugins|Topics|TopicMonitor.TheConsolepluginmonitorsthemessagesprintingoneachnodesandtheirseverity.Itisveryusefulfordebuggingpurposes.Inthefollowingfigure,theleftsectionofrqt_guiisloadedwiththeConsolepluginandtherightsideisloadedwithTopicMonitor.TopicMonitorwilllistthetopicsavailableandwillmonitortheirvalues.

Inthefollowingfigure,theConsolepluginmonitorsthetalker.pynode'smessagesandtheirseveritylevelwhereasTopicMonitormonitorsthevalueinsidethe/chatterTopic.

Wecanalsovisualizedatasuchasimagesandplotgraphsonrqt_gui.Forrobotnavigationanditsinspection,therearepluginsforembeddingRVizinrqt_gui.TheNavigationviewerpluginviewsthefrom/mapTopic.ThevisualizationpluginsareavailableinPlugin|Visualization.

Questions1. WhatarethepopularUItoolkitsavailableontheLinuxplatform?2. WhatarethedifferencesbetweenPyQtandPySideQtbindings?3. HowdoyouconvertaQtUIfileintoPythonscript?4. WhatareQtsignalsandslots?5. Whatisrqtandwhatareitsmainapplications?

SummaryInthischapter,wediscussedcreatingaGUIforChefBotthatcanbeusedbyanordinaryuserwhodoesn'thaveanyideaabouttheinternalworkingofarobot.WeusedPythonbindingofQtcalledPyQttocreatethisGUI.BeforewegotothemainGUIdesign,wesawaHelloWorldapplicationtogetaneasierunderstandingofPyQt.TheUIdesignwasdoneusingtheQtDesignertoolandtheUIfilewasconvertedintoitsequivalentPythonscriptusingPythonUIcompiler.AfterdesigningthemainGUIinQtDesigner,weconvertedtheUIfileintoPythonscriptandinsertedthenecessaryslotsinthegeneratedscript.TheChefBotGUIcanstarttherobot,selectatablenumber,andcommandtherobottogetintothatposition.ThepositionofeachtableisacquiredfromthegeneratedmapwehardcodedthepositionsinthisPythonscriptfortesting.Whenatableisselected,wesetagoalpositiononthemap,andwhenweclickontheGobutton,therobotwillmoveintothegoalposition.Theusercancanceltheoperationatanytimeandcommandtherobottocometothehomeposition.TheGUIcanalsoreceivethereal-timestatusoftherobotanditsbatterystatus.AfterdiscussingtherobotGUI,wesawthedebuggingGUItoolinROScalledrqt.Wesawsomepluginsusedfordebuggingthedatafromtherobot.Inthenextchapter,wewillseethecompletetestingandcalibrationoftherobot.

Chapter12.TheCalibrationandTestingofChefBotInthischapter,wewilldiscussthecalibrationandtestingofChefBotthatisnecessarybeforedeployingtherobotintheworkplace.ThetestingcanbedoneusingtheGUIthatwebuiltinthepreviouschapter.Beforethetestrun,wecancalibratethesensorsandaddresstheissuesintheChefBothardwareandsoftware.Inthetestingprocedure,wecanbuildamapofahotelkindofarrangementandnavigateonthemapusingROSonChefBot.WecanalsoseewaystoimproveaccuracyandupgradetheChefBotprototypeinfuture.

First,wewilllookatthecalibrationofsensorssuchasKinect,Quadratureencoder,andIMUtoimprovetheaccuracyoftherobot.

TheCalibrationofXboxKinectusingROSKinectcalibrationisrequiredtoimprovetheaccuracyoftheKinectdata.Inthisrobot,Kinectisusedinsteadofalaserscanner.WecangeneratedataequivalenttothatprovidedbylaserscannerbyconvertingPointClouddata,usingadepthimagetolaserscannerconverterpackageinROS.Thisconverteddatamaynotbeaspreciseasanactuallaserscanner,soineffect,theerrorfromtheconvertedlaserscannercanaffectrobotmapping,navigation,andlocalization.Toreducetheerrorstosomeextent,wecandoacalibrationpriortoourapplication.Kinectcanevenworkonfactorysettingswithoutbeingcalibrated,eachdevicehasitsowncameraparametersandthesecanchangefromdevicetodevice.Someofthecameraparametersarefocallength,formatsizeprinciplepoint,andlensdistortion.Whenweperformcameracalibration,weareabletoadjustthesevalues.

OneofthecalibrationsusedinKinectisintrinsiccalibration.Someoftheintrinsicparametersarefocallengthanddistortionmodel.Usingintrinsiccalibration,wecancorrectthesevaluesofIR(depth)andRGBcameraintrinsicparameters.

Let'sseehowtoperformKinectintrinsiccalibrationusingROSandPython.

CalibratingtheKinectRGBcameraBeforecalibratingKinectusingROS,ensurethattheOpenNIdriverpackagesandcameracalibrationpackagesofROSareinstalled.Iftheyarenotinstalled,wecaninstallthemusingthefollowingcommand:

$sudoapt-getinstallros-indigo-openni-launchros-indigo-camera-calibration

Beforethecalibration,printan8x6checkerboardof0.108meterinlength.Wewillgetastandard8x6checkerboardfilefromthefollowinglink:

http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration

FollowtheproceduretocalibratetheRGBcamerainKinect:

1. StarttheOpenNIdriverusingthefollowingcommand.ThiswillstartKinectRGBanddepthstreamimages:

$roslaunchopenni_launchopenni.launch

2. Afterlaunchingdrivers,runthecalibratorcodeavailableonthecamera_calibrationpackage.Thecameracalibrator.pyfileisthenodethatperformscameracalibration.WehavetospecifytheRGBrawimagetopic,cameratopic,sizeofthecheckerboardandsizeofthesquarethatweareusing.Simplyrunthecalibratornodebyusingfollowingcommand:

$rosruncamera_calibrationcameracalibrator.pyimage:=/camera/rgb/image_raw

camera:=/camera/rgb--size8x6--square0.108

3. Theabovecommandwillopenthefollowingwindow:

4. AssumingthatyouhaveaprintedcheckerboardandyouholditinyourhandandshowitontheKinectRGBcamera,youcanseepatternsgettingdetected,asinthepreceedingfigure.Ifitisdetectedproperly,thenmovethecheckerboardtotheleft,right,top,andbottomofthecamera

view,asshowninthefollowingfigure.Therearefourbarsontheright;theXandYbarindicatetheamountofdatacollectedinthexandydirectionandtheSizeandSkewbarsindicatethesamplesofimages,thatare,towards/awayfromthecameraandtiltedup/downrespectively.

5. Ateachstep,holdthecheckerboardstilluntiltheimagegetshighlightedbythedetectionpatterninthecalibrationwindow.Thenecessarycheckerboardpositionisshownasfollows:

6. WhenwemovethecheckerboardaroundtheRGBcamera,thesizeofthebarsincreaseandwhenthecalibrationprogramgetsenoughsamplesforcalibration,theCALIBRATEbuttonwillbecomeactive.

7. WeclickontheCALIBRATEbuttontostartcalibration.Thecalibrationprocesscantakeaboutaminute.Thecalibrationwindowmaybenon-responsiveforsometime,butitwillbereadyeventually.

Afterthecalibrationprocessiscomplete,wecanseethecalibrationresultsintheterminalandthecorrectedimagewillbeshowninthecalibrationwindow.

Asuccessfulcalibrationwillresultinarectifiedimageandafailedcalibrationusuallyresultsinablankorunrecognizableimage.

Aftercalibration,wecanusetheslideronthetopofthecalibrationwindowtoadjustthesizeoftherectifiedimage.Thescalevaluewillshowaszerotherectifiedimage,andsomepixelsintheoriginalimagewillbediscarded.Ascaleof1.0meanswecanseetheoriginalimageandtherectifiedimagehasblackborderswheretherearenoinputpixelsintheoriginalimage.

Ifyouaresatisfiedwiththecalibration,clickontheCOMMIT buttontosendthecalibrationparameterstothecameraforpermanentstorage.TheGUIexitsandyoushouldseewritingcalibrationdatato...intheconsole.

CalibratingtheKinectIRcameraKinectcandetectthedepthoftheenvironmentusinganIRcameraandanIRspeckleprojector,whichcanperformthesamefunctionasastereocamera.WecancalibratethedepthimagethatwegotfromKinectusingthecheckerboardthatweusedfortheRGBcameracalibration.

Thedifficultyincalibratingadepthimageisthatthespecklepatternonthedepthimagecanblocktheaccuratedetectionofthecornersofthecheckerboard.OnepossiblesolutionistocovertheIRprojectorandilluminateitwithanotherIRsourcesuchassunlight,incandescentlamp,andsoon.ThefirstfigureshowsthecheckerboardwiththespecklepatternandthesecondfigureshowsthedepthimageilluminatedbyanincandescentlampandcoveringthespeckleIRprojector.

ThePythonscriptusedfortheRGBcameracanbeusedfordepthcalibration.ThefollowingcommandisusedtocalibratetheIRcamera.Runthecalibratornodeusingthedepthimagetopic;weareusingthe8x6checkerboardwithasizeof0.108meter,asshowninthefollowingexample:

$rosruncamera_calibrationcameracalibrator.pyimage:=/camera/ir/image_raw

camera:=/camera/ir--size8x6--square0.108

TheROSdriverforKinectcannotstreambothIRandRGBimages.Itwilldecidewhichofthetwotostream,basedontheamountofsubscribers.ItisbesttonotrunanyROSnodesduringthecalibrationofthedepthimage,whichsubscribeRGBframes.

RepeatthesamemovementsoftheRGBcameracalibrationindepthcameratoo.Aftercalibration,wecanpresstheCOMMIT buttontosavethecalibrationvaluestoafile.WhenwepresstheCOMMITbutton,thevalueswillbesenttotheopenni_cameradriverpackageinaformofROSservicecall.

Whenopenni_camerareceivesthecameraparameters,itwillstorethemtoafilewiththehelpofanROSpackagecalledcamera_info_manager.Thecamera_info_managerpackagecanhandletheseparametersandstoretheminsomelocation.Thedefaultlocationofintrinsicparametersis$HOME/.ros/camera_info/NAME.yamlandthenameoffilecontainsthecameranameanddeviceserialnumber.Thisfilecanbemovedtoanypubliclocationwewant.ThenameofthefilesofRGBanddepthcalibrationwilllooklikergb_A00362903124106A.yamlanddepth_A00362903124106A.yaml.

ThecontentoftheRGBcameracalibrationfileisgivenasfollows:

image_width:640

image_height:480

camera_name:rgb_A00362903124106A

camera_matrix:

rows:3

cols:3

data:[543.275251827696,0,286.5024846235134,0,544.9622371717294,

270.5536535568697,0,0,1]

distortion_model:plumb_bob

distortion_coefficients:

rows:1

cols:5

data:[0.1236660642773772,-0.2974236496563437,0.008147821573873778,

-0.03185623828978901,0]

rectification_matrix:

rows:3

cols:3

data:[1,0,0,0,1,0,0,0,1]

projection_matrix:

rows:3

cols:4

data:[531.7443237304688,0,263.0477918357592,0,0,559.802490234375,

274.1133349321171,0,0,0,1,0]

Ifthefilesareplacedinthedefaultlocation,theOpenNIdrivercanautomaticallytakethecalibrationfilesfromthislocation.Ifwewanttosavetheminsomeotherlocation,wehavetousethelaunchfilesectiongiveninthefollowingcodeandmentionthepathofthecameracalibrationfilesasargumentsofopenni.launch:

<launch>

<!--Includeofficiallaunchfileandspecifycamera_infourls-->

<includefile="$(findopenni_launch)/launch/openni.launch">

<!--provideargumentstothatlaunchfile-->

<argname="rgb_camera_info_url"

value="file:///public/path/rgb_A00362903124106A.yaml"/>

<argname="depth_camera_info_url"

value="file:///public/path/depth_A00362903124106A.yaml"/>

</include>

</launch>

WheelodometrycalibrationCalibrationisrequiredinodometrytoreducenavigationalerrors.ThemainparameterneededtocalibratethisisthemeasureofDistanceperencoderticksofthewheels.Itisthedistancetraversedbytherobotwheelafterduringeachencodertick.

Thewheelbaseisthedistancebetweenthetwodifferentialdrivewheels.Distanceperencoderticksisthedistancetraversedbythewheeloneachencodercount.Wecancalibratetherobotbymonitoringencodercountsofeachwheelbydrivingforafixeddistance.Theaverageofthesecountsisdividedbythetotaldistancetraveledtogetastartingvaluefortheencoderclick,whichhappenspermillimeter.Theencodermanufacturermaymentionanencodercountinonerevolution,butinapracticalscenario,therewillbechangesinit.

Tocalibratetherobot,drivetherobotforafixeddistanceandnotedowntheencodercountsintheleftandrightmotor.Thefollowingequationcangiveanaveragecountpermillimeter:

Countspermillimeter=(leftcounts+rightcounts)/2)/totalmillimetertraveled

ErroranalysisofwheelodometryAnerrorfromthewheelodometrycanresultinaccumulationoferrorsinthepositionoftherobot.Theodometryvaluecanchangewhenthewheelslipsonthegroundormovesonanuneventerrain.Theodometryerrorgeneratedwhiletherobotrotatescancausesevereerrorsintherobot'sfinalposition.Forexample,ina10metertripofrobot,ifbothwheelsslipby1centimeter,itcancause0.1percenterrorsinthetotaldistanceandtherobotwillarrive1cmshortofitsdestination.

However,iftheslipbetweentwowheelsis1centimeter,itcancausemoreerrorsthanthefirstcasethatwediscussed.ThiscanresultinalargeerrorinbothXandYcoordinates.

Assumethattherobotwheelbaseis10centimeterandaslipof1centimeterbetweentwowheelscanresultin0.1radianerror,whichisabout5.72degrees.Givenhereistheequationtofindtheheadingerror:

headingerror=(left-right)/Wheelbase

=(0.01/0.1)

=0.1radians*(180/PI)=~5.72degrees

Wecanfindthefinalpositionoftherobotafter10meterswithaheadingerrorof0.1radian,asshownhere:

X'=10*sin(5.72)=~1meter

Y'=10*cos(5.72)=9.9meter

Fromthesecalculations,weknowthataheadingerrorof0.1radiancausesashiftof1meterinthexdirectionfromthedestinationposition.Theillustrationofthiserrorisgivenasfollows:

Fromthisanalysis,weunderstoodthatasmallerrorinθproduceslargeerrorsinXandY.Themainerroraffectstheorientationoftherobotratherthanthedistancetraveled.Therearesomemethodstoreducethiserror.Thesearementionedinthefollowingsection.

ErrorcorrectionFromtheaboveanalysis,itcanbeseenthatthemostimportanterrorintherobot'spositioncalculationistheerrorinheading,theθcalculation.Someofthemethodstoreduceθerrorsareasfollows:

Digitalcompass:Wecandeployadigitalcompassintherobottogettheheadingoftherobotandtherebyreducetherobotheadingerror.Digitalcompasscanbeusedalonebutitmayencounterproblemssuchasifthereisanylocalmagneticanomaly,itcanmakeabignoiseinthereading.Also,thecompassmustbeperfectlyinclinedtotherobot'ssurface;ifthesurfaceisuneven,therewillbeerrorsinthecompassreadings.Digitalgyroscope:Thedigitalgyroscopeprovidestherateofchangeoftheangleorangularvelocity.Ifweknowtheangularvelocity,wecanfindtheanglebyintegratingthevaluesoveraperiodoftime.Wecanfindtheangularvelocityoftherobotusinggyro;butthegyrovaluecanmakeerrorstoo.Ifarobothastocoveragreatdistance,theerrorcomputingfromgyrowillincrease,sogyrocanonlybeusediftherobotcoversashortdistance.Iftherobotcoversagreatdistance,wecanusethecombinationofagyroscopeandacompass.Gyro-correctedcompass:Inthismethod,weincorporatethegyroandcompassintoasingleunit,sothatonesensorcancorrecttheother.CombiningthesesensorvaluesusingaKalmanfiltercangivebetterheadingvaluesfortherobot.

IntheChefBotprototype,weareusingGyroalone.Infutureupgrades,wewillreplacegyrowiththe

combinationofgyroandcompass.

WeareusinganIMUcalledMPU-6050byInvensetogettheheadingoftherobot.ThefollowingsectionexplainsasimplecalibrationmethodtoreducetheoffsetofMPU6050.Herearetheprocedurestocalibratethesensor.

CalibratingtheMPU6050MPU6050calibrationcanbedoneusingtheEnergiacode,whichisusedtodisplaytherawvaluesofthesensormentionedinChapter6,WorkingwithRoboticSensors.ThisexampleisalreadyavailableinEnergiaexamples.YouwillgetthiscodebynavigatingtoFile/Examples/MPU6050/Examples/MPU6050_raw.LoadthissketchintoEnergiaandfollowtheproceduregivenhere:

1. PlacetheMPU6050breakoutboardonaflatsurface.Wecanuseaninclinometertochecktheinclinationofthesurface.

2. Modifythecurrentprogrambysettingtheoffsettozero.Wecansettheoffsetofthreeaxesvaluesofgyroscopeto0usingthefollowingfunction:

("setXGyroOffset,setYGyroOffset,setZGyroOffset"=0)

3. UploadtherawcodetoLaunchpadandtaketheEnergiaserialmonitortoconfirmwhethertheserialdataiscomingfromtheLaunchpad.Leavethebreakoutfor5to10minutestoallowthetemperaturetostabilizeandreadthegyrovaluesandnotedownthevalues.

4. SettheoffsetvaluestothereadingsnotedanduploadthecodeagaintotheLaunchpad.5. Repeatthisprocedureuntilwegetareadingof0fromeachgyroaxis.6. Afterachievingthegoal,wefinallygettheoffsetsthatcanbeusedforfuturepurposes.

ThesearethenecessaryprocedurestocalibrateMPU6050.Aftersensorcalibration,wecantesttherobothardwareusingtheGUI.

TestingoftherobotusingGUIWehavealreadydiscussedhowtobuildamapoftheenvironmentusingtherobotsimulationandrobothardware.Inthissection,wediscusshowtocommandtherobottogointoaparticularplaceofthemap.Abetterwaytofindthepositionoftherobotineachtableistomanuallydrivetherobotusingteleoperation.

AssumingthatChefBotpackagesareconfiguredinboththerobot'sPCandtheuser'sPC,thereshouldbeWi-FinetworkstowhichboththerobotanduserPCscanconnectandcommunicateusingtheIPassignedtoeachPC.ItshouldbenotedthatwehavetosetROS_MASTER_URIandROS_IP,asmentionedinChapter10,IntegrationofChefBotHardwareandInterfacingitintoROS,UsingPython.

Thefollowingprocedurecanbeusedtotesttherobotsthatareworkinginahotelenvironment:

1. RemotelogintotherobotPCfromtheuserPCusingthesshcommand.Thecommandisgivenasfollows:

$ssh<robot_pc_ip_address>

2. Iftheroomisnotmappedyet,wecanmapitusingthefollowingcommandsintherobotterminal.Starttherobotsensorsandtheodometryhandlingnodesusingthefollowingcommand:

$roslaunchchefbot_bringuprobot_standalone.launch

3. Afterstartingthenodes,wecanstartthegmappingnodesusingthefollowingcommand:

$roslaunchchefbot_bringupgmapping_demo.launch

4. Afterstartinggmapping,wecanstartthekeyboardteleoperationnodestomovetherobotusingthekeyboard:

$roslaunchchefbot_bringupkeyboard_telop.launch

5. Afterlaunchingtheteleoperation,runRVizintheusersystemtoviewthemapgenerated:

$roslaunchchefbot_bringupview_navigation.launch

6. Atypicalmapisgivenintheprecedingfigure.Itcanvaryaccordingtotheenvironment.Aftergeneratingthemap,wehavetorunthefollowingcommandtosavethegeneratedmapinthehomefolder:

$rosrunmap_servermap_saver-f~/<name_of_the_map>

7. Aftersavingthemap,wecanstarttheAMCLnodeforautonomousnavigation:

$roslaunchchefbot_bringupamcl_demo.launchmap_file:=~/<map_name.yaml>

8. TherobotonthemapafterstartingAMCLisshowninthefigure.AfterrunningAMCL,startthekeyboardteleoperationandmovetoeachtablereferringthemap.

9. Checkwhethertherobot'spositionisthesameinmapandintheactualenvironment.Ifthereisahugedifference,thenweneedtoremaptheroom.Ifthereislessdifference,wecanretrieveandviewrobot'spositionneareachtablewithrespecttothemap,usingthefollowingcommand:

$rosruntftf_echo/map/base_link

Wewillgetthetranslationandrotationvalueoftherobotineachposition,asshowninthefollowingscreenshot:

NotethecorrespondingpositionoftherobotneareachtableandfeedittotheGUIcode.TheeditingGUIcodemustbeontheuserPC.AfterinsertingthepositionoftherobotineachtableontheGUIcode,runtheGUInodeusingthefollowingcommandontheusersystem:

$rosrunchefbot_bringuprobot_gui.py

ThefollowingGUIwillpopupandwecancontroltherobotusingthisGUI.

WecancommandtherobottogointoaparticulartablebygivingthetablenumberontheGUIandpressingtheGobutton.WhenwepresstheGobutton,thecorrespondinggoalpositionissenttothenavigationstack.AftertestingtheGUI,wecandeploytherobotonthecurrentenvironment.

Wecanseetheadvantagesanddisadvantagesofthisnavigationmethod.ThenavigationmethodmainlydependsontheROSframeworkandprogrammingusingPython.

ProsandconsoftheROSnavigationThemainhighlightoftheROSnavigationisthatthecodeisopenandreusable.Also,itissimpletounderstand,evenifthehandlingtechnologyiscomplex.Peoplewithminimalcomputerknowledgecanprogramanautonomousrobot.

Theconsofthismethodare:thisisnotyetstableandisstillinthetestingstage,wecan'texpecthighaccuracyfromthismethod,andthecodemaynotbeofindustrialstandards.

Questions1. WhatisthemainuseoftheintrinsiccalibrationofKinect?2. HowwecancalibrateMPU6050values?3. Howwecancalibratethewheelodometryparameters?4. Whatarethepossibleerrorsinwheelodometry?5. Whataretheprosandconsofthisrobotdesign?

SummaryInthischapter,wehavediscussedallthepossibleerrorsandcalibrationsrequiredbeforestartingtherobot.Thecalibrationisrequiredtoreduceerrorsfromthesensors.WealsosawallthestepstodobeforeworkingwithrobotGUIthatwehavedesigned.Wealsohaveseentheprosandconsofthismethod.Theareawearehandlingisstillbeingresearchedsowecan'texpecthighaccuracyfromthecurrentprototype.

IndexA

A*searchalgorithmabout/Wheredorobotscomefrom?

A.L.I.C.Eabout/LoadingasingleAIMLfilefromthecommand-lineargument

A.L.I.C.E.AIMLfilesworkingwith/WorkingwithA.L.I.C.E.AIMLfilesreferencelink/WorkingwithA.L.I.C.E.AIMLfilesloading,intomemory/LoadingAIMLfilesintomemoryloading/LoadingAIMLfilesandsavingtheminbrainfilessaving,inbrainfile/LoadingAIMLfilesandsavingtheminbrainfilesloading,Bootstrapmethodused/LoadingAIMLandbrainfilesusingtheBootstrapmethod

AbsoluteZero,LibreCAD/Creatinga2DCADdrawingoftherobotusingLibreCADacousticmodel

about/BlockdiagramofaspeechrecognitionsystemActiveStatePython2.7bit

URL,fordownloading/InstallationoftheSpeechSDKAdaptiveMonteCarloLocalization(AMCL)

URL/CreatingtheGazebomodelfromTurtleBotpackagesAdvancePackagingTool(APT)

about/InstallingQtonUbuntu14.04.2LTSAIML

about/IntroductiontoAIMLworkingwith/WorkingwithAIMLandPython

AIMLtagsabout/IntroductiontoAIMLtags<aiml>tag/IntroductiontoAIMLtags<category>tag/IntroductiontoAIMLtags<pattern>tag/IntroductiontoAIMLtags<template>tag/IntroductiontoAIMLtags<starindex=$n$/>ta/IntroductiontoAIMLtags<srai>tag/IntroductiontoAIMLtagsreferencelink/IntroductiontoAIMLtags

aiml_client.pyfile/aiml_client.pyaiml_server.pyfile/aiml_server.pyaiml_speech_recog_client.pyfile/aiml_speech_recog_client.pyaiml_tts_client.pyfile/aiml_tts_client.pyAlicebotfreesoftwarecommunity

URL/IntroductiontoAIMLAMCLpackage

URL/WorkingwithROSlocalizationandnavigation

apt-keyabout/InstallingROSIndigoonUbuntu14.04.2

ArduinoURL/Embeddedcontrollerboard

AsusXtionPROURL/Kinect

AsusXtionPro/ListofroboticvisionsensorsandimageprocessinglibrariesAutoCAD

URL/Robotchassisdesignautonomoussystem/Moderndefinitionofarobot

Bbags/TheROSComputationGraphbaudRatevariable

about/WorkingwithDynamixelactuatorsBeagleBone

URL/CentralProcessingUnitbinaries,forWindowsandMacOSX

URL/PyQtBlender

URL/Robotchassisdesignabout/Robotchassisdesign,InstallingLibreCAD,Blender,andMeshLabinstalling/InstallingBlenderURL,fordownloading/InstallingBlenderURL,fordocumentation/InstallingBlenderURL,fortutorials/Workingwitha3DmodeloftherobotusingBlenderURL,forPythonscripting/PythonscriptinginBlender

BlenderPythonAPIsabout/IntroductiontoBlenderPythonAPIs

Block,LibreCADreferencelink/Creatinga2DCADdrawingoftherobotusingLibreCAD

blockdiagram,robotabout/Blockdiagramoftherobotmotor/Motorandencoderencoder/Motorandencodermotordriver/MotordriverEmbeddedControllerboard/Embeddedcontrollerboardultrasonicsensors/UltrasonicsensorsInertialMeasurementUnit(IMU)/InertialMeasurementUnitkinect/KinectCentralProcessingUnit/CentralProcessingUnitSpeakers/Mic/Speakers/micPowerSupply/Battery/Powersupply/battery

blockdiagram,speechrecognitionsystemabout/Blockdiagramofaspeechrecognitionsystem

featureextraction/Blockdiagramofaspeechrecognitionsystemacousticmodel/Blockdiagramofaspeechrecognitionsystemlexicon/Blockdiagramofaspeechrecognitionsystemlanguagemodel/Blockdiagramofaspeechrecognitionsystemsearchalgorithm/Blockdiagramofaspeechrecognitionsystemrecognizedwords/Blockdiagramofaspeechrecognitionsystem

Bootstrapmethodused,forloadingbrainfiles/LoadingAIMLandbrainfilesusingtheBootstrapmethodused,forloadingA.L.I.C.E.AIMLfiles/LoadingAIMLandbrainfilesusingtheBootstrapmethod

bpymoduleabout/IntroductiontoBlenderPythonAPIsContextAccess/IntroductiontoBlenderPythonAPIsDataAccess/IntroductiontoBlenderPythonAPIsOperators/IntroductiontoBlenderPythonAPIs

brainfileA.L.I.C.E.AIMLfiles,savingin/LoadingAIMLfilesandsavingtheminbrainfilesloading,Bootstrapmethodused/LoadingAIMLandbrainfilesusingtheBootstrapmethod

breakoutboardURL,forpurchasing/InertialMeasurementUnit

BulletURL/IntroducingGazebo

CCADtools

SolidWorks/RobotchassisdesignAutoCAD/RobotchassisdesignMaya/RobotchassisdesignGoogleSketchUp/RobotchassisdesignInventor/RobotchassisdesignBlender/RobotchassisdesignLibreCAD/Robotchassisdesign

calibrationURL/CalibratingtheKinectRGBcamera

Carmine/ListofroboticvisionsensorsandimageprocessinglibrariesURL,forpurchasing/Listofroboticvisionsensorsandimageprocessinglibraries

casterwheelsreferencelink/Casterwheeldesign

catkindefining/IntroducingcatkinURL/Introducingcatkin

CentralProcessingUnit/CentralProcessingUnitCentreofSpeechTechnologyResearch(CSTR)

about/FestivalChefBot

ROSPythondriver,writingfor/WritingaROSPythondriverforChefBotChefBotdescriptionROSpackage

creating/CreatingaChefBotdescriptionROSpackagechefbot_base_gazebo.urdf.xacro/chefbot_base_gazebo.urdf.xacrokinect.urdf.xacro/kinect.urdf.xacrochefbot_base.urdf.xacro/chefbot_base.urdf.xacro

ChefBothardwarespecifications/SpecificationsoftheChefBothardwareworking/WorkingoftheChefBothardwarebuilding/BuildingChefBothardware

ChefBotPCconfiguring/ConfiguringChefBotPCandsettingChefBotROSpackages

ChefBotPythonnodesworkingwith/WorkingwithChefBotPythonnodesandlaunchfiles

ChefBotROSlaunchfilesdefining/UnderstandingChefBotROSlaunchfiles

ChefBotROSpackageURL/WorkingwithChefBot'scontrolGUI

ChefBotROSpackagessetting/ConfiguringChefBotPCandsettingChefBotROSpackages

ChefBotsensorsinterfacing,toTivaCLaunchPad/InterfacingChefBotsensorswithTivaCLaunchPad

ChefBotsimulation,inhotelenvironmentabout/SimulatingChefBotandTurtleBotinahotelenvironment

CloudSimframeworkURL/IntroducingGazebo

CMakeList.txtandpackage.xmlfile/Whatisarobotmodel,URDF,xacro,androbotstatepublisher?cmudict

about/CMUSphinx/PocketSphinxCMUSphinx

about/CMUSphinx/PocketSphinxURL/CMUSphinx/PocketSphinx

codeinterfacing/Interfacingcode

code,ofTivaCLaunchPadinterfacing/InterfacingcodeofTivaCLaunchPad

command-lineargumentsingleAIMLfile,loadingfrom/LoadingasingleAIMLfilefromthecommand-lineargument

CommandBox,LibreCADreferencelink/Creatinga2DCADdrawingoftherobotusingLibreCAD

communicationsystem,ChefBotblockdiagram/BlockdiagramofthecommunicationsysteminChefBot

components,robot

about/Whatcanwefindinarobot?physicalbody/Thephysicalbodysensors/Sensorseffectors/Effectorscontrollers/Controllers

controlGUI,ChefBotworkingwith/WorkingwithChefBot'scontrolGUIfeatures/WorkingwithChefBot'scontrolGUI

countsperrevolution(CPR)about/Processingencoderdata

CUDA,forGPUaccelerationURL/WhatisOpenCV?

cv_bridgeused,fordisplayingKineticimages/DisplayingKinectimagesusingPython,ROS,andcv_bridge

D2DCADdrawing,ofrobot

creating,LibreCADused/Creatinga2DCADdrawingoftherobotusingLibreCADbaseplatedesign/Thebaseplatedesignbaseplatepoledesign/BaseplatepoledesignWheel,Motor,andMotorClampDesign/Wheel,motor,andmotorclampdesignCasterWheelDesign/CasterwheeldesignMiddlePlateDesign/MiddleplatedesignTopPlateDesign/Topplatedesign

3Dmodelofrobot,withBlenderabout/Workingwitha3DmodeloftherobotusingBlenderPythonscripting/PythonscriptinginBlender

DARTURL/IntroducingGazebo

DCgearedmotorinterfacing,toTivaCLaunchPad/InterfacingDCgearedmotorwithTivaCLaunchPad

deadreckoningabout/InertialNavigation

degreesoffreedom(DOF)about/Introductiontothedifferentialsteeringsystemandrobotkinematics

differentialdrivemechanismdifferentialwheeledrobot/DifferentialwheeledrobotEnergiaIDE,installing/InstallingtheEnergiaIDEcode,interfacing/Interfacingcode

differentialdriverobotabout/Robotdrivemechanism

differentialwheeledrobot/Differentialwheeledrobotdifferential_drivepackage

URL/WritingaROSPythondriverforChefBot

DigitalMotionProcessor(DMP)about/EmbeddedcodeforChefBot

DirectCurrent(DC)/BlockdiagramoftherobotDistanceperencoderticksofthewheels

about/WheelodometrycalibrationDynamixel

about/WorkingwithDynamixelactuatorsDynamixelactuators

workingwith/WorkingwithDynamixelactuatorsDynamixelservos

URL/WorkingwithDynamixelactuators

EEchopin

about/InterfacingHC-SR04toTivaCLaunchPadeffectors,robot

locomotion/Effectorsmanipulation/Effectors

embeddedcode,forChefBotabout/EmbeddedcodeforChefBot

EmbeddedControllerboardabout/Embeddedcontrollerboard

encoderabout/Motorandencoderselecting,forrobot/Selectingmotors,encoders,andwheelsfortherobot

encoderdataprocessing/Processingencoderdata

EnergiaURL/Embeddedcontrollerboard,Differentialwheeledrobotabout/Differentialwheeledrobotdownloading/InstallingtheEnergiaIDE

EnergiaIDEinstalling/InstallingtheEnergiaIDE

eSpeakabout/eSpeakURL/eSpeaksetting,inUbuntu14.04.2/SettingupeSpeakandFestivalinUbuntu14.04.2

ExtensibleMark-upLanguage(XML)about/IntroductiontoAIML

Ffeatureextraction

about/Blockdiagramofaspeechrecognitionsystemfeatures,Gazebo

dynamicsimulation/IntroducingGazeboadvanced3DGraphics/IntroducingGazebosensorssupport/IntroducingGazeboplugins/IntroducingGazeboTCP/IPTransport/IntroducingGazeboCloudSimulation/IntroducingGazebocommand-linetools/IntroducingGazebo

Festivalabout/FestivalURL/Festivalsetting,inUbuntu14.04.2/SettingupeSpeakandFestivalinUbuntu14.04.2

fileslaunching/WorkingwithChefBotPythonnodesandlaunchfiles

forwardkinematicsequation/Explainingoftheforwardkinematicsequation

GGazebo

about/UnderstandingroboticsimulationURL/Understandingroboticsimulationdefining/IntroducingGazebofeatures/IntroducingGazeboinstalling/InstallingGazebotesting,withROSinterface/TestingGazebowiththeROSinterface

Gazebomodelcreating,fromTurtleBotpackages/CreatingtheGazebomodelfromTurtleBotpackages

GazebosimulatorURL/InstallingGazebo

General-PurposeInput/Output(GPIO)/Embeddedcontrollerboardgmappingpackage

URL/WorkingwithSLAMusingROSandKinectGoogleSketchUp

URL/Robotchassisdesigngraycodes

URL/ProcessingencoderdataGTK+

about/InstallingTurtleBotRobotpackagesonROSIndigoGUI

used,fortestingrobot/TestingoftherobotusingGUI

HH-bridge

about/MotordriverHC-SR04

about/Selectingtheultrasonicsensor

interfacing,toTivaCLaunchPad/InterfacingHC-SR04toTivaCLaunchPadworking/WorkingofHC-SR04

HelloWorldGUIapplicationcreating/Qtsignalsandslotsrunning/UpandrunningofHelloWorldGUIapplication

Hello_world_publisher.py/Hello_world_publisher.pyHello_world_subscriber.py/Hello_world_subscriber.pyhierarchical(deliberative)control/Hierarchical(deliberative)controlHMM(HiddenMarkovModels)/Blockdiagramofaspeechrecognitionsystemhybridcontrol/Hybridcontrol

Iimage

displaying,withPython-OpenCVinterface/ReadinganddisplayinganimageusingthePython-OpenCVinterfacecapturing,fromwebcamera/Capturingfromwebcamera

imageprocessinglibrariesabout/Listofroboticvisionsensorsandimageprocessinglibraries

IMUworkingwith/WorkingwithInertialMeasurementUnitinertialnavigationsystem/InertialNavigationMPU6050,interfacingwithTivaCLaunchPad/InterfacingMPU6050withTivaCLaunchPadcodeofEnergia,interfacing/InterfacingcodeofEnergia,InterfacingMPU6050toLaunchpadwiththeDMPsupportusingEnergia

in-builtencoderabout/InterfacingquadratureencoderwithTivaCLaunchpad

InertialMeasurementUnit(IMU)about/chefbot_base_gazebo.urdf.xacro,InertialMeasurementUnitURL/chefbot_base_gazebo.urdf.xacro

inertialnavigationsystem/InertialNavigationInertialNavigationSystem(INS)/InertialNavigationinputpins,motordriver/InputpinsInstantaneousCenterofCurvature(ICC)

about/ExplainingoftheforwardkinematicsequationIntelDN2820FYKH/CentralProcessingUnitInterruptServiceRoutine(ISR)/QuadratureencoderinterfacingcodeInventor

URL/RobotchassisdesignInverseKinematics/InversekinematicsIRproximitysensor

workingwith/WorkingwiththeIRproximitysensorItseez

URL/WhatisOpenCV?

JJulius

about/JuliusURL/Juliusspeechrecognitionaccuracy,improvingin/ImprovingspeechrecognitionaccuracyinPocketSphinxandJulius

Juliusspeechrecognizerinstalling/InstallationofJuliusspeechrecognizerandPythonmodule

KKalmanfilter

URL/InertialNavigationkinect

about/KinectURL,forpurchasing/Kinect

Kinectabout/Listofroboticvisionsensorsandimageprocessinglibrariesprogramming,withPython/ProgrammingKinectwithPythonusingROS,OpenCV,andOpenNI

Kinectimagesdisplaying,Pythonused/DisplayingKinectimagesusingPython,ROS,andcv_bridgedisplaying,ROSused/DisplayingKinectimagesusingPython,ROS,andcv_bridgedisplaying,cv_bridgeused/DisplayingKinectimagesusingPython,ROS,andcv_bridge

KinectIRcameracalibrating/CalibratingtheKinectIRcamera

KinectRGBcameracalibrating/CalibratingtheKinectRGBcamera

kinematicsequationsURL/Inversekinematics

Kobukiabout/InstallingTurtleBotRobotpackagesonROSIndigo

LL-bracket,motor

referencelink/Selectingmotors,encoders,andwheelsfortherobotlanguagemodel

about/Blockdiagramofaspeechrecognitionsystemlaserscandata

PointCloud,convertingto/ConversionofPointCloudtolaserscandatalaunchfolder

launchfiles/CreatingtheGazebomodelfromTurtleBotpackagesLaunchpad

functionalities/Embeddedcontrollerboard

laws,roboticsfirstlaw/Wheredorobotscomefrom?secondlaw/Wheredorobotscomefrom?thirdlaw/Wheredorobotscomefrom?zerothlaw/Wheredorobotscomefrom?

LayerList,LibreCADreferencelink/Creatinga2DCADdrawingoftherobotusingLibreCAD

levelconvertorURL/InterfacingDCgearedmotorwithTivaCLaunchPad

levelshifterabout/WorkingoftheChefBothardwareURL/InterfacingChefBotsensorswithTivaCLaunchPad

lexiconabout/Blockdiagramofaspeechrecognitionsystem

LibreCADURL/Robotchassisdesignabout/Robotchassisdesign,InstallingLibreCAD,Blender,andMeshLabreferences,forinstalling/InstallingLibreCAD,Blender,andMeshLabURL,fordocumentation/InstallingLibreCAD,Blender,andMeshLabinstalling/InstallingLibreCAD

LibreCADtoolsreferencelink/Creatinga2DCADdrawingoftherobotusingLibreCADCommandBox/Creatinga2DCADdrawingoftherobotusingLibreCADLayerList/Creatinga2DCADdrawingoftherobotusingLibreCADBlock/Creatinga2DCADdrawingoftherobotusingLibreCADAbsoluteZero/Creatinga2DCADdrawingoftherobotusingLibreCAD

linesperrevolution(LPR)about/Processingencoderdata

LM(LanguageModel)/WorkingwithPocketSphinxPythonbindinginUbuntu14.04.2loop()function/Quadratureencoderinterfacingcode

MMacOSX

URL/InstallingtheEnergiaIDEmathematicalmodeling,ofrobot

about/Mathematicalmodelingoftherobotsteeringsystem/Introductiontothedifferentialsteeringsystemandrobotkinematicsrobotkinematics/Introductiontothedifferentialsteeringsystemandrobotkinematicsforwardkinematicsequation/ExplainingoftheforwardkinematicsequationInverseKinematics/Inversekinematics

MayaURL/Robotchassisdesign

memoryA.L.I.C.E.AIMLfiles,loadinginto/LoadingAIMLfilesintomemory

MeshLab

about/Robotchassisdesign,InstallingLibreCAD,Blender,andMeshLabinstalling/InstallingMeshLabURL,forsourcecode/InstallingMeshLabURL/chefbot_base.urdf.xacro

methods,forreducingerrorsdigitalcompass/Errorcorrectiondigitalgyroscope/Errorcorrectiongyro-correctedcompass/Errorcorrection

motorabout/Motorandencoderselecting,forrobot/Selectingmotors,encoders,andwheelsfortherobot

motordriverabout/Motordriverselecting/Selectingamotordriver/controllerreferencelink/Selectingamotordriver/controllerinputpins/Inputpinsoutputpins/Outputpinspowersupplypins/Powersupplypins

motorrotationfeedbackreferencelink/Motorandencoder

motors,RobotDriveMechanismselecting/SelectionofmotorsandwheelsRPMofmotors,calculating/CalculationofRPMofmotorsMotorTorque,calculating/Calculationofmotortorque

mountinghubreferencelink/Selectingmotors,encoders,andwheelsfortherobot

MPU6050about/InertialNavigationinterfacing,withTivaCLaunchPad/InterfacingMPU6050withTivaCLaunchPadcalibrating/CalibratingtheMPU6050

MPU6050librarysetting,inEnergia/SettinguptheMPU6050libraryinEnergia

NNaturalinteraction(NI)/WhatisOpenNINextUnitofComputing(NUC)/CentralProcessingUnitnServosvariable

about/WorkingwithDynamixelactuatorsNUC

URL,forpurchasing/CentralProcessingUnitNumPy

about/ReadinganddisplayinganimageusingthePython-OpenCVinterfaceURL/ReadinganddisplayinganimageusingthePython-OpenCVinterface

NXPURL/Listofroboticvisionsensorsandimageprocessinglibraries

Oodometryvalues

about/ExplainingoftheforwardkinematicsequationOGREframework

URL/IntroducingGazeboOpenCV

about/WhatisOpenCV?applications/WhatisOpenCV?installing/InstallationofOpenCVfromsourcecodeinUbuntu14.04.2URL/InstallationofOpenCVfromsourcecodeinUbuntu14.04.2

OpenCV,inMacOSXURL/WhatisOpenCV?

OpenCV,inWindowsURL/WhatisOpenCV?

OpenCV-PythontutorialsURL/Capturingfromwebcamera

OpenCVsupportROSpackage,creatingwith/CreatingROSpackagewithOpenCVsupport

OpenDynamicsEngine(ODE)URL/IntroducingGazebo

OpenNIabout/WhatisOpenNIinstalling,inUbuntu14.04.2/InstallingOpenNIinUbuntu14.04.2

OpenNIdriverlaunching/HowtolaunchOpenNIdriver

OpenSlamURL/WorkingwithSLAMusingROSandKinect

OpenSourceComputerVision(OpenCV)about/Understandingroboticsimulation

outputpins,motordriver/Outputpins

PPCL

about/WhatisPCL?URL,fordownloading/WhatisPCL?

PCM(PulseCodeModulation)/BlockdiagramofaspeechrecognitionsystemPersonalComputer(PC)

about/Robotchassisdesignphysicalworld/Moderndefinitionofarobotpinout,TexasInstrumentLaunchpadseries

referencelink/Embeddedcontrollerboardpins,motordrivers

about/InterfacingDCgearedmotorwithTivaCLaunchPadpitch

about/IntroductiontothedifferentialsteeringsystemandrobotkinematicsPixy/CMUcam5

URL/ListofroboticvisionsensorsandimageprocessinglibrariesPocketSphinx

about/CMUSphinx/PocketSphinxsetting,inUbuntu14.04.2/SettingupPocketSphinxanditsPythonbindinginUbuntu14.04.2speechrecognitionaccuracy,improvingin/ImprovingspeechrecognitionaccuracyinPocketSphinxandJulius

pocketsphinxpackageinstalling,inROSIndigo/InstallationofthepocketsphinxpackageinROSIndigo

PocketSphinxPythonbinding,Ubuntu14.04.2about/WorkingwithPocketSphinxPythonbindinginUbuntu14.04.2

pocketsphinxROSpackagereferencelink/WorkingwithSpeechrecognitioninROSIndigoandPython

PointCloudworkingwith/WorkingwithPointCloudsusingKinect,ROS,OpenNI,andPCLgeneration/OpeningdeviceandPointCloudgenerationconverting,tolaserscandata/ConversionofPointCloudtolaserscandata

PololuURL/Selectingmotors,encoders,andwheelsfortherobot

PololuH-Bridgeusing/InterfacingDCgearedmotorwithTivaCLaunchPad

portNamevariableabout/WorkingwithDynamixelactuators

PowerSupply/Battery/Powersupply/batterypowersupplypins,motordriver/PowersupplypinsPrintedCircuitBoard(PCB)

about/BuildingChefBothardwarepulsesperrevolution(PPR)

about/ProcessingencoderdataPyAIML

about/IntroductiontoPyAIMLinstalling,inUbuntu14.04.2/InstallingPyAIMLonUbuntu14.04.2installing,fromsourcecode/InstallingPyAIMLfromsourcecode

PyAIML,integratingintoROSabout/IntegratingPyAIMLintoROSaiml_server.pyfile/aiml_server.pyaiml_client.pyfile/aiml_client.pyaiml_tts_client.pyfile/aiml_tts_client.pyaiml_speech_recog_client.pyfile/aiml_speech_recog_client.pystart_chat.launchfile/start_chat.launchstart_tts_chat.launchfile/start_tts_chat.launchstart_speech_chat.launchfile/start_speech_chat.launch

pydynamixel

about/WorkingwithDynamixelactuatorsURL/WorkingwithDynamixelactuators

pyjuliusURL,fordownloading/InstallationofJuliusspeechrecognizerandPythonmodule

PyQtabout/PyQtURL/PyQtinstalling,inUbuntu14.04.1LTS/InstallingPyQtonUbuntu14.04.2LTSworkingwith/WorkingwithPyQtandPySide

PyQtcodeslotdefinition,addingto/AddingaslotdefinitiontoPyQtcode

PySerialmoduleabout/InterfacingTivaCLaunchPadwithPythonURL/InterfacingTivaCLaunchPadwithPython

PySideabout/PySideURL/PySideinstalling,onUbuntu14.04.2LTS/InstallingPySideonUbuntu14.04.2LTSworkingwith/WorkingwithPyQtandPySide

PythonTivaCLaunchPad,interfacingwith/InterfacingTivaCLaunchPadwithPythonKinetic,programmingwith/ProgrammingKinectwithPythonusingROS,OpenCV,andOpenNIused,fordisplayingKineticimages/DisplayingKinectimagesusingPython,ROS,andcv_bridgeworkingwith/WorkingwithAIMLandPython

Python-Juliusclientcode,speechrecognition/Python-JuliusclientcodePython-OpenCVinterface

image,readingwith/ReadinganddisplayinganimageusingthePython-OpenCVinterfaceimage,displayingwith/ReadinganddisplayinganimageusingthePython-OpenCVinterface

PythonAPIs,Blenderabout/IntroductiontoBlenderPythonAPIs

Pythonbindingsetting,inUbuntu14.04.2/SettingupPocketSphinxanditsPythonbindinginUbuntu14.04.2

Pythonbindings,ofQtworkingwith/WorkingwithPythonbindingsofQtPyQt/PyQtPySide/PySide

PythoncodeUIfile,convertinginto/ConvertingaUIfileintoPythoncode

Pythonmoduleinstalling/InstallationofJuliusspeechrecognizerandPythonmodule

Pythonscript,robotmodel/Pythonscriptoftherobotmodel

Pythonwrapper,forWindowsSpeechSDKURL,fordownloading/InstallationoftheSpeechSDK

pyuic4about/ConvertingaUIfileintoPythoncode

QQt

installing,onUbuntu14.04.2LTS/InstallingQtonUbuntu14.04.2LTSabout/InstallingQtonUbuntu14.04.2LTSURL/InstallingQtonUbuntu14.04.2LTSsignals/Qtsignalsandslotsslots/Qtsignalsandslots

QtDesignerdefining/IntroducingQtDesigner

quadratureencoderinterfacing,withTivaCLaunchPad/InterfacingquadratureencoderwithTivaCLaunchpad

quadratureencoderinterfacingcodeabout/Quadratureencoderinterfacingcode

RRaspberryPi

URL/CentralProcessingUnitreactivecontrol/Reactivecontrolreal-timespeechrecognition,GStreamer/Real-timespeechrecognitionusingPocketSphinx,GStreamer,andPythoninUbuntu14.04.2real-timespeechrecognition,PocketSphinx/Real-timespeechrecognitionusingPocketSphinx,GStreamer,andPythoninUbuntu14.04.2real-timespeechrecognition,Python/Real-timespeechrecognitionusingPocketSphinx,GStreamer,andPythoninUbuntu14.04.2recognitiongrammar,Julius

referencelink/ImprovingspeechrecognitionaccuracyinPocketSphinxandJuliusrecognizedwords

about/BlockdiagramofaspeechrecognitionsystemRoboLogix

about/Understandingroboticsimulationrobot

about/Whatisarobot?,Wheredorobotscomefrom?,Whatcanwefindinarobot?history/Historyofthetermrobot,Wheredorobotscomefrom?defining/Moderndefinitionofarobotbuilding/Howdowebuildarobot?reactivecontrol/Reactivecontrolhierarchical(deliberative)control/Hierarchical(deliberative)controlhybridcontrol/Hybridcontroltesting,GUIused/TestingoftherobotusingGUI

Robotchassisdesignabout/Robotchassisdesign

RobotDriveMechanismabout/Robotdrivemechanismmotors,selecting/Selectionofmotorsandwheelswheels,selecting/Selectionofmotorsandwheelsdesignsummary/Thedesignsummary

robotdynamicsabout/Introductiontothedifferentialsteeringsystemandrobotkinematics

roboticsabout/Wheredorobotscomefrom?

roboticsimulationabout/Understandingroboticsimulationadvantages/Understandingroboticsimulationdisadvantages/Understandingroboticsimulationmathematicalmodeling,ofrobot/MathematicalmodelingoftherobotROS/IntroductiontoROSandGazeboGazebo/IntroductiontoROSandGazeboROSIndigo,installingonUbuntu14.04.1/InstallingROSIndigoonUbuntu14.04.2ChefBotsimulation,inhotelenvironment/SimulatingChefBotandTurtleBotinahotelenvironment

roboticsimulatorapplicationsGazebo/UnderstandingroboticsimulationV-REP/Understandingroboticsimulationwebots/UnderstandingroboticsimulationRoboLogix/Understandingroboticsimulation

roboticvisionsensorsabout/Listofroboticvisionsensorsandimageprocessinglibraries

robotkinematics/Introductiontothedifferentialsteeringsystemandrobotkinematicsrobotmodel/Whatisarobotmodel,URDF,xacro,androbotstatepublisher?RobotShop

URL/CalculationofRPMofmotorsrobotstatepublisher/Whatisarobotmodel,URDF,xacro,androbotstatepublisher?robot_state_publisher

about/Whatisarobotmodel,URDF,xacro,androbotstatepublisher?roll

about/IntroductiontothedifferentialsteeringsystemandrobotkinematicsRoomba

about/RobotchassisdesignROS

about/IntroductiontoROSandGazebodefining/IntroductiontoROSandGazeboURL/IntroductiontoROSandGazebofeatures/IntroductiontoROSandGazebofilesystem/ROSConcepts

ComputationGraph/ROSConceptscommunity/ROSConceptsused,fordisplayingKineticimages/DisplayingKinectimagesusingPython,ROS,andcv_bridgeused,forcalibratingXboxKinect/TheCalibrationofXboxKinectusingROS

ROS-PCLpackageURL,fordownloading/WhatisPCL?

ros-usersmailinglistabout/TheROScommunitylevel

ROScommunitylevelabout/TheROScommunitylevelDistributions/TheROScommunitylevelRepositories/TheROScommunitylevelROSWiki/TheROScommunitylevelMailingLists/TheROScommunitylevel

ROSComputationGraphabout/TheROSComputationGraphnodes/TheROSComputationGraphROSMaster/TheROSComputationGraphParameterserver/TheROSComputationGraphmessages/TheROSComputationGraphtopics/TheROSComputationGraphservices/TheROSComputationGraphbags/TheROSComputationGraph

rosdepabout/InstallingROSIndigoonUbuntu14.04.2

ROSfilesystemabout/TheROSfilesystempackages/TheROSfilesystemPackageManifests/TheROSfilesystemmessage(msg)types/TheROSfilesystemservice(srv)types/TheROSfilesystem

ROSIndigoinstalling,onUbuntu14.04.1/InstallingROSIndigoonUbuntu14.04.2catkin,defining/IntroducingcatkinROSpackage,creating/CreatinganROSpackageHello_world_publisher.py/Hello_world_publisher.pyHello_world_subscriber.py/Hello_world_subscriber.pyGazebo,defining/IntroducingGazeboGazebo,installing/InstallingGazeboGazebo,testingwithROSinterface/TestingGazebowiththeROSinterfaceTurtleBotRobotpackages,installing/InstallingTurtleBotRobotpackagesonROSIndigoTurtleBotRobotpackages,installinginUbuntu/InstallingTurtleBotROSpackagesusingtheaptpackagemanagerinUbuntuTurtleBot,simulating/SimulatingTurtleBotusingGazeboandROS

Gazebomodel,creatingfromTurtleBotpackages/CreatingtheGazebomodelfromTurtleBotpackagesrobotmodel/Whatisarobotmodel,URDF,xacro,androbotstatepublisher?URDF/Whatisarobotmodel,URDF,xacro,androbotstatepublisher?xacro/Whatisarobotmodel,URDF,xacro,androbotstatepublisher?robotstatepublisher/Whatisarobotmodel,URDF,xacro,androbotstatepublisher?ChefBotdescriptionROSpackage,creating/CreatingaChefBotdescriptionROSpackagepocketsphinxpackage,installingin/InstallationofthepocketsphinxpackageinROSIndigo

ROSinterface,ofOpenCVabout/TheROSinterfaceofOpenCV

ROSlocalizationworkingwith/WorkingwithROSlocalizationandnavigation

ROSnavigationworkingwith/WorkingwithROSlocalizationandnavigationpros/ProsandconsoftheROSnavigationcons/ProsandconsoftheROSnavigation

ROSpackagecreating/CreatinganROSpackagecreating,withOpenCVsupport/CreatingROSpackagewithOpenCVsupport

ROSpackagesURL/InstallingROSIndigoonUbuntu14.04.2,CreatingtheGazebomodelfromTurtleBotpackages

ROSPythondriverwriting,forChefBot/WritingaROSPythondriverforChefBot

Rossum'sUniversalRobots(R.U.R)/Historyofthetermrobotrqt

about/InstallingandworkingwithrqtinUbuntu14.04.2LTSinstalling,inUbuntu14.04.2LTS/InstallingandworkingwithrqtinUbuntu14.04.2LTSdefining,inUbuntu14.04.2LTS/InstallingandworkingwithrqtinUbuntu14.04.2LTS

rvizabout/SimulatingChefBotandTurtleBotinahotelenvironmentURL/SimulatingChefBotandTurtleBotinahotelenvironment

SSAPI(SpeechApplicationProgrammingInterface)

about/WorkingwithspeechrecognitionandsynthesisinWindowsusingPythonsearchalgorithm

about/BlockdiagramofaspeechrecognitionsystemSerialClockLine(SCL)

about/InertialMeasurementUnitSerialDataLine(SDA)

about/InertialMeasurementUnitserialmodule

about/InterfacingTivaCLaunchPadwithPythonServiceRobot

requisites/TheRequirementsofaservicerobotsetuptools,Python

URL,fordownloading/InstallationofJuliusspeechrecognizerandPythonmoduleShakey

about/Wheredorobotscomefrom?SharpGP2D12sensor

URL/WorkingwiththeIRproximitysensorsignals

about/QtsignalsandslotsSimbody

URL/IntroducingGazeboSimultaneousLocalizationAndMapping(SLAM)/CreatingtheGazebomodelfromTurtleBotpackagessingleAIMLfile

loading,fromcommand-lineargument/LoadingasingleAIMLfilefromthecommand-lineargument

SLAMworkingwith/WorkingwithSLAMusingROSandKinect

SLAM,onROSworkingwith/WorkingwithSLAMonROStobuildthemapoftheroom

slotabout/Qtsignalsandslots

slotdefinitionadding,toPyQtcode/AddingaslotdefinitiontoPyQtcode

SolidWorksURL/Robotchassisdesign

sourcecodePyAIML,installingin/InstallingPyAIMLfromsourcecode

spamfilters/ModerndefinitionofarobotSpeakers/Mic/Speakers/micspecifications,ChefBothardware/SpecificationsoftheChefBothardwarespeechrecognition

about/Understandingspeechrecognitiondecoding,fromwavefile/WorkingwithPocketSphinxPythonbindinginUbuntu14.04.2

speechrecognition,inUbuntu14.04.2about/WorkingwithspeechrecognitionandsynthesisinUbuntu14.04.2usingPythonoutput/Output

speechrecognition,Julius/SpeechrecognitionusingJuliusandPythoninUbuntu14.04.2speechrecognition,Python/SpeechrecognitionusingJuliusandPythoninUbuntu14.04.2

about/WorkingwithSpeechrecognitioninROSIndigoandPythonspeechrecognition,ROSIndigo

about/WorkingwithSpeechrecognitioninROSIndigoandPythonspeechrecognitionaccuracy

improving,inPocketSphinx/ImprovingspeechrecognitionaccuracyinPocketSphinxandJulius

improving,inJulius/ImprovingspeechrecognitionaccuracyinPocketSphinxandJuliusspeechrecognitionlibraries

about/SpeechrecognitionlibrariesCMUSphinx/CMUSphinx/PocketSphinxPocketSphinx/CMUSphinx/PocketSphinxJulius/Julius

speechrecognitionsystemblockdiagram/Blockdiagramofaspeechrecognitionsystem

SpeechSDKinstalling/InstallationoftheSpeechSDKURL,fordownloading/InstallationoftheSpeechSDK

speechsynthesisabout/Speechsynthesis

speechsynthesis,inUbuntu14.04.2about/WorkingwithspeechrecognitionandsynthesisinUbuntu14.04.2usingPythonoutput/Output

speechsynthesis,Python/WorkingwithspeechsynthesisinROSIndigoandPythonspeechsynthesis,ROSIndigo/WorkingwithspeechsynthesisinROSIndigoandPythonspeechsynthesislibraries

about/SpeechsynthesislibrarieseSpeak/eSpeakFestival/Festival

speechsynthesisstagestextanalysis/Speechsynthesisphoneticanalysis/Speechsynthesisprosodicanalysis/Speechsynthesisspeechsynthesis/Speechsynthesis

StanfordResearchInstitute(SRI)about/Wheredorobotscomefrom?

start_chat.launchfile/start_chat.launchstart_speech_chat.launchfile/start_speech_chat.launchstart_tts_chat.launchfile/start_tts_chat.launchstatetransitions

about/Processingencoderdatasteeringsystem/IntroductiontothedifferentialsteeringsystemandrobotkinematicsSTereoLithography(STL)/IntroductiontoBlenderPythonAPIssynaptic

about/InstallingTurtleBotRobotpackagesonROSIndigosysmodule

about/InterfacingTivaCLaunchPadwithPythonSystemOnChip(SOC)/Listofroboticvisionsensorsandimageprocessinglibraries

Ttexttospeech(TTS)/Speakers/mictf

URL/Whatisarobotmodel,URDF,xacro,androbotstatepublisher?TivaCLaunchPad

URL/Embeddedcontrollerboardabout/EmbeddedcontrollerboardDCgearedmotor,interfacingto/InterfacingDCgearedmotorwithTivaCLaunchPadquadratureencoder,interfacingwith/InterfacingquadratureencoderwithTivaCLaunchpadHC-SR04,interfacingto/InterfacingHC-SR04toTivaCLaunchPadinterfacing,withPython/InterfacingTivaCLaunchPadwithPythonMPU6050,interfacingwith/InterfacingMPU6050withTivaCLaunchPadChefBotsensors,interfacingto/InterfacingChefBotsensorswithTivaCLaunchPad

topics/TheROSComputationGraphTrigpin

about/InterfacingHC-SR04toTivaCLaunchPadtruthtable

about/InterfacingDCgearedmotorwithTivaCLaunchPadTurtleBot

URL/Robotchassisdesignsimulating,Gazeboused/SimulatingTurtleBotusingGazeboandROSsimulating,ROSused/SimulatingTurtleBotusingGazeboandROS

TurtleBotpackagesGazebomodel,creatingfrom/CreatingtheGazebomodelfromTurtleBotpackages

TurtleBotrobotchassisdesignabout/Robotchassisdesign

TurtleBotRobotpackagesinstalling,onROSIndigo/InstallingTurtleBotRobotpackagesonROSIndigoURL/InstallingTurtleBotRobotpackagesonROSIndigo

TurtlebotROSpackagesinstalling,aptpackagemanagerused/InstallingTurtleBotROSpackagesusingtheaptpackagemanagerinUbuntu

UUbuntu14.04.2

OpenNI,installingin/InstallingOpenNIinUbuntu14.04.2PocketSphinx,settingin/SettingupPocketSphinxanditsPythonbindinginUbuntu14.04.2Pythonbinding,settingin/SettingupPocketSphinxanditsPythonbindinginUbuntu14.04.2eSpeak,settingin/SettingupeSpeakandFestivalinUbuntu14.04.2Festival,settingin/SettingupeSpeakandFestivalinUbuntu14.04.2PyAIML,installingin/InstallingPyAIMLonUbuntu14.04.2

Ubuntu14.04.2LTSQt,installingon/InstallingQtonUbuntu14.04.2LTS

UIfileconverting,intoPythoncode/ConvertingaUIfileintoPythoncode

ultrasonicdistancesensorsworkingwith/WorkingwithultrasonicdistancesensorsHC-SR04,interfacingtoTivaCLaunchPad/InterfacingHC-SR04toTivaCLaunchPad

ultrasonicsensorselecting/Selectingtheultrasonicsensor

ultrasonicsensorsabout/Ultrasonicsensors

UniformResourceIdentifier(URI)about/WorkingwithChefBotPythonnodesandlaunchfiles

UniversalAsynchronousReceiver/Transmitter(UART)/EmbeddedcontrollerboardUnmannedAerialVehicles(UAVs)/WorkingwithInertialMeasurementUnitUpdate_Time()function

about/EmbeddedcodeforChefBotURDF/Whatisarobotmodel,URDF,xacro,androbotstatepublisher?

URL/Whatisarobotmodel,URDF,xacro,androbotstatepublisher?,chefbot_base_gazebo.urdf.xacrofunctionality/CreatingaChefBotdescriptionROSpackagechefbot_base.urdf.xacro/CreatingaChefBotdescriptionROSpackagechefbot_base_gazebo.urdf.xacro/CreatingaChefBotdescriptionROSpackagechefbot_gazebo.urdf.xacro/CreatingaChefBotdescriptionROSpackagechefbot_library.urdf.xacro/CreatingaChefBotdescriptionROSpackagechefbot_properties.urdf.xacro/CreatingaChefBotdescriptionROSpackagecommon_properties.urdf.xacro/CreatingaChefBotdescriptionROSpackagekinect.urdf.xacro/CreatingaChefBotdescriptionROSpackagechefbot_circles_kinect_urdf.xacro/CreatingaChefBotdescriptionROSpackage

VV-REP

about/UnderstandingroboticsimulationURL/Understandingroboticsimulation

VirtualBoxURL/InstallingROSIndigoonUbuntu14.04.2

VNH2SP30motorabout/InterfacingChefBotsensorswithTivaCLaunchPad

Wwavefile

speechrecognition,decodingfrom/WorkingwithPocketSphinxPythonbindinginUbuntu14.04.2

webcameraimage,capturingfrom/Capturingfromwebcamera

webotsabout/Understandingroboticsimulation

wheelbase

about/Wheelodometrycalibrationwheelencoders

about/Explainingoftheforwardkinematicsequationwheelodometrycalibration

defining/Wheelodometrycalibrationerroranalysis,ofwheelodometry/Erroranalysisofwheelodometryerrorcorrection/Errorcorrection

wheelsselecting,forrobot/Selectingmotors,encoders,andwheelsfortherobot

wheels,RobotDriveMechanismselecting/Selectionofmotorsandwheels

WindowsURL/InstallingtheEnergiaIDE

WindowsSpeechSDKabout/WindowsSpeechSDK

WiringURL/Differentialwheeledrobot

worldfiles/Whatisarobotmodel,URDF,xacro,androbotstatepublisher?

Xxacro/Whatisarobotmodel,URDF,xacro,androbotstatepublisher?

URL/Whatisarobotmodel,URDF,xacro,androbotstatepublisher?XboxKinect

calibrating,ROSused/TheCalibrationofXboxKinectusingROS

Yyaw

about/Introductiontothedifferentialsteeringsystemandrobotkinematics

top related