ARCS SDK API  0.24.0
math.h
浏览该文件的文档.
1 /** @file math.h
2  * @brief 数学方法接口,如欧拉角与四元数转换、位姿的加减运算
3  */
4 #ifndef AUBO_SDK_MATH_INTERFACE_H
5 #define AUBO_SDK_MATH_INTERFACE_H
6 
7 #include <vector>
8 #include <memory>
9 
10 #include <aubo/type_def.h>
11 #include <aubo/global_config.h>
12 
13 namespace arcs {
14 namespace common_interface {
15 
16 class ARCS_ABI_EXPORT Math
17 {
18 public:
19  Math();
20  virtual ~Math();
21 
22  /**
23  * Pose addition
24  *
25  * Both arguments contain three position parameters (x, y, z) jointly called
26  * P, and three rotation parameters (R_x, R_y, R_z) jointly called R. This
27  * function calculates the result x_3 as the addition of the given poses as
28  * follows:
29  *
30  * p_3.P = p_1.P + p_2.P
31  * p_3.R = p_1.R * p_2.R
32  *
33  * 位姿相加。
34  * 两个参数都包含三个位置参数(x、y、z),统称为P,
35  * 以及三个旋转参数(R_x、R_y、R_z),统称为R。
36  * 此函数根据以下方式计算结果 p_3,即给定位姿的相加:
37  * p_3.P = p_1.P + p_2.P,
38  * p_3.R = p_1.R * p_2.R
39  *
40  * @param p1 工具位姿1(pose)
41  * @param p2 工具位姿2(pose)
42  * @return Sum of position parts and product of rotation parts (pose)
43  * 位置部分之和和旋转部分之积(pose)
44  *
45  * @par Python函数原型
46  * poseAdd(self: pyaubo_sdk.Math, arg0: List[float], arg1: List[float]) ->
47  * List[float]
48  *
49  * @par Lua函数原型
50  * poseAdd(p1: table, p2: table) -> table
51  *
52  * @par JSON-RPC请求示例
53  * {"jsonrpc":"2.0","method":"Math.poseAdd","params":[[0.2, 0.5, 0.1, 1.57,
54  * 0, 0],[0.2, 0.5, 0.6, 1.57, 0, 0]],"id":1}
55  *
56  * @par JSON-RPC响应示例
57  * {"id":1,"jsonrpc":"2.0","result":[0.4,1.0,0.7,3.14,-0.0,0.0]}
58  *
59  */
60  std::vector<double> poseAdd(const std::vector<double> &p1,
61  const std::vector<double> &p2);
62 
63  /**
64  * Pose subtraction
65  * 位姿相减
66  *
67  * 两个参数都包含三个位置参数(x、y、z),统称为P,
68  * 以及三个旋转参数(R_x、R_y、R_z),统称为R。
69  * 此函数根据以下方式计算结果 p_3,即给定位姿的相加:
70  * p_3.P = p_1.P - p_2.P,
71  * p_3.R = p_1.R * p_2.R.inverse
72  *
73  * @param p1 工具位姿1
74  * @param p2 工具位姿2
75  * @return 位姿相减计算结果
76  *
77  * @par Python函数原型
78  * poseSub(self: pyaubo_sdk.Math, arg0: List[float], arg1: List[float]) ->
79  * List[float]
80  *
81  * @par Lua函数原型
82  * poseSub(p1: table, p2: table) -> table
83  *
84  * @par JSON-RPC请求示例
85  * {"jsonrpc":"2.0","method":"Math.poseSub","params":[[0.2, 0.5, 0.1, 1.57,
86  * 0, 0],[0.2, 0.5, 0.6, 1.57, 0, 0]],"id":1}
87  *
88  * @par JSON-RPC响应示例
89  * {"id":1,"jsonrpc":"2.0","result":[0.0,0.0,-0.5,0.0,-0.0,0.0]}
90  *
91  */
92  std::vector<double> poseSub(const std::vector<double> &p1,
93  const std::vector<double> &p2);
94 
95  /**
96  * 计算线性插值
97  *
98  * @param p1 起点的TCP位姿
99  * @param p2 终点的TCP位姿
100  * @param alpha 系数,
101  * 当0<alpha<1,返回p1和p2两点直线的之间靠近p1端且占总路径比例为alpha的点;
102  * 例如当alpha=0.3,返回的是靠近p1那端,总路径的百分之30的点;
103  * 当alpha>1,返回p2;
104  * 当alpha<0,返回p1;
105  * @return 插值计算结果
106  *
107  * @par Python函数原型
108  * interpolatePose(self: pyaubo_sdk.Math, arg0: List[float], arg1:
109  * List[float], arg2: float) -> List[float]
110  *
111  * @par Lua函数原型
112  * interpolatePose(p1: table, p2: table, alpha: number) -> table
113  *
114  * @par JSON-RPC请求示例
115  * {"jsonrpc":"2.0","method":"Math.interpolatePose","params":[[0.2, 0.2,
116  * 0.4, 0, 0, 0],[0.2, 0.2, 0.6, 0, 0, 0],0.5],"id":1}
117  *
118  * @par JSON-RPC响应示例
119  * {"id":1,"jsonrpc":"2.0","result":[0.2,0.2,0.5,0.0,-0.0,0.0]}
120  *
121  */
122  std::vector<double> interpolatePose(const std::vector<double> &p1,
123  const std::vector<double> &p2,
124  double alpha);
125  /**
126  * Pose transformation
127  *
128  * The first argument, p_from, is used to transform the second argument,
129  * p_from_to, and the result is then returned. This means that the result is
130  * the resulting pose, when starting at the coordinate system of p_from, and
131  * then in that coordinate system moving p_from_to.
132  *
133  * This function can be seen in two different views. Either the function
134  * transforms, that is translates and rotates, p_from_to by the parameters
135  * of p_from. Or the function is used to get the resulting pose, when first
136  * making a move of p_from and then from there, a move of p_from_to. If the
137  * poses were regarded as transformation matrices, it would look like:
138  *
139  * T_world->to = T_world->from * T_from->to,
140  * T_x->to = T_x->from * T_from->to
141  *
142  * 位姿变换
143  *
144  * 第一个参数 p_from 用于转换第二个参数 p_from_to,并返回结果。
145  * 这意味着结果是从 p_from 的坐标系开始,
146  * 然后在该坐标系中移动 p_from_to后的位姿。
147  *
148  * 这个函数可以从两个不同的角度来看。
149  * 一种是函数将 p_from_to 根据 p_from 的参数进行转换,即平移和旋转。
150  * 另一种是函数被用于获取结果姿态,先对 p_from 进行移动,然后再对 p_from_to
151  * 进行移动。 如果将姿态视为转换矩阵,它看起来像是:
152  *
153  * T_world->to = T_world->from * T_from->to,
154  * T_x->to = T_x->from * T_from->to
155  *
156  * 这两个方程描述了姿态变换的基本原理,根据给定的起始姿态和相对于起始姿态的姿态变化,可以计算出目标姿态。
157  *
158  * 举个例子,已知B相对于A的位姿、C相对于B的位姿,求C相对于A的位姿。
159  * 第一个参数是B相对于A的位姿,第二个参数是C相对于B的位姿,
160  * 返回值是C相对于A的位姿。
161  *
162  * @param pose_from 起始位姿(空间向量)
163  * @param pose_from_to 相对于起始位姿的姿态变化(空间向量)
164  * @return 结果位姿 (空间向量)
165  *
166  * @par Python函数原型
167  * poseTrans(self: pyaubo_sdk.Math, arg0: List[float], arg1: List[float]) ->
168  * List[float]
169  *
170  * @par Lua函数原型
171  * poseTrans(pose_from: table, pose_from_to: table) -> table
172  *
173  * @par JSON-RPC请求示例
174  * {"jsonrpc":"2.0","method":"Math.poseTrans","params":[[0.2, 0.5,
175  * 0.1, 1.57, 0, 0],[0.2, 0.5, 0.6, 1.57, 0, 0]],"id":1}
176  *
177  * @par JSON-RPC响应示例
178  * {"id":1,"jsonrpc":"2.0","result":[0.4,-0.09960164640373415,0.6004776374923573,3.14,-0.0,0.0]}
179  *
180  */
181  std::vector<double> poseTrans(const std::vector<double> &pose_from,
182  const std::vector<double> &pose_from_to);
183 
184  /**
185  * 姿态逆变换
186  *
187  * 已知C相对于A的位姿、C相对于B的位姿,求B相对于A的位姿。
188  * 第一个参数是C相对于A的位姿,第二个参数是C相对于B的位姿,
189  * 返回值是B相对于A的位姿。
190  *
191  * @param pose_from 起始位姿
192  * @param pose_to_from 相对于结果位姿的姿态变化
193  * @return 结果位姿
194  *
195  * @par Python函数原型
196  * poseTransInv(self: pyaubo_sdk.Math, arg0: List[float], arg1: List[float])
197  * -> List[float]
198  *
199  * @par Lua函数原型
200  * poseTransInv(pose_from: table, pose_to_from: table) -> table
201  *
202  * @par JSON-RPC请求示例
203  * {"jsonrpc":"2.0","method":"Math.poseTransInv","params":[[0.4, -0.0996016,
204  * 0.600478, 3.14, 0, 0],[0.2, 0.5, 0.6, 1.57, 0, 0]],"id":1}
205  *
206  * @par JSON-RPC响应示例
207  * {"id":1,"jsonrpc":"2.0","result":[0.2,0.5000000464037341,0.10000036250764266,1.57,-0.0,0.0]}
208  *
209  */
210  std::vector<double> poseTransInv(const std::vector<double> &pose_from,
211  const std::vector<double> &pose_to_from);
212 
213  /**
214  * Get the inverse of a pose
215  *
216  * 获取位姿的逆
217  *
218  * @param pose tool pose (spatial vector)
219  * 工具位姿(空间向量)
220  * @return inverse tool pose transformation (spatial vector)
221  * 工具位姿的逆转换(空间向量)
222  *
223  * @par Python函数原型
224  * poseInverse(self: pyaubo_sdk.Math, arg0: List[float]) -> List[float]
225  *
226  * @par Lua函数原型
227  * poseInverse(pose: table) -> table
228  *
229  * @par JSON-RPC请求示例
230  * {"jsonrpc":"2.0","method":"Math.poseInverse","params":[[0.2, 0.5,
231  * 0.1, 1.57, 0, 3.14]],"id":1}
232  *
233  * @par JSON-RPC响应示例
234  * {"id":1,"jsonrpc":"2.0","result":[0.19920341988726448,-0.09960155178838484,-0.5003973704832628,
235  * 1.5699999989900404,-0.0015926530848129354,-3.1415913853161266]}
236  *
237  */
238  std::vector<double> poseInverse(const std::vector<double> &pose);
239 
240  /**
241  * 计算两个位姿的位置距离
242  *
243  * @param p1 位姿1
244  * @param p2 位姿2
245  * @return 两个位姿的位置距离
246  *
247  * @par JSON-RPC请求示例
248  * {"jsonrpc":"2.0","method":"Math.poseDistance","params":[[0.1, 0.3, 0.1,
249  * 0.3142, 0.0, 1.571],[0.2, 0.5, 0.6, 0, -0.172, 0.0]],"id":1}
250  *
251  * @par JSON-RPC响应示例
252  * {"id":1,"jsonrpc":"2.0","result":0.5477225575051661}
253  *
254  */
255  double poseDistance(const std::vector<double> &p1,
256  const std::vector<double> &p2);
257 
258  /**
259  * 计算两个位姿的轴角距离
260  *
261  * @param p1 位姿1
262  * @param p2 位姿2
263  * @return 轴角距离
264  */
265  double poseAngleDistance(const std::vector<double> &p1,
266 
267  const std::vector<double> &p2);
268 
269  /**
270  * 判断两个位姿是否相等
271  *
272  * @param p1 位姿1
273  * @param p2 位姿2
274  * @param eps 误差
275  * @return 相等返回true,反之返回false
276  *
277  * @par JSON-RPC请求示例
278  * {"jsonrpc":"2.0","method":"Math.poseDistance","params":[[0.1, 0.3, 0.1,
279  * 0.3142, 0.0, 1.571],[0.1, 0.3, 0.1, 0.3142, 0.0, 1.5711]],"id":1}
280  *
281  * @par JSON-RPC响应示例
282  * {"id":1,"jsonrpc":"2.0","result":0.0}
283  *
284  */
285  bool poseEqual(const std::vector<double> &p1, const std::vector<double> &p2,
286  double eps = 5e-5);
287 
288  /**
289  *
290  * @param F_b_a_old
291  * @param V_in_a
292  * @param type
293  * @return
294  *
295  * @par Python函数原型
296  * transferRefFrame(self: pyaubo_sdk.Math, arg0: List[float], arg1:
297  * List[float[3]], arg2: int) -> List[float]
298  *
299  * @par Lua函数原型
300  * transferRefFrame(F_b_a_old: table, V_in_a: table, type: number) -> table
301  *
302  */
303  std::vector<double> transferRefFrame(const std::vector<double> &F_b_a_old,
304  const Vector3d &V_in_a, int type);
305 
306  /**
307  * 姿态旋转
308  *
309  * @param pose
310  * @param rotv
311  * @return
312  *
313  * @par Python函数原型
314  * poseRotation(self: pyaubo_sdk.Math, arg0: List[float], arg1: List[float])
315  * -> List[float]
316  *
317  * @par Lua函数原型
318  * poseRotation(pose: table, rotv: table) -> table
319  *
320  */
321  std::vector<double> poseRotation(const std::vector<double> &pose,
322  const std::vector<double> &rotv);
323 
324  /**
325  * 欧拉角转四元数
326  *
327  * @param rpy 欧拉角
328  * @return 四元数
329  *
330  * @par Python函数原型
331  * rpyToQuaternion(self: pyaubo_sdk.Math, arg0: List[float]) -> List[float]
332  *
333  * @par Lua函数原型
334  * rpyToQuaternion(rpy: table) -> table
335  *
336  * @par JSON-RPC请求示例
337  * {"jsonrpc":"2.0","method":"Math.rpyToQuaternion","params":[[0.611, 0.785,
338  * 0.960]],"id":1}
339  *
340  * @par JSON-RPC响应示例
341  * {"id":1,"jsonrpc":"2.0","result":[0.834721517970497,0.07804256900772265,0.4518931575790371,0.3048637712043723]}
342  *
343  */
344  std::vector<double> rpyToQuaternion(const std::vector<double> &rpy);
345 
346  /**
347  * 四元数转欧拉角
348  *
349  * @param quat 四元数
350  * @return 欧拉角
351  *
352  * @par Python函数原型
353  * quaternionToRpy(self: pyaubo_sdk.Math, arg0: List[float]) -> List[float]
354  *
355  * @par Lua函数原型
356  * quaternionToRpy(quat: table) -> table
357  *
358  * @par JSON-RPC请求示例
359  * {"jsonrpc":"2.0","method":"Math.quaternionToRpy","params":[[0.834722,
360  * 0.0780426, 0.451893, 0.304864]],"id":1}
361  *
362  * @par JSON-RPC响应示例
363  * {"id":1,"jsonrpc":"2.0","result":[0.6110000520523781,0.7849996877683915,0.960000543982093]}
364  *
365  */
366  std::vector<double> quaternionToRpy(const std::vector<double> &quat);
367 
368  /**
369  * 四点法标定TCP偏移
370  *
371  * 找一个尖点,将机械臂工具末端点绕着尖点示教四个位置,姿态差别要大。
372  * 设置完毕后即可计算出来结果。
373  *
374  * @param poses 四个点的位姿集合
375  * @return TCP标定结果和标定结果是否有效
376  *
377  * @par Python函数原型
378  * tcpOffsetIdentify(self: pyaubo_sdk.Math, arg0: List[List[float]]) ->
379  * Tuple[List[float], int]
380  *
381  * @par Lua函数原型
382  * tcpOffsetIdentify(poses: table) -> table
383  *
384  */
385  ResultWithErrno tcpOffsetIdentify(
386  const std::vector<std::vector<double>> &poses);
387 
388  /**
389  * 三点法标定坐标系
390  *
391  * @param poses 三个点的位姿集合
392  * @param type 类型:\n
393  * 0 - oxy 原点 x轴正方向 xy平面(y轴正方向)\n
394  * 1 - oxz 原点 x轴正方向 xz平面(z轴正方向)\n
395  * 2 - oyz 原点 y轴正方向 yz平面(z轴正方向)\n
396  * 3 - oyx 原点 y轴正方向 yx平面(x轴正方向)\n
397  * 4 - ozx 原点 z轴正方向 zx平面(x轴正方向)\n
398  * 5 - ozy 原点 z轴正方向 zy平面(y轴正方向)\n
399  * @return 坐标系标定结果和标定结果是否有效
400  *
401  * @par JSON-RPC请求示例
402  * {"jsonrpc":"2.0","method":"Math.calibrateCoordinate","params":[[[0.55462,0.06219,0.37175,-3.142,0.0,1.580],
403  * [0.63746,0.11805,0.37175,-3.142,0.0,1.580],[0.40441,0.28489,0.37174,-3.142,0.0,1.580]],0],"id":1}
404  *
405  * @par JSON-RPC响应示例
406  * {"id":1,"jsonrpc":"2.0","result":[[0.55462,0.06219,0.37175,-3.722688983883945e-05,-1.6940658945086007e-21,0.5932768162455785],0]}
407  *
408  */
409  ResultWithErrno calibrateCoordinate(
410  const std::vector<std::vector<double>> &poses, int type);
411 
412  /**
413  * 根据圆弧的三个点,计算出拟合成的圆的另一半圆弧的中间点位置
414  *
415  * @param p1 圆弧的起始点
416  * @param p2 圆弧的中间点
417  * @param p3 圆弧的结束点
418  * @param mode 当mode等于1的时候,表示需要对姿态进行圆弧规划;
419  * 当mode等于0的时候,表示不需要对姿态进行圆弧规划
420  * @return 拟合成的圆的另一半圆弧的中间点位置和计算结果是否有效
421  *
422  * @par JSON-RPC请求示例
423  * {"jsonrpc":"2.0","method":"Math.calculateCircleFourthPoint","params":[[0.5488696249770836,-0.1214996547187204,0.2631931199112321,-3.14159198038469,-3.673205103150083e-06,1.570796326792424],
424  * [0.5488696249770835,-0.1214996547187207,0.3599720701808493,-3.14159198038469,-3.6732051029273e-06,1.570796326792423],
425  * [0.5488696249770836,-0.0389996547187214,0.3599720701808496,-3.141591980384691,-3.673205102557476e-06,
426  * 1.570796326792422],1],"id":1}
427  *
428  * @par JSON-RPC响应示例
429  * {"id":1,"jsonrpc":"2.0","result":[[0.5488696249770837,-0.031860179583911546,0.27033259504604207,-3.1415919803846903,-3.67320510285378e-06,1.570796326792423],1]}
430  *
431  */
432  ResultWithErrno calculateCircleFourthPoint(const std::vector<double> &p1,
433  const std::vector<double> &p2,
434  const std::vector<double> &p3,
435  int mode);
436  /**
437  * @brief forceTrans:
438  * 变换力和力矩的参考坐标系 force_in_b = pose_a_in_b * force_in_a
439  * @param pose_a_in_b: a 坐标系在 b 坐标系的位姿
440  * @param force_in_a: 力和力矩在 a 坐标系的描述
441  * @return force_in_b,力和力矩在 b 坐标系的描述
442  */
443  std::vector<double> forceTrans(const std::vector<double> &pose_a_in_b,
444  const std::vector<double> &force_in_a);
445 
446  /**
447  * @brief 通过距离计算工具坐标系下的位姿增量
448  * @param distances: N 个距离, N >=3
449  * @param position: 距离参考轨迹的保持高度
450  * @param radius: 传感器中心距离末端tcp的等效半径
451  * @param track_scale: 跟踪比例, 设置范围(0, 1], 1表示跟踪更快
452  * @return 基于工具坐标系的位姿增量
453  */
454  std::vector<double> getDeltaPoseBySensorDistance(
455  const std::vector<double> &distances, double position, double radius,
456  double track_scale);
457 
458  /**
459  * @brief changeFTFrame: 变换力和力矩的参考坐标系
460  * @param pose_a_in_b: a 坐标系在 b 坐标系的位姿
461  * @param ft_in_a: 作用在 a 点的力和力矩在 a 坐标系的描述
462  * @return ft_in_b,作用在 b 点的力和力矩在 b 坐标系的描述
463  */
464  std::vector<double> deltaPoseTrans(const std::vector<double> &pose_a_in_b,
465  const std::vector<double> &ft_in_a);
466 
467  /**
468  * @brief addDeltaPose: 计算以给定速度变换单位时间后的位姿
469  * @param pose_a_in_b: 当前时刻 a 相对于 b 的位姿
470  * @param v_in_b: 当前时刻 a 坐标系的速度在 b 的描述
471  * @return pose_in_b, 单位时间后的位姿在 b 的描述
472  */
473  std::vector<double> deltaPoseAdd(const std::vector<double> &pose_a_in_b,
474  const std::vector<double> &v_in_b);
475 
476 protected:
477  void *d_;
478 };
479 using MathPtr = std::shared_ptr<Math>;
480 
481 // clang-format off
482 #define Math_DECLARES \
483  _FUNC(Math, 2, poseAdd, p1, p2) \
484  _FUNC(Math, 2, poseSub, p1, p2) \
485  _FUNC(Math, 3, interpolatePose, p1, p2, alpha) \
486  _FUNC(Math, 2, poseTrans, pose_from, pose_from_to) \
487  _FUNC(Math, 2, poseTransInv, pose_from, pose_to_from) \
488  _FUNC(Math, 1, poseInverse, pose) \
489  _FUNC(Math, 2, poseDistance, p1, p2) \
490  _FUNC(Math, 2, poseAngleDistance, p1, p2) \
491  _FUNC(Math, 3, poseEqual, p1, p2, eps) \
492  _FUNC(Math, 3, transferRefFrame, F_b_a_old, V_in_a, type) \
493  _FUNC(Math, 2, poseRotation, pose, rotv) \
494  _FUNC(Math, 1, rpyToQuaternion, rpy) \
495  _FUNC(Math, 1, quaternionToRpy, quant) \
496  _FUNC(Math, 1, tcpOffsetIdentify, poses) \
497  _FUNC(Math, 2, calibrateCoordinate, poses, type) \
498  _FUNC(Math, 4, calculateCircleFourthPoint, p1, p2, p3, mode) \
499  _FUNC(Math, 2, forceTrans, pose_a_in_b, force_in_a) \
500  _FUNC(Math, 4, getDeltaPoseBySensorDistance, distances, position, radius, track_scale) \
501  _FUNC(Math, 2, deltaPoseTrans, pose_a_in_b, ft_in_a) \
502  _FUNC(Math, 2, deltaPoseAdd, pose_a_in_b, v_in_b)
503 // clang-format on
504 
505 } // namespace common_interface
506 } // namespace arcs
507 #endif
std::shared_ptr< Math > MathPtr
Definition: math.h:479
数据类型的定义
std::tuple< std::vector< double >, int > ResultWithErrno
Definition: type_def.h:661
std::array< double, 3 > Vector3d
Definition: type_def.h:29
Definition: aubo_api.h:17