Raise warning if there are NaNs in the XML.
For Windows, throw an error if NaNs are present. PiperOrigin-RevId: 455340787 Change-Id: Ibd95e2335ab15b706ee3328816983e5b57b2315e
This commit is contained in:
committed by
Copybara-Service
parent
8958e13878
commit
e0b6ba4a13
@@ -26,6 +26,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "cc/array_safety.h"
|
#include "cc/array_safety.h"
|
||||||
|
#include "engine/engine_util_errmem.h"
|
||||||
#include "xml/xml_util.h"
|
#include "xml/xml_util.h"
|
||||||
#include "xml/xml_numeric_format.h"
|
#include "xml/xml_numeric_format.h"
|
||||||
|
|
||||||
@@ -567,6 +568,10 @@ int mjXUtil::ReadAttr(XMLElement* elem, const char* attr, const int len,
|
|||||||
token_strm >> data[i++];
|
token_strm >> data[i++];
|
||||||
if (token_strm.fail() || !token_strm.eof()) {
|
if (token_strm.fail() || !token_strm.eof()) {
|
||||||
throw mjXError(elem, "problem reading attribute '%s'", attr);
|
throw mjXError(elem, "problem reading attribute '%s'", attr);
|
||||||
|
} else if constexpr (std::is_floating_point_v<T>) {
|
||||||
|
if (std::isnan(data[i-1])) {
|
||||||
|
mju_warning("XML contains a 'NaN'. Please check it carefully.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
strm >> std::ws;
|
strm >> std::ws;
|
||||||
|
|||||||
@@ -22,13 +22,17 @@
|
|||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <mujoco/mjmodel.h>
|
#include <mujoco/mjmodel.h>
|
||||||
#include <mujoco/mujoco.h>
|
#include <mujoco/mujoco.h>
|
||||||
|
#include "src/engine/engine_array_safety.h"
|
||||||
|
#include "src/engine/engine_util_errmem.h"
|
||||||
#include "test/fixture.h"
|
#include "test/fixture.h"
|
||||||
|
|
||||||
namespace mujoco {
|
namespace mujoco {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
using ::std::string;
|
||||||
using ::testing::HasSubstr;
|
using ::testing::HasSubstr;
|
||||||
using ::testing::IsNull;
|
using ::testing::IsNull;
|
||||||
|
using ::testing::NotNull;
|
||||||
|
|
||||||
using UserDataTest = MujocoTest;
|
using UserDataTest = MujocoTest;
|
||||||
|
|
||||||
@@ -128,6 +132,33 @@ TEST_F(UserDataTest, InvalidNUserSensor) {
|
|||||||
EXPECT_THAT(error.data(), HasSubstr("nuser_sensor"));
|
EXPECT_THAT(error.data(), HasSubstr("nuser_sensor"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(UserDataTest, RaiseNanWarning) {
|
||||||
|
static constexpr char xml[] = R"(
|
||||||
|
<mujoco>
|
||||||
|
<worldbody>
|
||||||
|
<body>
|
||||||
|
<geom size="1" axisangle="1.0 0.0 0.0 nan"/>
|
||||||
|
</body>
|
||||||
|
</worldbody>
|
||||||
|
</mujoco>
|
||||||
|
)";
|
||||||
|
std::array<char, 1024> error;
|
||||||
|
static char warning[1024];
|
||||||
|
warning[0] = '\0';
|
||||||
|
mju_user_warning = [](const char* msg) {
|
||||||
|
mjSTRNCPY(warning, msg);
|
||||||
|
};
|
||||||
|
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
|
||||||
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
ASSERT_THAT(model, IsNull());
|
||||||
|
EXPECT_THAT(error.data(), HasSubstr("problem reading attribute 'axisangle'"));
|
||||||
|
#else
|
||||||
|
ASSERT_THAT(model, NotNull());
|
||||||
|
EXPECT_THAT(warning, HasSubstr("XML contains a 'NaN'"));
|
||||||
|
mj_deleteModel(model);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(UserDataTest, InvalidArrayElement) {
|
TEST_F(UserDataTest, InvalidArrayElement) {
|
||||||
static constexpr char xml[] = R"(
|
static constexpr char xml[] = R"(
|
||||||
<mujoco>
|
<mujoco>
|
||||||
@@ -188,7 +219,7 @@ TEST_F(UserDataTest, AllowsSpaces) {
|
|||||||
)";
|
)";
|
||||||
std::array<char, 1024> error;
|
std::array<char, 1024> error;
|
||||||
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
|
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
|
||||||
ASSERT_THAT(model, Not(IsNull()));
|
ASSERT_THAT(model, NotNull());
|
||||||
mj_deleteModel(model);
|
mj_deleteModel(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -333,7 +364,7 @@ TEST_F(ActuatorTest, ReadsByte) {
|
|||||||
)";
|
)";
|
||||||
std::array<char, 1024> error;
|
std::array<char, 1024> error;
|
||||||
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
|
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
|
||||||
ASSERT_THAT(model, Not(IsNull()));
|
ASSERT_THAT(model, NotNull());
|
||||||
EXPECT_EQ(*(model->actuator_actlimited), (mjtByte)(1 & 0xFF));
|
EXPECT_EQ(*(model->actuator_actlimited), (mjtByte)(1 & 0xFF));
|
||||||
mj_deleteModel(model);
|
mj_deleteModel(model);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user