perception_interfaces 1.2.0
Loading...
Searching...
No Matches
convenience_state_setters.hpp
Go to the documentation of this file.
1// Copyright Institute for Automotive Engineering (ika), RWTH Aachen University
2// SPDX-License-Identifier: MIT
3
9#pragma once
10
12#include <perception_msgs_utils/covariance_transform.hpp>
15
16#include <array>
17
18namespace perception_msgs
19{
20
21namespace object_access
22{
23
24// --- full state/covariance -------------------------------------------------
25
32inline void setContinuousState(ObjectState & state, const std::vector<double> & val)
33{
34 state.continuous_state = val;
36}
37
45template <typename T>
46inline void setContinuousState(T & obj, const std::vector<double> & val)
47{
48 setContinuousState(obj.state, val);
49}
50
57inline void setDiscreteState(ObjectState & state, const std::vector<long int> & val)
58{
59 state.discrete_state = val;
61}
62
70template <typename T>
71inline void setDiscreteState(T & obj, const std::vector<long int> & val)
72{
73 setDiscreteState(obj.state, val);
74}
75
82inline void setContinuousStateCovariance(ObjectState & state, const std::vector<double> & val)
83{
84 state.continuous_state_covariance = val;
86}
87
95template <typename T>
96inline void setContinuousStateCovariance(T & obj, const std::vector<double> & val)
97{
98 setContinuousStateCovariance(obj.state, val);
99}
100
110 ObjectState & state, const unsigned int i, const unsigned int j, const double val)
111{
113 const int n = getContinuousStateSize(state);
114 if (i >= static_cast<unsigned int>(n) || j >= static_cast<unsigned int>(n))
115 throw std::out_of_range("Covariance coordinates out of range");
116 if (state.continuous_state_covariance.empty()) {
117 setContinuousStateCovariance(state, std::vector<double>(n * n, CONTINUOUS_STATE_COVARIANCE_INIT));
118 for (int k = 0; k < n; ++k)
119 state.continuous_state_covariance[n * k + k] = CONTINUOUS_STATE_COVARIANCE_INVALID;
120 }
121 state.continuous_state_covariance.at(n * i + j) = val;
122}
123
133template <typename T>
135 T & obj, const unsigned int i, const unsigned int j, const double val)
136{
137 setContinuousStateCovarianceAt(obj.state, i, j, val);
138}
139
146inline void setContinuousStateCovarianceDiagonal(ObjectState & state, const std::vector<double> val)
147{
148 const int n = getContinuousStateSize(state);
149 for (int i = 0; i < n; i++) setContinuousStateCovarianceAt(state, i, i, val[i]);
150}
151
159template <typename T>
160inline void setContinuousStateCovarianceDiagonal(T & obj, const std::vector<double> val)
161{
163}
164
165// --- vector quantities -----------------------------------------------------
166
174inline void setPosition(ObjectState & state, const gm::Point val, const bool reset_covariance = true)
175{
176 setX(state, val.x, reset_covariance);
177 setY(state, val.y, reset_covariance);
178 setZ(state, val.z, reset_covariance);
179}
180
189template <typename T>
190inline void setPosition(T & obj, const gm::Point val, const bool reset_covariance = true)
191{
192 setPosition(obj.state, val, reset_covariance);
193}
194
202inline void setPosition(ObjectState & state, const std::array<double, 3> & val, const bool reset_covariance = true)
203{
204 setX(state, val[0], reset_covariance);
205 setY(state, val[1], reset_covariance);
206 setZ(state, val[2], reset_covariance);
207}
208
217template <typename T>
218inline void setPosition(T & obj, const std::array<double, 3> & val, const bool reset_covariance = true)
219{
220 setPosition(obj.state, val, reset_covariance);
221}
222
230inline void setOrientation(ObjectState & state, const gm::Quaternion & val, const bool reset_covariance = true)
231{
232 tf2::Quaternion q;
233 tf2::fromMsg(val, q);
234 double roll, pitch, yaw;
235 tf2::Matrix3x3(q).getRPY(roll, pitch, yaw);
236 if (hasRoll(state.model_id)) setRoll(state, roll, reset_covariance);
237 if (hasPitch(state.model_id)) setPitch(state, pitch, reset_covariance);
238 if (hasYaw(state.model_id)) setYaw(state, yaw, reset_covariance);
239}
240
249template <typename T>
250inline void setOrientation(T & obj, const gm::Quaternion & val, const bool reset_covariance = true)
251{
252 setOrientation(obj.state, val, reset_covariance);
253}
254
262inline void setOrientation(ObjectState & state, const std::array<double, 3> & val, const bool reset_covariance = true)
263{
264 if (hasRoll(state.model_id)) setRoll(state, val[0], reset_covariance);
265 if (hasPitch(state.model_id)) setPitch(state, val[1], reset_covariance);
266 if (hasYaw(state.model_id)) setYaw(state, val[2], reset_covariance);
267}
268
277template <typename T>
278inline void setOrientation(T & obj, const std::array<double, 3> & val, const bool reset_covariance = true)
279{
280 setOrientation(obj.state, val, reset_covariance);
281}
282
290inline void setPose(ObjectState & state, const gm::Pose & val, const bool reset_covariance = true)
291{
292 setPosition(state, val.position, reset_covariance);
293 setOrientation(state, val.orientation, reset_covariance);
294}
295
304template <typename T>
305inline void setPose(T & obj, const gm::Pose & val, const bool reset_covariance = true)
306{
307 setPose(obj.state, val, reset_covariance);
308}
309
318inline void setPose(
319 ObjectState & state, const std::array<double, 3> & xyz, const std::array<double, 3> & rpy, const bool reset_covariance = true)
320{
321 setPosition(state, xyz, reset_covariance);
322 setOrientation(state, rpy, reset_covariance);
323}
324
334template <typename T>
335inline void setPose(T & obj, const std::array<double, 3> & xyz, const std::array<double, 3> & rpy, const bool reset_covariance = true)
336{
337 setPose(obj.state, xyz, rpy, reset_covariance);
338}
339
347 ObjectState & state, const gm::PoseWithCovariance::_covariance_type & val)
348{
349 const int n = 6;
350 const int model_id = state.model_id;
351
352 int ix, jx;
353 for (int i = 0; i < n; i++) {
354 bool i_valid = true;
355 switch (i) {
356 case 0: i_valid = hasX(model_id); ix = i_valid ? indexX(model_id) : 0; break;
357 case 1: i_valid = hasY(model_id); ix = i_valid ? indexY(model_id) : 0; break;
358 case 2: i_valid = hasZ(model_id); ix = i_valid ? indexZ(model_id) : 0; break;
359 case 3: i_valid = hasRoll(model_id); ix = i_valid ? indexRoll(model_id) : 0; break;
360 case 4: i_valid = hasPitch(model_id); ix = i_valid ? indexPitch(model_id) : 0; break;
361 case 5: i_valid = hasYaw(model_id); ix = i_valid ? indexYaw(model_id) : 0; break;
362 }
363 if (!i_valid) continue;
364
365 for (int j = 0; j < n; j++) {
366 bool j_valid = true;
367 switch (j) {
368 case 0: j_valid = hasX(model_id); jx = j_valid ? indexX(model_id) : 0; break;
369 case 1: j_valid = hasY(model_id); jx = j_valid ? indexY(model_id) : 0; break;
370 case 2: j_valid = hasZ(model_id); jx = j_valid ? indexZ(model_id) : 0; break;
371 case 3: j_valid = hasRoll(model_id); jx = j_valid ? indexRoll(model_id) : 0; break;
372 case 4: j_valid = hasPitch(model_id); jx = j_valid ? indexPitch(model_id) : 0; break;
373 case 5: j_valid = hasYaw(model_id); jx = j_valid ? indexYaw(model_id) : 0; break;
374 }
375 if (!j_valid) continue;
376
377 setContinuousStateCovarianceAt(state, ix, jx, val[n * i + j]);
378 }
379 }
380}
388template <typename T>
389inline void setPoseCovariance(T & obj, const gm::PoseWithCovariance::_covariance_type & val)
390{
391 setPoseCovariance(obj.state, val);
392}
393
400inline void setPoseWithCovariance(ObjectState & state, const gm::PoseWithCovariance & val)
401{
402 setPose(state, val.pose, false);
403 setPoseCovariance(state, val.covariance);
404}
405
413template <typename T>
414inline void setPoseWithCovariance(T & obj, const gm::PoseWithCovariance & val)
415{
416 setPoseWithCovariance(obj.state, val);
417}
418
426inline void setVelocity(ObjectState & state, const gm::Vector3 & val, const bool reset_covariance = true)
427{
428 setVelLon(state, val.x, reset_covariance);
429 setVelLat(state, val.y, reset_covariance);
430}
439template <typename T>
440inline void setVelocity(T & obj, const gm::Vector3 & val, const bool reset_covariance = true)
441{
442 setVelocity(obj.state, val, reset_covariance);
443}
444
452inline void setVelocity(ObjectState & state, const std::array<double, 2> & val, const bool reset_covariance = true)
453{
454 setVelLon(state, val[0], reset_covariance);
455 setVelLat(state, val[1], reset_covariance);
456}
457
466template <typename T>
467inline void setVelocity(T & obj, const std::array<double, 2> & val, const bool reset_covariance = true)
468{
469 setVelocity(obj.state, val, reset_covariance);
470}
471
479inline void setAcceleration(ObjectState & state, const gm::Vector3 & val, const bool reset_covariance = true)
480{
481 setAccLon(state, val.x, reset_covariance);
482 setAccLat(state, val.y, reset_covariance);
483}
484
493template <typename T>
494inline void setAcceleration(T & obj, const gm::Vector3 & val, const bool reset_covariance = true)
495{
496 setAcceleration(obj.state, val, reset_covariance);
497}
498
506inline void setAcceleration(ObjectState & state, const std::array<double, 2> & val, const bool reset_covariance = true)
507{
508 setAccLon(state, val[0], reset_covariance);
509 setAccLat(state, val[1], reset_covariance);
510}
511
520template <typename T>
521inline void setAcceleration(T & obj, const std::array<double, 2> & val, const bool reset_covariance = true)
522{
523 setAcceleration(obj.state, val, reset_covariance);
524}
525
526// --- alternative state entries ---------------------------------------------
527
535inline void setRollInDeg(ObjectState & state, const double val, const bool reset_covariance = true)
536{
537 setRoll(state, val * M_PI / 180.0, reset_covariance);
538}
539
548template <typename T>
549inline void setRollInDeg(T & obj, const double val, const bool reset_covariance = true)
550{
551 setRollInDeg(obj.state, val, reset_covariance);
552}
553
561inline void setPitchInDeg(ObjectState & state, const double val, const bool reset_covariance = true)
562{
563 setPitch(state, val * M_PI / 180.0, reset_covariance);
564}
565
574template <typename T>
575inline void setPitchInDeg(T & obj, const double val, const bool reset_covariance = true)
576{
577 setPitchInDeg(obj.state, val, reset_covariance);
578}
579
587inline void setYawInDeg(ObjectState & state, const double val, const bool reset_covariance = true)
588{
589 setYaw(state, val * M_PI / 180.0, reset_covariance);
590}
591
600template <typename T>
601inline void setYawInDeg(T & obj, const double val, const bool reset_covariance = true)
602{
603 setYawInDeg(obj.state, val, reset_covariance);
604}
605
617 ObjectState & state, const gm::Vector3 & vel_xyz_in, const double yaw, const double var_vel_x,
618 const double var_vel_y, const double cov_vel_xy)
619{
620 gm::PoseWithCovariance vel_lon_lat, vel_xyz;
621 vel_xyz.pose.position.x = vel_xyz_in.x;
622 vel_xyz.pose.position.y = vel_xyz_in.y;
623 vel_xyz.pose.position.z = 0.0;
624
625 vel_xyz.covariance.at(0) = var_vel_x;
626 vel_xyz.covariance.at(1) = cov_vel_xy;
627 vel_xyz.covariance.at(6) = cov_vel_xy;
628 vel_xyz.covariance.at(7) = var_vel_y;
629
630 tf2::Quaternion q;
631 q.setRPY(0.0, 0.0, -yaw);
632 gm::TransformStamped tf;
633 tf.transform.rotation = tf2::toMsg(q);
634
635 gm::PoseWithCovarianceStamped vel_lon_lat_stamped, vel_xyz_stamped;
636 vel_xyz_stamped.pose = vel_xyz;
637 transformPoseWithCovariance(vel_xyz_stamped, vel_lon_lat_stamped, tf);
638 vel_lon_lat = vel_lon_lat_stamped.pose;
639
640 setVelocity(state, {vel_lon_lat.pose.position.x, vel_lon_lat.pose.position.y}, false);
641 setYaw(state, yaw, false);
642
643 int ix, jx, n = 2;
644 auto model_id = state.model_id;
645 for (int i = 0; i < n; i++) {
646 for (int j = 0; j < n; j++) {
647 if (i == 0 && hasVelLon(model_id))
648 ix = indexVelLon(model_id);
649 else if (i == 1 && hasVelLat(model_id))
650 ix = indexVelLat(model_id);
651 else
652 continue;
653
654 if (j == 0 && hasVelLon(model_id))
655 jx = indexVelLon(model_id);
656 else if (j == 1 && hasVelLat(model_id))
657 jx = indexVelLat(model_id);
658 else
659 continue;
660
661 setContinuousStateCovarianceAt(state, ix, jx, vel_lon_lat.covariance.at(6 * i + j));
662 }
663 }
664}
665
677template <typename T>
679 T & obj, const gm::Vector3 & vel_xyz_in, const double yaw, const double var_vel_x,
680 const double var_vel_y, const double cov_vel_xy)
681{
682 return setVelocityXYZYawWithCovariance(obj.state, vel_xyz_in, yaw, var_vel_x, var_vel_y, cov_vel_xy);
683}
684
693inline void setVelocityXYZYaw(ObjectState & state, const gm::Vector3 & vel_xyz, const double yaw, const bool reset_covariance = true)
694{
695 gm::Vector3 vel_lon_lat, vel_xyz_in;
696 vel_xyz_in = vel_xyz;
697 tf2::Quaternion q;
698 q.setRPY(0.0, 0.0, -yaw);
699 gm::TransformStamped tf;
700 tf.transform.rotation = tf2::toMsg(q);
701 tf2::doTransform(vel_xyz_in, vel_lon_lat, tf);
702 setVelocity(state, vel_lon_lat, reset_covariance);
703 setYaw(state, yaw, reset_covariance);
704}
705
715template <typename T>
716inline void setVelocityXYZYaw(T & obj, const gm::Vector3 & vel_xyz, const double yaw, const bool reset_covariance = true)
717{
718 setVelocityXYZYaw(obj.state, vel_xyz, yaw, reset_covariance);
719}
720
732 ObjectState & state, const gm::Vector3 & acc_xyz_in, const double yaw, const double var_acc_x,
733 const double var_acc_y, const double cov_acc_xy)
734{
735 gm::PoseWithCovariance acc_lon_lat, acc_xyz;
736 acc_xyz.pose.position.x = acc_xyz_in.x;
737 acc_xyz.pose.position.y = acc_xyz_in.y;
738 acc_xyz.pose.position.z = 0.0;
739
740 acc_xyz.covariance.at(0) = var_acc_x;
741 acc_xyz.covariance.at(1) = cov_acc_xy;
742 acc_xyz.covariance.at(6) = cov_acc_xy;
743 acc_xyz.covariance.at(7) = var_acc_y;
744
745 tf2::Quaternion q;
746 q.setRPY(0.0, 0.0, -yaw);
747 gm::TransformStamped tf;
748 tf.transform.rotation = tf2::toMsg(q);
749
750 gm::PoseWithCovarianceStamped acc_lon_lat_stamped, acc_xyz_stamped;
751 acc_xyz_stamped.pose = acc_xyz;
752 transformPoseWithCovariance(acc_xyz_stamped, acc_lon_lat_stamped, tf);
753 acc_lon_lat = acc_lon_lat_stamped.pose;
754
755 setAcceleration(state, {acc_lon_lat.pose.position.x, acc_lon_lat.pose.position.y}, false);
756 setYaw(state, yaw, false);
757
758 int ix, jx, n = 2;
759 auto model_id = state.model_id;
760 for (int i = 0; i < n; i++) {
761 for (int j = 0; j < n; j++) {
762 if (i == 0 && hasAccLon(model_id))
763 ix = indexAccLon(model_id);
764 else if (i == 1 && hasAccLat(model_id))
765 ix = indexAccLat(model_id);
766 else
767 continue;
768
769 if (j == 0 && hasAccLon(model_id))
770 jx = indexAccLon(model_id);
771 else if (j == 1 && hasAccLat(model_id))
772 jx = indexAccLat(model_id);
773 else
774 continue;
775
776 setContinuousStateCovarianceAt(state, ix, jx, acc_lon_lat.covariance.at(6 * i + j));
777 }
778 }
779}
780
792template <typename T>
794 T & obj, const gm::Vector3 & acc_xyz_in, const double yaw, const double var_acc_x,
795 const double var_acc_y, const double cov_acc_xy)
796{
797 return setAccelerationXYZYawWithCovariance(obj.state, acc_xyz_in, yaw, var_acc_x, var_acc_y, cov_acc_xy);
798}
799
809 ObjectState & state, const gm::Vector3 & acc_xyz, const double yaw, const bool reset_covariance = true)
810{
811 gm::Vector3 acc_lon_lat, acc_xyz_in;
812 acc_xyz_in = acc_xyz;
813 tf2::Quaternion q;
814 q.setRPY(0.0, 0.0, -yaw);
815 gm::TransformStamped tf;
816 tf.transform.rotation = tf2::toMsg(q);
817 tf2::doTransform(acc_xyz_in, acc_lon_lat, tf);
818 setAcceleration(state, acc_lon_lat, reset_covariance);
819 setYaw(state, yaw, reset_covariance);
820}
821
831template <typename T>
832inline void setAccelerationXYZYaw(T & obj, const gm::Vector3 & acc_xyz, const double yaw, const bool reset_covariance = true)
833{
834 setAccelerationXYZYaw(obj.state, acc_xyz, yaw, reset_covariance);
835}
836
837} // namespace object_access
838
839} // namespace perception_msgs
Object state sanity checks.
void sanityCheckContinuousState(const ObjectState &state)
Perform sanity check on continuous state of given object state.
Definition checks.hpp:63
void sanityCheckContinuousStateCovariance(const ObjectState &state)
Perform sanity check on continuous state covariance of given object state.
Definition checks.hpp:103
void sanityCheckDiscreteState(const ObjectState &state)
Perform sanity check on discrete state of given object state.
Definition checks.hpp:83
void setPosition(ObjectState &state, const gm::Point val, const bool reset_covariance=true)
Set the position of a given object state.
void setContinuousStateCovarianceDiagonal(ObjectState &state, const std::vector< double > val)
Set the continuous state covariance diagonal of a given object state.
void setContinuousState(ObjectState &state, const std::vector< double > &val)
Set the continuous state of a given object state.
void setPitchInDeg(ObjectState &state, const double val, const bool reset_covariance=true)
Set the pitch in degree of a given object state.
void setPose(ObjectState &state, const gm::Pose &val, const bool reset_covariance=true)
Set the pose of a given object state.
void setAccelerationXYZYawWithCovariance(ObjectState &state, const gm::Vector3 &acc_xyz_in, const double yaw, const double var_acc_x, const double var_acc_y, const double cov_acc_xy)
Set the acceleration XYZ and yaw with covariance of a given object state.
void setAcceleration(ObjectState &state, const gm::Vector3 &val, const bool reset_covariance=true)
Set the acceleration of a given object state.
void setVelocityXYZYawWithCovariance(ObjectState &state, const gm::Vector3 &vel_xyz_in, const double yaw, const double var_vel_x, const double var_vel_y, const double cov_vel_xy)
Set the velocity XYZ and yaw with covariance of a given object state.
void setRollInDeg(ObjectState &state, const double val, const bool reset_covariance=true)
Set the roll in degree of a given object state.
void setContinuousStateCovarianceAt(ObjectState &state, const unsigned int i, const unsigned int j, const double val)
Set the continuous state covariance entry at (i,j) of a given object state.
void setDiscreteState(ObjectState &state, const std::vector< long int > &val)
Set the discrete state of a given object state.
void setVelocity(ObjectState &state, const gm::Vector3 &val, const bool reset_covariance=true)
Set the velocity of a given object state.
void setOrientation(ObjectState &state, const gm::Quaternion &val, const bool reset_covariance=true)
Set the orientation of a given object state.
void setPoseCovariance(ObjectState &state, const gm::PoseWithCovariance::_covariance_type &val)
Set the pose covariance of a given object state.
void setYawInDeg(ObjectState &state, const double val, const bool reset_covariance=true)
Set the yaw in degree of a given object state.
void setAccelerationXYZYaw(ObjectState &state, const gm::Vector3 &acc_xyz, const double yaw, const bool reset_covariance=true)
Set the acceleration XYZ and yaw of a given template object that contains an object state.
void setVelocityXYZYaw(ObjectState &state, const gm::Vector3 &vel_xyz, const double yaw, const bool reset_covariance=true)
Set the velocity XYZ and yaw of a given object state.
void setContinuousStateCovariance(ObjectState &state, const std::vector< double > &val)
Set the continuous state covariance of a given object state.
void setPoseWithCovariance(ObjectState &state, const gm::PoseWithCovariance &val)
Set the pose with covariance of a given object state.
Object state vector indices based on state model.
bool hasYaw(const unsigned char &model_id)
Indicates if given model contains a yaw.
int indexVelLon(const unsigned char &model_id)
Get the vector-index that stores the longitudinal velocity for a given model-id.
int indexRoll(const unsigned char &model_id)
Get the vector-index that stores the roll for a given model-id.
bool hasZ(const unsigned char &model_id)
Indicates if given model contains a z-position.
bool hasAccLat(const unsigned char &model_id)
Indicates if given model contains a lateral acceleration.
bool hasVelLat(const unsigned char &model_id)
Indicates if given model contains a lateral velocity.
int indexVelLat(const unsigned char &model_id)
Get the vector-index that stores the lateral velocity for a given model-id.
bool hasY(const unsigned char &model_id)
Indicates if given model contains a y-position.
bool hasRoll(const unsigned char &model_id)
Indicates if given model contains a roll.
int indexY(const unsigned char &model_id)
Get the vector-index that stores the y-position for a given model-id.
bool hasX(const unsigned char &model_id)
Indicates if given model contains an x-position.
bool hasVelLon(const unsigned char &model_id)
Indicates if given model contains a longitudinal velocity.
int indexZ(const unsigned char &model_id)
Get the vector-index that stores the z-position for a given model-id.
int indexAccLon(const unsigned char &model_id)
Get the vector-index that stores the longitudinal acceleration for a given model-id.
bool hasPitch(const unsigned char &model_id)
Indicates if given model contains a pitch.
int indexPitch(const unsigned char &model_id)
Get the vector-index that stores the pitch for a given model-id.
int indexAccLat(const unsigned char &model_id)
Get the vector-index that stores the lateral acceleration for a given model-id.
int indexX(const unsigned char &model_id)
Get the vector-index that stores the x-position for a given model-id.
bool hasAccLon(const unsigned char &model_id)
Indicates if given model contains a longitudinal acceleration.
int indexYaw(const unsigned char &model_id)
Get the vector-index that stores the yaw for a given model-id.
Setter functions for objects state members.
void setAccLat(ObjectState &state, const double val, const bool reset_covariance=true)
Set the lateral acceleration for a given object state.
void setAccLon(ObjectState &state, const double val, const bool reset_covariance=true)
Set the longitudinal acceleration for a given object state.
void setVelLon(ObjectState &state, const double val, const bool reset_covariance=true)
Set the longitdunial velocity for a given object state.
void setX(ObjectState &state, const double val, const bool reset_covariance=true)
Set the x-position for a given object state.
void setY(ObjectState &state, const double val, const bool reset_covariance=true)
Set the y-position for a given object state.
void setVelLat(ObjectState &state, const double val, const bool reset_covariance=true)
Set the lateral velocity for a given object state.
void setYaw(ObjectState &state, const double val, const bool reset_covariance=true)
Set the yaw for a given object state.
void setRoll(ObjectState &state, const double val, const bool reset_covariance=true)
Set the roll for a given object state.
void setPitch(ObjectState &state, const double val, const bool reset_covariance=true)
Set the pitch for a given object state.
void setZ(ObjectState &state, const double val, const bool reset_covariance=true)
Set the z-position for a given object state.
int getContinuousStateSize(const ObjectState &state)
Get the continuous state size for a given object state.
Definition utils.hpp:30