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;
42 double goalLinearVect[] = {-0.287, -0.090, 8};
44 Eigen::Matrix4d wTgoalVeh_eigen = Eigen::Matrix4d::Identity();
46 wTgoalVeh_eigen.topLeftCorner(3,3) = Eigen::Matrix3d::Identity();
48 wTgoalVeh_eigen(0, 3) = goalLinearVect[0];
49 wTgoalVeh_eigen(1, 3) = goalLinearVect[1];
50 wTgoalVeh_eigen(2, 3) = goalLinearVect[2];
53 double goalLinearVectEE[3];
54 if (robotName.compare(
"g500_A") == 0){
55 goalLinearVectEE[0] = 2.89;
56 goalLinearVectEE[1] = -0.090;
57 goalLinearVectEE[2] = 9.594;
60 goalLinearVectEE[0] = -1.11;
61 goalLinearVectEE[1] = -0.090;
62 goalLinearVectEE[2] = 9.594;
64 Eigen::Matrix4d wTgoalEE_eigen = Eigen::Matrix4d::Identity();
68 wTgoalEE_eigen.topLeftCorner(3,3) << 0, -1, 0,
72 wTgoalEE_eigen(0, 3) = goalLinearVectEE[0];
73 wTgoalEE_eigen(1, 3) = goalLinearVectEE[1];
74 wTgoalEE_eigen(2, 3) = goalLinearVectEE[2];
79 double goalLinearVectTool[] = {0.9999999999999999, -9.999999999999998, 8.378840300977453};
81 std::vector<double> eulRadTrue = {0, 0, -1.443185307179587};
82 std::vector<double> eulRad = {0, 0.0, -1.443185307179587};
83 Eigen::Matrix4d wTgoalTool_eigen = Eigen::Matrix4d::Identity();
89 wTgoalTool_eigen.topLeftCorner<3,3>() = FRM::eul2Rot(eulRad);
92 Eigen::Vector3d v_inside;
94 v_inside << 0.20, 0, 0;
95 Eigen::Vector3d w_inside = FRM::eul2Rot(eulRadTrue) * v_inside;
98 wTgoalTool_eigen(0, 3) = goalLinearVectTool[0] + w_inside(0);
99 wTgoalTool_eigen(1, 3) = goalLinearVectTool[1] + w_inside(1);
100 wTgoalTool_eigen(2, 3) = goalLinearVectTool[2] + w_inside(2);
110 robInfo.transforms.wTgoalVeh_eigen = wTgoalVeh_eigen;
111 robInfo.transforms.wTgoalEE_eigen = wTgoalEE_eigen;
112 robInfo.transforms.wTgoalTool_eigen = wTgoalTool_eigen;
113 robInfo.robotState.
vehicleVel.resize(VEHICLE_DOF);
119 robotInterface.init();
122 worldInterface.waitReady(
"world", otherRobotName);
125 robotInterface.getJointState(&(robInfo.robotState.jState));
126 robotInterface.getwTv(&(robInfo.robotState.
wTv_eigen));
127 worldInterface.getwPos(&(robInfo.exchangedInfo.otherRobPos), otherRobotName);
130 if (robotName.compare(
"g500_A") == 0){
131 worldInterface.getwT(&(robInfo.transforms.wTotherPeg),
135 worldInterface.getwT(&(robInfo.transforms.wTotherPeg),
144 std::string filenamePeg;
146 if (robotName.compare(
"g500_A") == 0){
147 filenamePeg =
"/home/tori/UWsim/Peg/model/g500ARM5APeg2.urdf";
149 filenamePeg =
"/home/tori/UWsim/Peg/model/g500ARM5BPeg2.urdf";
151 std::string vehicle =
"base_link";
152 std::string link0 =
"part0";
153 std::string endEffector =
"end_effector";
154 std::string peg =
"peg";
155 std::string pegHead =
"pegHead";
157 KDLHelper kdlHelper(filenamePeg, link0, endEffector, vehicle, pegHead);
160 kdlHelper.getFixedFrame(vehicle, link0, &(robInfo.robotStruct.vTlink0));
163 kdlHelper.getFixedFrame(endEffector, pegHead, &(robInfo.robotStruct.eeTtoolTip));
168 Eigen::Vector3d forceNotSat;
169 Eigen::Vector3d torqueNotSat;
170 robotInterface.getForceTorque(&forceNotSat, &torqueNotSat);
171 robInfo.robotSensor.forcePegTip = FRM::saturateVectorEigen(forceNotSat, 5);
172 robInfo.robotSensor.torquePegTip = FRM::saturateVectorEigen(torqueNotSat, 5);
174 kdlHelper.setEESolvers();
176 kdlHelper.getEEpose(robInfo.robotState.jState, &(robInfo.robotState.link0Tee_eigen));
178 robInfo.robotState.vTee_eigen = robInfo.robotStruct.vTlink0 * robInfo.robotState.link0Tee_eigen;
180 kdlHelper.getJacobianEE(robInfo.robotState.jState, &(robInfo.robotState.
link0_Jee_man));
182 computeWholeJacobianEE(&robInfo);
186 kdlHelper.setToolSolvers();
187 kdlHelper.getJacobianTool(robInfo.robotState.jState, &(robInfo.robotState.v_Jtool_man));
188 computeWholeJacobianTool(&robInfo);
190 robInfo.transforms.wTt_eigen = robInfo.robotState.
wTv_eigen *
191 robInfo.robotState.vTee_eigen * robInfo.robotStruct.eeTtoolTip;
199 std::vector<Task*> tasksTPIK1;
200 std::vector<Task*> tasksCoop;
201 std::vector<Task*> tasksArmVehCoord;
202 setTaskLists(robotName, &tasksTPIK1, &tasksCoop, &tasksArmVehCoord);
213 if (pathLog.size() > 0){
214 logger =
Logger(robotName, pathLog);
217 logger.createTasksListDirectories(tasksTPIK1);
218 logger.createTasksListDirectories(tasksCoop);
228 boost::asio::io_service ioinit;
229 std::cout <<
"[" << robotName <<
"][MISSION_MANAGER] Wating for "<<
230 "Coordinator to say I can start...\n";
231 while(!coordInterface.getStartFromCoord()){
232 boost::asio::deadline_timer loopRater(ioinit, boost::posix_time::milliseconds(msinit));
233 coordInterface.pubIamReadyOrNot(
true);
234 if (coordInterface.getUpdatedGoal(&(robInfo.transforms.wTgoalTool_eigen)) == 0) {
235 std::cout <<
"[" << robotName <<
"][MISSION_MANAGER] Arrived goal from coordinator!\n";
242 std::cout <<
"[" << robotName<<
"][MISSION_MANAGER] Start from coordinator "<<
249 int ms = MS_CONTROL_LOOP;
250 boost::asio::io_service io;
251 boost::asio::io_service io2;
263 boost::asio::deadline_timer loopRater(io, boost::posix_time::milliseconds(ms));
266 robotInterface.getJointState(&(robInfo.robotState.jState));
267 robotInterface.getwTv(&(robInfo.robotState.
wTv_eigen));
268 worldInterface.getwPos(&(robInfo.exchangedInfo.otherRobPos), otherRobotName);
272 if (robotName.compare(
"g500_A") == 0){
273 worldInterface.getwT(&(robInfo.transforms.wTotherPeg),
"g500_B/eeA");
275 worldInterface.getwT(&(robInfo.transforms.wTotherPeg),
"g500_A/eeB");
280 robotInterface.getForceTorque(&forceNotSat, &torqueNotSat);
283 robInfo.robotSensor.forcePegTip = forceNotSat;
284 robInfo.robotSensor.torquePegTip = torqueNotSat;
292 kdlHelper.getEEpose(robInfo.robotState.jState, &(robInfo.robotState.link0Tee_eigen));
294 robInfo.robotState.vTee_eigen = robInfo.robotStruct.vTlink0 * robInfo.robotState.link0Tee_eigen;
295 robInfo.transforms.wTt_eigen = robInfo.robotState.
wTv_eigen *
296 robInfo.robotState.vTee_eigen * robInfo.robotStruct.eeTtoolTip;
299 kdlHelper.getJacobianEE(robInfo.robotState.jState, &(robInfo.robotState.
link0_Jee_man));
300 computeWholeJacobianEE(&robInfo);
303 kdlHelper.getJacobianTool(robInfo.robotState.jState, &(robInfo.robotState.v_Jtool_man));
304 computeWholeJacobianTool(&robInfo);
311 if (coordInterface.getUpdatedGoal(&(robInfo.transforms.wTgoalTool_eigen)) == 0) {
322 controller.updateMultipleTasksMatrices(tasksTPIK1, &robInfo);
324 std::vector<double> yDotTPIK1 = controller.execAlgorithm(tasksTPIK1);
326 std::vector<double> yDotFinal(TOT_DOF);
329 Eigen::Matrix<double, VEHICLE_DOF, 1> nonCoopCartVel_eigen =
330 robInfo.robotState.w_Jtool_robot * CONV::vector_std2Eigen(yDotTPIK1);
332 Eigen::Matrix<double, VEHICLE_DOF, VEHICLE_DOF> admisVelTool_eigen =
333 robInfo.robotState.w_Jtool_robot * FRM::pseudoInverse(robInfo.robotState.w_Jtool_robot);
335 coordInterface.publishToCoord(nonCoopCartVel_eigen, admisVelTool_eigen);
337 while (coordInterface.getCoopCartVel(&(robInfo.exchangedInfo.coopCartVel)) == 1){
338 boost::asio::deadline_timer loopRater2(io2, boost::posix_time::milliseconds(1));
343 controller.updateMultipleTasksMatrices(tasksCoop, &robInfo);
344 std::vector<double> yDotOnlyVeh = controller.execAlgorithm(tasksCoop);
347 controller.updateMultipleTasksMatrices(tasksArmVehCoord, &robInfo);
348 std::vector<double> yDotOnlyArm = controller.execAlgorithm(tasksArmVehCoord);
350 for (
int i=0; i<ARM_DOF; i++){
351 yDotFinal.at(i) = yDotOnlyArm.at(i);
354 for (
int i = ARM_DOF; i<TOT_DOF; i++) {
355 yDotFinal.at(i) = yDotOnlyVeh.at(i);
357 robInfo.robotState.
vehicleVel.at(i-ARM_DOF) = yDotFinal.at(i);
361 std::vector<double> deltayDotTot(TOT_DOF);
363 std::vector<double> yDotFinalWithCollision(TOT_DOF);
364 yDotFinalWithCollision = yDotFinal;
365 if (COLLISION_PROPAGATOR){
366 if (robotName.compare(
"g500_A") == 0){
368 if (robInfo.robotSensor.forcePegTip.norm() > 0 ||
369 robInfo.robotSensor.torquePegTip.norm() > 0){
371 deltayDotTot = CollisionPropagator::calculateCollisionDisturbArmVeh(robInfo.robotState.w_Jtool_robot,
372 robInfo.transforms.wTt_eigen, robInfo.robotSensor.forcePegTip, robInfo.robotSensor.torquePegTip);
374 for (
int i=0; i<ARM_DOF; i++){
375 deltayDotTot.at(i) *= 0.00005;
376 yDotFinalWithCollision.at(i) += deltayDotTot.at(i);
379 for (
int i=ARM_DOF; i<TOT_DOF; i++){
380 deltayDotTot.at(i) *= 0.0001;
381 yDotFinalWithCollision.at(i) += deltayDotTot.at(i);
403 std::vector<double> yDotFinalWithGrasp = yDotFinalWithCollision;
404 std::vector<double> graspyDot(TOT_DOF);
406 if (GRASP_CONSTRAINER){
408 if (robotName.compare(
"g500_B") == 0){
417 robInfo.robotState.w_Jtool_robot,
418 robInfo.transforms.wTotherPeg,
419 robInfo.robotState.
wTv_eigen * robInfo.robotState.vTee_eigen);
422 for (
int i=0; i<graspyDot.size(); i++){
423 yDotFinalWithGrasp.at(i) += graspyDot.at(i);
444 robotInterface.sendyDot(yDotFinalWithGrasp);
449 if (pathLog.size() != 0){
450 logger.logAllForTasks(tasksArmVehCoord);
451 logger.logNumbers(tasksArmVehCoord.at(4)->getJacobian(),
"forceJacob");
455 logger.logNumbers(yDotTPIK1,
"yDotTPIK1");
456 logger.logNumbers(yDotFinal,
"yDotFinal");
457 logger.logNumbers(yDotFinalWithCollision,
"yDotFinalWithCollision");
458 logger.logNumbers(robInfo.robotSensor.forcePegTip,
"forces");
459 logger.logNumbers(robInfo.robotSensor.torquePegTip,
"torques");
460 logger.logNumbers(robInfo.robotState.w_Jtool_robot *
461 CONV::vector_std2Eigen(deltayDotTot),
"toolVel4Collision");
462 logger.logNumbers(robInfo.robotState.w_Jtool_robot *
463 CONV::vector_std2Eigen(graspyDot),
"toolVel4Grasp");
465 logger.logNumbers(robInfo.robotState.w_Jtool_robot
466 * CONV::vector_std2Eigen(yDotOnlyVeh),
"toolCartVelCoop");
506 controller.resetAllUpdatedFlags(tasksTPIK1);
507 controller.resetAllUpdatedFlags(tasksCoop);
508 controller.resetAllUpdatedFlags(tasksArmVehCoord);
529 coordInterface.pubIamReadyOrNot(
false);
532 deleteTasks(&tasksArmVehCoord);
547 void setTaskLists(std::string robotName, std::vector<Task*> *tasks1,
548 std::vector<Task*> *tasksCoord, std::vector<Task*> *tasksArmVeh){
551 bool ineqType =
false;
555 Task* coopTask6dof =
new CoopTask(6, eqType, robotName);
587 tasks1->push_back(jl);
588 tasks1->push_back(ha);
590 tasks1->push_back(forceInsert);
591 tasks1->push_back(pr6);
598 tasks1->push_back(shape);
599 tasks1->push_back(last);
609 tasksCoord->push_back(coopTask6dof);
610 tasksCoord->push_back(jl);
611 tasksCoord->push_back(ha);
612 tasksCoord->push_back(forceInsert);
613 tasksCoord->push_back(pr6);
616 tasksCoord->push_back(shape);
617 tasksCoord->push_back(last);
619 tasksArmVeh->push_back(coopTask6dof);
620 tasksArmVeh->push_back(constrainVel);
621 tasksArmVeh->push_back(jl);
622 tasksArmVeh->push_back(ha);
623 tasksArmVeh->push_back(forceInsert);
624 tasksArmVeh->push_back(pr6);
627 tasksArmVeh->push_back(shape);
628 tasksArmVeh->push_back(last);
637 void deleteTasks(std::vector<Task*> *tasks){
638 for (std::vector< Task* >::iterator it = tasks->begin() ; it != tasks->end(); ++it)
The Controller class is responsabile of 1) taking matrices and giving them to Tasks classes...
std::vector< double > vehicleVel
vehicle and joint
The ForceInsertTask class to help the inserting phase with force torque sensor this task is to genera...
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...
static std::vector< double > calculateGraspVelocities_armVeh(Eigen::Matrix< double, 6, TOT_DOF > w_Jee_robot, Eigen::Matrix4d wTotherPeg, Eigen::Matrix4d wTee)
calculateGraspVelocities_armVeh for effect of firm grasp on the arm and on the vehicle ...
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...
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...