-
Notifications
You must be signed in to change notification settings - Fork 68
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
FCP-5: SensorDetectedObject TMX message definition #628
Changes from 1 commit
78f4bb6
3914330
c0a8838
14de679
36e19e5
3e7c0d3
4d4d59d
63b51d5
adfd407
0dde9ce
06dd957
2f7e112
a573e12
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -28,23 +28,115 @@ namespace tmx | |
static constexpr const char *MessageSubType = MSGSUBTYPE_SENSOR_DETECTED_OBJECT_STRING; | ||
|
||
// TODO: Convert this member variable to std::attributes and handle nested object and arrays. (see [CloudHeartbeatMessage.h](./CloudHearbeatMessage.h) array_attribute ) | ||
|
||
// Classification of detected object | ||
std::string type = ""; | ||
//Flag to indicate whether sensor detected object is simulated. | ||
std_attribute(this->msg, bool, ISSimulated, false,); | ||
// Classification of detected object. | ||
std_attribute(this->msg, std::string, Type, "",); | ||
// Confidence of type classification | ||
double confidence = 0.0; | ||
// Unique indentifier of sensor reporting detection | ||
std::string sensorId = ""; | ||
// String describing projection used to convert cartesian data to WGS84 data | ||
std::string projString = ""; | ||
// Unique identifier of detected object | ||
int objectId = 0; | ||
std_attribute(this->msg, double, Confidence, 0.0,); | ||
// Unique indentifier of sensor reporting detection. | ||
std_attribute(this->msg, std::string, SensorId, "", ); | ||
// String describing projection used to convert cartesian data to WGS84 data. | ||
std_attribute(this->msg, std::string, ProjString, "", ); | ||
// Unique identifier of detected object. | ||
std_attribute(this->msg, int, ObjectId, 0, ); | ||
|
||
// Cartesian positiion of object. Assumed to be ENU coordinate frame. | ||
tmx::utils::Point position = tmx::utils::Point(); | ||
typedef struct Position{ | ||
double x, y, z; | ||
Position(){}; | ||
Position(double x, double y, double z):x(x),y(y),z(z){}; | ||
static message_tree_type to_tree(const Position& pos){ | ||
message_tree_type tree; | ||
tree.put("x", pos.x); | ||
tree.put("y", pos.y); | ||
tree.put("z", pos.z); | ||
return tree; | ||
} | ||
static Position from_tree(const message_tree_type& tree){ | ||
Position pos; | ||
pos.x = tree.get<double>("x"); | ||
pos.y = tree.get<double>("y"); | ||
pos.z = tree.get<double>("z"); | ||
return pos; | ||
} | ||
} Position; | ||
object_attribute(Position, Position); | ||
|
||
typedef struct Covariance{ | ||
std::string value; | ||
Covariance(){}; | ||
Covariance( std::string value):value(value){}; | ||
static message_tree_type to_tree(const Covariance& cov){ | ||
message_tree_type tree; | ||
tree.put("", cov.value); | ||
return tree; | ||
} | ||
static Covariance from_tree(const message_tree_type& tree){ | ||
Covariance cov; | ||
cov.value = tree.get<std::string>(""); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These will be double values. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. https://usdot-carma.atlassian.net/wiki/spaces/CRMSIM/pages/2563899417/Detected+Objects+Specification
|
||
return cov; | ||
} | ||
} Covariance; | ||
array_attribute(Covariance, PositionCovariance); | ||
|
||
// Cartesian velocity vector of object. Assumed to be ENU coordinate frame. | ||
tmx::utils::Vector3d velocity = tmx::utils::Vector3d(); | ||
// Epoch time in milliseconds | ||
long timestamp = 0; | ||
typedef struct Velocity{ | ||
double x, y, z; | ||
Velocity(){}; | ||
Velocity(double x, double y, double z):x(x),y(y),z(z){}; | ||
static message_tree_type to_tree(const Velocity& velocity){ | ||
message_tree_type tree; | ||
tree.put("x", velocity.x); | ||
tree.put("y", velocity.y); | ||
tree.put("z", velocity.z); | ||
return tree; | ||
} | ||
static Velocity from_tree(const message_tree_type& tree){ | ||
Velocity velocity; | ||
velocity.x = tree.get<double>("x"); | ||
velocity.y = tree.get<double>("y"); | ||
velocity.z = tree.get<double>("z"); | ||
return velocity; | ||
} | ||
} Velocity; | ||
//Linear velocity in meter per second | ||
object_attribute(Velocity, Velocity); | ||
//Covariance associated with linear velocity. | ||
array_attribute(Covariance, VelocityCovariance); | ||
|
||
//Angular velocity in radians per second. | ||
object_attribute(Velocity, AngularVelocity); | ||
//Covariance associated with angular velocity. | ||
array_attribute(Covariance, AngularVelocityCovariance); | ||
|
||
// Epoch time in milliseconds. | ||
// long timestamp = 0; | ||
std_attribute(this->msg, long, Timestamp, 0, ); | ||
|
||
//Length, width and height of object in meter. | ||
typedef struct Size{ | ||
double length; | ||
double width; | ||
double height; | ||
Size(){}; | ||
Size(double length, double width, double height): length(length), width(width), height(height){}; | ||
static message_tree_type to_tree(const Size& size){ | ||
message_tree_type tree; | ||
tree.put("length", size.length); | ||
tree.put("width", size.width); | ||
tree.put("height", size.height); | ||
return tree; | ||
} | ||
static Size from_tree(const message_tree_type & tree){ | ||
Size size; | ||
size.length = tree.get<double>("length"); | ||
size.width = tree.get<double>("width"); | ||
size.height = tree.get<double>("height"); | ||
return size; | ||
} | ||
} Size; | ||
object_attribute(Size, Size); | ||
|
||
}; | ||
|
||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add unit test covering to and from json serialization. I can provide example json payloads for testing |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
#include <gtest/gtest.h> | ||
#include "SensorDetectedObject.h" | ||
namespace tmx::messages{ | ||
TEST(SensorDetectedObjectTest, attributes){ | ||
SensorDetectedObject tmxSdsm; | ||
tmxSdsm.set_ISSimulated(false); | ||
SensorDetectedObject::Position pos(1.0, 2.3, 2.0); | ||
tmxSdsm.set_Position(pos); | ||
|
||
tmxSdsm.set_ProjString("+proj=tmerc +lat_0=38.95197911150576 +lon_0=-77.14835128349988 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +geoidgrids=egm96_15.gtx +vunits=m +no_defs"); | ||
tmxSdsm.set_Timestamp(12222222222); | ||
tmxSdsm.set_SensorId("SomeID"); | ||
tmxSdsm.set_Type("Car"); | ||
tmxSdsm.set_Confidence(0.7); | ||
tmxSdsm.set_ObjectId(123); | ||
|
||
SensorDetectedObject::Velocity vel(1.0, 0.3, 2.0); | ||
tmxSdsm.set_Velocity(vel); | ||
tmxSdsm.set_AngularVelocity(vel); | ||
|
||
std::vector<SensorDetectedObject::Covariance> covs { | ||
SensorDetectedObject::Covariance("a11"), | ||
SensorDetectedObject::Covariance("a12"), | ||
SensorDetectedObject::Covariance("a13"), | ||
SensorDetectedObject::Covariance("a21"), | ||
SensorDetectedObject::Covariance("a22"), | ||
SensorDetectedObject::Covariance("a23"), | ||
SensorDetectedObject::Covariance("a31"), | ||
SensorDetectedObject::Covariance("a32"), | ||
SensorDetectedObject::Covariance("a33"), | ||
SensorDetectedObject::Covariance("a41")}; | ||
tmxSdsm.set_PositionCovariance(covs); | ||
tmxSdsm.set_VelocityCovariance(covs); | ||
tmxSdsm.set_AngularVelocityCovariance(covs); | ||
|
||
EXPECT_EQ(false, tmxSdsm.get_ISSimulated()); | ||
EXPECT_EQ(0.7, tmxSdsm.get_Confidence()); | ||
EXPECT_EQ("SomeID", tmxSdsm.get_SensorId()); | ||
EXPECT_EQ(12222222222, tmxSdsm.get_Timestamp()); | ||
EXPECT_EQ(123, tmxSdsm.get_ObjectId()); | ||
EXPECT_EQ("+proj=tmerc +lat_0=38.95197911150576 +lon_0=-77.14835128349988 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +geoidgrids=egm96_15.gtx +vunits=m +no_defs", tmxSdsm.get_ProjString()); | ||
EXPECT_EQ(1.0, tmxSdsm.get_Velocity().x); | ||
EXPECT_NEAR(0.3, tmxSdsm.get_Velocity().y, 0.01); | ||
EXPECT_EQ(2.0, tmxSdsm.get_Velocity().z); | ||
EXPECT_EQ(1.0, tmxSdsm.get_AngularVelocity().x); | ||
EXPECT_NEAR(0.3, tmxSdsm.get_AngularVelocity().y, 0.01); | ||
EXPECT_EQ(2.0, tmxSdsm.get_AngularVelocity().z); | ||
EXPECT_EQ(10, tmxSdsm.get_PositionCovariance().size()); | ||
EXPECT_EQ(10, tmxSdsm.get_AngularVelocityCovariance().size()); | ||
EXPECT_EQ(10, tmxSdsm.get_VelocityCovariance().size()); | ||
} | ||
} |
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please include tests to cover to and from JSON serialization. I can provide a sample SensorDetectedObject message |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It may be worth while creating separate .h files for some of these classes in the messages package. This will allow reuse of these types in future messages which I think it pretty likely. It also makes this class more readable since it will not include object definitions of nest objects amongst its own member declaration