Я пишу программу, которая получает преобразования Eigen и сохраняет их в контейнере после применения некоторого шума.В частности, в момент времени k я получаю преобразование T k .Я получаю из контейнера преобразование T k-1 , создаю дельту = T k-1 -1 · T k ,применить некоторый шум к дельте и сохранить T k-1 · delta как новый элемент контейнера.
Я заметил, что после 50 итераций значения совершенно неверны и на каждой итерацииЯ вижу, что последний элемент контейнера, предварительно умноженный на его инверсию, даже не равен тождеству.
Я уже проверил, что контейнер соответствует правилам распределения, заданным Eigen.Я думаю, что проблема связана с нестабильностью операций, которые я выполняю.
Следующий простой код создает ненулевые значения, когда max = 35
, и уходит в бесконечность, когда max
больше, чем 60.
Eigen::Isometry3d my_pose = Eigen::Isometry3d::Identity();
my_pose.translate(Eigen::Vector3d::Random());
my_pose.rotate(Eigen::Quaterniond::UnitRandom());
Eigen::Isometry3d my_other_pose = my_pose;
int max = 35;
for(int i=0; i < max; i++)
{
my_pose = my_pose * my_pose.inverse() * my_pose;
}
std::cerr << my_pose.matrix() - my_other_pose.matrix() << std::endl;
Я удивлен, как быстро происходит расхождение.Поскольку ожидается, что моя настоящая программа будет повторяться более сотни раз, есть ли способ создать более стабильные относительные преобразования?