diff --git a/CMakeLists.txt b/CMakeLists.txt index 4dd8b9cbc49a7..f4b0b76695264 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,11 @@ #=============================================================================== # CMake settings #=============================================================================== -cmake_minimum_required(VERSION 2.8.6 FATAL_ERROR) +if(MSVC) + cmake_minimum_required(VERSION 3.1.3) +else() + cmake_minimum_required(VERSION 2.8.6) +endif() # Use MACOSX_RPATH by default on OS X. This was added in CMake 2.8.12 and # became default in CMake 3.0. Explicitly setting this policy is necessary to @@ -218,7 +222,7 @@ endif() # Boost set(DART_MIN_BOOST_VERSION 1.46.0 CACHE INTERNAL "Boost min version requirement" FORCE) -if(MSVC OR MSVC90 OR MSVC10) +if(MSVC) add_definitions(-DBOOST_ALL_NO_LIB) endif() add_definitions(-DBOOST_TEST_DYN_LINK) @@ -471,8 +475,8 @@ endif() #=============================================================================== if(MSVC) # Visual Studio enables c++11 support by default - if(NOT MSVC12 AND NOT MSVC14) - message(FATAL_ERROR "${PROJECT_NAME} requires VS 2013 or greater.") + if(MSVC_VERSION VERSION_LESS 1900) + message(FATAL_ERROR "${PROJECT_NAME} requires VS 2015 or greater.") endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP4") set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /INCREMENTAL:NO") diff --git a/appveyor.yml b/appveyor.yml index 38f6ebdbe3460..e33e34b9a07af 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -12,8 +12,8 @@ platform: # specify custom environment variables environment: MSVC_DEFAULT_OPTIONS: ON - BOOST_ROOT: C:\Libraries\boost - BOOST_LIBRARYDIR: C:\Libraries\boost\lib32-msvc-12.0 + BOOST_ROOT: C:\Libraries\boost_1_59_0 + BOOST_LIBRARYDIR: C:\Libraries\boost_1_59_0\lib32-msvc-14.0 BUILD_EXAMPLES: OFF # don't build examples to not exceed allowed build time (40 min) BUILD_TUTORIALS: OFF # don't build tutorials to not exceed allowed build time (40 min) matrix: @@ -53,8 +53,8 @@ before_build: - cmd: md build - cmd: cd build # We generate project files for Visual Studio 12 because the boost binaries installed on the test server are for Visual Studio 12. - - cmd: if "%platform%"=="Win32" set CMAKE_GENERATOR_NAME=Visual Studio 12 - - cmd: if "%platform%"=="x64" set CMAKE_GENERATOR_NAME=Visual Studio 12 Win64 + - cmd: if "%platform%"=="Win32" set CMAKE_GENERATOR_NAME=Visual Studio 14 2015 + - cmd: if "%platform%"=="x64" set CMAKE_GENERATOR_NAME=Visual Studio 14 2015 Win64 - cmd: cmake -G "%CMAKE_GENERATOR_NAME%" -DCMAKE_BUILD_TYPE=%configuration% -DBUILD_CORE_ONLY="%BUILD_CORE_ONLY%" -DDART_BUILD_EXAMPLES="%BUILD_EXAMPLES%" -DDART_BUILD_TUTORIALS="%BUILD_TUTORIALS%" -DBOOST_ROOT="%BOOST_ROOT%" -DBOOST_LIBRARYDIR="%BOOST_LIBRARYDIR%" -DBoost_USE_STATIC_LIBS="ON" -Durdfdom_DIR="%urdfdom_DIR%" -Durdfdom_headers_DIR="%urdfdom_headers_DIR%" -DDART_MSVC_DEFAULT_OPTIONS="%MSVC_DEFAULT_OPTIONS%" .. build: diff --git a/ci/appveyor_install.ps1 b/ci/appveyor_install.ps1 index 03a1dc8f491bc..3a10c7517cd79 100755 --- a/ci/appveyor_install.ps1 +++ b/ci/appveyor_install.ps1 @@ -9,8 +9,8 @@ function InstallPrerequisites($work_dir, $install_dir) $old_dir = $pwd cd $work_dir - $msi = "dart-prerequisites.msi" - $uri = "https://github.com/dartsim/dart-prerequisites-windows/raw/3e34167fd29fcc870ebed50bf318f3f31f491e6a/DART%205.0-prerequisites-msvc12-md-32bit.msi" + $msi = "dart-dependencies.msi" + $uri = "https://github.com/dartsim/dart-prerequisites-windows-installers/raw/master/02/DART-dependencies-msvc14-md-32bit.msi" Invoke-WebRequest $uri -OutFile $msi $install_command = "msiexec.exe" diff --git a/unittests/testJoints.cpp b/unittests/testJoints.cpp index 33f393eb73113..62056e3ce9e34 100644 --- a/unittests/testJoints.cpp +++ b/unittests/testJoints.cpp @@ -809,6 +809,118 @@ TEST_F(JOINTS, SERVO_MOTOR) testServoMotor(); } +//============================================================================== +TEST_F(JOINTS, JOINT_COULOMB_FRICTION_AND_POSITION_LIMIT) +{ + const double timeStep = 1e-3; + const double tol = 1e-2; + + simulation::WorldPtr myWorld + = utils::SkelParser::readWorld( + DART_DATA_PATH"/skel/test/joint_friction_test.skel"); + EXPECT_TRUE(myWorld != nullptr); + + myWorld->setGravity(Eigen::Vector3d(0.0, 0.0, 0.0)); + myWorld->setTimeStep(timeStep); + + dynamics::SkeletonPtr pendulum = myWorld->getSkeleton("double_pendulum"); + EXPECT_TRUE(pendulum != nullptr); + pendulum->disableSelfCollision(); + + dynamics::Joint* joint0 = pendulum->getJoint("joint0"); + dynamics::Joint* joint1 = pendulum->getJoint("joint1"); + + EXPECT_TRUE(joint0 != nullptr); + EXPECT_TRUE(joint1 != nullptr); + + double frictionForce = 5.0; + + joint0->setPositionLimitEnforced(true); + joint1->setPositionLimitEnforced(true); + + const double ll = -DART_PI/12.0; // -15 degree + const double ul = +DART_PI/12.0; // +15 degree + + size_t dof0 = joint0->getNumDofs(); + for (size_t i = 0; i < dof0; ++i) + { + joint0->setPosition(i, 0.0); + joint0->setPosition(i, 0.0); + joint0->setPositionLowerLimit(i, ll); + joint0->setPositionUpperLimit(i, ul); + } + + size_t dof1 = joint1->getNumDofs(); + for (size_t i = 0; i < dof1; ++i) + { + joint1->setPosition(i, 0.0); + joint1->setPosition(i, 0.0); + joint1->setPositionLowerLimit(i, ll); + joint1->setPositionUpperLimit(i, ul); + } + + joint0->setCoulombFriction(0, frictionForce); + joint1->setCoulombFriction(0, frictionForce); + + EXPECT_EQ(joint0->getCoulombFriction(0), frictionForce); + EXPECT_EQ(joint1->getCoulombFriction(0), frictionForce); + +#ifndef NDEBUG // Debug mode + double simTime = 0.2; +#else + double simTime = 2.0; +#endif // ------- Debug mode + int nSteps = simTime / timeStep; + + // First two seconds rotating in positive direction with higher control forces + // than the friction forces + for (int i = 0; i < nSteps; i++) + { + joint0->setForce(0, 100.0); + joint1->setForce(0, 100.0); + myWorld->step(); + + double jointPos0 = joint0->getPosition(0); + double jointPos1 = joint1->getPosition(0); + + double jointVel0 = joint0->getVelocity(0); + double jointVel1 = joint1->getVelocity(0); + + EXPECT_GE(std::abs(jointVel0), 0.0); + EXPECT_GE(std::abs(jointVel1), 0.0); + + EXPECT_GE(jointPos0, ll - tol); + EXPECT_LE(jointPos0, ul + tol); + + EXPECT_GE(jointPos1, ll - tol); + EXPECT_LE(jointPos1, ul + tol); + } + + // Another two seconds rotating in negative direction with higher control + // forces than the friction forces + for (int i = 0; i < nSteps; i++) + { + joint0->setForce(0, -100.0); + joint1->setForce(0, -100.0); + myWorld->step(); + + double jointPos0 = joint0->getPosition(0); + double jointPos1 = joint1->getPosition(0); + + double jointVel0 = joint0->getVelocity(0); + double jointVel1 = joint1->getVelocity(0); + + EXPECT_GE(std::abs(jointVel0), 0.0); + EXPECT_GE(std::abs(jointVel1), 0.0); + + EXPECT_GE(jointPos0, ll - tol); + EXPECT_LE(jointPos0, ul + tol); + + EXPECT_GE(jointPos1, ll - tol); + EXPECT_LE(jointPos1, ul + tol); + } +} + //============================================================================== template Eigen::Matrix random_vec(double limit=100)