00001 #include "config.h"
00002 #include <gtest/gtest.h>
00003
00004 #include "ros_type_introspection/deserializer.hpp"
00005 #include <sensor_msgs/JointState.h>
00006 #include <sensor_msgs/NavSatStatus.h>
00007 #include <sensor_msgs/Imu.h>
00008 #include <std_msgs/Int16MultiArray.h>
00009
00010 using namespace ros::message_traits;
00011 using namespace RosIntrospection;
00012
00013 TEST(Deserialize, JointState)
00014
00015 {
00016 ROSTypeList type_map = buildROSTypeMapFromDefinition(
00017 DataType<sensor_msgs::JointState >::value(),
00018 Definition<sensor_msgs::JointState >::value() );
00019
00020 sensor_msgs::JointState joint_state;
00021
00022 joint_state.header.seq = 2016;
00023 joint_state.header.stamp.sec = 1234;
00024 joint_state.header.stamp.nsec = 567*1000*1000;
00025 joint_state.header.frame_id = "pippo";
00026
00027 joint_state.name.resize( 3 );
00028 joint_state.position.resize( 3 );
00029 joint_state.velocity.resize( 3 );
00030 joint_state.effort.resize( 3 );
00031
00032 std::string names[3];
00033 names[0] = ("hola");
00034 names[1] = ("ciao");
00035 names[2] = ("bye");
00036
00037 for (int i=0; i<3; i++)
00038 {
00039 joint_state.name[i] = names[i];
00040 joint_state.position[i]= 11+i;
00041 joint_state.velocity[i]= 21+i;
00042 joint_state.effort[i]= 31+i;
00043 }
00044
00045 std::vector<uint8_t> buffer(64*1024);
00046 ros::serialization::OStream stream(buffer.data(), buffer.size());
00047 ros::serialization::Serializer<sensor_msgs::JointState>::write(stream, joint_state);
00048
00049 ROSType main_type( DataType<sensor_msgs::JointState >::value() );
00050
00051 ROSTypeFlat flat_container;
00052 buildRosFlatType(type_map,
00053 main_type,
00054 "JointState",
00055 buffer.data(),
00056 &flat_container,
00057 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, 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, 11 );
00077 EXPECT_EQ( flat_container.value[3].first.toStdString() , ("JointState/position.1"));
00078 EXPECT_EQ( flat_container.value[3].second, 12 );
00079 EXPECT_EQ( flat_container.value[4].first.toStdString() , ("JointState/position.2"));
00080 EXPECT_EQ( flat_container.value[4].second, 13 );
00081
00082 EXPECT_EQ( flat_container.value[5].first.toStdString() , ("JointState/velocity.0"));
00083 EXPECT_EQ( flat_container.value[5].second, 21 );
00084 EXPECT_EQ( flat_container.value[6].first.toStdString() , ("JointState/velocity.1"));
00085 EXPECT_EQ( flat_container.value[6].second, 22 );
00086 EXPECT_EQ( flat_container.value[7].first.toStdString() , ("JointState/velocity.2"));
00087 EXPECT_EQ( flat_container.value[7].second, 23 );
00088
00089 EXPECT_EQ( flat_container.value[8].first.toStdString() , ("JointState/effort.0"));
00090 EXPECT_EQ( flat_container.value[8].second, 31 );
00091 EXPECT_EQ( flat_container.value[9].first.toStdString() , ("JointState/effort.1"));
00092 EXPECT_EQ( flat_container.value[9].second, 32 );
00093 EXPECT_EQ( flat_container.value[10].first.toStdString() , ("JointState/effort.2"));
00094 EXPECT_EQ( flat_container.value[10].second, 33 );
00095
00096 EXPECT_EQ( flat_container.name[0].first.toStdString() , ("JointState/header/frame_id"));
00097 EXPECT_EQ( flat_container.name[0].second, ("pippo") );
00098
00099 EXPECT_EQ( flat_container.name[1].first.toStdString() , ("JointState/name.0"));
00100 EXPECT_EQ( flat_container.name[1].second, ("hola") );
00101 EXPECT_EQ( flat_container.name[2].first.toStdString() , ("JointState/name.1"));
00102 EXPECT_EQ( flat_container.name[2].second, ("ciao") );
00103 EXPECT_EQ( flat_container.name[3].first.toStdString() , ("JointState/name.2"));
00104 EXPECT_EQ( flat_container.name[3].second, ("bye") );
00105 }
00106
00107 TEST( Deserialize, NavSatStatus)
00108
00109 {
00110
00111
00112 ROSTypeList type_map = buildROSTypeMapFromDefinition(
00113 DataType<sensor_msgs::NavSatStatus >::value(),
00114 Definition<sensor_msgs::NavSatStatus >::value() );
00115
00116 sensor_msgs::NavSatStatus nav_stat;
00117 nav_stat.status = nav_stat.STATUS_GBAS_FIX;
00118 nav_stat.service = nav_stat.SERVICE_COMPASS;
00119
00120
00121 std::vector<uint8_t> buffer(64*1024);
00122 ros::serialization::OStream stream(buffer.data(), buffer.size());
00123 ros::serialization::Serializer<sensor_msgs::NavSatStatus>::write(stream, nav_stat);
00124
00125 ROSType main_type( DataType<sensor_msgs::NavSatStatus >::value() );
00126
00127 ROSTypeFlat flat_container;
00128 buildRosFlatType(type_map,
00129 main_type,
00130 "nav_stat",
00131 buffer.data(),
00132 &flat_container, 100);
00133
00134 if(VERBOSE_TEST){ std::cout << " -------------------- " << std::endl;
00135
00136 for(auto&it: flat_container.value) {
00137 std::cout << it.first << " >> " << it.second.convert<double>() << std::endl;
00138 }
00139 }
00140
00141 EXPECT_EQ( flat_container.value[0].first.toStdString() , ("nav_stat/status"));
00142 EXPECT_EQ( flat_container.value[0].second, (int)nav_stat.STATUS_GBAS_FIX );
00143 EXPECT_EQ( flat_container.value[1].first.toStdString() , ("nav_stat/service"));
00144 EXPECT_EQ( flat_container.value[1].second, (int)nav_stat.SERVICE_COMPASS );
00145 }
00146
00147 TEST( Deserialize, DeserializeIMU)
00148
00149 {
00150
00151
00152 ROSTypeList type_map = buildROSTypeMapFromDefinition(
00153 DataType<sensor_msgs::Imu >::value(),
00154 Definition<sensor_msgs::Imu >::value() );
00155
00156 sensor_msgs::Imu imu;
00157
00158 imu.header.seq = 2016;
00159 imu.header.stamp.sec = 1234;
00160 imu.header.stamp.nsec = 567*1000*1000;
00161 imu.header.frame_id = "pippo";
00162
00163 imu.orientation.x = 11;
00164 imu.orientation.y = 12;
00165 imu.orientation.z = 13;
00166 imu.orientation.w = 14;
00167
00168 imu.angular_velocity.x = 21;
00169 imu.angular_velocity.y = 22;
00170 imu.angular_velocity.z = 23;
00171
00172 imu.linear_acceleration.x = 31;
00173 imu.linear_acceleration.y = 32;
00174 imu.linear_acceleration.z = 33;
00175
00176 for (int i=0; i<9; i++)
00177 {
00178 imu.orientation_covariance[i] = 40+i;
00179 imu.angular_velocity_covariance[i] = 50+i;
00180 imu.linear_acceleration_covariance[i] = 60+i;
00181 }
00182
00183 std::vector<uint8_t> buffer(64*1024);
00184 ros::serialization::OStream stream(buffer.data(), buffer.size());
00185 ros::serialization::Serializer<sensor_msgs::Imu>::write(stream, imu);
00186
00187 ROSType main_type( DataType<sensor_msgs::Imu >::value() );
00188
00189 ROSTypeFlat flat_container;
00190 buildRosFlatType(type_map,
00191 main_type,
00192 "imu",
00193 buffer.data(),
00194 &flat_container, 100);
00195
00196 if(VERBOSE_TEST){
00197
00198 std::cout << " -------------------- " << std::endl;
00199 for(auto&it: flat_container.value) {
00200 std::cout << it.first << " >> " << it.second.convert<double>() << std::endl;
00201 }
00202 }
00203
00204 int index = 0;
00205
00206 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/header/seq"));
00207 EXPECT_EQ( flat_container.value[index].second, 2016 );
00208 index++;
00209 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/header/stamp"));
00210 EXPECT_EQ( flat_container.value[index].second.convert<double>(), double(1234.567) );
00211 EXPECT_EQ( flat_container.value[index].second.convert<ros::Time>(), imu.header.stamp );
00212 index++;
00213 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/orientation/x"));
00214 EXPECT_EQ( flat_container.value[index].second, 11 );
00215 index++;
00216 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/orientation/y"));
00217 EXPECT_EQ( flat_container.value[index].second, 12 );
00218 index++;
00219 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/orientation/z"));
00220 EXPECT_EQ( flat_container.value[index].second, 13 );
00221 index++;
00222 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/orientation/w"));
00223 EXPECT_EQ( flat_container.value[index].second, 14 );
00224 index++;
00225
00226 for(int i=0; i<9; i++)
00227 {
00228 char str[64];
00229 sprintf(str, "imu/orientation_covariance.%d",i);
00230 EXPECT_EQ( flat_container.value[index].first.toStdString() , (str) );
00231 EXPECT_EQ( flat_container.value[index].second, 40+i );
00232 index++;
00233 }
00234
00235 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/angular_velocity/x"));
00236 EXPECT_EQ( flat_container.value[index].second, 21 );
00237 index++;
00238 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/angular_velocity/y"));
00239 EXPECT_EQ( flat_container.value[index].second, 22 );
00240 index++;
00241 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/angular_velocity/z"));
00242 EXPECT_EQ( flat_container.value[index].second, 23 );
00243 index++;
00244
00245 for(int i=0; i<9; i++)
00246 {
00247 char str[64];
00248 sprintf(str, "imu/angular_velocity_covariance.%d",i);
00249 EXPECT_EQ( flat_container.value[index].first.toStdString() , (str) );
00250 EXPECT_EQ( flat_container.value[index].second, 50+i );
00251 index++;
00252 }
00253
00254 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/linear_acceleration/x"));
00255 EXPECT_EQ( flat_container.value[index].second, 31 );
00256 index++;
00257 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/linear_acceleration/y"));
00258 EXPECT_EQ( flat_container.value[index].second, 32 );
00259 index++;
00260 EXPECT_EQ( flat_container.value[index].first.toStdString() , ("imu/linear_acceleration/z"));
00261 EXPECT_EQ( flat_container.value[index].second, 33 );
00262 index++;
00263
00264 for(int i=0; i<9; i++)
00265 {
00266 char str[64];
00267 sprintf(str, "imu/linear_acceleration_covariance.%d",i);
00268 EXPECT_EQ( flat_container.value[index].first.toStdString() , (str) );
00269 EXPECT_EQ( flat_container.value[index].second, 60+i );
00270 index++;
00271 }
00272 }
00273
00274
00275
00276 TEST( Deserialize, Int16MultiArrayDeserialize)
00277
00278 {
00279 ROSTypeList type_map = buildROSTypeMapFromDefinition(
00280 DataType<std_msgs::Int16MultiArray >::value(),
00281 Definition<std_msgs::Int16MultiArray >::value() );
00282
00283 std_msgs::Int16MultiArray multi_array;
00284
00285 const unsigned N = 6;
00286 multi_array.layout.data_offset = 42;
00287 multi_array.data.resize(N);
00288
00289 for (unsigned i=0; i<N; i++){
00290 multi_array.data[i] = i;
00291 }
00292
00293
00294 std::vector<uint8_t> buffer(64*1024);
00295 ros::serialization::OStream stream(buffer.data(), buffer.size());
00296 ros::serialization::Serializer<std_msgs::Int16MultiArray>::write(stream, multi_array);
00297
00298 ROSType main_type( DataType<std_msgs::Int16MultiArray>::value() );
00299
00300 ROSTypeFlat flat_container;
00301 buildRosFlatType(type_map,
00302 main_type,
00303 "multi_array",
00304 buffer.data(),
00305 &flat_container, 100);
00306
00307 if(VERBOSE_TEST){
00308 std::cout << " -------------------- " << std::endl;
00309
00310 for(auto&it: flat_container.value) {
00311 std::cout << it.first << " >> " << it.second.convert<double>() << std::endl;
00312 }
00313 }
00314
00315 }
00316
00317