GCC Code Coverage Report


Directory: ./
File: benchmark/factory/legged-robots.hpp
Date: 2025-06-03 08:14:12
Exec Total Coverage
Lines: 0 63 0.0%
Functions: 0 1 0.0%
Branches: 0 143 0.0%

Line Branch Exec Source
1 ///////////////////////////////////////////////////////////////////////////////
2 // BSD 3-Clause License
3 //
4 // Copyright (C) 2019-2025, University of Edinburgh, LAAS-CNRS,
5 // Heriot-Watt University
6 // Copyright note valid unless otherwise stated in individual files.
7 // All rights reserved.
8 ///////////////////////////////////////////////////////////////////////////////
9
10 #ifndef CROCODDYL_LEGGED_ROBOTS_FACTORY_HPP_
11 #define CROCODDYL_LEGGED_ROBOTS_FACTORY_HPP_
12
13 #include <example-robot-data/path.hpp>
14 #include <pinocchio/parsers/srdf.hpp>
15 #include <pinocchio/parsers/urdf.hpp>
16
17 #include "crocoddyl/core/costs/cost-sum.hpp"
18 #include "crocoddyl/core/costs/residual.hpp"
19 #include "crocoddyl/core/integrator/euler.hpp"
20 #include "crocoddyl/core/residuals/control.hpp"
21 #include "crocoddyl/multibody/actions/contact-fwddyn.hpp"
22 #include "crocoddyl/multibody/actuations/floating-base.hpp"
23 #include "crocoddyl/multibody/contacts/contact-3d.hpp"
24 #include "crocoddyl/multibody/contacts/contact-6d.hpp"
25 #include "crocoddyl/multibody/contacts/multiple-contacts.hpp"
26 #include "crocoddyl/multibody/residuals/com-position.hpp"
27 #include "crocoddyl/multibody/residuals/frame-placement.hpp"
28 #include "crocoddyl/multibody/residuals/frame-translation.hpp"
29 #include "crocoddyl/multibody/residuals/state.hpp"
30 #include "crocoddyl/multibody/states/multibody.hpp"
31 #include "robot-ee-names.hpp"
32
33 namespace crocoddyl {
34 namespace benchmark {
35
36 template <typename Scalar>
37 ✗ void build_contact_action_models(
38 RobotEENames robotNames,
39 std::shared_ptr<crocoddyl::ActionModelAbstractTpl<Scalar> >& runningModel,
40 std::shared_ptr<crocoddyl::ActionModelAbstractTpl<Scalar> >&
41 terminalModel) {
42 typedef
43 typename crocoddyl::DifferentialActionModelContactFwdDynamicsTpl<Scalar>
44 DifferentialActionModelContactFwdDynamics;
45 typedef typename crocoddyl::IntegratedActionModelEulerTpl<Scalar>
46 IntegratedActionModelEuler;
47 typedef typename crocoddyl::ActuationModelFloatingBaseTpl<Scalar>
48 ActuationModelFloatingBase;
49 typedef typename crocoddyl::CostModelSumTpl<Scalar> CostModelSum;
50 typedef typename crocoddyl::ContactModelMultipleTpl<Scalar>
51 ContactModelMultiple;
52 typedef typename crocoddyl::CostModelAbstractTpl<Scalar> CostModelAbstract;
53 typedef typename crocoddyl::ContactModelAbstractTpl<Scalar>
54 ContactModelAbstract;
55 typedef typename crocoddyl::CostModelResidualTpl<Scalar> CostModelResidual;
56 typedef typename crocoddyl::ResidualModelFramePlacementTpl<Scalar>
57 ResidualModelFramePlacement;
58 typedef typename crocoddyl::ResidualModelCoMPositionTpl<Scalar>
59 ResidualModelCoMPosition;
60 typedef typename crocoddyl::ResidualModelStateTpl<Scalar> ResidualModelState;
61 typedef typename crocoddyl::ResidualModelControlTpl<Scalar>
62 ResidualModelControl;
63 typedef typename crocoddyl::ContactModel6DTpl<Scalar> ContactModel6D;
64 typedef typename crocoddyl::ContactModel3DTpl<Scalar> ContactModel3D;
65 typedef typename crocoddyl::MathBaseTpl<Scalar>::Vector2s Vector2s;
66 typedef typename crocoddyl::MathBaseTpl<Scalar>::Vector3s Vector3s;
67 typedef typename crocoddyl::MathBaseTpl<Scalar>::VectorXs VectorXs;
68 typedef typename crocoddyl::MathBaseTpl<Scalar>::Matrix3s Matrix3s;
69
70 ✗ pinocchio::ModelTpl<double> modeld;
71 ✗ pinocchio::urdf::buildModel(robotNames.urdf_path,
72 ✗ pinocchio::JointModelFreeFlyer(), modeld);
73 ✗ modeld.lowerPositionLimit.head<7>().array() = -1;
74 ✗ modeld.upperPositionLimit.head<7>().array() = 1.;
75 ✗ pinocchio::srdf::loadReferenceConfigurations(modeld, robotNames.srdf_path,
76 false);
77
78 ✗ pinocchio::ModelTpl<Scalar> model(modeld.cast<Scalar>());
79 ✗ std::shared_ptr<crocoddyl::StateMultibodyTpl<Scalar> > state =
80 std::make_shared<crocoddyl::StateMultibodyTpl<Scalar> >(
81 std::make_shared<pinocchio::ModelTpl<Scalar> >(model));
82
83 ✗ VectorXs default_state(model.nq + model.nv);
84 ✗ default_state << model.referenceConfigurations[robotNames.reference_conf],
85 ✗ VectorXs::Zero(model.nv);
86
87 ✗ std::shared_ptr<ActuationModelFloatingBase> actuation =
88 std::make_shared<ActuationModelFloatingBase>(state);
89
90 ✗ std::shared_ptr<CostModelAbstract> comCost =
91 std::make_shared<CostModelResidual>(
92 state, std::make_shared<ResidualModelCoMPosition>(
93 ✗ state, Vector3s::Zero(), actuation->get_nu()));
94 ✗ std::shared_ptr<CostModelAbstract> goalTrackingCost =
95 std::make_shared<CostModelResidual>(
96 state, std::make_shared<ResidualModelFramePlacement>(
97 ✗ state, model.getFrameId(robotNames.ee_name),
98 ✗ pinocchio::SE3Tpl<Scalar>(
99 Matrix3s::Identity(),
100 ✗ Vector3s(Scalar(.0), Scalar(.0), Scalar(.4))),
101 ✗ actuation->get_nu()));
102 ✗ std::shared_ptr<CostModelAbstract> xRegCost =
103 std::make_shared<CostModelResidual>(
104 state, std::make_shared<ResidualModelState>(state, default_state,
105 ✗ actuation->get_nu()));
106 ✗ std::shared_ptr<CostModelAbstract> uRegCost =
107 std::make_shared<CostModelResidual>(
108 state,
109 ✗ std::make_shared<ResidualModelControl>(state, actuation->get_nu()));
110
111 // Create a cost model per the running and terminal action model.
112 ✗ std::shared_ptr<CostModelSum> runningCostModel =
113 ✗ std::make_shared<CostModelSum>(state, actuation->get_nu());
114 ✗ std::shared_ptr<CostModelSum> terminalCostModel =
115 ✗ std::make_shared<CostModelSum>(state, actuation->get_nu());
116
117 // Then let's added the running and terminal cost functions
118 ✗ runningCostModel->addCost("gripperPose", goalTrackingCost, Scalar(1));
119 // runningCostModel->addCost("comPos", comCost, Scalar(1e-7));
120 ✗ runningCostModel->addCost("xReg", xRegCost, Scalar(1e-4));
121 ✗ runningCostModel->addCost("uReg", uRegCost, Scalar(1e-4));
122 ✗ terminalCostModel->addCost("gripperPose", goalTrackingCost, Scalar(1));
123
124 ✗ std::shared_ptr<ContactModelMultiple> contact_models =
125 ✗ std::make_shared<ContactModelMultiple>(state, actuation->get_nu());
126
127 ✗ for (std::size_t i = 0; i < robotNames.contact_names.size(); ++i) {
128 ✗ switch (robotNames.contact_types[i]) {
129 ✗ case Contact3D: {
130 ✗ std::shared_ptr<ContactModelAbstract> support_contact =
131 std::make_shared<ContactModel3D>(
132 ✗ state, model.getFrameId(robotNames.contact_names[i]),
133 ✗ Eigen::Vector3d::Zero(), pinocchio::LOCAL_WORLD_ALIGNED,
134 ✗ actuation->get_nu(), Vector2s(Scalar(0.), Scalar(50.)));
135 ✗ contact_models->addContact(
136 ✗ model.frames[model.getFrameId(robotNames.contact_names[i])].name,
137 support_contact);
138 ✗ break;
139 ✗ }
140 ✗ case Contact6D: {
141 ✗ std::shared_ptr<ContactModelAbstract> support_contact =
142 std::make_shared<ContactModel6D>(
143 ✗ state, model.getFrameId(robotNames.contact_names[i]),
144 pinocchio::SE3Tpl<Scalar>::Identity(),
145 ✗ pinocchio::LOCAL_WORLD_ALIGNED, actuation->get_nu(),
146 ✗ Vector2s(Scalar(0.), Scalar(50.)));
147 ✗ contact_models->addContact(
148 ✗ model.frames[model.getFrameId(robotNames.contact_names[i])].name,
149 support_contact);
150 ✗ break;
151 ✗ }
152 ✗ default: {
153 ✗ break;
154 }
155 }
156 }
157
158 // Next, we need to create an action model for running and terminal nodes
159 ✗ std::shared_ptr<DifferentialActionModelContactFwdDynamics> runningDAM =
160 std::make_shared<DifferentialActionModelContactFwdDynamics>(
161 state, actuation, contact_models, runningCostModel);
162 ✗ std::shared_ptr<DifferentialActionModelContactFwdDynamics> terminalDAM =
163 std::make_shared<DifferentialActionModelContactFwdDynamics>(
164 state, actuation, contact_models, terminalCostModel);
165
166 ✗ runningModel =
167 ✗ std::make_shared<IntegratedActionModelEuler>(runningDAM, Scalar(5e-3));
168 ✗ terminalModel =
169 ✗ std::make_shared<IntegratedActionModelEuler>(terminalDAM, Scalar(5e-3));
170 ✗ }
171
172 } // namespace benchmark
173 } // namespace crocoddyl
174
175 #endif // CROCODDYL_BIPED_FACTORY_HPP_
176