20 #include <boost/test/unit_test.hpp> 21 #include <boost/utility/binary.hpp> 35 #include <pinocchio/parsers/srdf.hpp> 36 #include <pinocchio/algorithm/joint-configuration.hpp> 37 #include <pinocchio/algorithm/center-of-mass.hpp> 43 using namespace tasks;
45 using namespace Eigen;
48 #define REQUIRE_FINITE(A) BOOST_REQUIRE_MESSAGE(isFinite(A), #A << ": " << A) 58 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
61 cout <<
"\n\n*********** TEST TASK SE3 EQUALITY ***********\n";
64 string urdfFileName = package_dirs[0] +
"/urdf/romeo.urdf";
68 TaskSE3Equality task(
"task-se3", robot,
"RWristPitch");
74 BOOST_CHECK(task.Kp().isApprox(Kp));
75 BOOST_CHECK(task.Kd().isApprox(Kd));
78 TrajectoryBase *
traj =
new TrajectorySE3Constant(
"traj_SE3", M_ref);
82 const double dt = 0.001;
90 sample = traj->computeNext();
91 task.setReference(sample);
92 const ConstraintBase &constraint = task.compute(t, q, v,
data);
93 BOOST_CHECK(constraint.rows() == 6);
94 BOOST_CHECK(static_cast<tsid::math::Index>(constraint.cols()) ==
95 static_cast<tsid::math::Index>(robot.
nv()));
97 BOOST_REQUIRE(
isFinite(constraint.vector()));
102 BOOST_CHECK(MatrixXd::Identity(6, 6).
isApprox(constraint.matrix() *
Jpinv));
104 cout <<
"Jpinv" <<
Jpinv.transpose() << endl;
105 cout <<
"b" << constraint.vector().transpose() << endl;
115 error = task.position_error().norm();
116 BOOST_REQUIRE(
isFinite(task.position_error()));
117 BOOST_CHECK(error <= error_past);
121 cout <<
"Time " << t <<
"\t Pos error " << error <<
"\t Vel error " 122 << task.velocity_error().norm() << endl;
127 cout <<
"\n\n*********** TEST TASK COM EQUALITY ***********\n";
130 string urdfFileName = package_dirs[0] +
"/urdf/romeo.urdf";
135 const string srdfFileName = package_dirs[0] +
"/srdf/romeo_collision.srdf";
142 std::cout <<
"q: " << q.transpose() << std::endl;
147 TaskComEquality task(
"task-com", robot);
153 BOOST_CHECK(task.Kp().isApprox(Kp));
154 BOOST_CHECK(task.Kd().isApprox(Kd));
158 TrajectoryBase *
traj =
new TrajectoryEuclidianConstant(
"traj_com", com_ref);
162 const double dt = 0.001;
168 sample = traj->computeNext();
169 task.setReference(sample);
170 const ConstraintBase &constraint = task.compute(t, q, v,
data);
171 BOOST_CHECK(constraint.rows() == 3);
172 BOOST_CHECK(static_cast<tsid::math::Index>(constraint.cols()) ==
173 static_cast<tsid::math::Index>(robot.
nv()));
174 BOOST_REQUIRE(
isFinite(constraint.matrix()));
175 BOOST_REQUIRE(
isFinite(constraint.vector()));
180 BOOST_CHECK(MatrixXd::Identity(constraint.rows(), constraint.rows())
190 error = task.position_error().norm();
191 BOOST_REQUIRE(
isFinite(task.position_error()));
192 BOOST_CHECK((error - error_past) <= 1e-4);
195 if (error < 1e-8)
break;
198 cout <<
"Time " << t <<
"\t CoM pos error " << error
199 <<
"\t CoM vel error " << task.velocity_error().norm() << endl;
204 cout <<
"\n\n*********** TEST TASK JOINT POSTURE ***********\n";
207 string urdfFileName = package_dirs[0] +
"/urdf/romeo.urdf";
210 const unsigned int na = robot.
nv() - 6;
212 cout <<
"Gonna create task\n";
213 TaskJointPosture task(
"task-posture", robot);
215 cout <<
"Gonna set gains\n" << na << endl;
220 BOOST_CHECK(task.Kp().isApprox(Kp));
221 BOOST_CHECK(task.Kd().isApprox(Kd));
223 cout <<
"Gonna create reference trajectory\n";
225 TrajectoryBase *
traj =
new TrajectoryEuclidianConstant(
"traj_joint", q_ref);
228 cout <<
"Gonna set up for simulation\n";
230 const double dt = 0.001;
238 sample = traj->computeNext();
239 task.setReference(sample);
240 const ConstraintBase &constraint = task.compute(t, q, v,
data);
241 BOOST_CHECK(constraint.rows() ==
na);
242 BOOST_CHECK(static_cast<tsid::math::Index>(constraint.cols()) ==
243 static_cast<tsid::math::Index>(robot.
nv()));
244 BOOST_REQUIRE(
isFinite(constraint.matrix()));
245 BOOST_REQUIRE(
isFinite(constraint.vector()));
251 MatrixXd::Identity(na, na).
isApprox(constraint.matrix() *
Jpinv));
260 error = task.position_error().norm();
261 BOOST_REQUIRE(
isFinite(task.position_error()));
262 BOOST_CHECK(error <= error_past);
266 cout <<
"Time " << t <<
"\t pos error " << error <<
"\t vel error " 267 << task.velocity_error().norm() << endl;
272 cout <<
"\n\n*********** TEST TASK JOINT BOUNDS ***********\n";
275 string urdfFileName = package_dirs[0] +
"/urdf/romeo.urdf";
278 const unsigned int na = robot.
nv() - 6;
279 const double dt = 0.001;
281 cout <<
"Gonna create task\n";
282 TaskJointBounds task(
"task-joint-bounds", robot, dt);
284 cout <<
"Gonna set limits\n" << na << endl;
285 VectorXd dq_max = VectorXd::Ones(na);
287 task.setVelocityBounds(dq_min, dq_max);
289 BOOST_CHECK(task.getVelocityLowerBounds().isApprox(dq_min));
290 BOOST_CHECK(task.getVelocityUpperBounds().isApprox(dq_max));
292 cout <<
"Gonna set up for simulation\n";
300 const ConstraintBase &constraint = task.compute(t, q, v,
data);
302 BOOST_CHECK(static_cast<tsid::math::Index>(constraint.cols()) ==
303 static_cast<tsid::math::Index>(robot.
nv()));
304 BOOST_REQUIRE(
isFinite(constraint.lowerBound()));
305 BOOST_REQUIRE(
isFinite(constraint.upperBound()));
314 cout <<
"\n\n*********** TEST TASK JOINT POS VEL ACC BOUNDS ***********\n";
317 string urdfFileName = package_dirs[0] +
"/urdf/romeo.urdf";
320 const unsigned int na = robot.
nv() - 6;
321 const double dt = 0.001;
323 cout <<
"Gonna create task\n";
324 TaskJointPosVelAccBounds task(
"task-joint-posVelAcc-bounds", robot, dt);
326 cout <<
"Gonna set limits\n" << na << endl;
327 VectorXd dq_max = VectorXd::Ones(na);
330 task.setPositionBounds(dq_min, dq_max);
331 task.setVelocityBounds(dq_max);
332 task.setAccelerationBounds(dq_max);
334 BOOST_CHECK(task.getPositionLowerBounds().isApprox(dq_min));
335 BOOST_CHECK(task.getPositionUpperBounds().isApprox(dq_max));
336 BOOST_CHECK(task.getVelocityBounds().isApprox(dq_max));
337 BOOST_CHECK(task.getAccelerationBounds().isApprox(dq_max));
339 cout <<
"Gonna set up for simulation\n";
347 const ConstraintBase &constraint = task.compute(t, q, v,
data);
349 BOOST_CHECK(static_cast<tsid::math::Index>(constraint.cols()) ==
350 static_cast<tsid::math::Index>(robot.
nv()));
351 BOOST_REQUIRE(
isFinite(constraint.lowerBound()));
352 BOOST_REQUIRE(
isFinite(constraint.upperBound()));
360 BOOST_AUTO_TEST_SUITE_END()
void loadReferenceConfigurations(ModelTpl< Scalar, Options, JointCollectionTpl > &model, const std::string &filename, const bool verbose=false)
trajectories::TrajectorySample TrajectorySample
BOOST_AUTO_TEST_CASE(test_task_se3_equality)
const Model & model() const
Accessor to model.
void integrate(const LieGroupGenericTpl< LieGroupCollection > &lg, const Eigen::MatrixBase< ConfigIn_t > &q, const Eigen::MatrixBase< Tangent_t > &v, const Eigen::MatrixBase< ConfigOut_t > &qout)
bool isApprox(const Shape &s1, const Shape &s2, const FCL_REAL tol)
Eigen::Matrix< Scalar, 3, 1 > Vector3
bool isFinite(const Eigen::MatrixBase< Derived > &x)
traits< SE3Tpl >::Vector3 Vector3
Wrapper for a robot based on pinocchio.
void neutral(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, const Eigen::MatrixBase< ReturnType > &qout)
const string romeo_model_path
const DataTpl< Scalar, Options, JointCollectionTpl >::Vector3 & centerOfMass(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConfigVectorType > &q, const bool computeSubtreeComs=true)
void computeAllTerms(Data &data, const Vector &q, const Vector &v) const
void pseudoInverse(ConstRefMatrix A, RefMatrix Apinv, double tolerance, unsigned int computationOptions=Eigen::ComputeThinU|Eigen::ComputeThinV)
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > VectorXd
#define REQUIRE_FINITE(A)
math::ConstRefVector ConstRefVector