Go to the documentation of this file.
14 #ifndef MOTION_COMMON__MOTION_COMMON_HPP_
15 #define MOTION_COMMON__MOTION_COMMON_HPP_
18 #include <autoware_auto_msgs/msg/control_diagnostic.hpp>
19 #include <autoware_auto_msgs/msg/trajectory.hpp>
20 #include <autoware_auto_msgs/msg/vehicle_control_command.hpp>
21 #include <autoware_auto_msgs/msg/vehicle_kinematic_state.hpp>
22 #include <geometry_msgs/msg/transform_stamped.hpp>
30 namespace motion_common
35 using Diagnostic = autoware_auto_msgs::msg::ControlDiagnostic;
38 using Heading = decltype(decltype(State::state)::heading);
39 using Index = decltype(Trajectory::points)::size_type;
40 using Point = decltype(Trajectory::points)::value_type;
47 const Point & state,
const Point & current_pt,
const Point & next_pt) noexcept;
57 template<
typename IsPastPo
intF>
65 if (traj.points.empty()) {
68 auto next_idx = start_idx;
69 for (
auto idx = start_idx; idx < traj.points.size() - 1U; ++idx) {
70 const auto current_pt = traj.points[idx];
71 const auto next_pt = traj.points[idx + 1U];
104 template<
typename RealT>
107 static_assert(std::is_floating_point<RealT>::value,
"angle must be floating point");
109 ret.real =
static_cast<decltype(ret.real)
>(std::cos(angle * RealT{0.5}));
110 ret.imag =
static_cast<decltype(ret.imag)
>(std::sin(angle * RealT{0.5}));
118 template<
typename QuatT>
122 ret.real =
static_cast<decltype(ret.real)
>(quat.w);
123 ret.imag =
static_cast<decltype(ret.imag)
>(quat.z);
131 template<
typename QuatT>
135 quat.w =
static_cast<decltype(quat.z)
>(heading.real);
136 quat.z =
static_cast<decltype(quat.
w)
>(heading.imag);
145 throw std::domain_error{
"max < min"};
147 return std::min(max, std::max(min, val));
151 template<
typename T,
typename RealT =
double>
154 static_assert(std::is_floating_point<RealT>::value,
"t must be floating point");
155 t =
clamp(
t, RealT{0.0}, RealT{1.0});
156 const auto del = b -
a;
157 return static_cast<T>(
t *
static_cast<RealT
>(del)) +
a;
166 template<
typename SlerpF>
169 #ifdef ROS_DISTRO_DASHING
170 Point ret{rosidl_generator_cpp::MessageInitialization::ALL};
171 #elif defined ROS_DISTRO_FOXY
172 Point ret{rosidl_runtime_cpp::MessageInitialization::ALL};
181 ret.heading = slerp_fn(
a.heading, b.heading,
t);
182 ret.longitudinal_velocity_mps =
183 interpolate(
a.longitudinal_velocity_mps, b.longitudinal_velocity_mps,
t);
184 ret.lateral_velocity_mps =
interpolate(
a.lateral_velocity_mps, b.lateral_velocity_mps,
t);
185 ret.acceleration_mps2 =
interpolate(
a.acceleration_mps2, b.acceleration_mps2,
t);
186 ret.heading_rate_rps =
interpolate(
a.heading_rate_rps, b.heading_rate_rps,
t);
187 ret.front_wheel_angle_rad =
interpolate(
a.front_wheel_angle_rad, b.front_wheel_angle_rad,
t);
188 ret.rear_wheel_angle_rad =
interpolate(
a.rear_wheel_angle_rad, b.rear_wheel_angle_rad,
t);
197 template<
typename SlerpF>
201 std::chrono::nanoseconds period,
205 out.header = in.header;
206 if (in.points.empty()) {
211 const auto last_time =
from_message(in.points.back().time_from_start);
212 auto count_ = last_time / period;
214 using SizeT =
typename decltype(in.points)::size_type;
216 static_cast<SizeT
>(std::min(count_,
static_cast<decltype(count_)
>(in.CAPACITY)));
217 out.points.reserve(count);
219 out.points.push_back(in.points.front());
221 auto ref_duration = period;
222 auto after_current_ref_idx = SizeT{1};
223 for (
auto idx = SizeT{1}; idx < count; ++idx) {
225 for (
auto jdx = after_current_ref_idx; jdx < in.points.size(); ++jdx) {
226 const auto & pt = in.points[jdx];
228 after_current_ref_idx = jdx;
234 const auto & curr_pt = in.points[after_current_ref_idx - 1U];
235 const auto & next_pt = in.points[after_current_ref_idx];
236 const auto dt = std::chrono::duration_cast<std::chrono::duration<Real>>(
238 const auto dt_ = std::chrono::duration_cast<std::chrono::duration<Real>>(
240 const auto t = dt_.count() / dt.count();
241 out.points.push_back(
interpolate(curr_pt, next_pt,
t, slerp_fn));
243 ref_duration += period;
248 MOTION_COMMON_PUBLIC
void sample(
251 std::chrono::nanoseconds period);
272 #endif // MOTION_COMMON__MOTION_COMMON_HPP_
MOTION_COMMON_PUBLIC Real to_angle(Heading heading) noexcept
Converts 2D quaternion to simple heading representation.
Definition: motion_common.cpp:145
Heading from_quat(QuatT quat) noexcept
Converts a quaternion-like object to a simple heading representation.
Definition: motion_common.hpp:119
TIME_UTILS_PUBLIC builtin_interfaces::msg::Time to_message(std::chrono::system_clock::time_point t)
Convert from std::chrono::time_point to time message.
Definition: time_utils.cpp:71
autoware_auto_msgs::msg::VehicleControlCommand VehicleControlCommand
Definition: pure_pursuit.hpp:41
autoware_auto_msgs::msg::VehicleControlCommand Command
Definition: motion_common.hpp:34
decltype(decltype(State::state)::heading) Heading
Definition: motion_common.hpp:38
T
Definition: catr_diff.py:22
autoware_auto_msgs::msg::VehicleKinematicState VehicleKinematicState
Definition: trajectory_spoofer.hpp:44
MOTION_COMMON_PUBLIC Complex32 operator-(Complex32 a) noexcept
Unary minus.
Definition: motion_common.cpp:247
MOTION_COMMON_PUBLIC void error(const Point &state, const Point &ref, Diagnostic &out) noexcept
Diagnostic header stuff.
Definition: motion_common.cpp:202
T clamp(T val, T min, T max)
Standard clamp implementation.
Definition: motion_common.hpp:142
t
Definition: catr_diff.py:22
MOTION_COMMON_PUBLIC bool is_aligned(Heading a, Heading b, Real dot_threshold)
Check if cosine angle is less than some dot product threshold.
Definition: motion_common.cpp:64
autoware_auto_msgs::msg::Complex32 Complex32
Definition: trajectory_spoofer.hpp:40
decltype(autoware_auto_msgs::msg::TrajectoryPoint::x) Real
Definition: motion_common.hpp:33
Heading from_angle(RealT angle) noexcept
Basic conversion.
Definition: motion_common.hpp:105
void sample(const Trajectory &in, Trajectory &out, std::chrono::nanoseconds period, SlerpF slerp_fn)
Sample a trajectory using interpolation; does not extrapolate.
Definition: motion_common.hpp:198
Definition: motion_common.hpp:259
TIME_UTILS_PUBLIC std::chrono::nanoseconds interpolate(std::chrono::nanoseconds a, std::chrono::nanoseconds b, float t) noexcept
Standard interpolation.
Definition: time_utils.cpp:101
autoware_auto_msgs::msg::VehicleKinematicState State
Definition: motion_common.hpp:36
MOTION_COMMON_PUBLIC Complex32 operator+(Complex32 a, Complex32 b) noexcept
Addition operator.
Definition: motion_common.cpp:227
T interpolate(T a, T b, RealT t)
Standard linear interpolation.
Definition: motion_common.hpp:152
Index update_reference_index(const Trajectory &traj, const State &state, Index start_idx, IsPastPointF is_past_point)
Advance to the first trajectory point past state according to criterion is_past_point.
Definition: motion_common.hpp:58
w
Definition: catr_diff.py:22
MOTION_COMMON_PUBLIC Heading nlerp(Heading a, Heading b, Real t)
Definition: motion_common.cpp:163
MOTION_COMMON_PUBLIC bool heading_ok(const Trajectory &traj)
Check that all heading values in a trajectory are normalized 2D quaternions.
Definition: motion_common.cpp:77
geometry_msgs::msg::TransformStamped TransformStamped
Definition: motion_testing_publisher.hpp:37
TIME_UTILS_PUBLIC std::chrono::system_clock::time_point from_message(builtin_interfaces::msg::Time t) noexcept
Convert from std::chrono::time_point from time message.
Definition: time_utils.cpp:84
DifferentialState x
Definition: kinematic_bicycle.snippet.hpp:28
decltype(Trajectory::points)::value_type Point
Definition: motion_common.hpp:40
decltype(Trajectory::points)::size_type Index
Definition: motion_common.hpp:39
QuatT to_quat(Heading heading) noexcept
Converts a simple heading representation into a quaternion-like object.
Definition: motion_common.hpp:132
a
Definition: catr_diff.py:22
Definition: controller_base.hpp:30
MOTION_COMMON_PUBLIC void doTransform(const Point &t_in, Point &t_out, const geometry_msgs::msg::TransformStamped &transform) noexcept
Apply transform to TrajectoryPoint.
Definition: motion_common.cpp:91
autoware_auto_msgs::msg::Trajectory Trajectory
Definition: motion_common.hpp:37
autoware_auto_msgs::msg::ControlDiagnostic Diagnostic
Definition: motion_common.hpp:35
MOTION_COMMON_PUBLIC bool is_past_point(const Point &state, const Point &pt) noexcept
Check if a state is past a given trajectory point, assuming heading is correct.
Definition: motion_common.cpp:26