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