GCC Code Coverage Report


Directory: ./
File: include/crocoddyl/multibody/impulses/impulse-3d.hxx
Date: 2025-05-13 10:30:51
Exec Total Coverage
Lines: 0 72 0.0%
Branches: 0 157 0.0%

Line Branch Exec Source
1 ///////////////////////////////////////////////////////////////////////////////
2 // BSD 3-Clause License
3 //
4 // Copyright (C) 2019-2025, LAAS-CNRS, University of Edinburgh,
5 // Heriot-Watt University
6 // Copyright note valid unless otherwise stated in individual files.
7 // All rights reserved.
8 ///////////////////////////////////////////////////////////////////////////////
9
10 namespace crocoddyl {
11
12 template <typename Scalar>
13 ImpulseModel3DTpl<Scalar>::ImpulseModel3DTpl(
14 std::shared_ptr<StateMultibody> state, const pinocchio::FrameIndex id,
15 const pinocchio::ReferenceFrame type)
16 : Base(state, type, 3) {
17 id_ = id;
18 }
19
20 template <typename Scalar>
21 void ImpulseModel3DTpl<Scalar>::calc(
22 const std::shared_ptr<ImpulseDataAbstract>& data,
23 const Eigen::Ref<const VectorXs>&) {
24 std::shared_ptr<Data> d = std::static_pointer_cast<Data>(data);
25 pinocchio::updateFramePlacement<Scalar>(*state_->get_pinocchio().get(),
26 *d->pinocchio, id_);
27 pinocchio::getFrameJacobian(*state_->get_pinocchio().get(), *d->pinocchio,
28 id_, pinocchio::LOCAL, d->fJf);
29
30 switch (type_) {
31 case pinocchio::ReferenceFrame::LOCAL:
32 data->Jc = d->fJf.template topRows<3>();
33 break;
34 case pinocchio::ReferenceFrame::WORLD:
35 case pinocchio::ReferenceFrame::LOCAL_WORLD_ALIGNED:
36 data->Jc.noalias() =
37 d->pinocchio->oMf[id_].rotation() * d->fJf.template topRows<3>();
38 break;
39 }
40 }
41
42 template <typename Scalar>
43 void ImpulseModel3DTpl<Scalar>::calcDiff(
44 const std::shared_ptr<ImpulseDataAbstract>& data,
45 const Eigen::Ref<const VectorXs>&) {
46 std::shared_ptr<Data> d = std::static_pointer_cast<Data>(data);
47
48 const pinocchio::JointIndex joint =
49 state_->get_pinocchio()->frames[d->frame].parentJoint;
50 pinocchio::getJointVelocityDerivatives(*state_->get_pinocchio().get(),
51 *d->pinocchio, joint, pinocchio::LOCAL,
52 d->v_partial_dq, d->v_partial_dv);
53 d->dv0_local_dq.noalias() = d->fXj.template topRows<3>() * d->v_partial_dq;
54
55 switch (type_) {
56 case pinocchio::ReferenceFrame::LOCAL:
57 data->dv0_dq = d->dv0_local_dq;
58 break;
59 case pinocchio::ReferenceFrame::WORLD:
60 case pinocchio::ReferenceFrame::LOCAL_WORLD_ALIGNED:
61 const Eigen::Ref<const Matrix3s> oRf = d->pinocchio->oMf[id_].rotation();
62 d->v0 = pinocchio::getFrameVelocity(*state_->get_pinocchio().get(),
63 *d->pinocchio, id_,
64 pinocchio::LOCAL_WORLD_ALIGNED)
65 .linear();
66 pinocchio::skew(d->v0, d->v0_skew);
67 d->v0_world_skew.noalias() = d->v0_skew * oRf;
68 data->dv0_dq.noalias() = oRf * d->dv0_local_dq;
69 data->dv0_dq.noalias() -=
70 d->v0_world_skew * d->fJf.template bottomRows<3>();
71 break;
72 }
73 }
74
75 template <typename Scalar>
76 void ImpulseModel3DTpl<Scalar>::updateForce(
77 const std::shared_ptr<ImpulseDataAbstract>& data, const VectorXs& force) {
78 if (force.size() != 3) {
79 throw_pretty(
80 "Invalid argument: " << "lambda has wrong dimension (it should be 3)");
81 }
82 Data* d = static_cast<Data*>(data.get());
83 data->f.linear() = force;
84 data->f.angular().setZero();
85 switch (type_) {
86 case pinocchio::ReferenceFrame::LOCAL:
87 data->fext = d->jMf.act(data->f);
88 data->dtau_dq.setZero();
89 break;
90 case pinocchio::ReferenceFrame::WORLD:
91 case pinocchio::ReferenceFrame::LOCAL_WORLD_ALIGNED:
92 const Eigen::Ref<const Matrix3s> oRf = d->pinocchio->oMf[id_].rotation();
93 d->f_local.linear().noalias() = oRf.transpose() * force;
94 d->f_local.angular().setZero();
95 data->fext = data->jMf.act(d->f_local);
96 pinocchio::skew(d->f_local.linear(), d->f_skew);
97 d->fJf_df.noalias() = d->f_skew * d->fJf.template bottomRows<3>();
98 data->dtau_dq.noalias() =
99 -d->fJf.template topRows<3>().transpose() * d->fJf_df;
100 break;
101 }
102 }
103
104 template <typename Scalar>
105 std::shared_ptr<ImpulseDataAbstractTpl<Scalar> >
106 ImpulseModel3DTpl<Scalar>::createData(pinocchio::DataTpl<Scalar>* const data) {
107 return std::allocate_shared<Data>(Eigen::aligned_allocator<Data>(), this,
108 data);
109 }
110
111 template <typename Scalar>
112 template <typename NewScalar>
113 ImpulseModel3DTpl<NewScalar> ImpulseModel3DTpl<Scalar>::cast() const {
114 typedef ImpulseModel3DTpl<NewScalar> ReturnType;
115 typedef StateMultibodyTpl<NewScalar> StateType;
116 ReturnType ret(
117 std::make_shared<StateType>(state_->template cast<NewScalar>()), id_,
118 type_);
119 return ret;
120 }
121
122 template <typename Scalar>
123 void ImpulseModel3DTpl<Scalar>::print(std::ostream& os) const {
124 os << "ImpulseModel3D {frame=" << state_->get_pinocchio()->frames[id_].name
125 << ", type=" << type_ << "}";
126 }
127
128 } // namespace crocoddyl
129