15 #ifndef BELUGA_MOTION_OMNIDIRECTIONAL_DRIVE_MODEL_HPP
16 #define BELUGA_MOTION_OMNIDIRECTIONAL_DRIVE_MODEL_HPP
21 #include <type_traits>
101 template <
class Control,
typename = common_tuple_type_t<Control, control_type>>
103 const auto& [pose, previous_pose] = action;
105 const auto translation = pose.translation() - previous_pose.translation();
106 const double distance = translation.norm();
107 const double distance_variance = distance * distance;
109 const auto& previous_orientation = previous_pose.so2();
110 const auto& current_orientation = pose.so2();
111 const auto rotation = current_orientation * previous_orientation.inverse();
113 const auto heading_rotation =
Sophus::SO2d{std::atan2(translation.y(), translation.x())};
114 const auto first_rotation =
117 using DistributionParam =
typename std::normal_distribution<double>::param_type;
118 const auto rotation_params = DistributionParam{
119 rotation.log(), std::sqrt(
123 const auto translation_params = DistributionParam{
128 const auto strafe_params = DistributionParam{
134 static thread_local
auto distribution = std::normal_distribution<double>{};
140 const auto second_rotation =
Sophus::SO2d{distribution(gen, rotation_params)} * first_rotation.inverse();
141 const auto translation =
142 Eigen::Vector2d{distribution(gen, translation_params), -distribution(gen, strafe_params)};
154 const auto delta = std::min(std::abs(rotation.log()), std::abs(flipped_rotation.log()));
155 return delta * delta;