diff --git a/VirtualRobot/examples/Simox2Mjcf/main.cpp b/VirtualRobot/examples/Simox2Mjcf/main.cpp index 7ca1cef54ee3d6644f1ef65f2d431d07b792cb83..a99e5b2e5a86a796b021997f9fff1d8afb4cd40f 100644 --- a/VirtualRobot/examples/Simox2Mjcf/main.cpp +++ b/VirtualRobot/examples/Simox2Mjcf/main.cpp @@ -15,12 +15,14 @@ namespace fs = boost::filesystem; void printUsage(const char* argv0) { std::cout << "Usage: " << argv0 - << " --robot <simox robot file> " - << "[--outdir <output directory>] " - << "[--meshRelDir <relative mesh directory>] " - << "[--actuator {motor|position|velocity}] " - << "[--mocap {y|n}] " - << "[--verbose {y|n}]" + << " --robot <simox robot file>" + << " [--outdir <output directory>]" + << " [--meshRelDir <relative mesh directory>]" + << " [--actuator {motor|position|velocity}]" + << " [--mocap {y|n}]" + << " [--length_scaling <length scaling (to m)>]" + << " [--mass_scaling <mass scaling (to kg)>]" + << " [--verbose {y|n}]" << std::endl; } @@ -36,6 +38,8 @@ int main(int argc, char* argv[]) RuntimeEnvironment::considerKey("meshRelDir"); RuntimeEnvironment::considerKey("actuator"); RuntimeEnvironment::considerKey("mocap"); + RuntimeEnvironment::considerKey("scale_length"); + RuntimeEnvironment::considerKey("scale_mass"); RuntimeEnvironment::considerKey("verbose"); RuntimeEnvironment::processCommandLine(argc, argv); @@ -84,6 +88,33 @@ int main(int argc, char* argv[]) const bool mocap = RuntimeEnvironment::checkParameter("mocap", "n") == "y"; const bool verbose = RuntimeEnvironment::checkParameter("verbose", "n") == "y"; + auto parseFloatParameter = [](const std::string& key, const std::string& default_) + { + const std::string string = RuntimeEnvironment::checkParameter(key, default_); + try + { + return std::stof(string); + } + catch (const std::invalid_argument& e) + { + std::cerr << "Could not parse value of argument " << key << ": '" << string << "' \n" + << "Reason: " << e.what() << std::endl; + throw e; + } + }; + + float lengthScaling; + float massScaling; + try + { + lengthScaling = parseFloatParameter("scale_length", "0.001"); + massScaling = parseFloatParameter("scale_mass", "0.001"); + } + catch (const std::invalid_argument&) + { + return -1; + } + std::cout << "Input file: " << inputFilename << std::endl; std::cout << "Output dir: " << outputDir << std::endl; @@ -104,7 +135,7 @@ int main(int argc, char* argv[]) throw; // rethrow } - if (false) + if (/* DISABLES CODE */ (false)) { // using RobotIO RobotIO::saveMJCF(robot, inputFilename.filename().string(), outputDir.string(), meshRelDir); @@ -115,6 +146,8 @@ int main(int argc, char* argv[]) mujoco::MujocoIO mujocoIO(robot); mujocoIO.setActuatorType(actuatorType); mujocoIO.setWithMocapBody(mocap); + mujocoIO.setLengthScaling(lengthScaling); + mujocoIO.setMassScaling(massScaling); mujocoIO.setVerbose(verbose); mujocoIO.saveMJCF(inputFilename.filename().string(), outputDir.string(), meshRelDir); }