diff --git a/CMakeLists.txt b/CMakeLists.txt index ca77087..78160c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,152 +1,152 @@ PROJECT(liboncilla C CXX) CMAKE_MINIMUM_REQUIRED(VERSION 2.6) SET(LIBNAME "oncilla") SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE) SET(LIBONCILLA_CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) # CMake module path and modules FIND_PACKAGE(RSC REQUIRED) SET(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" "${RSC_CMAKE_MODULE_PATH}") MESSAGE(STATUS "RSC version: ${RSC_VERSION}") INCLUDE(CheckIncludeFileCXX) INCLUDE(InstallFilesRecursive) INCLUDE(EnableCoverageReport) INCLUDE(EnableSlocCount) INCLUDE(GenerateDoxygen) INCLUDE(GenerateCppcheck) INCLUDE(PedanticCompilerWarnings) INCLUDE(SuperPedanticCompilerWarnings) FIND_PACKAGE(PkgConfig REQUIRED) SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) # --- user options --- OPTION(BUILD_TESTS "Decide whether unit-tests are built" ON) OPTION(BUILD_EXAMPLES "Decide whether the examples are built" ON) OPTION(BUILD_DOCS "Decide whether the docygen documentation is built" OFF) # Dependencies FIND_PACKAGE(Threads REQUIRED) MESSAGE(STATUS "Threading library: ${CMAKE_THREAD_LIBS_INIT}") set(OLD_CXX_FLAGS ${CMAKE_CXX_FLAGS}) FIND_PACKAGE(NemoMath REQUIRED) MESSAGE(STATUS "NemoMath version: ${NemoMath_VERSION}") set(CMAKE_CXX_FLAGS ${OLD_CXX_FLAGS}) FIND_PACKAGE(RCI REQUIRED) MESSAGE(STATUS "RCI version: ${RCI_VERSION}") # --- global definitions --- SET(LIBONCILLA_NAME "${LIBNAME}") SET(DRIVER_TEST_NAME "OncillaTest") SET(NODE_TEST_NAME "${DRIVER_TEST_NAME}Nodes") SET(LIBONCILLA_VERSION_MAJOR 0) SET(LIBONCILLA_VERSION_MINOR 2) SET(LIBONCILLA_VERSION_PATCH 0) SET(LIBONCILLA_VERSION_STRING "${LIBONCILLA_VERSION_MAJOR}.${LIBONCILLA_VERSION_MINOR}.${LIBONCILLA_VERSION_PATCH}") SET(LIBONCILLA_CMAKE_MODULE_PATH "share/cmake/Modules") SET(OUTPUT_PATH ${PROJECT_BINARY_DIR}/build) SET(ARCHIVE_OUTPUT_PATH ${OUTPUT_PATH}) SET(LIBRARY_OUTPUT_PATH ${OUTPUT_PATH}) SET(EXECUTABLE_OUTPUT_PATH ${OUTPUT_PATH}) # Includes INCLUDE_DIRECTORIES(BEFORE src ${PROJECT_BINARY_DIR}/src) message(STATUS ${RSC_INCLUDE_DIRS}) INCLUDE_DIRECTORIES(SYSTEM ${RCI_INCLUDE_DIRS} ${RSC_INCLUDE_DIRS} ${NemoMath_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${LIBRARIES_INCLUDE_DIRS}) #INCLUDE_DIRECTORIES(BEFORE SYSTEM ${PROTOBUF_INCLUDE_DIR} ${RST_INCLUDE_DIRS}) LINK_DIRECTORIES(${RCI_LIBRARY_DIR} ${LIBRARIES_LIBRARY_DIRS}) ADD_DEFINITIONS(${NEMOMATH_DEFINITIONS}) ADD_SUBDIRECTORY(src) IF(BUILD_TESTS) ENABLE_TESTING() INCLUDE(ProvideGoogleMock) MESSAGE(STATUS "Building tests - deactivate by adapting BUILD_TESTS") IF(GMOCK_AVAILABLE) ADD_SUBDIRECTORY(test) ELSE() MESSAGE(WARNING "Could not build unit tests even though desired because Google Mock could not be installed.") ENDIF() ENDIF() -#IF(BUILD_EXAMPLES) -# ADD_SUBDIRECTORY(examples) -#ENDIF() +IF(BUILD_EXAMPLES) + ADD_SUBDIRECTORY(examples) +ENDIF() # --- cmake config file --- SET(LIB_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX}) IF(CMAKE_LINK_LIBRARY_SUFFIX) SET(LIB_SUFFIX ${CMAKE_LINK_LIBRARY_SUFFIX}) ENDIF() # --- pkgconfig file --- set(PKG_CONFIG_FILE lib${LIBONCILLA_NAME}-${LIBONCILLA_VERSION_MAJOR}.pc) CONFIGURE_FILE(lib${LIBONCILLA_NAME}.pc.in ${PKG_CONFIG_FILE} @ONLY) INSTALL(FILES ${CMAKE_BINARY_DIR}/${PKG_CONFIG_FILE} DESTINATION lib/pkgconfig) # --- cmake config file --- SET(LIB_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX}) IF(CMAKE_LINK_LIBRARY_SUFFIX) SET(LIB_SUFFIX ${CMAKE_LINK_LIBRARY_SUFFIX}) ENDIF() CONFIGURE_FILE(${CMAKE_PROJECT_NAME}Config.cmake.in ${CMAKE_PROJECT_NAME}Config.cmake @ONLY) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake DESTINATION share/lib${LIBNAME}) # --- documentation generation --- IF(BUILD_DOCS) ADD_SUBDIRECTORY(doc) ENDIF(BUILD_DOCS) # --- coverage --- IF(BUILD_TESTS) ENABLE_COVERAGE_REPORT(TARGETS ${LIBONCILLA_NAME} TESTS ${DTO_TEST_NAME} ${INTEGRATED_TEST_NAME} FILTER "*3rdparty*" "*test/*") ENDIF(BUILD_TESTS) # --- sloccount --- ENABLE_SLOCCOUNT(FOLDERS src test examples) # --- cppcheck --- GENERATE_CPPCHECK(SOURCES src test examples "${CMAKE_CURRENT_BINARY_DIR}/src" "${CMAKE_CURRENT_BINARY_DIR}/test" "${CMAKE_CURRENT_BINARY_DIR}/examples" ENABLE_IDS style) # --- package --- INCLUDE(CheckLSBTypes) SET(CPACK_PACKAGE_VERSION_MAJOR ${LIBONCILLA_VERSION_MAJOR}) SET(CPACK_PACKAGE_VERSION_MINOR ${LIBONCILLA_VERSION_MINOR}) SET(CPACK_PACKAGE_VERSION_PATCH ${LIBONCILLA_VERSION_PATCH}) SET(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") SET(CPACK_PACKAGE_FILE_NAME ${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION}_${LSB_CODENAME}_${LSB_PROCESSOR_ARCH}) SET(CPACK_GENERATOR "TGZ") SET(CPACK_PACKAGE_VENDOR "CoR-Lab Bielefeld University") # IF(CMAKE_SYSTEM_NAME STREQUAL "Linux") # SET(CPACK_GENERATOR "${CPACK_GENERATOR};DEB") # SET(CPACK_DEBIAN_PACKAGE_NAME "amarsi-liboncilla") # SET(CPACK_DEBIAN_PACKAGE_VERSION ${LIBONCILLA_VERSION_MAJOR}.${LIBONCILLA_VERSION_MINOR}.${LIBONCILLA_VERSION_PATCH}) # SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Arne Nordmann (anordman@cor-lab.uni-bielefeld.de)") # SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION "AMARSi RCI representations of the AMARSi quadruped robot 'Oncilla'.") # SET(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") # SET(CPACK_DEBIAN_PACKAGE_SECTION "devel") # SET(CPACK_DEBIAN_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR}) # SET(CPACK_DEBIAN_PACKAGE_DEPENDS "amarsi-rci-all") # SET(CPACK_DEBIAN_PACKAGE_SUGGESTS "cmake, cmake-data, doxygen, lcov, cppcheck, sloccount") # ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Linux") INCLUDE(CPack) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 2a46fe5..e2c5cec 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,20 +1,10 @@ -set(SOURCES_LIST ) -foreach(file ${SOURCES}) - set(SOURCES_LIST "${SOURCES_LIST} ${file}") -endforeach(file) - -SET(EXAMPLE2 "OncillaWalkOneLeg") -ADD_EXECUTABLE(${EXAMPLE2} walkOneLeg.cpp) - -target_link_libraries(${EXAMPLE2} ${LIBNAME}) - -if(MY_LINK_FLAGS) - set(LINK_PROPERTIES LINK_FLAGS ${MY_LINK_FLAGS}) -elseif(MY_LINK_FLAGS) - set(LINK_PROPERTIES ) -endif(MY_LINK_FLAGS) - -INSTALL(TARGETS ${EXAMPLE1} ${EXAMPLE2} ${EXAMPLE3} ${EXAMPLE4} ${EXAMPLE5} ${EXAMPLE6} - RUNTIME DESTINATION bin +SET(EXAMPLE1 "SimpleSineMovement") +ADD_EXECUTABLE(${EXAMPLE1} + ${EXAMPLE1}.cpp) +TARGET_LINK_LIBRARIES(${EXAMPLE1} + ${LIBNAME}) + +INSTALL(TARGETS ${EXAMPLE1} + RUNTIME DESTINATION bin/examples/oncilla LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) diff --git a/examples/SimpleSineMovement.cpp b/examples/SimpleSineMovement.cpp new file mode 100644 index 0000000..20d0c19 --- /dev/null +++ b/examples/SimpleSineMovement.cpp @@ -0,0 +1,72 @@ +#include +#include + +#include +#include + +#include + +#include + +#include "Oncilla.h" +#include "OncillaL1L2.h" +#include "OncillaSynchronizer.h" + +using namespace std; +using namespace boost; + +using namespace rci; +using namespace rci::oncilla; + +int main() { + double amplitude_rad = 1.0; + double frequency_Hz = 1.0; + + // Instantiate the actual robot object + Oncilla oncilla; + + // Get the synchronizer, so that we can control the actual simulation + // stepping from within our code + OncillaSynchronizerPtr synchronizer = oncilla.getSynchronizer(); + + // Get all the joints we are interested in - L1 and L2 + OncillaL1Ptr left_fore_hip = oncilla.getL1(Oncilla::LEFT_FORE); + OncillaL2Ptr left_fore_knee = oncilla.getL2(Oncilla::LEFT_FORE); + OncillaL1Ptr right_fore_hip = oncilla.getL1(Oncilla::RIGHT_FORE); + OncillaL2Ptr right_fore_knee = oncilla.getL2(Oncilla::RIGHT_FORE); + OncillaL1Ptr left_hind_hip = oncilla.getL1(Oncilla::LEFT_HIND); + OncillaL2Ptr left_hind_knee = oncilla.getL2(Oncilla::LEFT_HIND); + OncillaL1Ptr right_hind_hip = oncilla.getL1(Oncilla::RIGHT_HIND); + OncillaL2Ptr right_hind_knee = oncilla.getL2(Oncilla::RIGHT_HIND); + + // Now move the joints + double time_s, phase1, phase2; + JointAnglesPtr hip1, hip2, knee1, knee2; + while (true) { + // The time is our phase - TODO: Use virtual / simulated time + time_s = rsc::misc::currentTimeMicros() / 1000; + phase1 = time_s * frequency_Hz; + phase2 = (time_s + 0.5) * frequency_Hz; + + hip1 = JointAngles::fromRad(amplitude_rad * sin(phase1)); + left_fore_hip->setJointPosition(hip1); + right_hind_hip->setJointPosition(hip1); + + hip2 = JointAngles::fromRad(amplitude_rad * sin(phase2)); + left_hind_hip->setJointPosition(hip2); + right_fore_hip->setJointPosition(hip2); + + knee1 = JointAngles::fromRad(amplitude_rad * sin(phase1)); + left_fore_knee->setJointPosition(knee1); + right_hind_knee->setJointPosition(knee1); + + knee2 = JointAngles::fromRad(amplitude_rad * sin(phase2)); + left_hind_knee->setJointPosition(knee2); + right_fore_knee->setJointPosition(knee2); + + // Now that we set the new angles, we do one processing step + synchronizer->process(); + } + + return EXIT_SUCCESS; +} diff --git a/examples/walkOneLeg.cpp b/examples/walkOneLeg.cpp deleted file mode 100644 index c515e4f..0000000 --- a/examples/walkOneLeg.cpp +++ /dev/null @@ -1,63 +0,0 @@ -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "Oncilla.h" -#include "OncillaSynchronizer.h" - -using namespace std; -using namespace boost; -using namespace boost::program_options; - -using namespace rci; -using namespace rci::oncilla; - -int main(int ac, char **av) { - unsigned int cycleTimeMs = 50; - double amplitude = 1.0; - double offset = 0.0; - double frequency = 1; - - /** - * Handle command line options - */ - options_description desc("Allowed options"); - desc.add_options()("help", "Produce help message")("frequency", - value (), "Frequency of oscillation in Hertz")("amplitude", - value (), "Amplitude of the sine")("offset", - value (), "Offset to the output value"); - variables_map vm; - store(parse_command_line(ac, av, desc), vm); - notify(vm); - if (vm.count("help")) { - cout << desc << "\n"; - return 1; - } - if (vm.count("frequency")) { - frequency = vm["frequency"].as (); - } - cout << "Frequency set to " << frequency << " Hertz.\n"; - if (vm.count("amplitude")) { - amplitude = vm["amplitude"].as (); - } - cout << "Amplitude set to " << amplitude << ".\n"; - if (vm.count("offset")) { - offset = vm["offset"].as (); - } - cout << "Offset set to " << offset << ".\n"; - - OncillaSynchronizerPtr s = - OncillaSynchronizerPtr(new OncillaSynchronizer()); - Oncilla o; - - return EXIT_SUCCESS; -}