1 #include "header/missionManager.h" 17 int main(
int argc,
char **argv)
20 std::cout <<
"[MISSION_MANAGER] Please insert the two robots name"<< std::endl;
23 std::string robotName = argv[1];
24 std::string otherRobotName = argv[2];
26 if (LOG && (argc > 3)){
32 ros::init(argc, argv, robotName +
"_MissionManager");
33 std::cout <<
"[" << robotName <<
"][MISSION_MANAGER] Start" << std::endl;
43 double goalLinearVect[] = {-0.287, -0.090, 8};
45 Eigen::Matrix4d wTgoalVeh_eigen = Eigen::Matrix4d::Identity();
47 wTgoalVeh_eigen.topLeftCorner(3,3) = Eigen::Matrix3d::Identity();
49 wTgoalVeh_eigen(0, 3) = goalLinearVect[0];
50 wTgoalVeh_eigen(1, 3) = goalLinearVect[1];
51 wTgoalVeh_eigen(2, 3) = goalLinearVect[2];
54 double goalLinearVectEE[3];
55 if (robotName.compare(
"g500_A") == 0){
56 goalLinearVectEE[0] = 2.89;
57 goalLinearVectEE[1] = -0.090;
58 goalLinearVectEE[2] = 9.594;
61 goalLinearVectEE[0] = -1.11;
62 goalLinearVectEE[1] = -0.090;
63 goalLinearVectEE[2] = 9.594;
65 Eigen::Matrix4d wTgoalEE_eigen = Eigen::Matrix4d::Identity();
69 wTgoalEE_eigen.topLeftCorner(3,3) << 0, -1, 0,
73 wTgoalEE_eigen(0, 3) = goalLinearVectEE[0];
74 wTgoalEE_eigen(1, 3) = goalLinearVectEE[1];
75 wTgoalEE_eigen(2, 3) = goalLinearVectEE[2];
82 double goalLinearVectTool[] = {-0.27, -1.102, 9.000};
84 Eigen::Matrix4d wTgoalTool_eigen = Eigen::Matrix4d::Identity();
87 wTgoalTool_eigen.topLeftCorner<3,3>() << 0, 1, 0,
94 wTgoalTool_eigen(0, 3) = goalLinearVectTool[0];
95 wTgoalTool_eigen(1, 3) = goalLinearVectTool[1];
96 wTgoalTool_eigen(2, 3) = goalLinearVectTool[2];
106 robInfo.transforms.wTgoalVeh_eigen = wTgoalVeh_eigen;
107 robInfo.transforms.wTgoalEE_eigen = wTgoalEE_eigen;
108 robInfo.transforms.wTgoalTool_eigen = wTgoalTool_eigen;
109 robInfo.robotState.
vehicleVel.resize(VEHICLE_DOF);
115 robotInterface.init();
119 std::string toolName;
120 if (robotName.compare(
"g500_A") == 0){
126 worldInterface.waitReady(toolName);
129 VisionInterfaceMissMan visionInterface(nh, robotName);
134 std::string filenamePeg;
136 if (robotName.compare(
"g500_A") == 0){
137 filenamePeg =
"/home/tori/UWsim/Peg/model/g500ARM5APeg.urdf";
139 filenamePeg =
"/home/tori/UWsim/Peg/model/g500ARM5BPeg.urdf";
141 std::string vehicle =
"base_link";
142 std::string link0 =
"part0";
143 std::string endEffector =
"end_effector";
146 KDLHelper kdlHelper(filenamePeg, link0, endEffector,
"");
148 kdlHelper.setEESolvers();
151 kdlHelper.getFixedFrame(vehicle, link0, &(robInfo.robotStruct.vTlink0));
155 robotInterface.getJointState(&(robInfo.robotState.jState));
156 robotInterface.getwTv(&(robInfo.robotState.
wTv_eigen));
158 worldInterface.getwT(&(robInfo.transforms.wTt_eigen), toolName);
160 worldInterface.getwPos(&(robInfo.exchangedInfo.otherRobPos), otherRobotName);
168 kdlHelper.getEEpose(robInfo.robotState.jState, &(robInfo.robotState.link0Tee_eigen));
170 robInfo.robotState.vTee_eigen = robInfo.robotStruct.vTlink0 * robInfo.robotState.link0Tee_eigen;
172 kdlHelper.getJacobianEE(robInfo.robotState.jState, &(robInfo.robotState.
link0_Jee_man));
174 computeWholeJacobianEE(&robInfo);
179 Eigen::Matrix4d eeTtool =
180 FRM::invertTransf(robInfo.robotState.
wTv_eigen*robInfo.robotState.vTee_eigen)
181 * robInfo.transforms.wTt_eigen;
182 kdlHelper.setToolSolvers(eeTtool);
184 kdlHelper.getJacobianTool(robInfo.robotState.jState, &(robInfo.robotState.v_Jtool_man));
185 computeWholeJacobianTool(&robInfo);
193 std::vector<Task*> tasksTPIK1;
194 std::vector<Task*> tasksCoop;
195 std::vector<Task*> tasksArmVehCoord;
196 setTaskLists(robotName, &tasksTPIK1, &tasksCoop, &tasksArmVehCoord);
206 if (pathLog.size() > 0){
207 logger =
Logger(robotName, pathLog);
210 logger.createTasksListDirectories(tasksTPIK1);
211 logger.createTasksListDirectories(tasksCoop);
221 boost::asio::io_service ioinit;
222 std::cout <<
"[" << robotName <<
"][MISSION_MANAGER] Wating for "<<
223 "Coordinator to say I can start...\n";
224 while(!coordInterface.getStartFromCoord()){
225 boost::asio::deadline_timer loopRater(ioinit, boost::posix_time::milliseconds(msinit));
226 coordInterface.pubIamReadyOrNot(
true);
232 std::cout <<
"[" << robotName<<
"][MISSION_MANAGER] Start from coordinator "<<
240 boost::asio::io_service io;
241 boost::asio::io_service io2;
251 boost::asio::deadline_timer loopRater(io, boost::posix_time::milliseconds(ms));
254 robotInterface.getJointState(&(robInfo.robotState.jState));
255 robotInterface.getwTv(&(robInfo.robotState.
wTv_eigen));
256 worldInterface.getwT(&(robInfo.transforms.wTt_eigen), toolName);
257 worldInterface.getwPos(&(robInfo.exchangedInfo.otherRobPos), otherRobotName);
258 visionInterface.getHoleTransform(&(robInfo.transforms.wTholeEstimated_eigen));
265 kdlHelper.getEEpose(robInfo.robotState.jState, &(robInfo.robotState.link0Tee_eigen));
267 robInfo.robotState.vTee_eigen = robInfo.robotStruct.vTlink0 * robInfo.robotState.link0Tee_eigen;
269 kdlHelper.getJacobianEE(robInfo.robotState.jState, &(robInfo.robotState.
link0_Jee_man));
270 computeWholeJacobianEE(&robInfo);
272 Eigen::Matrix4d eeTtool =
273 FRM::invertTransf(robInfo.robotState.
wTv_eigen*robInfo.robotState.vTee_eigen)
274 * robInfo.transforms.wTt_eigen;
276 kdlHelper.setToolSolvers(eeTtool);
277 kdlHelper.getJacobianTool(robInfo.robotState.jState, &(robInfo.robotState.v_Jtool_man));
278 computeWholeJacobianTool(&robInfo);
281 controller.updateMultipleTasksMatrices(tasksTPIK1, &robInfo);
282 std::vector<double> yDotTPIK1 = controller.execAlgorithm(tasksTPIK1);
284 std::vector<double> yDotFinal(TOT_DOF);
287 Eigen::Matrix<double, VEHICLE_DOF, 1> nonCoopCartVel_eigen =
288 robInfo.robotState.w_Jtool_robot * CONV::vector_std2Eigen(yDotTPIK1);
290 Eigen::Matrix<double, VEHICLE_DOF, VEHICLE_DOF> admisVelTool_eigen =
291 robInfo.robotState.w_Jtool_robot * FRM::pseudoInverse(robInfo.robotState.w_Jtool_robot);
294 coordInterface.publishToCoord(nonCoopCartVel_eigen, admisVelTool_eigen);
296 while (coordInterface.getCoopCartVel(&(robInfo.exchangedInfo.coopCartVel)) == 1){
297 boost::asio::deadline_timer loopRater2(io2, boost::posix_time::milliseconds(1));
302 controller.updateMultipleTasksMatrices(tasksCoop, &robInfo);
303 std::vector<double> yDotOnlyVeh = controller.execAlgorithm(tasksCoop);
306 controller.updateMultipleTasksMatrices(tasksArmVehCoord, &robInfo);
307 std::vector<double> yDotOnlyArm = controller.execAlgorithm(tasksArmVehCoord);
309 for (
int i=0; i<ARM_DOF; i++){
310 yDotFinal.at(i) = yDotOnlyArm.at(i);
314 for (
int i = ARM_DOF; i<TOT_DOF; i++) {
315 yDotFinal.at(i) = yDotOnlyVeh.at(i);
317 robInfo.robotState.
vehicleVel.at(i-ARM_DOF) = yDotFinal.at(i);
326 robotInterface.sendyDot(yDotFinal);
330 if (pathLog.size() != 0){
331 logger.logAllForTasks(tasksTPIK1);
335 logger.logNumbers(yDotTPIK1,
"yDotTPIK1");
336 logger.logNumbers(yDotFinal,
"yDotFinal");
338 logger.logNumbers(robInfo.robotState.w_Jtool_robot
339 * CONV::vector_std2Eigen(yDotOnlyVeh),
"toolCartVelCoop");
379 controller.resetAllUpdatedFlags(tasksTPIK1);
380 controller.resetAllUpdatedFlags(tasksCoop);
381 controller.resetAllUpdatedFlags(tasksArmVehCoord);
402 coordInterface.pubIamReadyOrNot(
false);
405 deleteTasks(&tasksArmVehCoord);
412 void setTaskLists(std::string robotName, std::vector<Task*> *tasks1,
413 std::vector<Task*> *tasksCoord, std::vector<Task*> *tasksArmVeh){
416 bool ineqType =
false;
420 Task* coopTask6dof =
new CoopTask(6, eqType, robotName);
421 Task* coopTask5dof =
new CoopTask(5, eqType, robotName);
450 tasks1->push_back(jl);
451 tasks1->push_back(ha);
453 tasks1->push_back(pr6);
458 tasks1->push_back(shape);
459 tasks1->push_back(last);
469 tasksCoord->push_back(coopTask6dof);
470 tasksCoord->push_back(jl);
471 tasksCoord->push_back(ha);
474 tasksCoord->push_back(shape);
475 tasksCoord->push_back(last);
477 tasksArmVeh->push_back(coopTask6dof);
478 tasksArmVeh->push_back(constrainVel);
479 tasksArmVeh->push_back(jl);
480 tasksArmVeh->push_back(ha);
483 tasksArmVeh->push_back(shape);
484 tasksArmVeh->push_back(last);
493 void deleteTasks(std::vector<Task*> *tasks){
494 for (std::vector< Task* >::iterator it = tasks->begin() ; it != tasks->end(); ++it)
512 void setTaskLists(std::string robotName, std::vector<Task*> *tasks){
517 bool ineqType =
false;
530 tasks->push_back(
new PipeReachTask(5, eqType, robotName, BOTH));
533 tasks->push_back(
new ArmShapeTask(4, ineqType, robotName, MID_LIMITS));
535 tasks->push_back(
new LastTask(TOT_DOF, eqType, robotName));
538 void setTaskLists(std::string robotName, std::vector<Task*> *tasks1, std::vector<Task*> *tasksFinal){
541 bool ineqType =
false;
545 Task* coopTask6dof =
new CoopTask(6, eqType, robotName);
546 Task* coopTask5dof =
new CoopTask(5, eqType, robotName);
570 tasks1->push_back(jl);
571 tasks1->push_back(ha);
572 tasks1->push_back(pr5);
575 tasks1->push_back(last);
577 tasksFinal->push_back(coopTask5dof);
581 tasksFinal->push_back(last);
The Controller class is responsabile of 1) taking matrices and giving them to Tasks classes...
std::vector< double > vehicleVel
vehicle and joint
robotInterface: a ros node responsible of taken info from simulator and robot sensors, and of given commands back. It is the intermiate layer between actual robot and mission manager ("main")
"Fake" Task needed as last to algorithm, it has all fixed matrices of eye and zeros so no setxx are n...
The ObstacleAvoidEETask class Usage of this task can be for avoiding with the end effector...
The vehicleConstrainVelTask class This task is a non-reactive one used to to constrain the velocities...
The CoordInterface class class to deal with ros comunications (pub/sub) from MissionManager node to C...
Task to make the end effector reach a goal (both linear and angular position)
Task to make the vehicle reach a goal (both linear and angular position)
The WorldInterface class to get position from world to anything else.
Eigen::Matrix< double, 6, ARM_DOF > link0_Jee_man
Jacobians.
Eigen::Matrix4d wTv_eigen
Transforms.
The ArmShapeTask class Preferred arm Shape: an optimization task. It is a non scalar task...
ABSTRACT class task. Each task is a derived class of this class. It contains all the variable that th...