pxmlw6n2f/sdformat_for_tcp/test/integration/converter.cc

261 lines
8.5 KiB
C++

/*
* Copyright 2015 Open Source Robotics Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include <gtest/gtest.h>
#include "sdf/sdf.hh"
#include "sdf/Converter.hh"
#include "test_config.h"
const std::string CONVERT_DOC =
std::string(PROJECT_SOURCE_PATH) + "/sdf/1.6/1_5.convert";
/////////////////////////////////////////////////
/// Test conversion of imu in 1.5 to 1.6
TEST(ConverterIntegration, IMU_15_to_16)
{
// The imu noise in 1.5 format
std::string xmlString = R"(
<?xml version="1.0" ?>
<sdf version="1.5">
<world name="default">
<model name="box_old_imu_noise">
<link name="link">
<sensor name='imu_sensor' type='imu'>
<imu>
<noise>
<type>gaussian</type>
<rate>
<mean>0</mean>
<stddev>0.0002</stddev>
<bias_mean>7.5e-06</bias_mean>
<bias_stddev>8e-07</bias_stddev>
</rate>
<accel>
<mean>0</mean>
<stddev>0.017</stddev>
<bias_mean>0.1</bias_mean>
<bias_stddev>0.001</bias_stddev>
</accel>
</noise>
</imu>
</sensor>
</link>
</model>
</world>
</sdf>)";
TiXmlDocument xmlDoc;
xmlDoc.Parse(xmlString.c_str());
// Convert
TiXmlDocument convertXmlDoc;
convertXmlDoc.LoadFile(CONVERT_DOC);
sdf::Converter::Convert(&xmlDoc, &convertXmlDoc);
// Check some basic elements
TiXmlElement *convertedElem = xmlDoc.FirstChildElement();
EXPECT_EQ(convertedElem->ValueStr(), "sdf");
convertedElem = convertedElem->FirstChildElement();
EXPECT_EQ(convertedElem->ValueStr(), "world");
convertedElem = convertedElem->FirstChildElement();
EXPECT_EQ(convertedElem->ValueStr(), "model");
convertedElem = convertedElem->FirstChildElement();
EXPECT_EQ(convertedElem->ValueStr(), "link");
convertedElem = convertedElem->FirstChildElement();
EXPECT_EQ(convertedElem->ValueStr(), "sensor");
// Get the imu
TiXmlElement *imuElem = convertedElem->FirstChildElement();
EXPECT_EQ(imuElem->ValueStr(), "imu");
// Get the angular_velocity
TiXmlElement *angVelElem = imuElem->FirstChildElement();
EXPECT_EQ(angVelElem->ValueStr(), "angular_velocity");
// Get the linear_acceleration
TiXmlElement *linAccElem = angVelElem->NextSiblingElement();
EXPECT_EQ(linAccElem->ValueStr(), "linear_acceleration");
std::array<char, 3> axis = {'x', 'y', 'z'};
TiXmlElement *angVelAxisElem = angVelElem->FirstChildElement();
TiXmlElement *linAccAxisElem = linAccElem->FirstChildElement();
// Iterate over <x>, <y>, and <z> elements under <angular_velocity> and
// <linear_acceleration>
for (auto const &a : axis)
{
EXPECT_EQ(angVelAxisElem->Value()[0], a);
EXPECT_EQ(linAccAxisElem->Value()[0], a);
TiXmlElement *angVelAxisNoiseElem = angVelAxisElem->FirstChildElement();
TiXmlElement *linAccAxisNoiseElem = linAccAxisElem->FirstChildElement();
EXPECT_EQ(angVelAxisNoiseElem->ValueStr(), "noise");
EXPECT_EQ(linAccAxisNoiseElem->ValueStr(), "noise");
EXPECT_STREQ(angVelAxisNoiseElem->Attribute("type"), "gaussian");
EXPECT_STREQ(linAccAxisNoiseElem->Attribute("type"), "gaussian");
EXPECT_STREQ(angVelAxisNoiseElem->FirstChildElement("mean")->GetText(),
"0");
EXPECT_STREQ(linAccAxisNoiseElem->FirstChildElement("mean")->GetText(),
"0");
EXPECT_STREQ(angVelAxisNoiseElem->FirstChildElement("stddev")->GetText(),
"0.0002");
EXPECT_STREQ(linAccAxisNoiseElem->FirstChildElement("stddev")->GetText(),
"0.017");
EXPECT_STREQ(angVelAxisNoiseElem->FirstChildElement("bias_mean")->GetText(),
"7.5e-06");
EXPECT_STREQ(linAccAxisNoiseElem->FirstChildElement("bias_mean")->GetText(),
"0.1");
EXPECT_STREQ(angVelAxisNoiseElem->FirstChildElement(
"bias_stddev")->GetText(), "8e-07");
EXPECT_STREQ(linAccAxisNoiseElem->FirstChildElement(
"bias_stddev")->GetText(), "0.001");
angVelAxisElem = angVelAxisElem->NextSiblingElement();
linAccAxisElem = linAccAxisElem->NextSiblingElement();
}
}
/////////////////////////////////////////////////
/// Test conversion using the parser sdf file converter interface.
TEST(ConverterIntegration, ParserFileConverter)
{
std::string filename = std::string(PROJECT_SOURCE_PATH) +
"/test/integration/audio.sdf";
sdf::SDFPtr sdf(new sdf::SDF());
sdf::init(sdf);
EXPECT_TRUE(sdf::convertFile(filename, "1.6", sdf));
sdf::ElementPtr rootElem = sdf->Root();
ASSERT_TRUE(rootElem != NULL);
EXPECT_EQ(rootElem->Get<std::string>("version"), "1.6");
sdf::ElementPtr modelElem = rootElem->GetElement("model");
ASSERT_TRUE(modelElem != NULL);
EXPECT_EQ(modelElem->Get<std::string>("name"), "full_audio_parameters");
sdf::ElementPtr linkElem = modelElem->GetElement("link");
ASSERT_TRUE(linkElem != NULL);
EXPECT_EQ(linkElem->Get<std::string>("name"), "link");
sdf::ElementPtr collElem = linkElem->GetElement("collision");
ASSERT_TRUE(collElem != NULL);
EXPECT_EQ(collElem->Get<std::string>("name"), "collision");
sdf::ElementPtr sinkElem = linkElem->GetElement("audio_sink");
ASSERT_TRUE(sinkElem != NULL);
sdf::ElementPtr sourceElem = linkElem->GetElement("audio_source");
ASSERT_TRUE(sourceElem != NULL);
}
/////////////////////////////////////////////////
/// Test conversion using the parser sdf string converter interface.
TEST(ConverterIntegration, ParserStringConverter)
{
// The gravity and magnetic_field in 1.5 format
std::string xmlString = R"(
<?xml version="1.0" ?>
<sdf version="1.5">
<world name="default">
<physics type="ode">
<gravity>0 0 -9.8</gravity>
<magnetic_field>1 2 3</magnetic_field>
</physics>
</world>
</sdf>)";
sdf::SDFPtr sdf(new sdf::SDF());
sdf::init(sdf);
EXPECT_TRUE(sdf::convertString(xmlString, "1.6", sdf));
ASSERT_TRUE(sdf->Root() != NULL);
EXPECT_EQ(sdf->Root()->GetName(), "sdf");
sdf::ElementPtr worldElem = sdf->Root()->GetElement("world");
ASSERT_TRUE(worldElem != NULL);
EXPECT_EQ(worldElem->Get<std::string>("name"), "default");
sdf::ElementPtr physicsElem = worldElem->GetElement("physics");
ASSERT_TRUE(physicsElem != NULL);
EXPECT_EQ(physicsElem->Get<std::string>("name"), "default_physics");
EXPECT_EQ(physicsElem->Get<std::string>("type"), "ode");
sdf::ElementPtr gravityElem = worldElem->GetElement("gravity");
ASSERT_TRUE(gravityElem != NULL);
EXPECT_EQ(gravityElem->Get<ignition::math::Vector3d>(),
ignition::math::Vector3d(0, 0, -9.8));
sdf::ElementPtr magElem = worldElem->GetElement("magnetic_field");
ASSERT_TRUE(magElem != NULL);
EXPECT_EQ(magElem->Get<ignition::math::Vector3d>(),
ignition::math::Vector3d(1, 2, 3));
}
/////////////////////////////////////////////////
/// Test conversion of gravity, magnetic_field in 1.5 to 1.6
TEST(ConverterIntegration, World_15_to_16)
{
// The gravity and magnetic_field in 1.5 format
std::string xmlString = R"(
<?xml version="1.0" ?>
<sdf version="1.5">
<world name="default">
<physics type="ode">
<gravity>0 0 -9.8</gravity>
<magnetic_field>1 2 3</magnetic_field>
</physics>
</world>
</sdf>)";
TiXmlDocument xmlDoc;
xmlDoc.Parse(xmlString.c_str());
// Convert
TiXmlDocument convertXmlDoc;
convertXmlDoc.LoadFile(CONVERT_DOC);
sdf::Converter::Convert(&xmlDoc, &convertXmlDoc);
// Check some basic elements
TiXmlElement *convertedElem = xmlDoc.FirstChildElement();
EXPECT_EQ(convertedElem->ValueStr(), "sdf");
convertedElem = convertedElem->FirstChildElement();
EXPECT_EQ(convertedElem->ValueStr(), "world");
convertedElem = convertedElem->FirstChildElement();
EXPECT_EQ(convertedElem->ValueStr(), "physics");
// Get the gravity
TiXmlElement *gravityElem = convertedElem->NextSiblingElement("gravity");
ASSERT_TRUE(gravityElem != NULL);
EXPECT_STREQ(gravityElem->GetText(), "0 0 -9.8");
// Get the magnetic_field
TiXmlElement *magneticFieldElem =
convertedElem->NextSiblingElement("magnetic_field");
ASSERT_TRUE(magneticFieldElem != NULL);
EXPECT_STREQ(magneticFieldElem->GetText(), "1 2 3");
}