@@ -40,6 +40,26 @@ QuadrupedCom<SCALAR_T>* QuadrupedCom<SCALAR_T>::clone() const {
4040 return new QuadrupedCom<SCALAR_T>(*this );
4141}
4242
43+ template <typename SCALAR_T>
44+ switched_model::vector3_s_t <SCALAR_T> QuadrupedCom<SCALAR_T>::centerOfMassInBaseFrame(
45+ const switched_model::joint_coordinate_s_t <SCALAR_T>& jointPositions) const {
46+ auto & data = pinocchioInterfacePtr_->getData ();
47+ const auto & model = pinocchioInterfacePtr_->getModel ();
48+ const auto configuration = getPinnochioConfiguration (switched_model::base_coordinate_s_t <SCALAR_T>::Zero (), jointPositions);
49+ pinocchio::centerOfMass (model, data, configuration);
50+ return data.com [1 ]; // CoM of the full robot in the free-flyer frame, i.e. base frame.
51+ }
52+
53+ template <typename SCALAR_T>
54+ switched_model::vector3_s_t <SCALAR_T> QuadrupedCom<SCALAR_T>::centerOfMassInWorldFrame(
55+ const switched_model::base_coordinate_s_t <SCALAR_T>& basePose,
56+ const switched_model::joint_coordinate_s_t <SCALAR_T>& jointPositions) const {
57+ auto & data = pinocchioInterfacePtr_->getData ();
58+ const auto & model = pinocchioInterfacePtr_->getModel ();
59+ const auto configuration = getPinnochioConfiguration (basePose, jointPositions);
60+ return pinocchio::centerOfMass (model, data, configuration);
61+ }
62+
4363template <typename SCALAR_T>
4464switched_model::base_coordinate_s_t <SCALAR_T> QuadrupedCom<SCALAR_T>::calculateBaseLocalAccelerations(
4565 const switched_model::base_coordinate_s_t <SCALAR_T>& basePose, const switched_model::base_coordinate_s_t <SCALAR_T>& baseLocalVelocities,
@@ -64,25 +84,12 @@ switched_model::base_coordinate_s_t<SCALAR_T> QuadrupedCom<SCALAR_T>::calculateB
6484 * w: Base angular velocity in Base Frame (3x1)
6585 * qj: Joint velocities per leg [HAA, HFE, KFE] (3x1)
6686 */
67- vector_t configuration = vector_t::Zero (model.nq );
68- // Leave basePos empty here - Not necessary to fill
69- // baseQuad
70- const Eigen::Quaternion<SCALAR_T> baseQuat = switched_model::quaternionBaseToOrigin<SCALAR_T>(switched_model::getOrientation (basePose));
71- configuration.template segment <4 >(3 ) = baseQuat.coeffs ();
72- // JointsPos
73- configuration.template segment <switched_model::JOINT_COORDINATE_SIZE>(7 ) = pinocchioMapping_.getPinocchioJointVector (jointPositions);
87+ const auto configuration = getPinnochioConfiguration (basePose, jointPositions);
88+ const auto velocity = getPinnochioVelocity (baseLocalVelocities, jointVelocities);
7489
7590 // Calculate joint space inertial matrix
7691 pinocchio::crba (model, data, configuration);
7792
78- vector_t velocity = vector_t::Zero (model.nv );
79- // Base linear velocity in Base frame
80- velocity.template head <3 >() = switched_model::getLinearVelocity (baseLocalVelocities);
81- // Base angular velocity in Base frame
82- velocity.template segment <3 >(3 ) = switched_model::getAngularVelocity (baseLocalVelocities);
83- // Joint velocity
84- velocity.template segment <switched_model::JOINT_COORDINATE_SIZE>(6 ) = pinocchioMapping_.getPinocchioJointVector (jointVelocities);
85-
8693 const vector_t dynamicBias = pinocchio::nonLinearEffects (model, data, configuration, velocity);
8794
8895 switched_model::base_coordinate_s_t <SCALAR_T> pinocchioBaseForces;
@@ -107,6 +114,40 @@ switched_model::base_coordinate_s_t<SCALAR_T> QuadrupedCom<SCALAR_T>::calculateB
107114 return ocs2baseAcceleration;
108115}
109116
117+ template <typename SCALAR_T>
118+ Eigen::Matrix<SCALAR_T, Eigen::Dynamic, 1 > QuadrupedCom<SCALAR_T>::getPinnochioConfiguration(
119+ const switched_model::base_coordinate_s_t <SCALAR_T>& basePose,
120+ const switched_model::joint_coordinate_s_t <SCALAR_T>& jointPositions) const {
121+ const auto & model = pinocchioInterfacePtr_->getModel ();
122+
123+ Eigen::Matrix<SCALAR_T, Eigen::Dynamic, 1 > configuration (model.nq );
124+ // basePost
125+ configuration.template head <3 >() = switched_model::getPositionInOrigin (basePose);
126+ // baseQuad
127+ const Eigen::Quaternion<SCALAR_T> baseQuat = switched_model::quaternionBaseToOrigin<SCALAR_T>(switched_model::getOrientation (basePose));
128+ configuration.template segment <4 >(3 ) = baseQuat.coeffs ();
129+ // JointsPos
130+ configuration.template segment <switched_model::JOINT_COORDINATE_SIZE>(7 ) = pinocchioMapping_.getPinocchioJointVector (jointPositions);
131+ return configuration;
132+ }
133+
134+ template <typename SCALAR_T>
135+ Eigen::Matrix<SCALAR_T, Eigen::Dynamic, 1 > QuadrupedCom<SCALAR_T>::getPinnochioVelocity(
136+ const switched_model::base_coordinate_s_t <SCALAR_T>& baseLocalVelocities,
137+ const switched_model::joint_coordinate_s_t <SCALAR_T>& jointVelocities) const {
138+ const auto & model = pinocchioInterfacePtr_->getModel ();
139+
140+ Eigen::Matrix<SCALAR_T, Eigen::Dynamic, 1 > velocity (model.nv );
141+ // Base linear velocity in Base frame
142+ velocity.template head <3 >() = switched_model::getLinearVelocity (baseLocalVelocities);
143+ // Base angular velocity in Base frame
144+ velocity.template segment <3 >(3 ) = switched_model::getAngularVelocity (baseLocalVelocities);
145+ // Joint velocity
146+ velocity.template segment <switched_model::JOINT_COORDINATE_SIZE>(6 ) = pinocchioMapping_.getPinocchioJointVector (jointVelocities);
147+
148+ return velocity;
149+ }
150+
110151} // namespace tpl
111152} // namespace anymal
112153
0 commit comments