3 #include <Eigen/Geometry> 4 #include <tf/transform_listener.h> 5 #include <tf_conversions/tf_eigen.h> 6 #include "../header/publisher.h" 8 #include "../classes/task.h" 9 #include "../support/support.h" 10 #include "../support/defines.h" 14 int equality_icat(
Task task, CMAT::Matrix &rhop, CMAT::Matrix &Q);
15 int inequality_icat(
Task task, CMAT::Matrix &rhop, CMAT::Matrix &Q);
17 int main(
int argc,
char **argv)
19 ROS_INFO(
"[CONTROLLER] Start");
20 ros::init(argc, argv,
"controller");
23 std::string topicTwist =
"/uwsim/g500_A/twist_command_A";
24 ros::Publisher pubTwist = nh.advertise<geometry_msgs::TwistStamped>(topicTwist,1);
27 Publisher pubClassTwist(pubTwist);
28 geometry_msgs::TwistStamped twist;
29 twist.twist.linear.x=0;
30 twist.twist.linear.y=0;
31 twist.twist.linear.z=0;
32 twist.twist.angular.x=0;
33 twist.twist.angular.y=0;
34 twist.twist.angular.z=0;
43 double goalLine[3] = {-0.287, -0.062, 7.424};
44 CMAT::Vect3 goal_xyz(goalLine);
45 CMAT::RotMatrix goal_rot = CMAT::Matrix::Eye(3);
46 CMAT::TransfMatrix wTgoal (goal_rot, goal_xyz);
50 tf::TransformListener tfListener;
51 tf::StampedTransform wTv_tf;
54 tfListener.waitForTransform(
"world",
"/girona500_A", ros::Time(0), ros::Duration(3.0));
58 Task vehicleReaching(6,10);
64 tfListener.lookupTransform(
"world",
"/girona500_A", ros::Time(0), wTv_tf);
66 }
catch (tf::TransformException &ex) {
67 ROS_ERROR(
"%s",ex.what());
68 ros::Duration(1.0).sleep();
74 std::fill_n(vectDiag, 6, 1);
75 vehicleReaching.A.SetDiag(vectDiag);
81 Eigen::MatrixXd jacobian_eigen(6,10);
82 jacobian_eigen = Eigen::MatrixXd::Zero(6,10);
84 Eigen::Matrix3d wRv_Eigen;
85 tf::matrixTFToEigen(wTv_tf.getBasis(), wRv_Eigen);
89 jacobian_eigen.block(0,4, 3,3) = wRv_Eigen;
94 jacobian_eigen.bottomRightCorner(3,3) = wRv_Eigen;
98 vehicleReaching.J = CMAT::Matrix(6,TOT_DOF, jacobian_eigen.data());
103 CMAT::TransfMatrix wTv_cmat = CONV::transfMatrix_tf2cmat(wTv_tf);
104 CMAT::Vect6 error = CMAT::CartError(wTgoal, wTv_cmat);
106 vehicleReaching.reference = k * (error);
110 CMAT::Matrix yDot(TOT_DOF,1);
116 CMAT::Matrix Q = CMAT::Matrix::Eye(TOT_DOF);
118 inequality_icat(vehicleReaching, yDot, Q);
121 twist.twist.angular.x=yDot(5);
122 twist.twist.angular.y=yDot(6);
123 twist.twist.angular.z=yDot(7);
124 twist.twist.linear.x=yDot(8);
125 twist.twist.linear.y=yDot(9);
126 twist.twist.linear.z=yDot(10);
128 pubClassTwist.publish(twist);
141 int equality_icat(
Task task, CMAT::Matrix &rhop, CMAT::Matrix &Q) {
152 CMAT::Matrix I = CMAT::Matrix::Eye(TOT_DOF);
153 CMAT::Matrix barG, barGtransp, T, W, barGpinv;
156 barGtransp = barG.Transpose();
161 T = (I - Q).Transpose() * (I-Q);
165 (barGtransp * barG + T)
166 .RegPseudoInverse(task.threshold, task.lambda, task.mu_W, task.flag_W) *
170 barGpinv = (barGtransp * barG)
171 .RegPseudoInverse(task.threshold, task.lambda, task.mu_G, task.flag_G);
172 rhop = rhop + Q * barGpinv * barGtransp * W * (task.reference - task.J * rhop);
178 Q = Q * (I - barGpinv * barGtransp * barG);
182 int inequality_icat(
Task task, CMAT::Matrix &rhop, CMAT::Matrix &Q) {
184 CMAT::Matrix I = CMAT::Matrix::Eye(TOT_DOF);
185 CMAT::Matrix barG, barGtransp, barGtranspAA, T, H, W, barGpinv;
188 barGtransp = barG.Transpose();
189 barGtranspAA = barGtransp * task.A * task.A;
194 T = (I - Q).Transpose() * (I-Q);
197 (CMAT::Matrix::Eye(task.dimension) - task.A)*
202 (barGtranspAA * barG + T + H)
203 .RegPseudoInverse(task.threshold, task.lambda, task.mu_W, task.flag_W) *
206 barGpinv = (barGtranspAA * barG + H)
207 .RegPseudoInverse(task.threshold, task.lambda, task.mu_G, task.flag_G);
214 rhop = rhop + Q * barGpinv * barGtranspAA * W * (task.reference - task.J * rhop);
217 Q = Q * (I - barGpinv * barGtranspAA * barG);
ABSTRACT class task. Each task is a derived class of this class. It contains all the variable that th...