200 likes | 328 Views
Control and Supervision of a Team of Robots. --Alberto Valero. Interface Server. The RAgent figure. Robot Client. Navig. Mapper. Web Services. REPOSITORY. A generic example in some detail. Robot Client. ScanMatcher. Mapper. Interface Server. getMap(). getPose(). getLaser().
E N D
Control and Supervision of a Team of Robots --Alberto Valero
InterfaceServer The RAgent figure... Robot Client Navig. Mapper Web Services REPOSITORY
A generic example in some detail Robot Client ScanMatcher Mapper InterfaceServer getMap() getPose() getLaser() setSpeed() setJog() Laser Robot Pose Map Speed Jog
The Classical Hierarchical Model Exploration Target Pose Path Planning Path Navigation Speed & Jog Motion executer Motion commands
Exploration Target Pose Path Planning Path Navigation Speed & Jog Motion executer Motion commands Hierarchical HRI
Let’s see it! Robot Client Navig. Mapper InterfaceServer REPOSITORY
The module structure Robot Client ScanMatcher Mapper InterfaceServer getMap() Navigator Path Planner Exploration getPose() InterfaceClient ExplorationAlert getLaser() AutonomyManager UnblockModule setSpeed() StallCondition setJog() Path Alert
Interface Client and Server InterfaceClient InterfaceServer getMap() getPose() currentPath() getLaser() currentTargetPose() setSpeed() robotStalled() setJog() victimFound() robotStatus() register(url) http://192.168.1.1:9871
Some code (I) #define PROPERTY_LASER_DATA "in/laserData" #define PROPERTY_DESIRED_SPEED_INPUT "in/speed" #define PROPERTY_DESIRED_JOG_INPUT "in/jog" #define PROPERTY_DESIRED_SPEED "out/desiredSpeed" #define PROPERTY_DESIRED_JOG "out/desiredJog“
Some code (II) bool SafeTeleOperationModule::initConfigurationProperties() { SESSION_TRY_START(session) session->createStorage("RLaserData",PROPERTY_LASER_DATA,"Robot Laser Readings (link in)"); session->createDouble(PROPERTY_JOG, "Robot Jog (please link)", RDouble::RAD_SEC); 1.0); session->createDouble(PROPERTY_DESIRED_SPEED, "Robot Desired speed (please link)", RDouble::M_SEC, 0.0); session->createDouble(PROPERTY_DESIRED_JOG, "Robot Desired Jog (please link)", RDouble::RAD_SEC, 0.0); session->createDouble(PROPERTY_DESIRED_SPEED_INPUT, "Robot Desired speed (please link)", RDouble::M_SEC, 0.0); session->createDouble(PROPERTY_DESIRED_JOG_INPUT, "Robot Desired Jog (please link)", RDouble::RAD_SEC, 0.0); SESSION_END(session) return true; SESSION_CATCH_TERMINATE(session) return false; }
Some code (III) bool SafeTeleOperationModule::init() { SESSION_TRY_START(session) session->listen(PROPERTY_DESIRED_SPEED_INPUT); session->listen(PROPERTY_DESIRED_JOG_INPUT); SESSION_END(session) return true; SESSION_CATCH_TERMINATE(session) return false; }
Some code (and IV) void SafeTeleOperationModule::exec() { while (session->wait(), !exiting) { SESSION_TRY_START(session) session->lock(PROPERTY_LASER_DATA, HERE); RLaserData* laserData=session->getObjectAsL<RLaserData>(PROPERTY_LASER_DATA); int numOfPoints=laserData->points.size(); float minRange=DBL_MAX; for (int i=0; i<numOfPoints; i+=3){ if (minRange>laserData->points[i].reading) minRange=laserData->points[i].reading; session->unlock(PROPERTY_LASER_DATA); float desiredSpeed; if (minRange < 0.5){ desiredSpeed=0.0; }else{ desiredSpeed=session->getDouble(PROPERTY_DESIRED_SPEED_INPUT); } session->setDouble(PROPERTY_DESIRED_SPEED, desiredSpeed); SESSION_END_CATCH_TERMINATE(session) } }
Let’s complicate the System Single-User-Multiple-Robot Single-User-Robot-Team Single-User-Single-Robot
Single-User-Multiple-Robot InterfaceServer RobotClient InterfaceServer RobotClient REPOSITORY REPOSITORY
Single-User-Robot-Team TeamServer TeamCoordinator REPOSITORY InterfaceServer RobotClient InterfaceServer RobotClient REPOSITORY REPOSITORY cucciolo mammolo teamCoord/out/robot1TargetPose=@rdk2://cucciolo/navigator/in/targetPose teamCoord/out/robot2TargetPose=@rdk2://mammolo/navigator/in/targetPose
Example End Init