|
|
Badania wstępne
Projekt polegał na zbadaniu aktualnych właściwości jezdnych robotów pod kątem dokładności realizacji zadanej trajektorii(czy roboty jadą tak daleko i skręcają o tyle, ile im się rozkaże), a następnie na eksperymentalnym dobraniu kilku parametrów kalibracyjnych tak, aby roboty jeździły jak najdokładniej w stosunku do do wydanych im poleceń.
Pomimo faktu, że pracowaliśmy nad projektem indywidualnym, wykonanie go w jednoosobowym zespole byłoby zdecydowanie trudniejsze z racji trudności w dokonywaniu pomiarów przy jednoczesnej obsłudze robota.
Badania wstępne:
Aby rozpocząć pracę nad projektem, najpierw należało zapoznać się ze środowiskiem pracy. Polegało to na zaznajomieniu się z ARIA(Advanced Robotics Interface for Applications), ogólnymi zagadnieniami dotyczącymi sterowaniem robotem oraz z wykorzystaniem środowiska Visual Studio 2005 do pisania aplikacji w języku C++ odpowiedzialnej za poruszanie się robotem.
Połączenie z robotem odbywa się przez skorzystanie z usługi zdalnego pulpitu.
Robot1 IP 10.44.29.21
Robot2 IP 10.44.29.19
ARIA umożliwia bezpośrednie sterowanie ruchami robota za pomocą odpowiednich komend, bądź odpowiednich klawiszy. Klawiszologia ukazywana jest na ekranie zaraz po uruchomieniu ARIA.
Korzystając z biblioteki Aria byliśmy w stanie napisać aplikację w C++, umożliwiającą sterowanie robotem i wykonanie kilku czynności w kolejności, co umożliwiło wykonanie testu do jazdy po kwadracie o zadanym boku.
Przykładowy fragment kodu programu:
void setKeyUp(int k)
{
ArFunctorC *fun = new ArFunctorC (this,&SterowanieRobotem::UpDistance);
key->addKeyHandler(k,fun);
}
void setKeyDown(int k)
{
ArFunctorC *fun = new ArFunctorC (this,&SterowanieRobotem::DownDistance);
key->addKeyHandler(k,fun);
}
void setKeyLeft(int k)
{
ArFunctorC *fun = new ArFunctorC (this,&SterowanieRobotem::LeftTurn);
key->addKeyHandler(k,fun);
}
void setKeyRight(int k)
{
ArFunctorC *fun = new ArFunctorC (this,&SterowanieRobotem::RightTurn);
key->addKeyHandler(k,fun);
}
void setKeyStop(int k)
{
ArFunctorC *fun = new ArFunctorC (this,&SterowanieRobotem::Stop);
key->addKeyHandler(k,fun);
}
void setKeyKwadrat(int k)
{
ArFunctorC *fun = new ArFunctorC (this,&SterowanieRobotem::Kwadrat);
key->addKeyHandler(k,fun);
}
(...)
void UpDistance()
{
robot->move(1000);
}
void DownDistance()
{
robot->move(-1000);
}
void Kwadrat()
{
robot->move(2000);
ArUtil::sleep(500);
robot->setDeltaHeading(90);
ArUtil::sleep(500);
robot->move(2000);
ArUtil::sleep(500);
robot->setDeltaHeading(90);
ArUtil::sleep(500);
robot->move(2000);
ArUtil::sleep(500);
robot->setDeltaHeading(90);
ArUtil::sleep(500);
robot->move(2000);
ArUtil::sleep(500);
robot->setDeltaHeading(90);
ArUtil::sleep(500);
}
void LeftTurn()
{
robot->setDeltaHeading(90);
}
void RightTurn()
{
robot->setDeltaHeading(-90);
}
(...)
int main(int argc,char * argv[])
{
Aria::init();
ArKeyHandler *Globalkey = new ArKeyHandler();
SterowanieRobotem *r1 = new SterowanieRobotem();
r1->setArKeyHandler(Globalkey);
r1->setKeyUp('w');
r1->setKeyDown('s');
r1->setKeyLeft('a');
r1->setKeyRight('d');
r1->setKeyKwadrat('k');
r1->setKeyStop(ArKeyHandler::SPACE);
r1->setKeyUpDistance('y');
r1->setKeyDownDistance('h');
r1->setKeyLeftTurn('g');
r1->setKeyRightTurn('j');
r1->setKeyReset('r');
r1->addArActionRatioInput();
r1->startUp();
while(1){
Globalkey->checkKeys();
//Globalkey->
ArUtil::sleep(500);
}
Aria::shutdown();
return 0;
}
|
|
|
|