Во время учебного процесса мои сценарии Python будут вызывать код C ++ от Pybind, а в части C ++ у меня есть функциональная ротация. p>
Код: Выделить всё
Eigen::Matrix rotationMatrixBaseToOriginInside(const Eigen::Matrix& eulerAnglesXYZ) {
Eigen::Matrix o_R_b;
// auxiliary variables
std::array v{};
v[0] = std::cos(eulerAnglesXYZ[1]);
v[1] = std::cos(eulerAnglesXYZ[2]);
o_R_b(0) = v[0] * v[1];
v[2] = std::sin(eulerAnglesXYZ[0]);
v[3] = -v[2];
o_R_b(6) = std::sin(eulerAnglesXYZ[1]);
v[4] = -o_R_b(6);
v[5] = v[3] * v[4];
v[6] = std::cos(eulerAnglesXYZ[0]);
v[7] = std::sin(eulerAnglesXYZ[2]);
o_R_b(1) = v[5] * v[1] + v[6] * v[7];
v[4] = v[6] * v[4];
o_R_b(2) = v[4] * v[1] + v[2] * v[7];
v[7] = -v[7];
o_R_b(3) = v[0] * v[7];
o_R_b(4) = v[5] * v[7] + v[6] * v[1];
o_R_b(5) = v[4] * v[7] + v[2] * v[1];
o_R_b(7) = v[3] * v[0];
o_R_b(8) = v[6] * v[0];
return o_R_b;
}
and i call this function by
const matrix3_t w_R_b = rotationMatrixBaseToOriginInside(eulerXYZ);
< /code>
Однако, когда запускается код, иногда он случайно умер. и я получаю ядро.Program terminated with signal SIGFPE, Arithmetic exception.
#0 0x00007fe977dd9e29 in do_cos (dx=0, x=) at ../sysdeps/ieee754/dbl-64/s_sin.c:108
108 ../sysdeps/ieee754/dbl-64/s_sin.c: No such file or directory.
[Current thread is 1 (Thread 0x7fe313fff700 (LWP 3672941))]
(gdb) bt
#0 0x00007fe977dd9e29 in do_cos (dx=0, x=) at ../sysdeps/ieee754/dbl-64/s_sin.c:108
#1 __cos_fma (x=) at ../sysdeps/ieee754/dbl-64/s_sin.c:286
#2 0x00007fe906785be4 in humanoid_interface::rotationMatrixBaseToOriginInside (eulerAnglesXYZ=...) at /usr/include/eigen3/Eigen/src/Core/util/Meta.h:300
< /code>
и информация локалей < /p>
(gdb) info locals
u =
xx =
s =
sn =
ssn =
c =
cs =
ccs =
cor = 0.023701645488744413
(gdb) up 1
#1 __cos_fma (x=) at ../sysdeps/ieee754/dbl-64/s_sin.c:286
286 in ../sysdeps/ieee754/dbl-64/s_sin.c
(gdb) info locals
y =
a = 120.00000000011512
da = 6.9472020217249313e-310
u =
k =
m =
n =
retval = 0
ctx = {env = {__control_word = , __glibc_reserved1 = , __status_word = , __glibc_reserved2 = , __tags = , __glibc_reserved3 = ,
__eip = , __cs_selector = , __opcode = , __glibc_reserved4 = , __data_offset = , __data_selector = ,
__glibc_reserved5 = , __mxcsr = 8101}, updated_status = }
(gdb) up 1
#2 0x00007fe906785be4 in humanoid_interface::rotationMatrixBaseToOriginInside (eulerAnglesXYZ=...) at /usr/include/eigen3/Eigen/src/Core/util/Meta.h:300
300 EIGEN_DEVICE_FUNC ~noncopyable() {}
(gdb) info locals
o_R_b = { = { = { = { = { = { = { = {}, }, }, }, }, }, m_storage = {m_data = {array = {0.99312891205556586, 6.9485744768938875e-310, 0, 0,
0, 0, -0.035153291205020566, 0, 0}}}}, }
v = {_M_elems = {0.99938193205473502, 0.9937431128194274, 0.023699426413416234, -0.023699426413416234, , , , }}
(gdb) p eulerAnglesXYZ
$1 = (const
Eigen::Matrix &) @0x7fe313ffe110: { = { = { = { = { = { = { = {}, }, }, }, }, }, m_storage = {m_data = {
array = {0.023701645488744413, -0.035160535370161498, 0.11192339221079543}}}}, }
и почему она очень случайная? < /P>
Большое спасибо, если вы можете дать несколько советов !!>
Подробнее здесь: https://stackoverflow.com/questions/794 ... n-cos-in-c