deserializer_test.cpp
Go to the documentation of this file.
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     // msg.frame_id = "here";  //NOTE: I can NOT change the size of an array, nor a string
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   // We test this because we want to test that constant fields are skipped.
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;  // 2
00183   nav_stat.service = nav_stat.SERVICE_COMPASS; // 4
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 //int func()
00208 {
00209   // We test this because to check if arrays with fixed length work.
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 //  std::vector< std::pair<SString,std_msgs::Header>> headers;
00331 //  std::vector< std::pair<SString,geometry_msgs::Vector3>> vectors;
00332 //  std::vector< std::pair<SString,geometry_msgs::Quaternion>> quaternions;
00333 
00334 //  ExtractSpecificROSMessages(type_map,  main_type,
00335 //                              "imu", buffer,
00336 //                              headers);
00337 
00338 //  EXPECT_EQ(headers.size(), 1);
00339 //  const std_msgs::Header& header = headers[0].second;
00340 //  std::string header_prefix =  headers[0].first.toStdString();
00341 //  EXPECT_EQ( header_prefix, "imu/header");
00342 //  EXPECT_EQ(header.seq,        imu.header.seq);
00343 //  EXPECT_EQ(header.stamp.sec,  imu.header.stamp.sec);
00344 //  EXPECT_EQ(header.stamp.nsec, imu.header.stamp.nsec);
00345 //  EXPECT_EQ(header.frame_id,   imu.header.frame_id);
00346 
00347 //  ExtractSpecificROSMessages(type_map,  main_type,
00348 //                              "imu", buffer,
00349 //                              quaternions);
00350 
00351 //  EXPECT_EQ(quaternions.size(), 1);
00352 //  const geometry_msgs::Quaternion& quaternion = quaternions[0].second;
00353 //  std::string quaternion_prefix =  quaternions[0].first.toStdString();
00354 //  EXPECT_EQ( quaternion_prefix, "imu/orientation");
00355 //  EXPECT_EQ(quaternion.x,  imu.orientation.x);
00356 //  EXPECT_EQ(quaternion.y,  imu.orientation.y);
00357 //  EXPECT_EQ(quaternion.z,  imu.orientation.z);
00358 //  EXPECT_EQ(quaternion.w,  imu.orientation.w);
00359 
00360 //  ExtractSpecificROSMessages(type_map,  main_type,
00361 //                              "imu", buffer,
00362 //                              vectors);
00363 
00364 //  EXPECT_EQ(vectors.size(), 2);
00365 //  for( const auto& vect_pair: vectors)
00366 //  {
00367 //    if( vect_pair.first.toStdString() == "imu/angular_velocity")
00368 //    {
00369 //      EXPECT_EQ(vect_pair.second.x,  imu.angular_velocity.x);
00370 //      EXPECT_EQ(vect_pair.second.y,  imu.angular_velocity.y);
00371 //      EXPECT_EQ(vect_pair.second.z,  imu.angular_velocity.z);
00372 //    }
00373 //    else if( vect_pair.first.toStdString() == "imu/linear_acceleration")
00374 //    {
00375 //      EXPECT_EQ(vect_pair.second.x,  imu.linear_acceleration.x);
00376 //      EXPECT_EQ(vect_pair.second.y,  imu.linear_acceleration.y);
00377 //      EXPECT_EQ(vect_pair.second.z,  imu.linear_acceleration.z);
00378 //    }
00379 //    else{
00380 //      FAIL();
00381 //    }
00382 //  }
00383 }
00384 
00385 
00386 
00387 TEST( Deserialize, Int16MultiArrayDeserialize)
00388 //int func()
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 //int func()
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 // Run all the tests that were declared with TEST()
00459 int main(int argc, char **argv){
00460   testing::InitGoogleTest(&argc, argv);
00461   return RUN_ALL_TESTS();
00462 }


type_introspection_tests
Author(s): Davide Faconti
autogenerated on Sat Apr 14 2018 03:30:59