talos-torque-control  1.1.1
Collection of dynamic-graph entities aiming at the implementation of torque control on TALOS.
talos-common.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2014, Oscar E. Ramos Ponce, LAAS-CNRS
3  *
4  */
5 
6 #include <dynamic-graph/factory.h>
7 
8 #include <sot/core/debug.hh>
10 
11 namespace dynamicgraph {
12 namespace sot {
13 namespace torque_control {
14 namespace dg = ::dynamicgraph;
15 using namespace dg;
16 using namespace dg::command;
17 
18 bool base_se3_to_sot(dg::sot::ConstRefVector pos, dg::sot::ConstRefMatrix R,
19  dg::sot::RefVector q_sot) {
20  assert(q_sot.size() == 6);
21  assert(pos.size() == 3);
22  assert(R.rows() == 3);
23  assert(R.cols() == 3);
24  // ********* Quat to RPY *********
25  double r, p, y, m;
26  m = sqrt(R(2, 1) * R(2, 1) + R(2, 2) * R(2, 2));
27  p = atan2(-R(2, 0), m);
28  if (abs(abs(p) - M_PI / 2) < 0.001) {
29  r = 0.0;
30  y = -atan2(R(0, 1), R(1, 1));
31  } else {
32  y = atan2(R(1, 0), R(0, 0));
33  r = atan2(R(2, 1), R(2, 2));
34  }
35  // *********************************
36  q_sot[0] = pos[0];
37  q_sot[1] = pos[1];
38  q_sot[2] = pos[2];
39  q_sot[3] = r;
40  q_sot[4] = p;
41  q_sot[5] = y;
42  return true;
43 }
44 
45 bool base_urdf_to_sot(dg::sot::ConstRefVector q_urdf,
46  dg::sot::RefVector q_sot) {
47  assert(q_urdf.size() == 7);
48  assert(q_sot.size() == 6);
49  // ********* Quat to RPY *********
50  const double W = q_urdf[6];
51  const double X = q_urdf[3];
52  const double Y = q_urdf[4];
53  const double Z = q_urdf[5];
54  const Eigen::Matrix3d R = Eigen::Quaterniond(W, X, Y, Z).toRotationMatrix();
55  return base_se3_to_sot(q_urdf.head<3>(), R, q_sot);
56 }
57 
58 bool base_sot_to_urdf(dg::sot::ConstRefVector q_sot,
59  dg::sot::RefVector q_urdf) {
60  assert(q_urdf.size() == 7);
61  assert(q_sot.size() == 6);
62  // ********* RPY to Quat *********
63  const double r = q_sot[3];
64  const double p = q_sot[4];
65  const double y = q_sot[5];
66  const Eigen::AngleAxisd rollAngle(r, Eigen::Vector3d::UnitX());
67  const Eigen::AngleAxisd pitchAngle(p, Eigen::Vector3d::UnitY());
68  const Eigen::AngleAxisd yawAngle(y, Eigen::Vector3d::UnitZ());
69  const Eigen::Quaternion<double> quat = yawAngle * pitchAngle * rollAngle;
70 
71  q_urdf[0] = q_sot[0]; // BASE
72  q_urdf[1] = q_sot[1];
73  q_urdf[2] = q_sot[2];
74  q_urdf[3] = quat.x();
75  q_urdf[4] = quat.y();
76  q_urdf[5] = quat.z();
77  q_urdf[6] = quat.w();
78 
79  return true;
80 }
81 
82 bool config_urdf_to_sot(dg::sot::ConstRefVector q_urdf,
83  dg::sot::RefVector q_sot) {
84  assert(q_urdf.size() == N_JOINTS + 7);
85  assert(q_sot.size() == N_JOINTS + 6);
86  // ********* Quat to RPY *********
87  // const double W = q_urdf[6];
88  // const double X = q_urdf[3];
89  // const double Y = q_urdf[4];
90  // const double Z = q_urdf[5];
91  // const Eigen::Matrix3d M = Eigen::Quaterniond(W, X, Y,
92  // Z).toRotationMatrix(); double r,p,y,m; m = sqrt(M(2, 1) *M(2, 1) +
93  // M(2, 2) * M(2, 2)); p = atan2(-M(2, 0), m); if (abs(abs(p) - M_PI /
94  // 2) < 0.001 )
95  // {
96  // r = 0;
97  // y = -atan2(M(0, 1), M(1, 1));
98  // }
99  // else
100  // {
101  // y = atan2(M(1, 0), M(0, 0)) ;
102  // r = atan2(M(2, 1), M(2, 2)) ;
103  // }
104  // // *********************************
105  // q_sot[0 ]=q_urdf[0 ]; //BASE
106  // q_sot[1 ]=q_urdf[1 ];
107  // q_sot[2 ]=q_urdf[2 ];
108  // q_sot[3 ]=r;
109  // q_sot[4 ]=p;
110  // q_sot[5 ]=y;
111  base_urdf_to_sot(q_urdf.head<7>(), q_sot.head<6>());
112  joints_urdf_to_sot(q_urdf.tail<N_JOINTS>(), q_sot.tail<N_JOINTS>());
113  // q_sot[18]=q_urdf[7 ]; //HEAD
114  // q_sot[19]=q_urdf[8 ];
115 
116  // q_sot[20]=q_urdf[9 ]; //CHEST
117  // q_sot[21]=q_urdf[10];
118 
119  // q_sot[29]=q_urdf[11]; //LARM
120  // q_sot[30]=q_urdf[12];
121  // q_sot[31]=q_urdf[13];
122  // q_sot[32]=q_urdf[14];
123  // q_sot[33]=q_urdf[15];
124  // q_sot[34]=q_urdf[16];
125  // q_sot[35]=q_urdf[17];
126 
127  // q_sot[22]=q_urdf[18]; //RARM
128  // q_sot[23]=q_urdf[19];
129  // q_sot[24]=q_urdf[20];
130  // q_sot[25]=q_urdf[21];
131  // q_sot[26]=q_urdf[22];
132  // q_sot[27]=q_urdf[23];
133  // q_sot[28]=q_urdf[24];
134 
135  // q_sot[12]=q_urdf[25]; //LLEG
136  // q_sot[13]=q_urdf[26];
137  // q_sot[14]=q_urdf[27];
138  // q_sot[15]=q_urdf[28];
139  // q_sot[16]=q_urdf[29];
140  // q_sot[17]=q_urdf[30];
141 
142  // q_sot[6 ]=q_urdf[31]; //RLEG
143  // q_sot[7 ]=q_urdf[32];
144  // q_sot[8 ]=q_urdf[33];
145  // q_sot[9 ]=q_urdf[34];
146  // q_sot[10]=q_urdf[35];
147  // q_sot[11]=q_urdf[36];
148  return true;
149 }
150 
151 bool config_sot_to_urdf(dg::sot::ConstRefVector q_sot,
152  dg::sot::RefVector q_urdf) {
153  assert(q_urdf.size() == N_JOINTS + 7);
154  assert(q_sot.size() == N_JOINTS + 6);
155  // ********* RPY to Quat *********
156  // const double r = q_sot[3];
157  // const double p = q_sot[4];
158  // const double y = q_sot[5];
159  // const Eigen::AngleAxisd rollAngle(r, Eigen::Vector3d::UnitX());
160  // const Eigen::AngleAxisd pitchAngle(p, Eigen::Vector3d::UnitY());
161  // const Eigen::AngleAxisd yawAngle(y, Eigen::Vector3d::UnitZ());
162  // const Eigen::Quaternion<double> quat = yawAngle * pitchAngle *
163  // rollAngle;
164 
165  // q_urdf[0 ]=q_sot[0 ]; //BASE
166  // q_urdf[1 ]=q_sot[1 ];
167  // q_urdf[2 ]=q_sot[2 ];
168  // q_urdf[3 ]=quat.x();
169  // q_urdf[4 ]=quat.y();
170  // q_urdf[5 ]=quat.z();
171  // q_urdf[6 ]=quat.w();
172 
173  base_sot_to_urdf(q_sot.head<6>(), q_urdf.head<7>());
174  joints_sot_to_urdf(q_sot.tail<N_JOINTS>(), q_urdf.tail<N_JOINTS>());
175 
176  // q_urdf[7 ]=q_sot[18]; //HEAD
177  // q_urdf[8 ]=q_sot[19];
178 
179  // q_urdf[9 ]=q_sot[20]; //CHEST
180  // q_urdf[10]=q_sot[21];
181 
182  // q_urdf[11]=q_sot[29]; //LARM
183  // q_urdf[12]=q_sot[30];
184  // q_urdf[13]=q_sot[31];
185  // q_urdf[14]=q_sot[32];
186  // q_urdf[15]=q_sot[33];
187  // q_urdf[16]=q_sot[34];
188  // q_urdf[17]=q_sot[35];
189 
190  // q_urdf[18]=q_sot[22]; //RARM
191  // q_urdf[19]=q_sot[23];
192  // q_urdf[20]=q_sot[24];
193  // q_urdf[21]=q_sot[25];
194  // q_urdf[22]=q_sot[26];
195  // q_urdf[23]=q_sot[27];
196  // q_urdf[24]=q_sot[28];
197 
198  // q_urdf[25]=q_sot[12]; //LLEG
199  // q_urdf[26]=q_sot[13];
200  // q_urdf[27]=q_sot[14];
201  // q_urdf[28]=q_sot[15];
202  // q_urdf[29]=q_sot[16];
203  // q_urdf[30]=q_sot[17];
204 
205  // q_urdf[31]=q_sot[6 ]; //RLEG
206  // q_urdf[32]=q_sot[7 ];
207  // q_urdf[33]=q_sot[8 ];
208  // q_urdf[34]=q_sot[9 ];
209  // q_urdf[35]=q_sot[10];
210  // q_urdf[36]=q_sot[11];
211  return true;
212 }
213 
214 bool velocity_urdf_to_sot(dg::sot::ConstRefVector v_urdf,
215  dg::sot::RefVector v_sot) {
216  assert(v_urdf.size() == N_JOINTS + 6);
217  assert(v_sot.size() == N_JOINTS + 6);
218  v_sot.head<6>() = v_urdf.head<6>();
219  joints_urdf_to_sot(v_urdf.tail<N_JOINTS>(), v_sot.tail<N_JOINTS>());
220 
221  // v_sot[0 ]=v_urdf[0 ]; //BASE
222  // v_sot[1 ]=v_urdf[1 ];
223  // v_sot[2 ]=v_urdf[2 ];
224  // v_sot[3 ]=v_urdf[3 ];
225  // v_sot[4 ]=v_urdf[4 ];
226  // v_sot[5 ]=v_urdf[5 ];
227 
228  // v_sot[18]=v_urdf[6 ]; //HEAD
229  // v_sot[19]=v_urdf[7 ];
230 
231  // v_sot[20]=v_urdf[8 ]; //CHEST
232  // v_sot[21]=v_urdf[9];
233 
234  // v_sot[29]=v_urdf[10]; //LARM
235  // v_sot[30]=v_urdf[11];
236  // v_sot[31]=v_urdf[12];
237  // v_sot[32]=v_urdf[13];
238  // v_sot[33]=v_urdf[14];
239  // v_sot[34]=v_urdf[15];
240  // v_sot[35]=v_urdf[16];
241 
242  // v_sot[22]=v_urdf[17]; //RARM
243  // v_sot[23]=v_urdf[18];
244  // v_sot[24]=v_urdf[19];
245  // v_sot[25]=v_urdf[20];
246  // v_sot[26]=v_urdf[21];
247  // v_sot[27]=v_urdf[22];
248  // v_sot[28]=v_urdf[23];
249 
250  // v_sot[12]=v_urdf[24]; //LLEG
251  // v_sot[13]=v_urdf[25];
252  // v_sot[14]=v_urdf[26];
253  // v_sot[15]=v_urdf[27];
254  // v_sot[16]=v_urdf[28];
255  // v_sot[17]=v_urdf[29];
256 
257  // v_sot[6 ]=v_urdf[30]; //RLEG
258  // v_sot[7 ]=v_urdf[31];
259  // v_sot[8 ]=v_urdf[32];
260  // v_sot[9 ]=v_urdf[33];
261  // v_sot[10]=v_urdf[34];
262  // v_sot[11]=v_urdf[35];
263  return true;
264 }
265 
266 bool velocity_sot_to_urdf(dg::sot::ConstRefVector v_sot,
267  dg::sot::RefVector v_urdf) {
268  assert(v_urdf.size() == N_JOINTS + 6);
269  assert(v_sot.size() == N_JOINTS + 6);
270  v_urdf.head<6>() = v_sot.head<6>();
271  joints_sot_to_urdf(v_sot.tail<N_JOINTS>(), v_urdf.tail<N_JOINTS>());
272 
273  // v_urdf[0 ]=v_sot[0 ]; //BASE
274  // v_urdf[1 ]=v_sot[1 ];
275  // v_urdf[2 ]=v_sot[2 ];
276  // v_urdf[3 ]=v_sot[3 ];
277  // v_urdf[4 ]=v_sot[4 ];
278  // v_urdf[5 ]=v_sot[5 ];
279 
280  // v_urdf[6 ]=v_sot[18]; //HEAD
281  // v_urdf[7 ]=v_sot[19];
282 
283  // v_urdf[8 ]=v_sot[20]; //CHEST
284  // v_urdf[9 ]=v_sot[21];
285 
286  // v_urdf[10]=v_sot[29]; //LARM
287  // v_urdf[11]=v_sot[30];
288  // v_urdf[12]=v_sot[31];
289  // v_urdf[13]=v_sot[32];
290  // v_urdf[14]=v_sot[33];
291  // v_urdf[15]=v_sot[34];
292  // v_urdf[16]=v_sot[35];
293 
294  // v_urdf[17]=v_sot[22]; //RARM
295  // v_urdf[18]=v_sot[23];
296  // v_urdf[19]=v_sot[24];
297  // v_urdf[20]=v_sot[25];
298  // v_urdf[21]=v_sot[26];
299  // v_urdf[22]=v_sot[27];
300  // v_urdf[23]=v_sot[28];
301 
302  // v_urdf[24]=v_sot[12]; //LLEG
303  // v_urdf[25]=v_sot[13];
304  // v_urdf[26]=v_sot[14];
305  // v_urdf[27]=v_sot[15];
306  // v_urdf[28]=v_sot[16];
307  // v_urdf[29]=v_sot[17];
308 
309  // v_urdf[30]=v_sot[6 ]; //RLEG
310  // v_urdf[31]=v_sot[7 ];
311  // v_urdf[32]=v_sot[8 ];
312  // v_urdf[33]=v_sot[9 ];
313  // v_urdf[34]=v_sot[10];
314  // v_urdf[35]=v_sot[11];
315  return true;
316 }
317 
318 bool joints_urdf_to_sot(dg::sot::ConstRefVector q_urdf,
319  dg::sot::RefVector q_sot) {
320  assert(q_urdf.size() == N_JOINTS);
321  assert(q_sot.size() == N_JOINTS);
322 
323  q_sot[12] = q_urdf[0]; // HEAD
324  q_sot[13] = q_urdf[1];
325 
326  q_sot[14] = q_urdf[2]; // CHEST
327  q_sot[15] = q_urdf[3];
328 
329  q_sot[23] = q_urdf[4]; // LARM
330  q_sot[24] = q_urdf[5];
331  q_sot[25] = q_urdf[6];
332  q_sot[26] = q_urdf[7];
333  q_sot[27] = q_urdf[8];
334  q_sot[28] = q_urdf[9];
335  q_sot[29] = q_urdf[10];
336 
337  q_sot[16] = q_urdf[11]; // RARM
338  q_sot[17] = q_urdf[12];
339  q_sot[18] = q_urdf[13];
340  q_sot[19] = q_urdf[14];
341  q_sot[20] = q_urdf[15];
342  q_sot[21] = q_urdf[16];
343  q_sot[22] = q_urdf[17];
344 
345  q_sot[6] = q_urdf[18]; // LLEG
346  q_sot[7] = q_urdf[19];
347  q_sot[8] = q_urdf[20];
348  q_sot[9] = q_urdf[21];
349  q_sot[10] = q_urdf[22];
350  q_sot[11] = q_urdf[23];
351 
352  q_sot[0] = q_urdf[24]; // RLEG
353  q_sot[1] = q_urdf[25];
354  q_sot[2] = q_urdf[26];
355  q_sot[3] = q_urdf[27];
356  q_sot[4] = q_urdf[28];
357  q_sot[5] = q_urdf[29];
358  return true;
359 }
360 
361 bool joints_sot_to_urdf(dg::sot::ConstRefVector q_sot,
362  dg::sot::RefVector q_urdf) {
363  assert(q_urdf.size() == N_JOINTS);
364  assert(q_sot.size() == N_JOINTS);
365 
366  q_urdf[0] = q_sot[12]; // HEAD
367  q_urdf[1] = q_sot[13];
368 
369  q_urdf[2] = q_sot[24]; // CHEST
370  q_urdf[3] = q_sot[25];
371 
372  q_urdf[4] = q_sot[23]; // LARM
373  q_urdf[5] = q_sot[24];
374  q_urdf[6] = q_sot[25];
375  q_urdf[7] = q_sot[26];
376  q_urdf[8] = q_sot[27];
377  q_urdf[9] = q_sot[28];
378  q_urdf[10] = q_sot[29];
379 
380  q_urdf[11] = q_sot[16]; // RARM
381  q_urdf[12] = q_sot[17];
382  q_urdf[13] = q_sot[18];
383  q_urdf[14] = q_sot[19];
384  q_urdf[15] = q_sot[20];
385  q_urdf[16] = q_sot[21];
386  q_urdf[17] = q_sot[22];
387 
388  q_urdf[18] = q_sot[6]; // LLEG
389  q_urdf[19] = q_sot[7];
390  q_urdf[20] = q_sot[8];
391  q_urdf[21] = q_sot[9];
392  q_urdf[22] = q_sot[10];
393  q_urdf[23] = q_sot[11];
394 
395  q_urdf[24] = q_sot[0]; // RLEG
396  q_urdf[25] = q_sot[1];
397  q_urdf[26] = q_sot[2];
398  q_urdf[27] = q_sot[3];
399  q_urdf[28] = q_sot[4];
400  q_urdf[29] = q_sot[5];
401  return true;
402 }
403 
404 } // namespace torque_control
405 } // namespace sot
406 } // namespace dynamicgraph
bool base_sot_to_urdf(dynamicgraph::sot::ConstRefVector q_sot, dynamicgraph::sot::RefVector q_urdf)
bool base_urdf_to_sot(dynamicgraph::sot::ConstRefVector q_urdf, dynamicgraph::sot::RefVector q_sot)
bool velocity_sot_to_urdf(dynamicgraph::sot::ConstRefVector v_sot, dynamicgraph::sot::RefVector v_urdf)
bool joints_urdf_to_sot(dynamicgraph::sot::ConstRefVector q_urdf, dynamicgraph::sot::RefVector q_sot)
bool config_sot_to_urdf(dynamicgraph::sot::ConstRefVector q_sot, dynamicgraph::sot::RefVector q_urdf)
bool velocity_urdf_to_sot(dynamicgraph::sot::ConstRefVector v_urdf, dynamicgraph::sot::RefVector v_sot)
bool base_se3_to_sot(dynamicgraph::sot::ConstRefVector pos, dynamicgraph::sot::ConstRefMatrix R, dynamicgraph::sot::RefVector q_sot)
bool joints_sot_to_urdf(dynamicgraph::sot::ConstRefVector q_sot, dynamicgraph::sot::RefVector q_urdf)
bool config_urdf_to_sot(dynamicgraph::sot::ConstRefVector q_urdf, dynamicgraph::sot::RefVector q_sot)
#define N_JOINTS
Definition: talos-common.hh:40