Kinematics Animation Multithread
finger.cpp
Go to the documentation of this file.
1#include "../include/finger.h"
2
13void Finger::initialize(const std::string& name_id,
14 const nlohmann::json& json_file, igl::opengl::glfw::Viewer *viewer,
15 int mesh_idx)
16{
17 // Get finger id
18 m_name_id = name_id;
19
20 // Parse the json file
21 parse_json_file(json_file);
22
23 // Initialize mesh files
25
26 // Load mesh files
27 load_mesh_files(viewer);
28
29 // Set viewer data indices
30 m_viewer_data_lower_idx = mesh_idx;
32 (m_meshes_filenames.size() - 1);
33
34 // Get mesh data
35 get_mesh_data(viewer);
36
37 // Postprocess meshes
39
40 // Initialize state
42
43 // Initialize meshes
45}
46
60void Finger::update(const std::vector<dm::JointState>& state)
61{
62 // Update state vector
63 m_state_vec = state;
64
65 // Resize states
68
69 /* Loop through state vector components and
70 generate transformation matrices */
71 for (size_t i = 0; i < m_state_vec.size(); i++)
72 {
73 /*********** Local transformation ***********/
74 // Initialize transformation matrices
75 Eigen::Matrix4d local_transform = Eigen::Matrix4d::Identity();
76
77 // Position vector
78 local_transform.block<3, 1>(0, 3) = m_state_vec.at(i).position;
79
80 // Rotation matrix
81 local_transform.block<3, 3>(0, 0) =
83
84 // Push back locak transform
85 m_local_transform.at(i) = local_transform;
86
87 /*********** Global transformation ***********/
88 if (i == 0) {
89 // Global transform
91 }
92 else {
93 // Global transform
94 m_global_transform.at(i) = m_global_transform.at(i-1) *
96 }
97 }
98
99 // Resize vertices data
100 m_vertices_data.resize(2 * m_state_size);
101
102 // Loop through global transformation matrices
103 for (size_t i = 0; i < m_global_transform.size(); i++)
104 {
105 // Get global transformation matrix
106 Eigen::Matrix4d t_mat = m_global_transform.at(i);
107
108 /****************** Transform vertices ********************/
109 // Joint vertices
110 Eigen::MatrixXd joint_vert =
111 (t_mat * m_vertices_data_oh.at(2*i).transpose()).transpose();
112
113 // Link vertices
114 Eigen::MatrixXd link_vert =
115 (t_mat * m_vertices_data_oh.at(2*i+1).transpose()).transpose();
116
117 // Push back vertices
118 m_vertices_data.at(2*i) = joint_vert.leftCols<3>();
119 m_vertices_data.at(2*i+1) = link_vert.leftCols<3>();
120 }
121}
122
130void Finger::initialize_state(const std::vector<double>& link_lengths,
131 const dm::JointState& origin)
132{
133 // State size
134 m_state_size = link_lengths.size();
135
136 // Initialize state vector
138
139 // Set origin
140 m_state_vec.at(0) = origin;
141
142 // Generate initial state vector states
143 int idx = 0;
144
145 for (size_t i = 1; i < m_state_size; i++)
146 {
147 // Set link lengths
148 m_state_vec.at(i).position(0) = link_lengths.at(idx);
149
150 // Update idx
151 idx++;
152 }
153}
154
161{
162 // Get mesh files absolute filenames
163 auto joint_mesh_abs = std::filesystem::current_path() / m_joint_rel_filename;
164 auto bone_mesh_abs = std::filesystem::current_path() / m_bone_rel_filename;
165
166 // Generate meshses filenames
167 for (size_t i = 0; i < m_link_lengths.size(); i++)
168 {
169 // Meshes filenames configuration
170 m_meshes_filenames.push_back(joint_mesh_abs.string());
171 m_meshes_filenames.push_back(bone_mesh_abs.string());
172
173 // Geometry scales configurations
174 m_geom_scales.push_back(m_joint_scale);
175 m_geom_scales.push_back(m_link_lengths.at(i));
176 }
177}
178
184void Finger::load_mesh_files(igl::opengl::glfw::Viewer *viewer)
185{
186 for (size_t i = 0; i < m_meshes_filenames.size(); i++)
187 {
188 viewer->load_mesh_from_file(m_meshes_filenames.at(i));
189 }
190}
191
197void Finger::get_mesh_data(igl::opengl::glfw::Viewer *viewer)
198{
199 for (size_t i = m_viewer_data_lower_idx; i <= m_viewer_data_upper_idx; i++)
200 {
201 // Push back vertices data
202 m_vertices_data_o.push_back(viewer->data_list.at(i).V);
203
204 // Push back faces data
205 m_faces_data.push_back(viewer->data_list.at(i).F);
206 }
207}
208
214{
215 // Scale meshes
216 for (size_t i = 0; i < m_vertices_data_o.size(); i++)
217 {
218 /************** Scale data *******************/
219 Eigen::Matrix3d scale_matrix;
220 scale_matrix << m_geom_scales.at(i), 0.0, 0.0,
221 0.0, m_geom_scales.at(i), 0.0, 0.0, 0.0, m_geom_scales.at(i);
222
223 m_vertices_data_o.at(i) = (scale_matrix *
224 m_vertices_data_o.at(i).transpose()).transpose();
225
226 /************** Generate homogeneous vertices data *******************/
227 // Get mesh i
228 Eigen::MatrixXd mesh_i = m_vertices_data_o.at(i);
229
230 // Initialize homogeneous coordinates
231 Eigen::MatrixXd mesh_i_oh = Eigen::MatrixXd::Ones(mesh_i.rows(),
232 mesh_i.cols() + 1);
233
234 // Generate matrix of homogeneous coordinates
235 mesh_i_oh.col(0) = mesh_i.col(0);
236 mesh_i_oh.col(1) = mesh_i.col(1);
237 mesh_i_oh.col(2) = mesh_i.col(2);
238
239 m_vertices_data_oh.push_back(mesh_i_oh);
240 }
241}
242
248void Finger::parse_json_file(const nlohmann::json& json_file)
249{
250 // Get lengths
251 auto lengths_json = json_file[m_name_id]["Lengths"];
252
253 // Get frame ids
254 auto frames_json = json_file[m_name_id]["Frames"];
255
256 // Get origin position
257 auto origin_position_json = json_file[m_name_id]["Origin"]["Position"];
258
259 // Get origin orientation
260 auto origin_euler_json = json_file[m_name_id]["Origin"]["Euler"];
261
262 for(size_t i = 0; i < lengths_json.size(); i++)
263 {
264 // Push back link lengths
265 m_link_lengths.push_back(lengths_json.at(i));
266
267 // Set origin position
268 m_origin.position(0) = origin_position_json.at(0);
269 m_origin.position(1) = origin_position_json.at(1);
270 m_origin.position(2) = origin_position_json.at(2);
271
272 // Set origin orientation
273 m_origin.euler(0) = origin_euler_json.at(0);
274 m_origin.euler(1) = origin_euler_json.at(1);
275 m_origin.euler(2) = origin_euler_json.at(2);
276 }
277
278 for(size_t i = 0; i < frames_json.size(); i++)
279 {
280 m_frame_ids.push_back(frames_json.at(i));
281 }
282}
static Eigen::Matrix3d rotation(double phi, double theta, double psi)
Euler rotation matrix z-y'-x''.
void initialize_state(const std::vector< double > &link_lengths, const dm::JointState &origin)
Initialize state.
Definition: finger.cpp:130
void initialize(const std::string &name_id, const nlohmann::json &json_file, igl::opengl::glfw::Viewer *viewer, int mesh_idx)
Initialize finger.
Definition: finger.cpp:13
int m_viewer_data_lower_idx
Viewer data lower idx see (Hand::m_viewer_data_lower_idx).
Definition: finger.h:82
std::vector< int > m_frame_ids
The frame ids of the finger.
Definition: finger.h:56
std::string m_joint_rel_filename
Joint mesh file.
Definition: finger.h:64
std::vector< Eigen::MatrixXd > m_vertices_data_o
Vertices data (original).
Definition: finger.h:93
double m_joint_scale
Joint scales.
Definition: finger.h:76
std::vector< Eigen::MatrixXd > m_vertices_data
Vertices data.
Definition: finger.h:99
std::vector< double > m_link_lengths
The lengths of the finger links.
Definition: finger.h:53
void load_mesh_files(igl::opengl::glfw::Viewer *viewer)
Load finger mesh files.
Definition: finger.cpp:184
std::vector< Eigen::Matrix4d > m_global_transform
Global transforamation matrix.
Definition: finger.h:123
std::string m_bone_rel_filename
Bone (link) mesh file.
Definition: finger.h:67
void postprocess_meshes(void)
Postproccess meshes.
Definition: finger.cpp:213
std::vector< std::string > m_meshes_filenames
Mesh files for joints and bones(links).
Definition: finger.h:70
std::vector< Eigen::MatrixXi > m_faces_data
Faces data.
Definition: finger.h:102
void parse_json_file(const nlohmann::json &json_file)
Parses the finger configuration json file.
Definition: finger.cpp:248
int m_state_size
State size.
Definition: finger.h:117
std::vector< dm::JointState > m_state_vec
Finger state.
Definition: finger.h:114
dm::JointState m_origin
Finger origin.
Definition: finger.h:50
void update(const std::vector< dm::JointState > &state)
Update state.
Definition: finger.cpp:60
void get_mesh_data(igl::opengl::glfw::Viewer *viewer)
Get mesh data.
Definition: finger.cpp:197
std::vector< Eigen::Matrix4d > m_local_transform
Local transforamation matrix.
Definition: finger.h:120
std::string m_name_id
Finger name id.
Definition: finger.h:47
void initialize_mesh_containers(void)
Initialize mesh files.
Definition: finger.cpp:160
std::vector< double > m_geom_scales
Finger scales.
Definition: finger.h:79
std::vector< Eigen::MatrixXd > m_vertices_data_oh
Vertices data (original homogeneous).
Definition: finger.h:96
int m_viewer_data_upper_idx
Viewer data upper idx (see Hand::m_viewer_data_lower_idx).
Definition: finger.h:85
Eigen::Vector3d position
Definition: dynamics_math.h:21
Eigen::Vector3d euler
Definition: dynamics_math.h:24