00001 #include "config.h"
00002 #include <gtest/gtest.h>
00003
00004 #include "ros_type_introspection/ros_introspection.hpp"
00005 #include <sensor_msgs/JointState.h>
00006 #include <sensor_msgs/NavSatStatus.h>
00007 #include <sensor_msgs/Imu.h>
00008 #include <sensor_msgs/Image.h>
00009 #include <std_msgs/Int16MultiArray.h>
00010
00011 using namespace ros::message_traits;
00012 using namespace RosIntrospection;
00013
00014
00015 TEST(Deserialize, JointState)
00016
00017 {
00018 RosIntrospection::Parser parser;
00019
00020 parser.registerMessageDefinition(
00021 "JointState",
00022 ROSType(DataType<sensor_msgs::JointState>::value()),
00023 Definition<sensor_msgs::JointState>::value());
00024
00025 sensor_msgs::JointState joint_state;
00026
00027 const int NUM = 15;
00028
00029 joint_state.header.seq = 2016;
00030 joint_state.header.stamp.sec = 1234;
00031 joint_state.header.stamp.nsec = 567*1000*1000;
00032 joint_state.header.frame_id = "pippo";
00033
00034 joint_state.name.resize( NUM );
00035 joint_state.position.resize( NUM );
00036 joint_state.velocity.resize( NUM );
00037 joint_state.effort.resize( NUM );
00038
00039 std::string names[NUM];
00040 names[0] = ("hola");
00041 names[1] = ("ciao");
00042 names[2] = ("bye");
00043
00044 for (int i=0; i<NUM; i++)
00045 {
00046 joint_state.name[i] = names[i%3];
00047 joint_state.position[i]= 10+i;
00048 joint_state.velocity[i]= 30+i;
00049 joint_state.effort[i]= 50+i;
00050 }
00051
00052 std::vector<uint8_t> buffer( ros::serialization::serializationLength(joint_state) );
00053 ros::serialization::OStream stream(buffer.data(), buffer.size());
00054 ros::serialization::Serializer<sensor_msgs::JointState>::write(stream, joint_state);
00055
00056 FlatMessage flat_container;
00057 parser.deserializeIntoFlatContainer("JointState", absl::Span<uint8_t>(buffer), &flat_container,100);
00058
00059 if(VERBOSE_TEST){
00060 for(auto&it: flat_container.value) {
00061 std::cout << it.first << " >> " << it.second.convert<double>() << std::endl;
00062 }
00063
00064 for(auto&it: flat_container.name) {
00065 std::cout << it.first << " >> " << it.second << std::endl;
00066 }
00067 }
00068
00069 EXPECT_EQ( flat_container.value[0].first.toStdString() , ("JointState/header/seq"));
00070 EXPECT_EQ( flat_container.value[0].second.convert<int>(), 2016 );
00071 EXPECT_EQ( flat_container.value[1].first.toStdString() , ("JointState/header/stamp"));
00072 EXPECT_EQ( flat_container.value[1].second.convert<double>(), double(1234.567) );
00073 EXPECT_EQ( flat_container.value[1].second.convert<ros::Time>(), joint_state.header.stamp );
00074
00075 EXPECT_EQ( flat_container.value[2].first.toStdString() , ("JointState/position.0"));
00076 EXPECT_EQ( flat_container.value[2].second.convert<int>(), 10 );
00077 EXPECT_EQ( flat_container.value[3].first.toStdString() , ("JointState/position.1"));
00078 EXPECT_EQ( flat_container.value[3].second.convert<int>(), 11 );
00079 EXPECT_EQ( flat_container.value[4].first.toStdString() , ("JointState/position.2"));
00080 EXPECT_EQ( flat_container.value[4].second.convert<int>(), 12 );
00081 EXPECT_EQ( flat_container.value[16].first.toStdString() , ("JointState/position.14"));
00082 EXPECT_EQ( flat_container.value[16].second.convert<int>(), 24 );
00083
00084 EXPECT_EQ( flat_container.value[17].first.toStdString() , ("JointState/velocity.0"));
00085 EXPECT_EQ( flat_container.value[17].second.convert<int>(), 30 );
00086 EXPECT_EQ( flat_container.value[18].first.toStdString() , ("JointState/velocity.1"));
00087 EXPECT_EQ( flat_container.value[18].second.convert<int>(), 31 );
00088 EXPECT_EQ( flat_container.value[19].first.toStdString() , ("JointState/velocity.2"));
00089 EXPECT_EQ( flat_container.value[19].second.convert<int>(), 32 );
00090 EXPECT_EQ( flat_container.value[31].first.toStdString() , ("JointState/velocity.14"));
00091 EXPECT_EQ( flat_container.value[31].second.convert<int>(), 44 );
00092
00093 EXPECT_EQ( flat_container.value[32].first.toStdString() , ("JointState/effort.0"));
00094 EXPECT_EQ( flat_container.value[32].second.convert<int>(), 50 );
00095 EXPECT_EQ( flat_container.value[33].first.toStdString() , ("JointState/effort.1"));
00096 EXPECT_EQ( flat_container.value[33].second.convert<int>(), 51 );
00097 EXPECT_EQ( flat_container.value[34].first.toStdString() , ("JointState/effort.2"));
00098 EXPECT_EQ( flat_container.value[34].second.convert<int>(), 52 );
00099 EXPECT_EQ( flat_container.value[46].first.toStdString() , ("JointState/effort.14"));
00100 EXPECT_EQ( flat_container.value[46].second.convert<int>(), 64 );
00101
00102 EXPECT_EQ( flat_container.name[0].first.toStdString() , ("JointState/header/frame_id"));
00103 EXPECT_EQ( flat_container.name[0].second, ("pippo") );
00104
00105 EXPECT_EQ( flat_container.name[1].first.toStdString() , ("JointState/name.0"));
00106 EXPECT_EQ( flat_container.name[1].second, ("hola") );
00107 EXPECT_EQ( flat_container.name[2].first.toStdString() , ("JointState/name.1"));
00108 EXPECT_EQ( flat_container.name[2].second, ("ciao") );
00109 EXPECT_EQ( flat_container.name[3].first.toStdString() , ("JointState/name.2"));
00110 EXPECT_EQ( flat_container.name[3].second, ("bye") );
00111
00112
00113 std::vector<std_msgs::Header> headers;
00114
00115 Parser::VisitingCallback callbackReadAndStore = [&headers](const ROSType&, absl::Span<uint8_t>& raw_data)
00116 {
00117 std_msgs::Header msg;
00118 ros::serialization::IStream s( raw_data.data(), raw_data.size() );
00119 ros::serialization::deserialize(s, msg);
00120 headers.push_back( std::move(msg) );
00121 };
00122
00123 Parser::VisitingCallback callbackOverwiteInPlace = [&headers](const ROSType&, absl::Span<uint8_t>& raw_data)
00124 {
00125 std_msgs::Header msg;
00126 ros::serialization::IStream is( raw_data.data(), raw_data.size() );
00127 ros::serialization::deserialize(is, msg);
00128
00129 ASSERT_EQ(ros::serialization::serializationLength(msg), raw_data.size());
00130
00131
00132 msg.seq = 666;
00133 msg.stamp.sec = 1;
00134 msg.stamp.nsec = 2;
00135
00136 ros::serialization::OStream os( raw_data.data(), raw_data.size() );
00137 ros::serialization::serialize(os, msg);
00138
00139 ASSERT_EQ(ros::serialization::serializationLength(msg), raw_data.size());
00140 };
00141
00142
00143 absl::Span<uint8_t> buffer_view(buffer);
00144 const ROSType header_type( DataType<std_msgs::Header>::value() );
00145
00146 parser.applyVisitorToBuffer( "JointState", header_type,
00147 buffer_view, callbackReadAndStore);
00148
00149 EXPECT_EQ(headers.size(), 1);
00150 const std_msgs::Header& header = headers[0];
00151 EXPECT_EQ(header.seq, joint_state.header.seq);
00152 EXPECT_EQ(header.stamp.sec, joint_state.header.stamp.sec);
00153 EXPECT_EQ(header.stamp.nsec, joint_state.header.stamp.nsec);
00154 EXPECT_EQ(header.frame_id, joint_state.header.frame_id);
00155
00156 parser.applyVisitorToBuffer( "JointState", header_type,
00157 buffer_view, callbackOverwiteInPlace);
00158
00159 parser.applyVisitorToBuffer( "JointState", header_type,
00160 buffer_view, callbackReadAndStore);
00161
00162 EXPECT_EQ(headers.size(), 2);
00163 const std_msgs::Header& header_mutated = headers[1];
00164 EXPECT_EQ(header_mutated.seq, 666);
00165 EXPECT_EQ(header_mutated.stamp.sec, 1);
00166 EXPECT_EQ(header_mutated.stamp.nsec, 2);
00167
00168 }
00169
00170 TEST( Deserialize, NavSatStatus)
00171
00172 {
00173
00174 RosIntrospection::Parser parser;
00175
00176 parser.registerMessageDefinition(
00177 "nav_stat",
00178 ROSType(DataType<sensor_msgs::NavSatStatus>::value()),
00179 Definition<sensor_msgs::NavSatStatus>::value());
00180
00181 sensor_msgs::NavSatStatus nav_stat;
00182 nav_stat.status = nav_stat.STATUS_GBAS_FIX;
00183 nav_stat.service = nav_stat.SERVICE_COMPASS;
00184
00185
00186 std::vector<uint8_t> buffer( ros::serialization::serializationLength(nav_stat) );
00187 ros::serialization::OStream stream(buffer.data(), buffer.size());
00188 ros::serialization::Serializer<sensor_msgs::NavSatStatus>::write(stream, nav_stat);
00189
00190 FlatMessage flat_container;
00191 parser.deserializeIntoFlatContainer("nav_stat", absl::Span<uint8_t>(buffer), &flat_container,100);
00192
00193 if(VERBOSE_TEST){ std::cout << " -------------------- " << std::endl;
00194
00195 for(auto&it: flat_container.value) {
00196 std::cout << it.first << " >> " << it.second.convert<double>() << std::endl;
00197 }
00198 }
00199
00200 EXPECT_EQ( flat_container.value[0].first.toStdString() , ("nav_stat/status"));
00201 EXPECT_EQ( flat_container.value[0].second.convert<int>(), (int)nav_stat.STATUS_GBAS_FIX );
00202 EXPECT_EQ( flat_container.value[1].first.toStdString() , ("nav_stat/service"));
00203 EXPECT_EQ( flat_container.value[1].second.convert<int>(), (int)nav_stat.SERVICE_COMPASS );
00204 }
00205
00206 TEST( Deserialize, DeserializeIMU)
00207
00208 {
00209
00210 RosIntrospection::Parser parser;
00211
00212 parser.registerMessageDefinition(
00213 "imu",
00214 ROSType(DataType<sensor_msgs::Imu>::value()),
00215 Definition<sensor_msgs::Imu>::value());
00216
00217 sensor_msgs::Imu imu;
00218
00219 imu.header.seq = 2016;
00220 imu.header.stamp.sec = 1234;
00221 imu.header.stamp.nsec = 567*1000*1000;
00222 imu.header.frame_id = "pippo";
00223
00224 imu.orientation.x = 11;
00225 imu.orientation.y = 12;
00226 imu.orientation.z = 13;
00227 imu.orientation.w = 14;
00228
00229 imu.angular_velocity.x = 21;
00230 imu.angular_velocity.y = 22;
00231 imu.angular_velocity.z = 23;
00232
00233 imu.linear_acceleration.x = 31;
00234 imu.linear_acceleration.y = 32;
00235 imu.linear_acceleration.z = 33;
00236
00237 for (int i=0; i<9; i++)
00238 {
00239 imu.orientation_covariance[i] = 40+i;
00240 imu.angular_velocity_covariance[i] = 50+i;
00241 imu.linear_acceleration_covariance[i] = 60+i;
00242 }
00243
00244 std::vector<uint8_t> buffer( ros::serialization::serializationLength(imu) );
00245 ros::serialization::OStream stream(buffer.data(), buffer.size());
00246 ros::serialization::Serializer<sensor_msgs::Imu>::write(stream, imu);
00247
00248 FlatMessage flat_container;
00249 parser.deserializeIntoFlatContainer("imu", absl::Span<uint8_t>(buffer), &flat_container,100);
00250
00251
00252 if(VERBOSE_TEST){
00253
00254 std::cout << " -------------------- " << std::endl;
00255 for(auto&it: flat_container.value) {
00256 std::cout << it.first << " >> " << it.second.convert<double>() << std::endl;
00257 }
00258 }
00259
00260 int index = 0;
00261
00262 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/header/seq"));
00263 EXPECT_EQ( flat_container.value[index].second.convert<int>(), 2016 );
00264 index++;
00265 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/header/stamp"));
00266 EXPECT_EQ( flat_container.value[index].second.convert<double>(), double(1234.567) );
00267 EXPECT_EQ( flat_container.value[index].second.convert<ros::Time>(), imu.header.stamp );
00268 index++;
00269 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/orientation/x"));
00270 EXPECT_EQ( flat_container.value[index].second.convert<int>(), 11 );
00271 index++;
00272 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/orientation/y"));
00273 EXPECT_EQ( flat_container.value[index].second.convert<int>(), 12 );
00274 index++;
00275 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/orientation/z"));
00276 EXPECT_EQ( flat_container.value[index].second.convert<int>(), 13 );
00277 index++;
00278 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/orientation/w"));
00279 EXPECT_EQ( flat_container.value[index].second.convert<int>(), 14 );
00280 index++;
00281
00282 for(int i=0; i<9; i++)
00283 {
00284 char str[64];
00285 sprintf(str, "imu/orientation_covariance.%d",i);
00286 EXPECT_EQ( flat_container.value[index].first.toStdString() , (str) );
00287 EXPECT_EQ( flat_container.value[index].second.convert<int>(), 40+i );
00288 index++;
00289 }
00290
00291 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/angular_velocity/x"));
00292 EXPECT_EQ( flat_container.value[index].second.convert<int>(), 21 );
00293 index++;
00294 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/angular_velocity/y"));
00295 EXPECT_EQ( flat_container.value[index].second.convert<int>(), 22 );
00296 index++;
00297 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/angular_velocity/z"));
00298 EXPECT_EQ( flat_container.value[index].second.convert<int>(), 23 );
00299 index++;
00300
00301 for(int i=0; i<9; i++)
00302 {
00303 char str[64];
00304 sprintf(str, "imu/angular_velocity_covariance.%d",i);
00305 EXPECT_EQ( flat_container.value[index].first.toStdString() , (str) );
00306 EXPECT_EQ( flat_container.value[index].second.convert<int>(), 50+i );
00307 index++;
00308 }
00309
00310 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/linear_acceleration/x"));
00311 EXPECT_EQ( flat_container.value[index].second.convert<int>(), 31 );
00312 index++;
00313 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/linear_acceleration/y"));
00314 EXPECT_EQ( flat_container.value[index].second.convert<int>(), 32 );
00315 index++;
00316 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/linear_acceleration/z"));
00317 EXPECT_EQ( flat_container.value[index].second.convert<int>(), 33 );
00318 index++;
00319
00320 for(int i=0; i<9; i++)
00321 {
00322 char str[64];
00323 sprintf(str, "imu/linear_acceleration_covariance.%d",i);
00324 EXPECT_EQ( flat_container.value[index].first.toStdString() , (str) );
00325 EXPECT_EQ( flat_container.value[index].second.convert<int>(), 60+i );
00326 index++;
00327 }
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383 }
00384
00385
00386
00387 TEST( Deserialize, Int16MultiArrayDeserialize)
00388
00389 {
00390 RosIntrospection::Parser parser;
00391
00392 parser.registerMessageDefinition(
00393 "multi_array",
00394 ROSType(DataType<std_msgs::Int16MultiArray>::value()),
00395 Definition<std_msgs::Int16MultiArray>::value());
00396
00397 std_msgs::Int16MultiArray multi_array;
00398
00399 const unsigned N = 6;
00400 multi_array.layout.data_offset = 42;
00401 multi_array.data.resize(N);
00402
00403 for (unsigned i=0; i<N; i++){
00404 multi_array.data[i] = i;
00405 }
00406
00407 std::vector<uint8_t> buffer( ros::serialization::serializationLength(multi_array) );
00408 ros::serialization::OStream stream(buffer.data(), buffer.size());
00409 ros::serialization::Serializer<std_msgs::Int16MultiArray>::write(stream, multi_array);
00410
00411 FlatMessage flat_container;
00412
00413 EXPECT_NO_THROW(
00414 parser.deserializeIntoFlatContainer("multi_array",
00415 absl::Span<uint8_t>(buffer),
00416 &flat_container,100)
00417 );
00418
00419 if(VERBOSE_TEST){
00420 std::cout << " -------------------- " << std::endl;
00421
00422 for(auto&it: flat_container.value) {
00423 std::cout << it.first << " >> " << it.second.convert<double>() << std::endl;
00424 }
00425 }
00426 }
00427
00428 TEST( Deserialize, SensorImage)
00429
00430 {
00431 RosIntrospection::Parser parser;
00432
00433 parser.registerMessageDefinition( "image_raw",
00434 ROSType(DataType<sensor_msgs::Image>::value()),
00435 Definition<sensor_msgs::Image>::value());
00436
00437 sensor_msgs::Image image;
00438 image.width = 640;
00439 image.height = 480;
00440 image.step = 3*image.width;
00441 image.data.resize( image.height * image.step );
00442
00443 std::vector<uint8_t> buffer( ros::serialization::serializationLength(image) );
00444 ros::serialization::OStream stream(buffer.data(), buffer.size());
00445 ros::serialization::Serializer<sensor_msgs::Image>::write(stream, image);
00446
00447 FlatMessage flat_container;
00448
00449 EXPECT_NO_THROW(
00450 parser.deserializeIntoFlatContainer("image_raw",
00451 absl::Span<uint8_t>(buffer),
00452 &flat_container,100)
00453 );
00454
00455 }
00456
00457
00458
00459 int main(int argc, char **argv){
00460 testing::InitGoogleTest(&argc, argv);
00461 return RUN_ALL_TESTS();
00462 }