Robovision: Difference between revisions

From ICO wiki
Jump to navigationJump to search
Mernits (talk | contribs)
Mernits (talk | contribs)
 
Line 128: Line 128:
<source lang="cpp">
<source lang="cpp">
   class Object {
   class Object {
     public:    int type; // BALL, GOAL
     public:    int type; // BALL, GOAL_RED, GOAL_BLUE
     CvPoint center; // center coordiantes
     CvPoint center; // center coordiantes
     CvRect rect; // bounding rectangle
     CvRect rect; // bounding rectangle
Line 135: Line 135:
   };
   };
</source>
</source>


*type - objekti tüüp: pall või värav
*type - objekti tüüp: pall või värav
: BALL (1), GOAL (2)
: BALL (1), GOAL_RED - punane värav, GOAL_BLUE - sinine värav
 
*center - objekti keskpunkt: kaks int tüüpi muutujat ''x, y''
*center - objekti keskpunkt: kaks int tüüpi muutujat ''x, y''
*rect - objekti ümbritsev kujuteldav ristkülik: neli int tüüpi muutujat ''x, y, width, height''
*rect - objekti ümbritsev kujuteldav ristkülik: neli int tüüpi muutujat ''x, y, width, height''
**x - ristküliku vasaku nurga x koordinaat
**y - ristküliku vastaku nurga y koordinaat
**width - ristküliku laius
**height - ristküliku pikkus
*area - objekti pindala
*area - objekti pindala
: obj.area = fabs(cvContourArea(c, CV_WHOLE_SEQ));
: obj.area = fabs(cvContourArea(c, CV_WHOLE_SEQ));
*distanceH - horisontaalne kaugus pildi keskkoha ja objekti keskkoha vahel
*distanceH - horisontaalne kaugus pildi keskkoha ja objekti keskkoha vahel
: obj.distanceH = obj.center.x - (width / 2);
: obj.distanceH = obj.center.x - (width / 2);

Latest revision as of 16:47, 31 October 2010

Mis on

Robovision on Eesti Infotehnoloogia Kolledži robootikaklubi robotijuhtimise ja videotöötluse tarkvara. Tarkvara on kaitstud GPL litsentsiga. Robovision kasutab OpenCV ja QT4 teeke.

alt. Robovision üldpilt


Installeerimine

Eeltingimused

Intalleeri:

  • instaleeri QT4 koos arendus failidega

Kood

Kood asub robot.itcollege.ee SVN-is, check-out-iks:

svn checkout http://robot.itcollege.ee/svn/vision/robotvision2010

Kõigi muudatuste sisse panemiseks tee kataloogis, kuhu tegid checkout'i (võib olla ka selle kataloogi alamkataloog):

svn commit -m"muudatuse kommentaar"

Kui ei taha kõikide failide muudatusi svn'i viia, siis commitile saab ette anda ka kindla kataloogi või faili, milles olevad muudatused commititakse. Näiteks:

svn commit MinuRobot.cpp

Uuenduste alla tõmbamiseks:

svn up

Uue faili lisamiseks:

svn add faili_nimi_mida_tahad_lisada

Kui tahad näha, millised sinu arvutis olevad failid erinevad svn'i omadest:

svn status

Üldkirjeldus

Tegemist on C++ programmiga ja iga roboti jaoks on eraldi klass, mis pärineb abstraktsest Roboti klassist.

Klassid

MyRobot

Antud klass on igal robotil individuaalne ning klassi nimeks on roboti nimi. Klassi aluseks kasutatakse TestRobot klassi ehk kui lood oma roboti nimega klassi, siis kopeeeri TestRobot endale alusvormiks. TestRobot (ja seega iga individuaalse roboti klass) pärineb klassist AbstractRobot.

Mida teeb antud klass
  • Laetakse iga roboti individuaalne konfiguratsioon
  • Käivitatakse logimine
  • Lubatakse suhtlus Asuse ja mikrokontrolleri vahel (conf.setSendCmdEnabled(1);)
Lõpmatu (while) tsükli sees:
  • Kasutades Image klassi abi küsitakse kaadreid (image->getFrame();)
  • Peale kaadritöötlust saab küsida leitud objektide nimekirja (image->process(0,0,0,1);)
  • Loeb andureid mikroprotsessorsüsteemist (getAnalogs();)
  • Väljastab andurite väärtusi (konsoolile)
  • Juhib mootoreid (com.sendCommand(129,124);)
  • Käivitab pildi joonistamise ekraanile (view->show(_img);)
MyRobot klassis peaks olema
  • Config objekt
  • log objekt
  • image objekt päritakse AbstractRobot klassist
Näide

Näitena TestRoboti go() meetod:

void TestRobot::go()
{
 Config  & conf  = Config::getConfig();

 log->console("TestRobot Start...\n");

 char servo=0;
 
 conf.setSendCmdEnabled(1);

 while(1){
 _img = image->getFrame();
 image->process(0,0,0,1);

 getAnalogs();
 std::cout<<analog[0]<<std::endl;
 std::cout<<analog[1]<<std::endl;
 
 com.sendCommand(129,124);
 std::cout<<"servo: "<<servo++<<std::endl;
 view->show(_img);
 }
}

While tsüklis saab kasutada meetodit. Image::process(purk, sokk, purgi majakas, soki majakas)

Näiteks, kui argumendi väärtus on 1, siis otsib just seda objekti. Kui soki argumendi väärtus on 1, siis otsib sokke. Meetod tagastab objektilisti.

Peale process'i väljakutsumist saab kasutada Image klassi struktuuri found_objects (CvSeq tüüpi), mille sees on Object tüüpi elemendid.

Tulevik:

Plaanis on MyRobot klassi failid viia programmi peakaustast ära "Robots" kausta, mille all on igal robotil individuaalne kaust.


Object

Object klass on Image klassi sisemine klass ja see kirjeldab ühte leitud objekti.

Peale pilditöötlust saab robot klassis pöörduda image->found_objects listi poole mis sisaldab Object klassi kuuluvaid elemente.

Võimalikud objekti tüübid:

#define BALL 1
#define GOAL_RED 2
#define GOAL_BLUE 3

Objekti kirjeldavad elemendid:

  class Object {
    public:    int type;	// BALL, GOAL_RED, GOAL_BLUE
    CvPoint center;		// center coordiantes
    CvRect rect;		// bounding rectangle
    double area;		// area of the object
    int distanceH;		// horizontal distance from image center
  };


  • type - objekti tüüp: pall või värav
BALL (1), GOAL_RED - punane värav, GOAL_BLUE - sinine värav
  • center - objekti keskpunkt: kaks int tüüpi muutujat x, y
  • rect - objekti ümbritsev kujuteldav ristkülik: neli int tüüpi muutujat x, y, width, height
    • x - ristküliku vasaku nurga x koordinaat
    • y - ristküliku vastaku nurga y koordinaat
    • width - ristküliku laius
    • height - ristküliku pikkus
  • area - objekti pindala
obj.area = fabs(cvContourArea(c, CV_WHOLE_SEQ));
  • distanceH - horisontaalne kaugus pildi keskkoha ja objekti keskkoha vahel
obj.distanceH = obj.center.x - (width / 2);

AbstractRobot

Abstraktne klass, millest on tuletatud kõik robotite klassid. AbstractRobot sisaldab erinevate robotite ühist funktsionaalsust.

  • Initsialiseerib Log klassi
  • Initsialiseerib Image pilditöötlusklassi
  • Initsialiseerib View klassi
  • Initsialiseerib Comm kommunikatsiooniklassi (roboti mikrokontrolleriga)
  • Loob virtuaalse funktsiooni go(), mille kõik robotid peavad üle kirjutama


Camera

Kaamera klass initsialiseerib kaamera või võtab sisendi pildifailist. Kaamera klass seadistab kaamera vastavalt ini failile. Tegemist on singleton klassiga.


Comm

Kommunikatsiooni klass loob ühenduse pilditöötlusarvuti ja mikrokontrolleri vahel. Ühenduse viis loetakse ini failist. Tegemist on singleton klassiga.

  • Hetkel realiseerib com pordi ühenduse
  • Implementeerib suhtlusprotokoli
  • Implementeerib send_message ja receive_message funktsionaalsuse


Config

Loeb käsurealt robotikohased parameetrid. Kui käsurealt vajalikke parameetreid ei sisestatud, siis loetakse need .ini failist. Tegemist on singleton klassiga. .ini failid asuvad "configs" kataloogis. Iga roboti kohta on RobotiNimi.ini fail.

NB!failinimi ja robotinimi on tõstutundlikud (case sensitive).

Käsurea argumendid

Config klassis on realiseeritud käsurealt argumentide lugemine.

-h, --help

Väljastab käsurealt loetavate argumentide kasutusvõimalused.

-r, --robot

Roboti nimi. Tõstutundlik. Kohustuslik argument.

-s, --sdev

Jadaliidese nimi. Tõstutundlik.

-v, --videodev

Video seadme nimi. Tõstutundlik.

-f, --file

Pildifaili nimi. Tõstutundlik.

-c, --contrast

Kontrastsuse väärtus <min:max vahemik>.

-b, --brightness

Heleduse väärtus <min:max vahemik>.
Muu funktsionaalsus
  • sendCmdEnabled

Programmi käivitamisel on Asuse ja mikrokontrolleri vaheline suhtlus keelatud (sendCmdEnabled=0). Enne käskude edastamist kontrollib Comm klass selle muutuja olekut (getSendCmdEnabled) ning teeb otsuse, kas käske edastada. Suhtluse lubamiseks tuleb muutuja väärtus seada mingiks nullist erinevaks täisarvuks (nt conf.setSendCmdEnabled(1)). Kaval on seda teha näiteks tühiku vajutamise peale, et programmi käivitamisel robot kohe minema ei sõidaks.

Image

Sisaldab piltidöötluse funktsioone. Hoiab kolme koopiat kaamerast tulevast pildist. Image klass on singleton. Realiseerib funktsionaalsused:

  • Loob kaamera objekti
  • Küsib uue kaadri kaamerast
  • Töötleb kaadrit
  • Annab töödeldud kaadri kohta infot:
    • Suurima purgi koordinaadid
    • Leitud purkide koordinaadid
    • Info võimalike sokkide kohta
    • Info nähtavat majakate kohta (värv ja koordinaadid)


Log

Log klass on singleton, mida saab välja kutsuda igast klassist. Funktsionaalsus:

  • Kirjutab konsoolile
  • Kirjutab töödeldavale pildile


View

Mittevajalikud klassid

Järgnev nimekiri on klassidest, mis ei ole kirjutamise hetkeks enam kasutusel ning eemaldatakse ITK Robovisionist.

  • ObjectFinder
  • ObjectType
  • Protocol
  • RobotTestSuite
  • UdpSendThread

KKK

Uue roboti loomine

  • Kopeerida testrobot.cpp -> sinurobot.cpp ja testrobot.h -> sinurobot.h
  • Muuta failid sinurobot.cpp sinurobot.h Makefile robotfactory.h

sinurobot.cpp

TestRobot asendada SinuRobot

#include "testrobot.h" -> #include "sinurobot.h"

sinurobot.h

#ifndef TESTROBOT_H -> #ifndef SINUROBOT_H
#define TESTROBOT_H -> #define SINUROBOT_H

Ja asendada kõik TestRobot SinuRobot'iga

Autorid ja ajalugu

  • Vers 1 - Linux, SDL ja Framegrab teekide baasil loodud rakendus. Autorid Jaan Oras, Margus Ernits
  • Vers 2 - Linux, SDL ja V4L v1 teekide baasil. Autorid Juri Prokofjev, Margus Ernits
  • Vers 3 - Linux, OpenCV. Autorid Valdur Kaldvee, Margus Ernits. Mikk Mangus, Mart Mangus ja teised
  • Vers 2009 - Linux, OpenCV. Autorid Valdur Kaldvee, Margus Ernits, Madis Toom, Janek Sarjas, Mikk Pärast
  • Pooleli Vers 2010 - Linux, OpenCV. Autorid Valdur Kaldvee, Margus Ernits, Mikk Pärast, Mauno Pihelgas