12#include <perception_msgs_utils/covariance_transform.hpp>
18namespace perception_msgs
21namespace object_access
34 state.continuous_state = val;
59 state.discrete_state = val;
84 state.continuous_state_covariance = val;
110 ObjectState & state,
const unsigned int i,
const unsigned int j,
const double val)
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()) {
118 for (
int k = 0; k < n; ++k)
119 state.continuous_state_covariance[n * k + k] = CONTINUOUS_STATE_COVARIANCE_INVALID;
121 state.continuous_state_covariance.at(n * i + j) = val;
135 T & obj,
const unsigned int i,
const unsigned int j,
const double val)
174inline void setPosition(ObjectState & state,
const gm::Point val,
const bool reset_covariance =
true)
176 setX(state, val.x, reset_covariance);
177 setY(state, val.y, reset_covariance);
178 setZ(state, val.z, reset_covariance);
190inline void setPosition(T & obj,
const gm::Point val,
const bool reset_covariance =
true)
202inline void setPosition(ObjectState & state,
const std::array<double, 3> & val,
const bool reset_covariance =
true)
204 setX(state, val[0], reset_covariance);
205 setY(state, val[1], reset_covariance);
206 setZ(state, val[2], reset_covariance);
218inline void setPosition(T & obj,
const std::array<double, 3> & val,
const bool reset_covariance =
true)
230inline void setOrientation(ObjectState & state,
const gm::Quaternion & val,
const bool reset_covariance =
true)
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);
238 if (
hasYaw(state.model_id))
setYaw(state, yaw, reset_covariance);
250inline void setOrientation(T & obj,
const gm::Quaternion & val,
const bool reset_covariance =
true)
262inline void setOrientation(ObjectState & state,
const std::array<double, 3> & val,
const bool reset_covariance =
true)
264 if (
hasRoll(state.model_id))
setRoll(state, val[0], reset_covariance);
266 if (
hasYaw(state.model_id))
setYaw(state, val[2], reset_covariance);
278inline void setOrientation(T & obj,
const std::array<double, 3> & val,
const bool reset_covariance =
true)
290inline void setPose(ObjectState & state,
const gm::Pose & val,
const bool reset_covariance =
true)
292 setPosition(state, val.position, reset_covariance);
305inline void setPose(T & obj,
const gm::Pose & val,
const bool reset_covariance =
true)
307 setPose(obj.state, val, reset_covariance);
319 ObjectState & state,
const std::array<double, 3> & xyz,
const std::array<double, 3> & rpy,
const bool reset_covariance =
true)
335inline void setPose(T & obj,
const std::array<double, 3> & xyz,
const std::array<double, 3> & rpy,
const bool reset_covariance =
true)
337 setPose(obj.state, xyz, rpy, reset_covariance);
347 ObjectState & state,
const gm::PoseWithCovariance::_covariance_type & val)
350 const int model_id = state.model_id;
353 for (
int i = 0; i < n; 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;
361 case 5: i_valid =
hasYaw(model_id); ix = i_valid ?
indexYaw(model_id) : 0;
break;
363 if (!i_valid)
continue;
365 for (
int j = 0; j < n; 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;
373 case 5: j_valid =
hasYaw(model_id); jx = j_valid ?
indexYaw(model_id) : 0;
break;
375 if (!j_valid)
continue;
402 setPose(state, val.pose,
false);
426inline void setVelocity(ObjectState & state,
const gm::Vector3 & val,
const bool reset_covariance =
true)
428 setVelLon(state, val.x, reset_covariance);
429 setVelLat(state, val.y, reset_covariance);
440inline void setVelocity(T & obj,
const gm::Vector3 & val,
const bool reset_covariance =
true)
452inline void setVelocity(ObjectState & state,
const std::array<double, 2> & val,
const bool reset_covariance =
true)
454 setVelLon(state, val[0], reset_covariance);
455 setVelLat(state, val[1], reset_covariance);
467inline void setVelocity(T & obj,
const std::array<double, 2> & val,
const bool reset_covariance =
true)
479inline void setAcceleration(ObjectState & state,
const gm::Vector3 & val,
const bool reset_covariance =
true)
481 setAccLon(state, val.x, reset_covariance);
482 setAccLat(state, val.y, reset_covariance);
494inline void setAcceleration(T & obj,
const gm::Vector3 & val,
const bool reset_covariance =
true)
506inline void setAcceleration(ObjectState & state,
const std::array<double, 2> & val,
const bool reset_covariance =
true)
508 setAccLon(state, val[0], reset_covariance);
509 setAccLat(state, val[1], reset_covariance);
521inline void setAcceleration(T & obj,
const std::array<double, 2> & val,
const bool reset_covariance =
true)
535inline void setRollInDeg(ObjectState & state,
const double val,
const bool reset_covariance =
true)
537 setRoll(state, val * M_PI / 180.0, reset_covariance);
549inline void setRollInDeg(T & obj,
const double val,
const bool reset_covariance =
true)
561inline void setPitchInDeg(ObjectState & state,
const double val,
const bool reset_covariance =
true)
563 setPitch(state, val * M_PI / 180.0, reset_covariance);
575inline void setPitchInDeg(T & obj,
const double val,
const bool reset_covariance =
true)
587inline void setYawInDeg(ObjectState & state,
const double val,
const bool reset_covariance =
true)
589 setYaw(state, val * M_PI / 180.0, reset_covariance);
601inline void setYawInDeg(T & obj,
const double val,
const bool reset_covariance =
true)
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)
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;
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;
631 q.setRPY(0.0, 0.0, -yaw);
632 gm::TransformStamped tf;
633 tf.transform.rotation = tf2::toMsg(q);
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;
640 setVelocity(state, {vel_lon_lat.pose.position.x, vel_lon_lat.pose.position.y},
false);
641 setYaw(state, yaw,
false);
644 auto model_id = state.model_id;
645 for (
int i = 0; i < n; i++) {
646 for (
int j = 0; j < n; j++) {
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)
693inline void setVelocityXYZYaw(ObjectState & state,
const gm::Vector3 & vel_xyz,
const double yaw,
const bool reset_covariance =
true)
695 gm::Vector3 vel_lon_lat, vel_xyz_in;
696 vel_xyz_in = vel_xyz;
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);
703 setYaw(state, yaw, reset_covariance);
716inline void setVelocityXYZYaw(T & obj,
const gm::Vector3 & vel_xyz,
const double yaw,
const bool reset_covariance =
true)
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)
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;
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;
746 q.setRPY(0.0, 0.0, -yaw);
747 gm::TransformStamped tf;
748 tf.transform.rotation = tf2::toMsg(q);
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;
755 setAcceleration(state, {acc_lon_lat.pose.position.x, acc_lon_lat.pose.position.y},
false);
756 setYaw(state, yaw,
false);
759 auto model_id = state.model_id;
760 for (
int i = 0; i < n; i++) {
761 for (
int j = 0; j < n; j++) {
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)
809 ObjectState & state,
const gm::Vector3 & acc_xyz,
const double yaw,
const bool reset_covariance =
true)
811 gm::Vector3 acc_lon_lat, acc_xyz_in;
812 acc_xyz_in = acc_xyz;
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);
819 setYaw(state, yaw, reset_covariance);
832inline void setAccelerationXYZYaw(T & obj,
const gm::Vector3 & acc_xyz,
const double yaw,
const bool reset_covariance =
true)
Object state sanity checks.
void sanityCheckContinuousState(const ObjectState &state)
Perform sanity check on continuous state of given object state.
void sanityCheckContinuousStateCovariance(const ObjectState &state)
Perform sanity check on continuous state covariance of given object state.
void sanityCheckDiscreteState(const ObjectState &state)
Perform sanity check on discrete state of given object state.
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.