1 #include "header/missionManagerPeg.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 +
"_MissionManagerPeg");
33 std::cout <<
"[" << robotName <<
"][MISSION_MANAGERPEG] 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];
78 double goalLinearVectTool[] = {0.9999999999999999, -9.999999999999998, 8.378840300977453};
79 std::vector<double> eulRad = {0, 0, -1.443185307179587};
81 Eigen::Matrix4d wTgoalTool_eigen = Eigen::Matrix4d::Identity();
87 wTgoalTool_eigen.topLeftCorner<3,3>() = FRM::eul2Rot(eulRad);
89 Eigen::Vector3d v_inside;
91 v_inside << 0.20, 0, 0;
92 Eigen::Vector3d w_inside = FRM::eul2Rot(eulRad) * v_inside;
95 wTgoalTool_eigen(0, 3) = goalLinearVectTool[0] + w_inside(0);
96 wTgoalTool_eigen(1, 3) = goalLinearVectTool[1] + w_inside(1);
97 wTgoalTool_eigen(2, 3) = goalLinearVectTool[2] + w_inside(2);
99 std::cout <<
"GOALLLLL DEGUBE\n" << wTgoalTool_eigen <<
"\n\n\n";
109 robInfo.transforms.wTgoalVeh_eigen = wTgoalVeh_eigen;
110 robInfo.transforms.wTgoalEE_eigen = wTgoalEE_eigen;
111 robInfo.transforms.wTgoalTool_eigen = wTgoalTool_eigen;
112 robInfo.robotState.
vehicleVel.resize(VEHICLE_DOF);
118 robotInterface.init();
121 worldInterface.waitReady(
"world", otherRobotName);
124 robotInterface.getJointState(&(robInfo.robotState.jState));
125 robotInterface.getwTv(&(robInfo.robotState.
wTv_eigen));
126 worldInterface.getwPos(&(robInfo.exchangedInfo.otherRobPos), otherRobotName);
129 std::string filenamePeg;
131 if (robotName.compare(
"g500_A") == 0){
132 filenamePeg =
"/home/tori/UWsim/Peg/model/g500ARM5APeg2.urdf";
134 filenamePeg =
"/home/tori/UWsim/Peg/model/g500ARM5BPeg.urdf";
136 std::string vehicle =
"base_link";
137 std::string link0 =
"part0";
138 std::string endEffector =
"end_effector";
139 std::string peg =
"peg";
140 std::string pegHead =
"pegHead";
142 KDLHelper kdlHelper(filenamePeg, link0, endEffector, vehicle, pegHead);
145 kdlHelper.getFixedFrame(vehicle, link0, &(robInfo.robotStruct.vTlink0));
147 kdlHelper.getFixedFrame(endEffector, pegHead, &(robInfo.robotStruct.eeTtoolTip));
150 robotInterface.getForceTorque(&(robInfo.robotSensor.forcePegTip), &robInfo.robotSensor.torquePegTip);
152 kdlHelper.setEESolvers();
154 kdlHelper.getEEpose(robInfo.robotState.jState, &(robInfo.robotState.link0Tee_eigen));
156 robInfo.robotState.vTee_eigen = robInfo.robotStruct.vTlink0 * robInfo.robotState.link0Tee_eigen;
158 kdlHelper.getJacobianEE(robInfo.robotState.jState, &(robInfo.robotState.
link0_Jee_man));
160 computeWholeJacobianEE(&robInfo);
162 kdlHelper.setToolSolvers();
163 kdlHelper.getJacobianTool(robInfo.robotState.jState, &(robInfo.robotState.v_Jtool_man));
164 computeWholeJacobianTool(&robInfo);
171 robInfo.transforms.wTt_eigen = robInfo.robotState.
wTv_eigen *
172 robInfo.robotState.vTee_eigen * robInfo.robotStruct.eeTtoolTip;
182 std::vector<Task*> tasksTPIK1;
183 std::vector<Task*> tasksCoop;
184 std::vector<Task*> tasksArmVehCoord;
185 setTaskLists(robotName, &tasksTPIK1, &tasksCoop, &tasksArmVehCoord);
195 if (pathLog.size() > 0){
196 logger =
Logger(robotName, pathLog);
199 logger.createTasksListDirectories(tasksTPIK1);
200 logger.createTasksListDirectories(tasksCoop);
212 int ms = MS_CONTROL_LOOP;
213 boost::asio::io_service io;
214 boost::asio::io_service io2;
224 boost::asio::deadline_timer loopRater(io, boost::posix_time::milliseconds(ms));
227 robotInterface.getJointState(&(robInfo.robotState.jState));
228 robotInterface.getwTv(&(robInfo.robotState.
wTv_eigen));
232 robotInterface.getForceTorque(&(robInfo.robotSensor.forcePegTip), &robInfo.robotSensor.torquePegTip);
233 robInfo.robotSensor.forcePegTip = FRM::saturateVectorEigen(robInfo.robotSensor.forcePegTip, 5);
234 robInfo.robotSensor.torquePegTip = FRM::saturateVectorEigen(robInfo.robotSensor.torquePegTip, 5);
238 std::cout <<
"force torque arrive:\n" 239 << robInfo.robotSensor.forcePegTip <<
"\n" 240 << robInfo.robotSensor.torquePegTip <<
"\n\n";
241 worldInterface.getwPos(&(robInfo.exchangedInfo.otherRobPos), otherRobotName);
245 kdlHelper.getEEpose(robInfo.robotState.jState, &(robInfo.robotState.link0Tee_eigen));
247 robInfo.robotState.vTee_eigen = robInfo.robotStruct.vTlink0 * robInfo.robotState.link0Tee_eigen;
248 robInfo.transforms.wTt_eigen = robInfo.robotState.
wTv_eigen *
249 robInfo.robotState.vTee_eigen * robInfo.robotStruct.eeTtoolTip;
251 kdlHelper.getJacobianEE(robInfo.robotState.jState, &(robInfo.robotState.
link0_Jee_man));
252 computeWholeJacobianEE(&robInfo);
255 kdlHelper.getJacobianTool(robInfo.robotState.jState, &(robInfo.robotState.v_Jtool_man));
256 computeWholeJacobianTool(&robInfo);
260 controller.updateMultipleTasksMatrices(tasksTPIK1, &robInfo);
262 std::vector<double> yDotTPIK1 = controller.execAlgorithm(tasksTPIK1);
264 std::vector<double> yDotFinal(TOT_DOF);
266 controller.updateMultipleTasksMatrices(tasksArmVehCoord, &robInfo);
267 std::vector<double> yDotOnlyArm = controller.execAlgorithm(tasksArmVehCoord);
269 for (
int i=0; i<ARM_DOF; i++){
270 yDotFinal.at(i) = yDotOnlyArm.at(i);
273 for (
int i = ARM_DOF; i<TOT_DOF; i++) {
274 yDotFinal.at(i) = yDotTPIK1.at(i);
276 robInfo.robotState.
vehicleVel.at(i-ARM_DOF) = yDotFinal.at(i);
280 std::vector<double> deltayDot(ARM_DOF);
281 std::vector<double> deltayDotVeh(VEHICLE_DOF);
282 std::vector<double> deltayDotTot(TOT_DOF);
283 std::vector<double> yDotFinalWithCollision = yDotFinal;
284 if (COLLISION_PROPAGATOR){
285 if (robInfo.robotSensor.forcePegTip.norm() > 0 || robInfo.robotSensor.torquePegTip.norm() > 0){
293 deltayDot = CollisionPropagator::calculateCollisionDisturb(
294 robInfo.robotState.w_Jtool_robot.leftCols<4>(), robInfo.transforms.wTt_eigen,
295 robInfo.robotSensor.forcePegTip, robInfo.robotSensor.torquePegTip);
297 for (
int i=0; i<ARM_DOF; i++){
298 yDotFinalWithCollision.at(i) += (0.001*deltayDot.at(i));
300 deltayDotTot.at(i)= 0.001*deltayDot.at(i);
305 deltayDotVeh = CollisionPropagator::calculateCollisionDisturbVeh(
306 robInfo.robotState.w_Jtool_robot.rightCols<6>(), robInfo.transforms.wTt_eigen,
307 robInfo.robotSensor.forcePegTip, robInfo.robotSensor.torquePegTip);
309 for (
int i=ARM_DOF; i<TOT_DOF; i++){
310 yDotFinalWithCollision.at(i) += (0.01 * deltayDotVeh.at(i-ARM_DOF));
311 deltayDotTot.at(i)= 0.01 * deltayDotVeh.at(i-ARM_DOF);
323 robotInterface.sendyDot(yDotFinal);
329 if (pathLog.size() != 0){
330 logger.logAllForTasks(tasksArmVehCoord);
334 logger.logNumbers(yDotTPIK1,
"yDotTPIK1");
335 logger.logNumbers(yDotFinal,
"yDotFinal");
336 logger.logNumbers(yDotFinalWithCollision,
"yDotFinalWithCollision");
337 logger.logNumbers(robInfo.robotSensor.forcePegTip,
"forces");
338 logger.logNumbers(robInfo.robotSensor.torquePegTip,
"torques");
339 logger.logNumbers(robInfo.robotState.w_Jtool_robot *
340 CONV::vector_std2Eigen(deltayDotTot),
"toolVel4Collision");
367 std::vector<Task*> tasksDebug = tasksArmVehCoord;
368 for(
int i=0; i<tasksDebug.size(); i++){
369 if (tasksDebug[i]->getName().compare(
"FORCE_INSERTION") == 0){
370 std::cout <<
"Activation " << tasksDebug[i]->getName() <<
": \n";
371 tasksDebug[i]->getActivation().PrintMtx() ;
373 std::cout <<
"JACOBIAN " << tasksDebug[i]->getName() <<
": \n";
374 tasksDebug[i]->getJacobian().PrintMtx();
377 std::cout <<
"REFERENCE " << tasksDebug[i]->getName() <<
": \n";
378 tasksDebug[i]->getReference().PrintMtx() ;
384 controller.resetAllUpdatedFlags(tasksTPIK1);
385 controller.resetAllUpdatedFlags(tasksArmVehCoord);
406 coordInterface.pubIamReadyOrNot(
false);
409 deleteTasks(&tasksArmVehCoord);
424 void setTaskLists(std::string robotName, std::vector<Task*> *tasks1,
425 std::vector<Task*> *tasksCoord, std::vector<Task*> *tasksArmVeh){
428 bool ineqType =
false;
432 Task* coopTask6dof =
new CoopTask(6, eqType, robotName);
433 Task* coopTask5dof =
new CoopTask(5, eqType, robotName);
464 tasks1->push_back(jl);
465 tasks1->push_back(ha);
467 tasks1->push_back(forceInsert);
474 tasks1->push_back(last);
493 tasksArmVeh->push_back(constrainVel);
495 tasksArmVeh->push_back(jl);
496 tasksArmVeh->push_back(ha);
497 tasksArmVeh->push_back(forceInsert);
498 tasksArmVeh->push_back(pr6);
500 tasksArmVeh->push_back(last);
509 void deleteTasks(std::vector<Task*> *tasks){
510 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...
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 VehicleNullVel class. It is a non reactive task which is needed in manipulation phases where we w...
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...