GCC Code Coverage Report


Directory: ./
File: unittest/factory/pinocchio_model.cpp
Date: 2025-06-03 08:14:12
Exec Total Coverage
Lines: 0 106 0.0%
Functions: 0 8 0.0%
Branches: 0 140 0.0%

Line Branch Exec Source
1 ///////////////////////////////////////////////////////////////////////////////
2 // BSD 3-Clause License
3 //
4 // Copyright (C) 2019-2025, University of Edinburgh, Heriot-Watt University
5 // Copyright note valid unless otherwise stated in individual files.
6 // All rights reserved.
7 ///////////////////////////////////////////////////////////////////////////////
8
9 #include "pinocchio_model.hpp"
10
11 #include <pinocchio/fwd.hpp>
12 #include <pinocchio/parsers/sample-models.hpp>
13 #include <pinocchio/parsers/srdf.hpp>
14 #include <pinocchio/parsers/urdf.hpp>
15
16 #include "crocoddyl/core/utils/exception.hpp"
17
18 namespace crocoddyl {
19 namespace unittest {
20
21 const std::vector<PinocchioModelTypes::Type> PinocchioModelTypes::all(
22 PinocchioModelTypes::init_all());
23
24 std::ostream& operator<<(std::ostream& os, PinocchioModelTypes::Type type) {
25 switch (type) {
26 case PinocchioModelTypes::Hector:
27 os << "Hector";
28 break;
29 case PinocchioModelTypes::TalosArm:
30 os << "TalosArm";
31 break;
32 case PinocchioModelTypes::HyQ:
33 os << "HyQ";
34 break;
35 case PinocchioModelTypes::Talos:
36 os << "Talos";
37 break;
38 case PinocchioModelTypes::RandomHumanoid:
39 os << "RandomHumanoid";
40 break;
41 case PinocchioModelTypes::NbPinocchioModelTypes:
42 os << "NbPinocchioModelTypes";
43 break;
44 default:
45 break;
46 }
47 return os;
48 }
49
50 PinocchioModelFactory::PinocchioModelFactory(PinocchioModelTypes::Type type) {
51 frame_name_.clear();
52 frame_id_.clear();
53 switch (type) {
54 case PinocchioModelTypes::Hector:
55 construct_model(EXAMPLE_ROBOT_DATA_MODEL_DIR
56 "/hector_description/robots/quadrotor_base.urdf");
57 frame_name_.resize(1);
58 frame_id_.resize(1);
59 frame_name_[0] = "base_link";
60 frame_id_[0] = model_->getFrameId(frame_name_[0]);
61 contact_nc_ = 6;
62 break;
63 case PinocchioModelTypes::TalosArm:
64 construct_model(
65 EXAMPLE_ROBOT_DATA_MODEL_DIR "/talos_data/robots/talos_left_arm.urdf",
66 EXAMPLE_ROBOT_DATA_MODEL_DIR "/talos_data/srdf/talos.srdf", false);
67 frame_name_.resize(1);
68 frame_id_.resize(1);
69 frame_name_[0] = "gripper_left_fingertip_1_link";
70 frame_id_[0] = model_->getFrameId(frame_name_[0]);
71 contact_nc_ = 6;
72 break;
73 case PinocchioModelTypes::HyQ:
74 construct_model(EXAMPLE_ROBOT_DATA_MODEL_DIR
75 "/hyq_description/robots/hyq_no_sensors.urdf",
76 EXAMPLE_ROBOT_DATA_MODEL_DIR
77 "/hyq_description/srdf/hyq.srdf");
78 frame_name_.resize(4);
79 frame_id_.resize(4);
80 frame_name_[0] = "lf_foot";
81 frame_name_[1] = "rf_foot";
82 frame_name_[2] = "lh_foot";
83 frame_name_[3] = "rh_foot";
84 for (std::size_t i = 0; i < frame_name_.size(); ++i) {
85 frame_id_[i] = model_->getFrameId(frame_name_[i]);
86 }
87 contact_nc_ = 3;
88 break;
89 case PinocchioModelTypes::Talos:
90 construct_model(
91 EXAMPLE_ROBOT_DATA_MODEL_DIR "/talos_data/robots/talos_reduced.urdf",
92 EXAMPLE_ROBOT_DATA_MODEL_DIR "/talos_data/srdf/talos.srdf");
93 frame_name_.resize(2);
94 frame_id_.resize(2);
95 frame_name_[0] = "left_sole_link";
96 frame_name_[1] = "right_sole_link";
97 for (std::size_t i = 0; i < frame_name_.size(); ++i) {
98 frame_id_[i] = model_->getFrameId(frame_name_[i]);
99 }
100 contact_nc_ = 6;
101 break;
102 case PinocchioModelTypes::RandomHumanoid:
103 construct_model();
104 frame_name_.resize(2);
105 frame_id_.resize(2);
106 frame_name_[0] = "rleg6_body";
107 frame_name_[1] = "lleg6_body";
108 for (std::size_t i = 0; i < frame_name_.size(); ++i) {
109 frame_id_[i] = model_->getFrameId(frame_name_[i]);
110 }
111 contact_nc_ = 6;
112 break;
113 case PinocchioModelTypes::NbPinocchioModelTypes:
114 break;
115 default:
116 throw_pretty(__FILE__ ": Wrong PinocchioModelTypes::Type given");
117 break;
118 }
119 }
120
121 PinocchioModelFactory::~PinocchioModelFactory() {}
122
123 void PinocchioModelFactory::construct_model(const std::string& urdf_file,
124 const std::string& srdf_file,
125 bool free_flyer) {
126 model_ = std::make_shared<pinocchio::Model>();
127 if (!urdf_file.empty()) {
128 if (free_flyer) {
129 pinocchio::urdf::buildModel(urdf_file, pinocchio::JointModelFreeFlyer(),
130 *model_.get());
131 model_->lowerPositionLimit.segment<7>(0).fill(-1.);
132 model_->upperPositionLimit.segment<7>(0).fill(1.);
133 if (!srdf_file.empty()) {
134 pinocchio::srdf::loadReferenceConfigurations(*model_.get(), srdf_file,
135 false);
136 }
137 } else {
138 pinocchio::urdf::buildModel(urdf_file, *model_.get());
139 if (!srdf_file.empty()) {
140 pinocchio::srdf::loadReferenceConfigurations(*model_.get(), srdf_file,
141 false);
142 }
143 }
144 } else {
145 pinocchio::buildModels::humanoidRandom(*model_.get(), free_flyer);
146 model_->lowerPositionLimit.segment<7>(0).fill(-1.);
147 model_->upperPositionLimit.segment<7>(0).fill(1.);
148 }
149 }
150
151 std::shared_ptr<pinocchio::Model> PinocchioModelFactory::create() const {
152 return model_;
153 }
154 std::vector<std::string> PinocchioModelFactory::get_frame_names() const {
155 return frame_name_;
156 }
157 std::vector<std::size_t> PinocchioModelFactory::get_frame_ids() const {
158 return frame_id_;
159 }
160 std::size_t PinocchioModelFactory::get_contact_nc() const {
161 return contact_nc_;
162 }
163
164 } // namespace unittest
165 } // namespace crocoddyl
166