GCC Code Coverage Report


Directory: ./
File: include/crocoddyl/multibody/impulses/impulse-3d.hxx
Date: 2025-06-03 08:14:12
Exec Total Coverage
Lines: 0 79 0.0%
Functions: 0 14 0.0%
Branches: 0 163 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