From fd0c81a14367e96071a570006d969146dfa2ae11 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Wed, 5 Dec 2018 15:38:55 +0100 Subject: [PATCH 01/37] Removed the core of WBToolbox In preparation of the split of the core https://github.com/robotology/wb-toolbox/issues/96 --- CMakeLists.txt | 2 +- cmake/ExtraPackageConfigVars.cmake.in | 36 - deps/CMakeLists.txt | 5 - deps/MxAnyType/CMakeLists.txt | 74 -- deps/MxAnyType/include/AnyType.h | 68 - deps/MxAnyType/include/MxAnyType.h | 103 -- deps/MxAnyType/src/MxAnyType.cpp | 262 ---- deps/sharedlibpp/.gitignore | 2 - deps/sharedlibpp/AUTHORS | 10 - deps/sharedlibpp/CMakeLists.txt | 86 -- deps/sharedlibpp/LICENSE | 26 - deps/sharedlibpp/README.md | 45 - .../cmake/AddInstallRPATHSupport.cmake | 169 --- .../cmake/AddUninstallTarget.cmake | 70 - .../cmake/InstallBasicPackageFiles.cmake | 677 ---------- deps/sharedlibpp/examples/CMakeLists.txt | 19 - deps/sharedlibpp/examples/MyMath.cpp | 22 - deps/sharedlibpp/examples/MyMath.h | 26 - deps/sharedlibpp/examples/MyMathCustom.cpp | 22 - deps/sharedlibpp/examples/MyMathCustom.h | 40 - deps/sharedlibpp/examples/math_test.cpp | 41 - .../sharedlibpp/examples/math_test_custom.cpp | 45 - deps/sharedlibpp/src/CMakeLists.txt | 70 - deps/sharedlibpp/src/SharedLibrary.cpp | 143 -- deps/sharedlibpp/src/SharedLibraryFactory.cpp | 252 ---- deps/sharedlibpp/src/shlibpp/SharedLibrary.h | 92 -- .../src/shlibpp/SharedLibraryClass-inl.h | 105 -- .../src/shlibpp/SharedLibraryClass.h | 128 -- .../src/shlibpp/SharedLibraryClassApi.h | 195 --- .../shlibpp/SharedLibraryClassFactory-inl.h | 56 - .../src/shlibpp/SharedLibraryClassFactory.h | 51 - .../src/shlibpp/SharedLibraryFactory.h | 235 ---- deps/sharedlibpp/src/shlibpp/api.h | 44 - deps/sharedlibpp/src/shlibpp/config.h.in | 15 - deps/sharedlibpp/src/shlibpp/version.h.in | 29 - deps/sharedlibpp/src/version.cpp | 29 - example/.clang-format | 108 -- example/CMakeLists.txt | 56 - example/README.md | 28 - example/include/SignalMath.h | 48 - example/matlab/ExampleToolbox.slx | Bin 22004 -> 0 bytes example/matlab/Model.mdl | 1174 ----------------- example/matlab/slblocks.m | 11 - example/src/Factory.cpp | 7 - example/src/SignalMath.cpp | 166 --- toolbox/CMakeLists.txt | 3 +- toolbox/core/CMakeLists.txt | 149 --- toolbox/core/WBToolbox.tlc | 272 ---- toolbox/core/include/Core/Block.h | 305 ----- toolbox/core/include/Core/BlockInformation.h | 225 ---- .../core/include/Core/CoderBlockInformation.h | 76 -- toolbox/core/include/Core/ConvertStdVector.h | 82 -- .../core/include/Core/GeneratedCodeWrapper.h | 131 -- toolbox/core/include/Core/Log.h | 117 -- toolbox/core/include/Core/Parameter.h | 132 -- toolbox/core/include/Core/Parameters.h | 252 ---- toolbox/core/include/Core/Signal.h | 268 ---- .../include/Core/SimulinkBlockInformation.h | 120 -- toolbox/core/src/Block.cpp | 103 -- toolbox/core/src/BlockInformation.cpp | 11 - toolbox/core/src/CoderBlockInformation.cpp | 337 ----- toolbox/core/src/ConvertStdVector.cpp | 123 -- toolbox/core/src/Log.cpp | 108 -- toolbox/core/src/Parameter.cpp | 65 - toolbox/core/src/Parameters.cpp | 664 ---------- toolbox/core/src/Signal.cpp | 373 ------ toolbox/core/src/SimulinkBlockInformation.cpp | 900 ------------- toolbox/core/src/WBToolbox.cpp | 857 ------------ 68 files changed, 3 insertions(+), 10562 deletions(-) delete mode 100644 cmake/ExtraPackageConfigVars.cmake.in delete mode 100644 deps/MxAnyType/CMakeLists.txt delete mode 100644 deps/MxAnyType/include/AnyType.h delete mode 100644 deps/MxAnyType/include/MxAnyType.h delete mode 100644 deps/MxAnyType/src/MxAnyType.cpp delete mode 100644 deps/sharedlibpp/.gitignore delete mode 100644 deps/sharedlibpp/AUTHORS delete mode 100644 deps/sharedlibpp/CMakeLists.txt delete mode 100644 deps/sharedlibpp/LICENSE delete mode 100644 deps/sharedlibpp/README.md delete mode 100644 deps/sharedlibpp/cmake/AddInstallRPATHSupport.cmake delete mode 100644 deps/sharedlibpp/cmake/AddUninstallTarget.cmake delete mode 100644 deps/sharedlibpp/cmake/InstallBasicPackageFiles.cmake delete mode 100644 deps/sharedlibpp/examples/CMakeLists.txt delete mode 100644 deps/sharedlibpp/examples/MyMath.cpp delete mode 100644 deps/sharedlibpp/examples/MyMath.h delete mode 100644 deps/sharedlibpp/examples/MyMathCustom.cpp delete mode 100644 deps/sharedlibpp/examples/MyMathCustom.h delete mode 100644 deps/sharedlibpp/examples/math_test.cpp delete mode 100644 deps/sharedlibpp/examples/math_test_custom.cpp delete mode 100644 deps/sharedlibpp/src/CMakeLists.txt delete mode 100644 deps/sharedlibpp/src/SharedLibrary.cpp delete mode 100644 deps/sharedlibpp/src/SharedLibraryFactory.cpp delete mode 100644 deps/sharedlibpp/src/shlibpp/SharedLibrary.h delete mode 100644 deps/sharedlibpp/src/shlibpp/SharedLibraryClass-inl.h delete mode 100644 deps/sharedlibpp/src/shlibpp/SharedLibraryClass.h delete mode 100644 deps/sharedlibpp/src/shlibpp/SharedLibraryClassApi.h delete mode 100644 deps/sharedlibpp/src/shlibpp/SharedLibraryClassFactory-inl.h delete mode 100644 deps/sharedlibpp/src/shlibpp/SharedLibraryClassFactory.h delete mode 100644 deps/sharedlibpp/src/shlibpp/SharedLibraryFactory.h delete mode 100644 deps/sharedlibpp/src/shlibpp/api.h delete mode 100644 deps/sharedlibpp/src/shlibpp/config.h.in delete mode 100644 deps/sharedlibpp/src/shlibpp/version.h.in delete mode 100644 deps/sharedlibpp/src/version.cpp delete mode 100644 example/.clang-format delete mode 100644 example/CMakeLists.txt delete mode 100644 example/README.md delete mode 100644 example/include/SignalMath.h delete mode 100644 example/matlab/ExampleToolbox.slx delete mode 100644 example/matlab/Model.mdl delete mode 100644 example/matlab/slblocks.m delete mode 100644 example/src/Factory.cpp delete mode 100644 example/src/SignalMath.cpp delete mode 100644 toolbox/core/CMakeLists.txt delete mode 100644 toolbox/core/WBToolbox.tlc delete mode 100644 toolbox/core/include/Core/Block.h delete mode 100644 toolbox/core/include/Core/BlockInformation.h delete mode 100644 toolbox/core/include/Core/CoderBlockInformation.h delete mode 100644 toolbox/core/include/Core/ConvertStdVector.h delete mode 100644 toolbox/core/include/Core/GeneratedCodeWrapper.h delete mode 100644 toolbox/core/include/Core/Log.h delete mode 100644 toolbox/core/include/Core/Parameter.h delete mode 100644 toolbox/core/include/Core/Parameters.h delete mode 100644 toolbox/core/include/Core/Signal.h delete mode 100644 toolbox/core/include/Core/SimulinkBlockInformation.h delete mode 100644 toolbox/core/src/Block.cpp delete mode 100644 toolbox/core/src/BlockInformation.cpp delete mode 100644 toolbox/core/src/CoderBlockInformation.cpp delete mode 100644 toolbox/core/src/ConvertStdVector.cpp delete mode 100644 toolbox/core/src/Log.cpp delete mode 100644 toolbox/core/src/Parameter.cpp delete mode 100644 toolbox/core/src/Parameters.cpp delete mode 100644 toolbox/core/src/Signal.cpp delete mode 100644 toolbox/core/src/SimulinkBlockInformation.cpp delete mode 100644 toolbox/core/src/WBToolbox.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index b79a2ee04..f2962d937 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ # GNU Lesser General Public License v2.1 or any later version. cmake_minimum_required(VERSION 3.5) -project(WB-Toolbox LANGUAGES CXX VERSION 4) +project(WB-Toolbox LANGUAGES CXX VERSION 5) if(WBT_BUILD_DOCS) add_subdirectory(doc) diff --git a/cmake/ExtraPackageConfigVars.cmake.in b/cmake/ExtraPackageConfigVars.cmake.in deleted file mode 100644 index 67cf896f7..000000000 --- a/cmake/ExtraPackageConfigVars.cmake.in +++ /dev/null @@ -1,36 +0,0 @@ -set(NAME "WBToolbox") - -foreach(comp (ToolboxCore ToolboxCoder ToolboxMex WBToolboxLibrary)) - if(${${comp}_FOUND}) - string(CONCAT FOUND_COMPONENTS_LIST ${FOUND_COMPONENTS_LIST} " ${comp}") - endif() -endforeach() - -foreach(comp ${${NAME}_FIND_COMPONENTS}) - # Match the component status with the find_dependency exit variable - set(${NAME}_${comp}_FOUND ${${comp}_FOUND}) -endforeach() - -check_required_components(${NAME}) - -if(${NAME}_FOUND) - message(STATUS "Found WBToolbox ${${NAME}_FIND_VERSION} (Components:${FOUND_COMPONENTS_LIST})") -endif() - -if(NOT ${NAME}_FIND_QUIETLY) - foreach(comp ${${NAME}_FIND_COMPONENTS}) - # If a component is not found, tell the user its name - if((NOT ${NAME}_FIND_REQUIRED_${comp}) AND (NOT ${comp}_FOUND)) - # status if it is OPTIONAL_COMPONENT - message(STATUS "WBToolbox: OPTIONAL component ${comp} NOT found") - elseif(NOT ${comp}_FOUND) - # warning if it is REQUIRED - message(WARNING "WBToolbox: REQUIRED component ${comp} NOT found") - # Note: find_package will exit with a fatal error but without telling - # what is missing - endif() - endforeach() -endif() - -unset(NAME) -unset(FOUND_COMPONENTS_LIST) diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index be8f55c47..ca708c46b 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -2,9 +2,4 @@ # This software may be modified and distributed under the terms of the # GNU Lesser General Public License v2.1 or any later version. -if(WBT_USES_MATLAB) - add_subdirectory(MxAnyType) -endif() - -add_subdirectory(sharedlibpp) add_subdirectory(thrift) diff --git a/deps/MxAnyType/CMakeLists.txt b/deps/MxAnyType/CMakeLists.txt deleted file mode 100644 index 8f8083cf5..000000000 --- a/deps/MxAnyType/CMakeLists.txt +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT). All rights reserved. -# This software may be modified and distributed under the terms of the -# GNU Lesser General Public License v2.1 or any later version. - -cmake_minimum_required(VERSION 3.5) -project(MxAnyType LANGUAGES CXX VERSION 0.1) - -# Configure the project -# ===================== - -set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -include(GNUInstallDirs) - -# Export all symbols in Windows -set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) - -# Add a postfix to Windows libraries compiled in debug -if(MSVC) - set(CMAKE_DEBUG_POSTFIX "d") -endif() - -# Control where binaries and libraries are placed in the build folder. -# This simplifies tests running in Windows. -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}") -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}") -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}") - -# Build the library -# ================= - -# Add the target -add_library(MxAnyType - include/AnyType.h - include/MxAnyType.h - src/MxAnyType.cpp) - -set_target_properties(MxAnyType PROPERTIES - VERSION ${PROJECT_VERSION} - PUBLIC_HEADER include/AnyType.h -) - -# Find Matlab resources -find_package(Matlab REQUIRED MX_LIBRARY) -target_include_directories(MxAnyType SYSTEM PRIVATE "${Matlab_INCLUDE_DIRS}") -target_link_libraries(MxAnyType ${Matlab_MX_LIBRARY}) - -# Setup the include directories -target_include_directories(MxAnyType PUBLIC - $ - $) - -# Build tests -# =========== - -# add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tests) - -# Install -# ======= - -install(TARGETS MxAnyType - EXPORT MxAnyTypeExport - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/MxAnyType" -) - -include(InstallBasicPackageFiles) -install_basic_package_files(MxAnyType - VERSION ${PROJECT_VERSION} - COMPATIBILITY AnyNewerVersion - EXPORT MxAnyTypeExport - NO_CHECK_REQUIRED_COMPONENTS_MACRO) diff --git a/deps/MxAnyType/include/AnyType.h b/deps/MxAnyType/include/AnyType.h deleted file mode 100644 index 24e06e45c..000000000 --- a/deps/MxAnyType/include/AnyType.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#ifndef ANYTYPE_H -#define ANYTYPE_H - -#include -#include -#include - -class AnyType; - -using AnyTypeSPtr = std::shared_ptr; -using AnyCell = std::vector; -using AnyStruct = std::unordered_map; - -class AnyType -{ -protected: -public: - AnyType() = default; - virtual ~AnyType() = default; - - // Integers - virtual bool asInt(int& i) = 0; - // virtual bool asInt8(int8_t& i) = 0; - // virtual bool asInt16(int16_t& i) = 0; - virtual bool asInt32(int32_t& i) = 0; - // virtual bool asInt64(int64_t& i) = 0; - - // Unsigned Integers - virtual bool asUInt(unsigned& i) = 0; - // virtual bool asUInt8(uint8_t& i) = 0; - // virtual bool asUInt16(uint16_t& i) = 0; - // virtual bool asUInt32(uint32_t& i) = 0; - // virtual bool asUInt64(uint64_t& i) = 0; - - // Boolean - virtual bool asBool(bool& b) = 0; - - // Floating-point - // virtual bool asFloat(float& f) = 0; - virtual bool asDouble(double& d) = 0; - - // Characters - virtual bool asString(std::string& s) = 0; - - // Struct - virtual bool asAnyStruct(AnyStruct& map) = 0; - - // Cell array - virtual bool asAnyCell(AnyCell& map) = 0; - - // Matrix - // TODO: constraint max 2-dimension - // virtual bool asMatrixFloat(Eigen::MatrixXf mat) = 0; - // virtual bool asMatrixDouble(Eigen::MatrixXd mat) = 0; - - // Vector - virtual bool asVectorDouble(std::vector& vec) = 0; -}; - -#endif // ANYTYPE_H diff --git a/deps/MxAnyType/include/MxAnyType.h b/deps/MxAnyType/include/MxAnyType.h deleted file mode 100644 index c7f5997b3..000000000 --- a/deps/MxAnyType/include/MxAnyType.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#ifndef MXANYTYPE_H -#define MXANYTYPE_H - -#include "AnyType.h" - -#include - -#include -#include -#include -#include - -class MxAnyType; - -// If needed in the future -// class MxAnyCell : public AnyCell {}; -// class MxAnyStruct : public AnyStruct {}; - -struct MxArrayMetadata -{ - mxClassID id; - bool isScalar; - size_t rows; - size_t cols; - size_t nElem; - size_t nDims; - std::vector dims; -}; - -class MxAnyType : public AnyType -{ -private: - const mxArray* mx; - MxArrayMetadata md; - bool validate; - - // TODO: https://it.mathworks.com/help/matlab/apiref/mxgetscalar.html returns a double always - bool asScalar(double& d); - bool validateClassId(mxClassID id1, mxClassID id2); - -public: - MxAnyType() = delete; - MxAnyType(const mxArray* m, bool validateId = false); - ~MxAnyType() override = default; - MxAnyType(const MxAnyType& mxAnyType); - - void enableClassIDValidation(); - - // STRING / CHARS - // ============== - - bool asString(std::string& s) override; - - // SCALAR TYPES - // ============ - - // Generic casting - // --------------- - - bool asInt(int& i) override; - bool asUInt(unsigned& i) override; - - // Specific casting - // ---------------- - - bool asInt32(int32_t& i) override; - - // TODO: complete with all the other scalar types - // bool asInt64(int64_t& i) override - // { - // double buffer; - // if (!asScalar(buffer)) return false; - // i = static_cast(buffer); - // return validateClassId(md.id, mxINT64_CLASS); - // } - - bool asDouble(double& d) override; - bool asBool(bool& b) override; - - // COMPOSITE DATA TYPES - // ==================== - - bool asAnyStruct(AnyStruct& s) override; - bool asAnyCell(AnyCell& cell) override; - - // MATRIX - // ====== - - // VECTOR - // ====== - - bool asVectorDouble(std::vector& vec) override; -}; - -#endif // MXANYTYPE_H diff --git a/deps/MxAnyType/src/MxAnyType.cpp b/deps/MxAnyType/src/MxAnyType.cpp deleted file mode 100644 index 88578807b..000000000 --- a/deps/MxAnyType/src/MxAnyType.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#include "MxAnyType.h" - -#include -#include - -// PRIVATE METHODS -// =============== - -bool MxAnyType::asScalar(double& d) -{ - if (!mx) { - return false; - } - - if (!mxIsScalar(mx)) { - return false; // 1x1 - } - - if (!mxIsNumeric(mx)) { - return false; // Types: https://it.mathworks.com/help/matlab/apiref/mxisnumeric.html - } - - // Cast to double since even a mxINT8_CLASS is returned as double: - // https://it.mathworks.com/help/matlab/apiref/mxgetscalar.html - d = static_cast(mxGetScalar(mx)); - return true; -} - -bool MxAnyType::validateClassId(mxClassID id1, mxClassID id2) -{ - if (validate) { - return id1 == id2; - } - else { - return true; - } -} - -// PUBLIC METHODS -// ============== - -// Constructors -// ============ - -MxAnyType::MxAnyType(const mxArray* m, bool validateId) - : mx(m) - , validate(validateId) -{ - assert(mx); - - // Get the ID - md.id = mxGetClassID(mx); - assert(md.id != mxVOID_CLASS); - assert(md.id != mxUNKNOWN_CLASS); - - // Get the other metadata - md.isScalar = mxIsScalar(mx); - md.rows = static_cast(mxGetN(mx)); - md.cols = static_cast(mxGetM(mx)); - md.nElem = static_cast(mxGetNumberOfElements(mx)); - md.nDims = static_cast(mxGetNumberOfDimensions(mx)); - - if (md.isScalar) { - assert(md.rows == md.cols == md.nElem == 1); - } - - // TODO: only 2 dims currently supported - assert(md.nDims <= 2); - assert(md.rows * md.cols == md.nElem); - - const size_t* size = mxGetDimensions(mx); - for (unsigned dim = 0; dim < md.nDims; ++dim) { - md.dims.push_back(static_cast(size[dim])); - } - assert(md.dims.size() == 2); -} - -MxAnyType::MxAnyType(const MxAnyType& mxAnyType) - : mx(mxAnyType.mx) - , md(mxAnyType.md) - , validate(mxAnyType.validate) -{} - -void MxAnyType::enableClassIDValidation() -{ - validate = true; -} - -// STRING / CHARS -// ============== - -bool MxAnyType::asString(std::string& s) -{ - if (!mx) { - return false; - } - if (md.id != mxCHAR_CLASS) { - return false; - } - char* buffer = mxArrayToString(mx); - s = std::string(buffer); - mxFree(buffer); - return true; -} - -// SCALAR TYPES -// ============ - -// Generic casting -// --------------- - -bool MxAnyType::asInt(int& i) -{ - double buffer; - if (!asScalar(buffer)) { - return false; - } - i = static_cast(buffer); - return true; -} - -bool MxAnyType::asUInt(unsigned& i) -{ - double buffer; - if (!asScalar(buffer)) { - return false; - } - i = static_cast(buffer); - return true; -} - -// Specific casting -// ---------------- - -bool MxAnyType::asInt32(int32_t& i) -{ - double buffer; - if (!asScalar(buffer)) { - return false; - } - i = static_cast(buffer); - return validateClassId(md.id, mxINT32_CLASS); -} - -// TODO: complete with all the other scalar types -// bool asInt64(int64_t& i) -// { -// double buffer; -// if (!asScalar(buffer)) return false; -// i = static_cast(buffer); -// return validateClassId(md.id, mxINT64_CLASS); -// } - -bool MxAnyType::asDouble(double& d) -{ - bool ok = asScalar(d); - return ok && validateClassId(md.id, mxDOUBLE_CLASS); -} - -bool MxAnyType::asBool(bool& b) -{ - if (!mx) { - return false; - } - if (!mxIsLogicalScalar(mx)) { - return false; - } - b = mxIsLogicalScalarTrue(mx); - return true; -} - -// COMPOSITE DATA TYPES -// ==================== - -bool MxAnyType::asAnyStruct(AnyStruct& s) -{ - if (!mx) { - return false; - } - if (md.id != mxSTRUCT_CLASS) { - return false; - } - - for (unsigned i = 0; i < mxGetNumberOfFields(mx); ++i) { - const char* fieldName = mxGetFieldNameByNumber(mx, i); - // TODO multidimensional struct - mxArray* fieldContent = mxGetFieldByNumber(mx, 0, i); - if (!fieldName) { - return false; - } - if (!fieldContent) { - return false; - } - s[std::string(fieldName)] = std::make_shared(fieldContent); - } - return true; -} - -bool MxAnyType::asAnyCell(AnyCell& cell) -{ - if (!mx) { - return false; - } - if (md.id != mxCELL_CLASS) { - return false; - } - - // TODO: AnyCell then will have a operator()(3,4) method; - for (unsigned i = 0; i < mxGetNumberOfElements(mx); ++i) { - mxArray* cellContent = mxGetCell(mx, i); - if (!cellContent) { - return false; - } - cell.push_back(std::make_shared(cellContent)); - } - return true; -} - -// MATRIX -// ====== - -// VECTOR -// ====== - -// TODO: -// Tests with other types (uint8) https://it.mathworks.com/help/matlab/apiref/mxgetdata.html -// (Description) -bool MxAnyType::asVectorDouble(std::vector& vec) -{ - if (!mx) { - return false; - } - if (!mxIsDouble(mx)) { - return false; - } - - if (md.rows > 1 && md.cols > 1) { - return false; - } - - // TODO add method for complex vectors (and move the check into md) - if (mxIsComplex(mx)) { - return false; - } - - double* buffer = mxGetPr(mx); - if (!buffer) { - return false; - } - - vec.reserve(md.rows * md.cols); - vec.assign(buffer, buffer + md.rows * md.cols); - return true; -} diff --git a/deps/sharedlibpp/.gitignore b/deps/sharedlibpp/.gitignore deleted file mode 100644 index 956ac116d..000000000 --- a/deps/sharedlibpp/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -build -*.*~ diff --git a/deps/sharedlibpp/AUTHORS b/deps/sharedlibpp/AUTHORS deleted file mode 100644 index f23bcb8fd..000000000 --- a/deps/sharedlibpp/AUTHORS +++ /dev/null @@ -1,10 +0,0 @@ -Author and contributor list ---------------------------- - -Ali Paikan -Daniele E. Domenichelli -Paul Fitzpatrick -Damiano Enerli -Francesco Romano -Nicolò Genesio -Silvio Traversaro diff --git a/deps/sharedlibpp/CMakeLists.txt b/deps/sharedlibpp/CMakeLists.txt deleted file mode 100644 index 114b78150..000000000 --- a/deps/sharedlibpp/CMakeLists.txt +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) -# All rights reserved. -# -# This software may be modified and distributed under the terms of the -# BSD-3-Clause license. See the accompanying LICENSE file for details. - -cmake_minimum_required(VERSION 3.5) - -project(shlibpp - VERSION 0.0.1 - LANGUAGES CXX) -set(PROJECT_DESCRIPTION "Tiny cross-platform plug-in system (dll, so, dylib)") - -# For now keep YCM as a soft dependency -find_package(YCM 0.8.1 QUIET) -if(NOT YCM_FOUND) - list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") -endif() - -# Set output directories for targets -include(GNUInstallDirs) -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}") -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}") -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}") - -# Set postfix for debug builds on MSVC -if(MSVC) - set(CMAKE_DEBUG_POSTFIX "d") -endif() - -# Encourage user to specify a build type (e.g. Release, Debug, etc.), otherwise set it to Release. -if(NOT CMAKE_CONFIGURATION_TYPES) - if(NOT CMAKE_BUILD_TYPE) - message(STATUS "Setting build type to 'Release' as none was specified.") - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY VALUE "Release") - endif() -endif() - -# Shared/Dynamic or Static library? -option(BUILD_SHARED_LIBS "Build libraries as shared as opposed to static" ON) - -# Enable RPATH Support -include(AddInstallRPATHSupport) -add_install_rpath_support(BIN_DIRS "${CMAKE_INSTALL_FULL_LIBDIR}" - LIB_DIRS "${CMAKE_INSTALL_FULL_BINDIR}" - INSTALL_NAME_DIR "${CMAKE_INSTALL_FULL_LIBDIR}" - USE_LINK_PATH) - -# Build in pure c++11 -set(CMAKE_CXX_EXTENSIONS OFF) -set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -# Build position independent code -set(CMAKE_POSITION_INDEPENDENT_CODE ON) - -# Hide all symbols by default -set(CMAKE_CXX_VISIBILITY_PRESET hidden) -set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) - -add_subdirectory(src) - -# Install CMake config files for the library -include(InstallBasicPackageFiles) -install_basic_package_files(shlibpp - VERSION ${shlibpp_VERSION} - COMPATIBILITY AnyNewerVersion - EXPORT shlibpp - NO_CHECK_REQUIRED_COMPONENTS_MACRO) - -# Add uninstall target -# include(AddUninstallTarget) - -# Do not put tests and examples in the same output directories as the main -# targets -unset(CMAKE_RUNTIME_OUTPUT_DIRECTORY) -unset(CMAKE_LIBRARY_OUTPUT_DIRECTORY) -unset(CMAKE_ARCHIVE_OUTPUT_DIRECTORY) - - -# Create examples -option(BUILD_SHAREDLIBPP_EXAMPLES "Build examples" OFF) -mark_as_advanced(BUILD_SHAREDLIBPP_EXAMPLES) -if(BUILD_SHAREDLIBPP_EXAMPLES) - add_subdirectory(examples) -endif() diff --git a/deps/sharedlibpp/LICENSE b/deps/sharedlibpp/LICENSE deleted file mode 100644 index 9f664c855..000000000 --- a/deps/sharedlibpp/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. Neither the name of the University nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. diff --git a/deps/sharedlibpp/README.md b/deps/sharedlibpp/README.md deleted file mode 100644 index a00f49212..000000000 --- a/deps/sharedlibpp/README.md +++ /dev/null @@ -1,45 +0,0 @@ -Simple cross platform plug-in system -==================================== - -The sharedlibpp is a tiny cross-platform library to create and load shared -libraries for different platform (Linux/Mac/Windows). The sharedlibpp provide -an easy and portable way to create plug-ins which encapsulate your c++ classes -inside a shared library (so, dylib, dll). -The original code is taken and from -[YARP (Yet Another Robot Platform)](http://www.yarp.it/). -The code is simplified by removing dependencies and some helper functions are -added to report the native OS error messages on failures. - - -Building on Linux/Mac ---------------------- - $ cd sharedlibpp - $ mkdir build; cd build - $ cmake ../; make - - -Building on Windows -------------------- -The easiest way is to use Cmake to create VStudio project. To do that: - -* download and install [cmake](http://www.cmake.org/download/) for windows. -* open the cmake gui and set the source path to `sharedlibpp` and set the - build path (for example `sharedlibpp/build`). -* configure and generate visual studio project. -* open the project and built it. - -Running example ---------------- -The build system by defualt compiles and build the examples. - -* On Linux/Mac -``` - $ cd sharedlibpp/build/examples - $ ./math_test mymath.so - $ ./math_test_custom mymathcustom.so -``` -* On Windows first switch to directory where example is created and then -``` - > math_test mymath.dll - > math_test_custom mymathcustom.dll -``` diff --git a/deps/sharedlibpp/cmake/AddInstallRPATHSupport.cmake b/deps/sharedlibpp/cmake/AddInstallRPATHSupport.cmake deleted file mode 100644 index c36cc2072..000000000 --- a/deps/sharedlibpp/cmake/AddInstallRPATHSupport.cmake +++ /dev/null @@ -1,169 +0,0 @@ -#.rst: -# AddInstallRPATHSupport -# ---------------------- -# -# Add support to RPATH during installation to your project:: -# -# add_install_rpath_support([BIN_DIRS dir [dir]] -# [LIB_DIRS dir [dir]] -# [INSTALL_NAME_DIR [dir]] -# [DEPENDS condition [condition]] -# [USE_LINK_PATH]) -# -# Normally (depending on the platform) when you install a shared -# library you can either specify its absolute path as the install name, -# or leave just the library name itself. In the former case the library -# will be correctly linked during run time by all executables and other -# shared libraries, but it must not change its install location. This -# is often the case for libraries installed in the system default -# library directory (e.g. ``/usr/lib``). -# In the latter case, instead, the library can be moved anywhere in the -# file system but at run time the dynamic linker must be able to find -# it. This is often accomplished by setting environmental variables -# (i.e. ``LD_LIBRARY_PATH`` on Linux). -# This procedure is usually not desirable for two main reasons: -# -# - by setting the variable you are changing the default behaviour -# of the dynamic linker thus potentially breaking executables (not as -# destructive as ``LD_PRELOAD``) -# - the variable will be used only by applications spawned by the shell -# and not by other processes. -# -# RPATH aims in solving the issues introduced by the second -# installation method. Using run-path dependent libraries you can -# create a directory structure containing executables and dependent -# libraries that users can relocate without breaking it. -# A run-path dependent library is a dependent library whose complete -# install name is not known when the library is created. -# Instead, the library specifies that the dynamic loader must resolve -# the library’s install name when it loads the executable that depends -# on the library. The executable or the other shared library will -# hardcode in the binary itself the additional search directories -# to be passed to the dynamic linker. This works great in conjunction -# with relative paths. -# This command will enable support to RPATH to your project. -# It will enable the following things: -# -# - If the project builds shared libraries it will generate a run-path -# enabled shared library, i.e. its install name will be resolved -# only at run time. -# - In all cases (building executables and/or shared libraries) -# dependent shared libraries with RPATH support will have their name -# resolved only at run time, by embedding the search path directly -# into the built binary. -# -# The command has the following parameters: -# -# Options: -# - ``USE_LINK_PATH``: if passed the command will automatically adds to -# the RPATH the path to all the dependent libraries. -# -# Arguments: -# - ``BIN_DIRS`` list of directories when the targets (executable and -# plugins) will be installed. -# - ``LIB_DIRS`` list of directories to be added to the RPATH. These -# directories will be added "relative" w.r.t. the ``BIN_DIRS`` and -# ``LIB_DIRS``. -# - ``INSTALL_NAME_DIR`` directory where the libraries will be installed. -# This variable will be used only if ``CMAKE_SKIP_RPATH`` or -# ``CMAKE_SKIP_INSTALL_RPATH`` is set to ``TRUE`` as it will set the -# ``INSTALL_NAME_DIR`` on all targets -# - ``DEPENDS`` list of conditions that should be ``TRUE`` to enable -# RPATH, for example ``FOO; NOT BAR``. -# -# Note: see https://gitlab.kitware.com/cmake/cmake/issues/16589 for further -# details. - -#======================================================================= -# Copyright 2014 Istituto Italiano di Tecnologia (IIT) -# @author Francesco Romano -# -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#======================================================================= -# (To distribute this file outside of CMake, substitute the full -# License text for the above reference.) - - -include(CMakeParseArguments) - - -function(ADD_INSTALL_RPATH_SUPPORT) - - set(_options USE_LINK_PATH) - set(_oneValueArgs INSTALL_NAME_DIR) - set(_multiValueArgs BIN_DIRS - LIB_DIRS - DEPENDS) - - cmake_parse_arguments(_ARS "${_options}" - "${_oneValueArgs}" - "${_multiValueArgs}" - "${ARGN}") - - # if either RPATH or INSTALL_RPATH is disabled - # and the INSTALL_NAME_DIR variable is set, then hardcode the install name - if(CMAKE_SKIP_RPATH OR CMAKE_SKIP_INSTALL_RPATH) - if(DEFINED _ARS_INSTALL_NAME_DIR) - set(CMAKE_INSTALL_NAME_DIR ${_ARS_INSTALL_NAME_DIR} PARENT_SCOPE) - endif() - endif() - - if (CMAKE_SKIP_RPATH OR (CMAKE_SKIP_INSTALL_RPATH AND CMAKE_SKIP_BUILD_RPATH)) - return() - endif() - - - set(_rpath_available 1) - if(DEFINED _ARS_DEPENDS) - foreach(_dep ${_ARS_DEPENDS}) - string(REGEX REPLACE " +" ";" _dep "${_dep}") - if(NOT (${_dep})) - set(_rpath_available 0) - endif() - endforeach() - endif() - - if(_rpath_available) - - # Enable RPATH on OSX. - set(CMAKE_MACOSX_RPATH TRUE PARENT_SCOPE) - - # Find system implicit lib directories - set(_system_lib_dirs ${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}) - if(EXISTS "/etc/debian_version") # is this a debian system ? - if(CMAKE_LIBRARY_ARCHITECTURE) - list(APPEND _system_lib_dirs "/lib/${CMAKE_LIBRARY_ARCHITECTURE}" - "/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}") - endif() - endif() - # This is relative RPATH for libraries built in the same project - foreach(lib_dir ${_ARS_LIB_DIRS}) - list(FIND _system_lib_dirs "${lib_dir}" isSystemDir) - if("${isSystemDir}" STREQUAL "-1") - foreach(bin_dir ${_ARS_LIB_DIRS} ${_ARS_BIN_DIRS}) - file(RELATIVE_PATH _rel_path ${bin_dir} ${lib_dir}) - if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - list(APPEND CMAKE_INSTALL_RPATH "@loader_path/${_rel_path}") - else() - list(APPEND CMAKE_INSTALL_RPATH "\$ORIGIN/${_rel_path}") - endif() - endforeach() - endif() - endforeach() - if(NOT "${CMAKE_INSTALL_RPATH}" STREQUAL "") - list(REMOVE_DUPLICATES CMAKE_INSTALL_RPATH) - endif() - set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_RPATH} PARENT_SCOPE) - - # add the automatically determined parts of the RPATH - # which point to directories outside the build tree to the install RPATH - set(CMAKE_INSTALL_RPATH_USE_LINK_PATH ${_ARS_USE_LINK_PATH} PARENT_SCOPE) - - endif() - -endfunction() diff --git a/deps/sharedlibpp/cmake/AddUninstallTarget.cmake b/deps/sharedlibpp/cmake/AddUninstallTarget.cmake deleted file mode 100644 index fefef2d1e..000000000 --- a/deps/sharedlibpp/cmake/AddUninstallTarget.cmake +++ /dev/null @@ -1,70 +0,0 @@ -#.rst: -# AddUninstallTarget -# ------------------ -# -# Add the "uninstall" target for your project:: -# -# include(AddUninstallTarget) -# -# -# will create a file cmake_uninstall.cmake in the build directory and add a -# custom target uninstall that will remove the files installed by your package -# (using install_manifest.txt) - -#============================================================================= -# Copyright 2008-2013 Kitware, Inc. -# Copyright 2013 Istituto Italiano di Tecnologia (IIT) -# Authors: Daniele E. Domenichelli -# -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= -# (To distribute this file outside of CMake, substitute the full -# License text for the above reference.) - - -if(DEFINED __ADD_UNINSTALL_TARGET_INCLUDED) - return() -endif() -set(__ADD_UNINSTALL_TARGET_INCLUDED TRUE) - - -set(_filename ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) - -file(WRITE ${_filename} -"if(NOT EXISTS \"${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt\") - message(WARNING \"Cannot find install manifest: \\\"${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt\\\"\") - return() -endif() - -file(READ \"${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt\" files) -string(STRIP \"\${files}\" files) -string(REGEX REPLACE \"\\n\" \";\" files \"\${files}\") -list(REVERSE files) -foreach(file \${files}) - message(STATUS \"Uninstalling: \$ENV{DESTDIR}\${file}\") - if(EXISTS \"\$ENV{DESTDIR}\${file}\") - execute_process( - COMMAND \${CMAKE_COMMAND} -E remove \"\$ENV{DESTDIR}\${file}\" - OUTPUT_VARIABLE rm_out - RESULT_VARIABLE rm_retval) - if(NOT \"\${rm_retval}\" EQUAL 0) - message(FATAL_ERROR \"Problem when removing \\\"\$ENV{DESTDIR}\${file}\\\"\") - endif() - else() - message(STATUS \"File \\\"\$ENV{DESTDIR}\${file}\\\" does not exist.\") - endif() -endforeach(file) -") - -if("${CMAKE_GENERATOR}" MATCHES "^(Visual Studio|Xcode)") - set(_uninstall "UNINSTALL") -else() - set(_uninstall "uninstall") -endif() -add_custom_target(${_uninstall} COMMAND "${CMAKE_COMMAND}" -P "${_filename}") -set_property(TARGET ${_uninstall} PROPERTY FOLDER "CMakePredefinedTargets") diff --git a/deps/sharedlibpp/cmake/InstallBasicPackageFiles.cmake b/deps/sharedlibpp/cmake/InstallBasicPackageFiles.cmake deleted file mode 100644 index aa216a728..000000000 --- a/deps/sharedlibpp/cmake/InstallBasicPackageFiles.cmake +++ /dev/null @@ -1,677 +0,0 @@ -#.rst: -# InstallBasicPackageFiles -# ------------------------ -# -# A helper module to make your package easier to be found by other -# projects. -# -# -# .. command:: install_basic_package_files -# -# Create and install a basic version of cmake config files for your -# project:: -# -# install_basic_package_files( -# VERSION -# COMPATIBILITY -# [EXPORT ] # (default = "") -# [FIRST_TARGET ] # (default = "") -# [TARGETS ...] -# [TARGETS_PROPERTY ] -# [TARGETS_PROPERTIES ...] -# [NO_SET_AND_CHECK_MACRO] -# [NO_CHECK_REQUIRED_COMPONENTS_MACRO] -# [VARS_PREFIX ] # (default = "") -# [EXPORT_DESTINATION ] -# [INSTALL_DESTINATION ] -# [NAMESPACE ] # (default = "::") -# [EXTRA_PATH_VARS_SUFFIX path1 [path2 ...]] -# [CONFIG_TEMPLATE ] -# [UPPERCASE_FILENAMES | LOWERCASE_FILENAMES] -# [DEPENDENCIES " [...]" ...] -# [PRIVATE_DEPENDENCIES " [...]" ...] -# [INCLUDE_FILE ] -# [COMPONENT ] # (default = "") -# [NO_COMPATIBILITY_VARS] -# ) -# -# Depending on UPPERCASE_FILENAMES and LOWERCASE_FILENAMES, this -# function generates 3 files: -# -# - ``ConfigVersion.cmake`` or ``-config-version.cmake`` -# - ``Config.cmake`` or ``-config.cmake`` -# - ``Targets.cmake`` or ``-targets.cmake`` -# -# If neither ``UPPERCASE_FILENAMES`` nor ``LOWERCASE_FILENAMES`` is -# set, a file ``ConfigVersion.cmake.in`` or -# ``-config-version.cmake.in`` is searched, and the convention -# is chosed according to the file found. If no file was found, the -# uppercase convention is used. -# -# The ``DEPENDENCIES`` argument can be used to set a list of dependencies -# that will be searched using the :command:`find_dependency` command -# from the :module:`CMakeFindDependencyMacro` module. -# Dependencies can be followed by any of the possible :command:`find_dependency` -# argument. -# In this case, all the arguments must be specified within double quotes (e.g. -# " 1.0.0 EXACT", " CONFIG"). -# The ``PRIVATE_DEPENDENCIES`` argument is similar to ``DEPENDENCIES``, but -# these dependencies are included only when libraries are built ``STATIC``, i.e. -# if ``BUILD_SHARED_LIBS`` is ``OFF`` or if the ``TYPE`` property for one or -# more of the targets is ``STATIC_LIBRARY``. -# When using a custom template file, the ``@PACKAGE_DEPENDENCIES@`` -# string is replaced with the code checking for the dependencies -# specified by these two argument. -# -# Each file is generated twice, one for the build directory and one for -# the installation directory. The ``INSTALL_DESTINATION`` argument can be -# passed to install the files in a location different from the default -# one (``CMake`` on Windows, ``${CMAKE_INSTALL_LIBDIR}/cmake/${Name}`` -# on other platforms. The ``EXPORT_DESTINATION`` argument can be passed to -# generate the files in the build tree in a location different from the default -# one (``CMAKE_BINARY_DIR``). If this is a relative path, it is considered -# relative to the ``CMAKE_BINARY_DIR`` directory. -# -# The ``ConfigVersion.cmake`` is generated using -# ``write_basic_package_version_file``. The ``VERSION``, -# ``COMPATIBILITY``, ``NO_SET_AND_CHECK_MACRO``, and -# ``NO_CHECK_REQUIRED_COMPONENTS_MACRO`` are passed to this function -# and are used internally by :module:`CMakePackageConfigHelpers` module. -# -# ``VERSION`` shall be in the form ``[.[.[.]]]]``. -# If no ``VERSION`` is given, the ``PROJECT_VERSION`` variable is used. -# If this hasn’t been set, it errors out. The ``VERSION`` argument is also used -# to replace the ``@PACKAGE_VERSION@`` string in the configuration file. -# -# ``COMPATIBILITY`` shall be any of ````. -# The ``COMPATIBILITY`` mode ``AnyNewerVersion`` means that the installed -# package version will be considered compatible if it is newer or exactly the -# same as the requested version. This mode should be used for packages which are -# fully backward compatible, also across major versions. -# If ``SameMajorVersion`` is used instead, then the behaviour differs from -# ``AnyNewerVersion`` in that the major version number must be the same as -# requested, e.g. version 2.0 will not be considered compatible if 1.0 is -# requested. This mode should be used for packages which guarantee backward -# compatibility within the same major version. If ``ExactVersion`` is used, then -# the package is only considered compatible if the requested version matches -# exactly its own version number (not considering the tweak version). For -# example, version 1.2.3 of a package is only considered compatible to requested -# version 1.2.3. This mode is for packages without compatibility guarantees. If -# your project has more elaborated version matching rules, you will need to -# write your own custom ConfigVersion.cmake file instead of using this macro. -# -# By default ``install_basic_package_files`` also generates the two helper -# macros ``set_and_check()`` and ``check_required_components()`` into the -# ``Config.cmake`` file. ``set_and_check()`` should be used instead of the -# normal set() command for setting directories and file locations. Additionally -# to setting the variable it also checks that the referenced file or directory -# actually exists and fails with a ``FATAL_ERROR`` otherwise. This makes sure -# that the created ``Config.cmake`` file does not contain wrong -# references. When using the ``NO_SET_AND_CHECK_MACRO, this macro is not -# generated into the ``Config.cmake`` file. -# -# By default, ``install_basic_package_files`` append a call to -# ``check_required_components()`` in Config.cmake file if the -# package supports components. This macro checks whether all requested, -# non-optional components have been found, and if this is not the case, sets the -# ``_FOUND`` variable to ``FALSE``, so that the package is considered to -# be not found. It does that by testing the ``__FOUND`` -# variables for all requested required components. When using the -# ``NO_CHECK_REQUIRED_COMPONENTS_MACRO`` option, this macro is not generated -# into the Config.cmake file. -# -# Finally, the files in the build and install directory are exactly the same. -# -# See the documentation of :module:`CMakePackageConfigHelpers` module for -# further information and references therein. -# -# -# The ``Config.cmake`` is generated using -# ``configure_package_config_file``. See the documentation for the -# :module:`CMakePackageConfigHelpers` module for further information. -# If the ``CONFIG_TEMPLATE`` argument is passed, the specified file -# is used as template for generating the configuration file, otherwise -# this module expects to find a ``Config.cmake.in`` or -# ``-config.cmake.in`` file either in the root directory of the -# project or in current source directory. -# If the file does not exist, a very basic file is created. -# -# A set of variables are checked and passed to -# ``configure_package_config_file`` as ``PATH_VARS``. For each of the -# ``SUFFIX`` considered, if one of the variables:: -# -# _(BUILD|INSTALL)_ -# (BUILD|INSTALL)__ -# -# is defined, the ``_`` variable will be defined -# before configuring the package. In order to use that variable in the -# config file, you have to add a line:: -# -# set_and_check(_ \"@PACKAGE__@\") -# -# if the path must exist or just:: -# -# set(_ \"@PACKAGE__@\") -# -# if the path could be missing. -# -# These variable will have different values whether you are using the -# package from the build tree or from the install directory. Also these -# files will contain only relative paths, meaning that you can move the -# whole installation and the CMake files will still work. -# -# Default ``PATH_VARS`` suffixes are:: -# -# BINDIR BIN_DIR -# SBINDIR SBIN_DIR -# LIBEXECDIR LIBEXEC_DIR -# SYSCONFDIR SYSCONF_DIR -# SHAREDSTATEDIR SHAREDSTATE_DIR -# LOCALSTATEDIR LOCALSTATE_DIR -# LIBDIR LIB_DIR -# INCLUDEDIR INCLUDE_DIR -# OLDINCLUDEDIR OLDINCLUDE_DIR -# DATAROOTDIR DATAROOT_DIR -# DATADIR DATA_DIR -# INFODIR INFO_DIR -# LOCALEDIR LOCALE_DIR -# MANDIR MAN_DIR -# DOCDIR DOC_DIR -# -# more suffixes can be added using the ``EXTRA_PATH_VARS_SUFFIX`` -# argument. -# -# -# The ``Targets.cmake`` is generated using -# :command:`export(TARGETS)` (if ``EXPORT`` or no options are used) or -# :command:`export(TARGETS)` (if `EXPORT` is not used and one between -# ``TARGETS``, ``TARGETS_PROPERTY``, or ``TARGETS_PROPERTIES`` is used) in the -# build tree and :command:`install(EXPORT)` in the installation directory. -# The targets are exported using the value for the ``NAMESPACE`` -# argument as namespace. -# The export can be passed using the `EXPORT` argument. -# The targets can be passed using the `TARGETS` argument or using one or more -# global properties, that can be passed to the function using the -# ``TARGETS_PROPERTY`` or ``TARGET_PROPERTIES`` arguments. -# -# If the ``NO_COMPATIBILITY_VARS`` argument is not set, the compatibility -# variables ``_LIBRARIES`` and ``_INCLUDE_DIRS`` -# are set, trying to guess their correct values from the variables set or -# from the arguments passed to this command. This argument is ignored if -# the template file is not generated by this command. -# -# If the ``INCLUDE_FILE`` argument is passed, the content of the specified file -# (which might be templated) is appended to the ``Config.cmake``. -# This allows to inject custom code to this file, useful e.g. to set additional -# variables which are loaded by downstream projects. -# -# If the ``COMPONENT`` argument is passed, it is forwarded to the -# :command:`install` commands, otherwise is used. - -#============================================================================= -# Copyright 2013 Istituto Italiano di Tecnologia (IIT) -# Authors: Daniele E. Domenichelli -# -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= -# (To distribute this file outside of CMake, substitute the full -# License text for the above reference.) - - -if(COMMAND install_basic_package_files) - return() -endif() - - -include(GNUInstallDirs) -include(CMakePackageConfigHelpers) -include(CMakeParseArguments) - - -function(INSTALL_BASIC_PACKAGE_FILES _Name) - - # TODO check that _Name does not contain "-" characters - - set(_options NO_SET_AND_CHECK_MACRO - NO_CHECK_REQUIRED_COMPONENTS_MACRO - UPPERCASE_FILENAMES - LOWERCASE_FILENAMES - NO_COMPATIBILITY_VARS) - set(_oneValueArgs VERSION - COMPATIBILITY - EXPORT - FIRST_TARGET - TARGETS_PROPERTY - VARS_PREFIX - EXPORT_DESTINATION - INSTALL_DESTINATION - DESTINATION - NAMESPACE - CONFIG_TEMPLATE - INCLUDE_FILE - COMPONENT) - set(_multiValueArgs EXTRA_PATH_VARS_SUFFIX - TARGETS - TARGETS_PROPERTIES - DEPENDENCIES - PRIVATE_DEPENDENCIES) - cmake_parse_arguments(_IBPF "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" "${ARGN}") - - if(NOT DEFINED _IBPF_VARS_PREFIX) - set(_IBPF_VARS_PREFIX ${_Name}) - endif() - - if(NOT DEFINED _IBPF_VERSION) - message(FATAL_ERROR "VERSION argument is required") - endif() - - if(NOT DEFINED _IBPF_COMPATIBILITY) - message(FATAL_ERROR "COMPATIBILITY argument is required") - endif() - - if(_IBPF_UPPERCASE_FILENAMES AND _IBPF_LOWERCASE_FILENAMES) - message(FATAL_ERROR "UPPERCASE_FILENAMES and LOWERCASE_FILENAMES arguments cannot be used together") - endif() - - # Prepare install and export commands - set(_first_target ${_Name}) - set(_targets ${_Name}) - set(_install_cmd EXPORT ${_Name}) - set(_export_cmd EXPORT ${_Name}) - - if(DEFINED _IBPF_FIRST_TARGET) - if(DEFINED _IBPF_TARGETS OR DEFINED _IBPF_TARGETS_PROPERTIES OR DEFINED _IBPF_TARGETS_PROPERTIES) - message(FATAL_ERROR "EXPORT cannot be used with TARGETS, TARGETS_PROPERTY or TARGETS_PROPERTIES") - endif() - - set(_first_target ${_IBPF_FIRST_TARGET}) - set(_targets ${_IBPF_FIRST_TARGET}) - endif() - - if(DEFINED _IBPF_EXPORT) - if(DEFINED _IBPF_TARGETS OR DEFINED _IBPF_TARGETS_PROPERTIES OR DEFINED _IBPF_TARGETS_PROPERTIES) - message(FATAL_ERROR "EXPORT cannot be used with TARGETS, TARGETS_PROPERTY or TARGETS_PROPERTIES") - endif() - - set(_export_cmd EXPORT ${_IBPF_EXPORT}) - set(_install_cmd EXPORT ${_IBPF_EXPORT}) - - elseif(DEFINED _IBPF_TARGETS) - if(DEFINED _IBPF_TARGETS_PROPERTY OR DEFINED _IBPF_TARGETS_PROPERTIES) - message(FATAL_ERROR "TARGETS cannot be used with TARGETS_PROPERTY or TARGETS_PROPERTIES") - endif() - - set(_targets ${_IBPF_TARGETS}) - set(_export_cmd TARGETS ${_IBPF_TARGETS}) - list(GET _targets 0 _first_target) - - elseif(DEFINED _IBPF_TARGETS_PROPERTY) - if(DEFINED _IBPF_TARGETS_PROPERTIES) - message(FATAL_ERROR "TARGETS_PROPERTIES cannot be used with TARGETS_PROPERTIES") - endif() - - get_property(_targets GLOBAL PROPERTY ${_IBPF_TARGETS_PROPERTY}) - set(_export_cmd TARGETS ${_targets}) - list(GET _targets 0 _first_target) - - elseif(DEFINED _IBPF_TARGETS_PROPERTIES) - - unset(_targets) - foreach(_prop ${_IBPF_TARGETS_PROPERTIES}) - get_property(_prop_val GLOBAL PROPERTY ${_prop}) - list(APPEND _targets ${_prop_val}) - endforeach() - set(_export_cmd TARGETS ${_targets}) - list(GET _targets 0 _first_target) - - endif() - - # Path for installed cmake files - if(DEFINED _IBPF_DESTINATION) - message(DEPRECATION "DESTINATION is deprecated. Use INSTALL_DESTINATION instead") - if(NOT DEFINED _IBPF_INSTALL_DESTINATION) - set(_IBPF_INSTALL_DESTINATION ${_IBPF_DESTINATION}) - endif() - endif() - - if(NOT DEFINED _IBPF_INSTALL_DESTINATION) - if(WIN32 AND NOT CYGWIN) - set(_IBPF_INSTALL_DESTINATION CMake) - else() - set(_IBPF_INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${_Name}) - endif() - endif() - - if(NOT DEFINED _IBPF_EXPORT_DESTINATION) - set(_IBPF_EXPORT_DESTINATION "${CMAKE_BINARY_DIR}") - elseif(NOT IS_ABSOLUTE _IBPF_EXPORT_DESTINATION) - set(_IBPF_EXPORT_DESTINATION "${CMAKE_BINARY_DIR}/${_IBPF_EXPORT_DESTINATION}") - endif() - - if(NOT DEFINED _IBPF_NAMESPACE) - set(_IBPF_NAMESPACE "${_Name}::") - endif() - - if(NOT DEFINED _IBPF_COMPONENT) - set(_IBPF_COMPONENT "${_Name}") - endif() - - if(_IBPF_NO_SET_AND_CHECK_MACRO) - list(APPEND configure_package_config_file_extra_args NO_SET_AND_CHECK_MACRO) - endif() - - if(_IBPF_NO_CHECK_REQUIRED_COMPONENTS_MACRO) - list(APPEND configure_package_config_file_extra_args NO_CHECK_REQUIRED_COMPONENTS_MACRO) - endif() - - - - # Set input file for config, and ensure that _IBPF_UPPERCASE_FILENAMES - # and _IBPF_LOWERCASE_FILENAMES are set correctly - unset(_config_cmake_in) - set(_generate_file 0) - if(DEFINED _IBPF_CONFIG_TEMPLATE) - if(NOT EXISTS "${_IBPF_CONFIG_TEMPLATE}") - message(FATAL_ERROR "Config template file \"${_IBPF_CONFIG_TEMPLATE}\" not found") - endif() - set(_config_cmake_in "${_IBPF_CONFIG_TEMPLATE}") - if(NOT _IBPF_UPPERCASE_FILENAMES AND NOT _IBPF_LOWERCASE_FILENAMES) - if("${_IBPF_CONFIG_TEMPLATE}" MATCHES "${_Name}Config.cmake.in") - set(_IBPF_UPPERCASE_FILENAMES 1) - elseif("${_IBPF_CONFIG_TEMPLATE}" MATCHES "${_name}-config.cmake.in") - set(_IBPF_LOWERCASE_FILENAMES 1) - else() - set(_IBPF_UPPERCASE_FILENAMES 1) - endif() - endif() - else() - string(TOLOWER "${_Name}" _name) - if(EXISTS "${CMAKE_SOURCE_DIR}/${_Name}Config.cmake.in") - set(_config_cmake_in "${CMAKE_SOURCE_DIR}/${_Name}Config.cmake.in") - if(NOT _IBPF_UPPERCASE_FILENAMES AND NOT _IBPF_LOWERCASE_FILENAMES) - set(_IBPF_UPPERCASE_FILENAMES 1) - endif() - elseif(EXISTS "${CMAKE_SOURCE_DIR}/${_name}-config.cmake.in") - set(_config_cmake_in "${CMAKE_SOURCE_DIR}/${_name}-config.cmake.in") - if(NOT _IBPF_UPPERCASE_FILENAMES AND NOT _IBPF_LOWERCASE_FILENAMES) - set(_IBPF_LOWERCASE_FILENAMES 1) - endif() - elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${_Name}Config.cmake.in") - set(_config_cmake_in "${CMAKE_CURRENT_SOURCE_DIR}/${_Name}Config.cmake.in") - if(NOT _IBPF_UPPERCASE_FILENAMES AND NOT _IBPF_LOWERCASE_FILENAMES) - set(_IBPF_UPPERCASE_FILENAMES 1) - endif() - elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${_name}-config.cmake.in") - set(_config_cmake_in "${CMAKE_CURRENT_SOURCE_DIR}/${_name}-config.cmake.in") - if(NOT _IBPF_UPPERCASE_FILENAMES AND NOT _IBPF_LOWERCASE_FILENAMES) - set(_IBPF_LOWERCASE_FILENAMES 1) - endif() - else() - set(_generate_file 1) - if(_IBPF_LOWERCASE_FILENAMES) - set(_config_cmake_in "${CMAKE_CURRENT_BINARY_DIR}/${_name}-config.cmake") - else() - set(_config_cmake_in "${CMAKE_CURRENT_BINARY_DIR}/${_Name}Config.cmake.in") - set(_IBPF_UPPERCASE_FILENAMES 1) - endif() - endif() - endif() - - # Set input file containing user variables - if(DEFINED _IBPF_INCLUDE_FILE) - if(NOT IS_ABSOLUTE "${_IBPF_INCLUDE_FILE}") - if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${_IBPF_INCLUDE_FILE}") - set(_IBPF_INCLUDE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${_IBPF_INCLUDE_FILE}") - endif() - endif() - if(NOT EXISTS "${_IBPF_INCLUDE_FILE}") - message(FATAL_ERROR "File \"${_IBPF_INCLUDE_FILE}\" not found") - endif() - file(READ ${_IBPF_INCLUDE_FILE} _includedfile_user_content_in) - string(CONFIGURE ${_includedfile_user_content_in} _includedfile_user_content) - set(INCLUDED_FILE_CONTENT -"#### Expanded from INCLUDE_FILE by install_basic_package_files() ####") - set(INCLUDED_FILE_CONTENT "${INCLUDED_FILE_CONTENT}\n\n${_includedfile_user_content}") - set(INCLUDED_FILE_CONTENT -"${INCLUDED_FILE_CONTENT} -#####################################################################") - endif() - - # Select output file names - if(_IBPF_UPPERCASE_FILENAMES) - set(_config_filename ${_Name}Config.cmake) - set(_version_filename ${_Name}ConfigVersion.cmake) - set(_targets_filename ${_Name}Targets.cmake) - elseif(_IBPF_LOWERCASE_FILENAMES) - set(_config_filename ${_name}-config.cmake) - set(_version_filename ${_name}-config-version.cmake) - set(_targets_filename ${_name}-targets.cmake) - endif() - - - # If the template config file does not exist, write a basic one - if(_generate_file) - # Generate the compatibility code - unset(_compatibility_vars) - if(NOT _IBPF_NO_COMPATIBILITY_VARS) - unset(_get_include_dir_code) - unset(_set_include_dir_code) - unset(_target_list) - foreach(_target ${_targets}) - list(APPEND _target_list ${_IBPF_NAMESPACE}${_target}) - endforeach() - if(DEFINED ${_IBPF_VARS_PREFIX}_BUILD_INCLUDEDIR OR - DEFINED BUILD_${_IBPF_VARS_PREFIX}_INCLUDEDIR OR - DEFINED ${_IBPF_VARS_PREFIX}_INSTALL_INCLUDEDIR OR - DEFINED INSTALL_${_IBPF_VARS_PREFIX}_INCLUDEDIR) - set(_get_include_dir "set(${_IBPF_VARS_PREFIX}_INCLUDEDIR \"\@PACKAGE_${_IBPF_VARS_PREFIX}_INCLUDEDIR\@\")\n") - set(_set_include_dir "set(${_Name}_INCLUDE_DIRS \"\${${_IBPF_VARS_PREFIX}_INCLUDEDIR}\")") - elseif(DEFINED ${_IBPF_VARS_PREFIX}_BUILD_INCLUDE_DIR OR - DEFINED BUILD_${_IBPF_VARS_PREFIX}_INCLUDE_DIR OR - DEFINED ${_IBPF_VARS_PREFIX}_INSTALL_INCLUDE_DIR OR - DEFINED INSTALL_${_IBPF_VARS_PREFIX}_INCLUDE_DIR) - set(_get_include_dir "set(${_IBPF_VARS_PREFIX}_INCLUDE_DIR \"\@PACKAGE_${_IBPF_VARS_PREFIX}_INCLUDE_DIR\@\")\n") - set(_set_include_dir "set(${_Name}_INCLUDE_DIRS \"\${${_IBPF_VARS_PREFIX}_INCLUDE_DIR}\")") - else() - unset(_include_dir_list) - foreach(_target ${_targets}) - set(_get_include_dir "${_get_include_dir}get_property(${_IBPF_VARS_PREFIX}_${_target}_INCLUDE_DIR TARGET ${_IBPF_NAMESPACE}${_target} PROPERTY INTERFACE_INCLUDE_DIRECTORIES)\n") - list(APPEND _include_dir_list "\"\${${_IBPF_VARS_PREFIX}_${_target}_INCLUDE_DIR}\"") - endforeach() - string(REPLACE ";" " " _include_dir_list "${_include_dir_list}") - string(REPLACE ";" " " _target_list "${_target_list}") - set(_set_include_dir "set(${_Name}_INCLUDE_DIRS ${_include_dir_list})\nlist(REMOVE_DUPLICATES ${_Name}_INCLUDE_DIRS)") - endif() - set(_compatibility_vars "# Compatibility\n${_get_include_dir}\nset(${_Name}_LIBRARIES ${_target_list})\n${_set_include_dir}") - endif() - - # Write the file - file(WRITE "${_config_cmake_in}" -"set(${_IBPF_VARS_PREFIX}_VERSION \@PACKAGE_VERSION\@) - -\@PACKAGE_INIT\@ - -\@PACKAGE_DEPENDENCIES\@ - -if(NOT TARGET ${_IBPF_NAMESPACE}${_first_target}) - include(\"\${CMAKE_CURRENT_LIST_DIR}/${_targets_filename}\") -endif() - -${_compatibility_vars} - -\@INCLUDED_FILE_CONTENT\@ -") - endif() - - # Make relative paths absolute (needed later on) and append the - # defined variables to _(build|install)_path_vars_suffix - foreach(p BINDIR BIN_DIR - SBINDIR SBIN_DIR - LIBEXECDIR LIBEXEC_DIR - SYSCONFDIR SYSCONF_DIR - SHAREDSTATEDIR SHAREDSTATE_DIR - LOCALSTATEDIR LOCALSTATE_DIR - LIBDIR LIB_DIR - INCLUDEDIR INCLUDE_DIR - OLDINCLUDEDIR OLDINCLUDE_DIR - DATAROOTDIR DATAROOT_DIR - DATADIR DATA_DIR - INFODIR INFO_DIR - LOCALEDIR LOCALE_DIR - MANDIR MAN_DIR - DOCDIR DOC_DIR - ${_IBPF_EXTRA_PATH_VARS_SUFFIX}) - if(DEFINED ${_IBPF_VARS_PREFIX}_BUILD_${p}) - list(APPEND _build_path_vars_suffix ${p}) - list(APPEND _build_path_vars "${_IBPF_VARS_PREFIX}_${p}") - endif() - if(DEFINED BUILD_${_IBPF_VARS_PREFIX}_${p}) - list(APPEND _build_path_vars_suffix ${p}) - list(APPEND _build_path_vars "${_IBPF_VARS_PREFIX}_${p}") - endif() - if(DEFINED ${_IBPF_VARS_PREFIX}_INSTALL_${p}) - list(APPEND _install_path_vars_suffix ${p}) - list(APPEND _install_path_vars "${_IBPF_VARS_PREFIX}_${p}") - endif() - if(DEFINED INSTALL_${_IBPF_VARS_PREFIX}_${p}) - list(APPEND _install_path_vars_suffix ${p}) - list(APPEND _install_path_vars "${_IBPF_VARS_PREFIX}_${p}") - endif() - endforeach() - - - # ConfigVersion.cmake file (same for build tree and intall) - write_basic_package_version_file("${_IBPF_EXPORT_DESTINATION}/${_version_filename}" - VERSION ${_IBPF_VERSION} - COMPATIBILITY ${_IBPF_COMPATIBILITY}) - install(FILES "${_IBPF_EXPORT_DESTINATION}/${_version_filename}" - DESTINATION ${_IBPF_INSTALL_DESTINATION} - COMPONENT ${_IBPF_COMPONENT}) - - - # Prepare PACKAGE_DEPENDENCIES variable - set(_need_private_deps 0) - if(NOT BUILD_SHARED_LIBS) - set(_need_private_deps 1) - else() - foreach(_target ${_targets}) - get_property(_type TARGET ${_target} PROPERTY TYPE) - if("${_type}" STREQUAL "STATIC_LIBRARY") - set(_need_private_deps 1) - break() - endif() - endforeach() - endif() - - unset(PACKAGE_DEPENDENCIES) - if(DEFINED _IBPF_DEPENDENCIES) - set(PACKAGE_DEPENDENCIES "#### Expanded from @PACKAGE_DEPENDENCIES@ by install_basic_package_files() ####\n\ninclude(CMakeFindDependencyMacro)\n") - - # FIXME When CMake 3.9 or greater is required, remove this madness and just - # use find_dependency - if (CMAKE_VERSION VERSION_LESS 3.9) - string(APPEND PACKAGE_DEPENDENCIES " -set(_${_Name}_FIND_PARTS_REQUIRED) -if (${_Name}_FIND_REQUIRED) - set(_${_Name}_FIND_PARTS_REQUIRED REQUIRED) -endif() -set(_${_Name}_FIND_PARTS_QUIET) -if (${_Name}_FIND_QUIETLY) - set(_${_Name}_FIND_PARTS_QUIET QUIET) -endif() -") - - foreach(_dep ${_IBPF_DEPENDENCIES}) - if("${_dep}" MATCHES ".+ .+") - string(REPLACE " " ";" _dep_list "${_dep}") - list(INSERT _dep_list 1 \${_${_Name}_FIND_PARTS_QUIET} \${_${_Name}_FIND_PARTS_REQUIRED}) - string(REPLACE ";" " " _depx "${_dep_list}") - string(APPEND PACKAGE_DEPENDENCIES "find_package(${_depx})\n") - else() - string(APPEND PACKAGE_DEPENDENCIES "find_dependency(${_dep})\n") - endif() - endforeach() - if(_need_private_deps) - foreach(_dep ${_IBPF_PRIVATE_DEPENDENCIES}) - if("${_dep}" MATCHES ".+ .+") - string(REPLACE " " ";" _dep_list "${_dep}") - list(INSERT _dep_list 1 \${_${_Name}_FIND_PARTS_QUIET} \${_${_Name}_FIND_PARTS_REQUIRED}) - string(REPLACE ";" "\n " _depx "${_dep_list}") - string(APPEND PACKAGE_DEPENDENCIES "find_package(${_depx})\n") - else() - string(APPEND PACKAGE_DEPENDENCIES "find_dependency(${_dep})\n") - endif() - endforeach() - endif() - - else() - - foreach(_dep ${_IBPF_DEPENDENCIES}) - string(APPEND PACKAGE_DEPENDENCIES "find_dependency(${_dep})\n") - endforeach() - if(_need_private_deps) - foreach(_dep ${_IBPF_PRIVATE_DEPENDENCIES}) - string(APPEND PACKAGE_DEPENDENCIES "find_dependency(${_dep})\n") - endforeach() - endif() - - endif() - - set(PACKAGE_DEPENDENCIES "${PACKAGE_DEPENDENCIES}\n###############################################################################\n") - endif() - - # Prepare PACKAGE_VERSION variable - set(PACKAGE_VERSION ${_IBPF_VERSION}) - - # Config.cmake (build tree) - foreach(p ${_build_path_vars_suffix}) - if(DEFINED ${_IBPF_VARS_PREFIX}_BUILD_${p}) - set(${_IBPF_VARS_PREFIX}_${p} "${${_IBPF_VARS_PREFIX}_BUILD_${p}}") - elseif(DEFINED BUILD_${_IBPF_VARS_PREFIX}_${p}) - set(${_IBPF_VARS_PREFIX}_${p} "${BUILD_${_IBPF_VARS_PREFIX}_${p}}") - endif() - endforeach() - configure_package_config_file("${_config_cmake_in}" - "${_IBPF_EXPORT_DESTINATION}/${_config_filename}" - INSTALL_DESTINATION ${_IBPF_EXPORT_DESTINATION} - PATH_VARS ${_build_path_vars} - ${configure_package_config_file_extra_args} - INSTALL_PREFIX ${CMAKE_BINARY_DIR}) - - # Config.cmake (installed) - foreach(p ${_install_path_vars_suffix}) - if(DEFINED ${_IBPF_VARS_PREFIX}_INSTALL_${p}) - set(${_IBPF_VARS_PREFIX}_${p} "${${_IBPF_VARS_PREFIX}_INSTALL_${p}}") - elseif(DEFINED INSTALL_${_IBPF_VARS_PREFIX}_${p}) - set(${_IBPF_VARS_PREFIX}_${p} "${INSTALL_${_IBPF_VARS_PREFIX}_${p}}") - endif() - endforeach() - configure_package_config_file("${_config_cmake_in}" - "${CMAKE_CURRENT_BINARY_DIR}/${_config_filename}.install" - INSTALL_DESTINATION ${_IBPF_INSTALL_DESTINATION} - PATH_VARS ${_install_path_vars} - ${configure_package_config_file_extra_args}) - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${_config_filename}.install" - DESTINATION ${_IBPF_INSTALL_DESTINATION} - RENAME ${_config_filename} - COMPONENT ${_IBPF_COMPONENT}) - - - # Targets.cmake (build tree) - export(${_export_cmd} - NAMESPACE ${_IBPF_NAMESPACE} - FILE "${_IBPF_EXPORT_DESTINATION}/${_targets_filename}") - - # Targets.cmake (installed) - install(${_install_cmd} - NAMESPACE ${_IBPF_NAMESPACE} - DESTINATION ${_IBPF_INSTALL_DESTINATION} - FILE "${_targets_filename}" - COMPONENT ${_IBPF_COMPONENT}) -endfunction() diff --git a/deps/sharedlibpp/examples/CMakeLists.txt b/deps/sharedlibpp/examples/CMakeLists.txt deleted file mode 100644 index 8736b9181..000000000 --- a/deps/sharedlibpp/examples/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) -# All rights reserved. -# -# This software may be modified and distributed under the terms of the -# BSD-3-Clause license. See the accompanying LICENSE file for details. - -add_library(mymath MODULE MyMath.cpp MyMath.h) -target_include_directories(mymath PRIVATE $) -set_property(TARGET mymath PROPERTY PREFIX "") - -add_executable(math_test math_test.cpp) -target_link_libraries(math_test PRIVATE shlibpp::shlibpp) - -add_library(mymathcustom MODULE MyMathCustom.cpp MyMathCustom.h) -target_include_directories(mymathcustom PRIVATE $) -set_property(TARGET mymathcustom PROPERTY PREFIX "") - -add_executable(math_test_custom math_test_custom.cpp) -target_link_libraries(math_test_custom PRIVATE shlibpp::shlibpp) diff --git a/deps/sharedlibpp/examples/MyMath.cpp b/deps/sharedlibpp/examples/MyMath.cpp deleted file mode 100644 index 8a6c99b3b..000000000 --- a/deps/sharedlibpp/examples/MyMath.cpp +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#include "MyMath.h" -#include - -SHLIBPP_DEFINE_SHARED_SUBCLASS(my_math, MyMathImpl, MyMath); - -int MyMathImpl::add(int a, int b) -{ - return (a+b); -} - -int MyMathImpl::sub(int a, int b) -{ - return (a-b); -} diff --git a/deps/sharedlibpp/examples/MyMath.h b/deps/sharedlibpp/examples/MyMath.h deleted file mode 100644 index fa78441c2..000000000 --- a/deps/sharedlibpp/examples/MyMath.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#ifndef MYMATH_H -#define MYMATH_H - -class MyMath -{ -public: - virtual int add(int a, int b) = 0; - virtual int sub(int a, int b) = 0; -}; - -class MyMathImpl : public MyMath -{ -public: - int add(int a, int b); - int sub(int a, int b); -}; - -#endif //_MYMATH_H_ diff --git a/deps/sharedlibpp/examples/MyMathCustom.cpp b/deps/sharedlibpp/examples/MyMathCustom.cpp deleted file mode 100644 index 9dd4b42cc..000000000 --- a/deps/sharedlibpp/examples/MyMathCustom.cpp +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#include "MyMathCustom.h" -#include - -SHLIBPP_DEFINE_SHARED_SUBCLASS_CUSTOM(CUSTOM_START_CHECK, CUSTOM_END_CHECK, CUSTOM_SYSTEM_VERSION, my_math_custom, MyMathCustomImpl, MyMathCustom); - -int MyMathCustomImpl::add(int a, int b) -{ - return (a+b); -} - -int MyMathCustomImpl::sub(int a, int b) -{ - return (a-b); -} diff --git a/deps/sharedlibpp/examples/MyMathCustom.h b/deps/sharedlibpp/examples/MyMathCustom.h deleted file mode 100644 index 98a553716..000000000 --- a/deps/sharedlibpp/examples/MyMathCustom.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#ifndef MYMATHCUSTOM_H -#define MYMATHCUSTOM_H - -#include - -constexpr int32_t CUSTOM_START_CHECK = - static_cast('T') + - (static_cast('E') << 8) + - (static_cast('S') << 16) + - (static_cast('T') << 24); -constexpr int32_t CUSTOM_END_CHECK = - static_cast('T') + - (static_cast('S') << 8) + - (static_cast('E') << 16) + - (static_cast('T') << 24); -constexpr int32_t CUSTOM_SYSTEM_VERSION = 42; - -class MyMathCustom -{ -public: - virtual int add(int a, int b) = 0; - virtual int sub(int a, int b) = 0; -}; - -class MyMathCustomImpl : public MyMathCustom -{ -public: - int add(int a, int b); - int sub(int a, int b); -}; - -#endif //_MYMATH_H_ diff --git a/deps/sharedlibpp/examples/math_test.cpp b/deps/sharedlibpp/examples/math_test.cpp deleted file mode 100644 index 547ad0d2e..000000000 --- a/deps/sharedlibpp/examples/math_test.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#include -#include "MyMath.h" - -#include -#include - - -int main(int argc, char *argv[]) -{ - - if(argc < 2) { - printf("Usage: %s \n", argv[0]); - printf("for example: %s libmymath.so\n", argv[0]); - return 0; - } - - // create an instance of shared library class factory to load the library - printf("Loading the shared library... \n"); - shlibpp::SharedLibraryClassFactory myMathFactory(argv[1], "my_math"); - if (!myMathFactory.isValid()) { - printf("error (%d) : %s\n", static_cast(myMathFactory.getStatus()), - myMathFactory.getError().c_str()); - return 1; - } - - // create an instance of the class and call its functions - shlibpp::SharedLibraryClass myMath(myMathFactory); - printf("Calling some of its functions... \n"); - printf("15 + 12 = %d\n", myMath->add(15, 12)); - printf("15 - 12 = %d\n", myMath->sub(15, 12)); - - return 0; -} diff --git a/deps/sharedlibpp/examples/math_test_custom.cpp b/deps/sharedlibpp/examples/math_test_custom.cpp deleted file mode 100644 index bc66e63eb..000000000 --- a/deps/sharedlibpp/examples/math_test_custom.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#include -#include "MyMathCustom.h" - -#include -#include - - -int main(int argc, char *argv[]) -{ - - if(argc < 2) { - printf("Usage: %s \n", argv[0]); - printf("for example: %s libmymath.so\n", argv[0]); - return 0; - } - - // create an instance of shared library class factory to load the library - printf("Loading the shared library... \n"); - shlibpp::SharedLibraryClassFactory myMathFactory(argv[1], - CUSTOM_START_CHECK, - CUSTOM_END_CHECK, - CUSTOM_SYSTEM_VERSION, - "my_math_custom"); - if (!myMathFactory.isValid()) { - printf("error (%d) : %s\n", static_cast(myMathFactory.getStatus()), - myMathFactory.getError().c_str()); - return 1; - } - - // create an instance of the class and call its functions - shlibpp::SharedLibraryClass myMath(myMathFactory); - printf("Calling some of its functions... \n"); - printf("15 + 12 = %d\n", myMath->add(15, 12)); - printf("15 - 12 = %d\n", myMath->sub(15, 12)); - - return 0; -} diff --git a/deps/sharedlibpp/src/CMakeLists.txt b/deps/sharedlibpp/src/CMakeLists.txt deleted file mode 100644 index e96cedbc4..000000000 --- a/deps/sharedlibpp/src/CMakeLists.txt +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) -# All rights reserved. -# -# This software may be modified and distributed under the terms of the -# BSD-3-Clause license. See the accompanying LICENSE file for details. - -include (GNUInstallDirs) - -configure_file("${CMAKE_CURRENT_SOURCE_DIR}/shlibpp/config.h.in" - "${CMAKE_CURRENT_BINARY_DIR}/shlibpp/config.h" - @ONLY) - -configure_file("${CMAKE_CURRENT_SOURCE_DIR}/shlibpp/version.h.in" - "${CMAKE_CURRENT_BINARY_DIR}/shlibpp/version.h" - @ONLY) - -set(shlibpp_HDRS "${CMAKE_CURRENT_BINARY_DIR}/shlibpp/config.h" - "${CMAKE_CURRENT_BINARY_DIR}/shlibpp/version.h" - shlibpp/api.h - shlibpp/SharedLibraryClassApi.h - shlibpp/SharedLibraryClassFactory.h - shlibpp/SharedLibraryClassFactory-inl.h - shlibpp/SharedLibraryClass.h - shlibpp/SharedLibraryClass-inl.h - shlibpp/SharedLibraryFactory.h - shlibpp/SharedLibrary.h) - -set(shlibpp_SRCS version.cpp - SharedLibrary.cpp - SharedLibraryFactory.cpp) - -add_library(shlibpp ${shlibpp_SRCS} ${shlibpp_HDRS}) -add_library(shlibpp::shlibpp ALIAS shlibpp) - -# Add build definitions -if(NOT BUILD_SHARED_LIBS) - target_compile_definitions(shlibpp PRIVATE SHLIBPP_STATIC) -endif() -set_target_properties(shlibpp PROPERTIES DEFINE_SYMBOL BUILDING_SHLIBPP) - -target_include_directories(shlibpp PUBLIC $ - $ - $) - -if(NOT CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 3.8) - message(AUTHOR_WARNING "CMAKE_MINIMUM_REQUIRED_VERSION is now ${CMAKE_MINIMUM_REQUIRED_VERSION}. This check can be removed") -endif() -if(CMAKE_VERSION VERSION_LESS 3.8) - # Should be enough to enable c++11 - target_compile_features(shlibpp PUBLIC cxx_constexpr - cxx_nullptr) -else() - target_compile_features(shlibpp PUBLIC cxx_std_11) -endif() - -if(UNIX) - target_link_libraries(shlibpp PRIVATE dl) -endif() - -set_property(TARGET shlibpp PROPERTY PUBLIC_HEADER ${shlibpp_HDRS}) -set_property(TARGET shlibpp PROPERTY VERSION ${shlibpp_VERSION}) -set_property(TARGET shlibpp PROPERTY SOVERSION 1) - -install(TARGETS shlibpp - EXPORT shlibpp - COMPONENT shlibpp - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/shlibpp) diff --git a/deps/sharedlibpp/src/SharedLibrary.cpp b/deps/sharedlibpp/src/SharedLibrary.cpp deleted file mode 100644 index 68d45f411..000000000 --- a/deps/sharedlibpp/src/SharedLibrary.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#include - -#if defined(_WIN32) -# include -#else -# include -#endif - -#include - -using namespace shlibpp; - - -class SharedLibrary::Private -{ -public: - Private() : - implementation(nullptr), - err_message() - { - } - - void* implementation; - std::string err_message; -}; - -SharedLibrary::SharedLibrary() : - mPriv(new Private) -{ -} - -SharedLibrary::SharedLibrary(const char *filename) : - SharedLibrary() -{ - open(filename); -} - -SharedLibrary::~SharedLibrary() -{ - close(); - delete mPriv; -} - -bool SharedLibrary::open(const char *filename) -{ - mPriv->err_message.clear(); - close(); -#if defined(_WIN32) - mPriv->implementation = (void*)LoadLibrary(filename); - LPTSTR msg = nullptr; - FormatMessage( - FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, - nullptr, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR)&msg, 0, nullptr); - - if(msg != nullptr) { - mPriv->err_message = std::string(msg); - // release memory allocated by FormatMessage() - LocalFree(msg); msg = nullptr; - } - return (mPriv->implementation != nullptr); -#else - mPriv->implementation = dlopen(filename, RTLD_LAZY); - char* msg = dlerror(); - if(msg) - mPriv->err_message = msg; - return mPriv->implementation != nullptr; -#endif -} - -bool SharedLibrary::close() { - int result = 0; - if (mPriv->implementation != nullptr) { -#if defined(WIN32) - result = FreeLibrary((HINSTANCE)mPriv->implementation); - LPTSTR msg = nullptr; - FormatMessage( - FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, - nullptr, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR)&msg, 0, nullptr); - - if(msg != nullptr) { - mPriv->err_message = std::string(msg); - // release memory allocated by FormatMessage() - LocalFree(msg); msg = nullptr; - } -#else - result = dlclose(mPriv->implementation); - if (result != 0) { - char* msg = dlerror(); - if(msg) - mPriv->err_message = msg; - } -#endif - mPriv->implementation = nullptr; - - } - return (result == 0); -} - -std::string SharedLibrary::error() -{ - return mPriv->err_message; -} - -void *SharedLibrary::getSymbol(const char *symbolName) { - mPriv->err_message.clear(); - if (mPriv->implementation==nullptr) return nullptr; -#if defined(_WIN32) - FARPROC proc = GetProcAddress((HINSTANCE)mPriv->implementation, symbolName); - LPTSTR msg = nullptr; - FormatMessage( - FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, - nullptr, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR)&msg, 0, nullptr); - - if(msg != nullptr) { - mPriv->err_message = std::string(msg); - // release memory allocated by FormatMessage() - LocalFree(msg); msg = nullptr; - } - return (void*)proc; -#else - dlerror(); - void* func = dlsym(mPriv->implementation,symbolName); - char* msg = dlerror(); - if(msg) - mPriv->err_message = msg; - return func; -#endif -} - -bool SharedLibrary::isValid() const { - return mPriv->implementation != nullptr; -} diff --git a/deps/sharedlibpp/src/SharedLibraryFactory.cpp b/deps/sharedlibpp/src/SharedLibraryFactory.cpp deleted file mode 100644 index ee38d48f3..000000000 --- a/deps/sharedlibpp/src/SharedLibraryFactory.cpp +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#include -#include -#include - -#include -#if defined(_WIN32) -# define shlibpp_struct_stat struct _stat -# define shlibpp_stat ::_stat -#else -# define shlibpp_struct_stat struct ::stat -# define shlibpp_stat ::stat -#endif - -class shlibpp::SharedLibraryFactory::Private -{ -public: - Private(int32_t startCheck, - int32_t endCheck, - int32_t systemVersion, - const char* factoryName); - - bool open(const char* dll_name); - bool isValid() const; - bool useFactoryFunction(void *factory); - - SharedLibrary lib; - SharedLibraryFactory::Status status; - SharedLibraryClassApi api; - int returnValue; - int rct; // FIXME Remove this reference counter and use a shared_ptr instead. - std::string name; - std::string className; - std::string baseClassName; - std::string error; - - int32_t startCheck; - int32_t endCheck; - int32_t systemVersion; - const char* factoryName; -}; - - - -shlibpp::SharedLibraryFactory::Private::Private(int32_t startCheck, - int32_t endCheck, - int32_t systemVersion, - const char* factoryName) : - status(Status::None), - returnValue(0), - rct(1), - startCheck(startCheck), - endCheck(endCheck), - systemVersion(systemVersion), - factoryName(factoryName) -{ - memset(&api, 0, sizeof(SharedLibraryClassApi)); -} - -bool shlibpp::SharedLibraryFactory::Private::open(const char* dll_name) -{ - returnValue = 0; - name = ""; - className = ""; - baseClassName = ""; - status = Status::None; - error = ""; - api.startCheck = 0; - if (!lib.open(dll_name)) { - shlibpp_struct_stat dummy; - if (shlibpp_stat(dll_name, &dummy) != 0) { - status = Status::LibraryNotFound; - } else { - status = Status::LibraryNotLoaded; - } - error = lib.error(); - return false; - } - void *fn = lib.getSymbol((factoryName != nullptr) ? factoryName : SHLIBPP_DEFAULT_FACTORY_NAME_STRING); - if (fn == nullptr) { - status = Status::FactoryNotFound; - error = lib.error(); - lib.close(); - return false; - } - if (!useFactoryFunction(fn)) { - status = Status::FactoryNotFunctional; - error = "Hook in shared library misbehaved"; - return false; - } - status = Status::OK; - name = dll_name; - - char buf[256]; - api.getClassName(buf, 256); - className = buf; - api.getBaseClassName(buf, 256); - baseClassName = buf; - - return true; -} - -bool shlibpp::SharedLibraryFactory::Private::isValid() const -{ - if (returnValue != startCheck) { - return false; - } - if (api.startCheck != startCheck) { - return false; - } - if (api.structureSize != sizeof(SharedLibraryClassApi)) { - return false; - } - if (api.systemVersion != systemVersion) { - return false; - } - if (api.endCheck != endCheck) { - return false; - } - return true; -} - -bool shlibpp::SharedLibraryFactory::Private::useFactoryFunction(void *factory) -{ - api.startCheck = 0; - if (factory == nullptr) { - return false; - } - returnValue = - ((int (*)(void *ptr,int len)) factory)(&api,sizeof(SharedLibraryClassApi)); - return isValid(); -} - - -shlibpp::SharedLibraryFactory::SharedLibraryFactory(int32_t startCheck, - int32_t endCheck, - int32_t systemVersion, - const char *factoryName) : - mPriv(new Private(startCheck, endCheck, systemVersion, factoryName)) -{ -} - -shlibpp::SharedLibraryFactory::SharedLibraryFactory(const char *dll_name, - int32_t startCheck, - int32_t endCheck, - int32_t systemVersion, - const char *factoryName) : - SharedLibraryFactory(startCheck, endCheck, systemVersion, factoryName) -{ - mPriv->open(dll_name); -} - -shlibpp::SharedLibraryFactory::SharedLibraryFactory(const char* dll_name, - const char* factoryName) : - SharedLibraryFactory(SHLIBPP_DEFAULT_START_CHECK, - SHLIBPP_DEFAULT_END_CHECK, - SHLIBPP_DEFAULT_SYSTEM_VERSION, - factoryName) -{ - mPriv->open(dll_name); -} - -shlibpp::SharedLibraryFactory::~SharedLibraryFactory() -{ - delete mPriv; -} - -bool shlibpp::SharedLibraryFactory::open(const char *dll_name, - int32_t startCheck, - int32_t endCheck, - int32_t systemVersion, - const char *factoryName) -{ - mPriv->startCheck = startCheck; - mPriv->endCheck = endCheck; - mPriv->systemVersion = systemVersion; - mPriv->factoryName = factoryName; - return mPriv->open(dll_name); -} - -bool shlibpp::SharedLibraryFactory::open(const char* dll_name, const char* factoryName) -{ - mPriv->startCheck = SHLIBPP_DEFAULT_START_CHECK; - mPriv->endCheck = SHLIBPP_DEFAULT_END_CHECK; - mPriv->systemVersion = SHLIBPP_DEFAULT_SYSTEM_VERSION; - mPriv->factoryName = factoryName; - return mPriv->open(dll_name); -} - -bool shlibpp::SharedLibraryFactory::isValid() const -{ - return mPriv->isValid(); -} - -shlibpp::SharedLibraryFactory::Status shlibpp::SharedLibraryFactory::getStatus() const -{ - return mPriv->status; -} - -std::string shlibpp::SharedLibraryFactory::getError() const -{ - return mPriv->error; -} - -const shlibpp::SharedLibraryClassApi& shlibpp::SharedLibraryFactory::getApi() const -{ - return mPriv->api; -} - -int shlibpp::SharedLibraryFactory::getReferenceCount() const -{ - return mPriv->rct; -} - -int shlibpp::SharedLibraryFactory::addRef() -{ - mPriv->rct++; - return mPriv->rct; -} - -int shlibpp::SharedLibraryFactory::removeRef() -{ - mPriv->rct--; - return mPriv->rct; -} - -std::string shlibpp::SharedLibraryFactory::getName() const -{ - return mPriv->name; -} - -std::string shlibpp::SharedLibraryFactory::getClassName() const -{ - return mPriv->className; -} - -std::string shlibpp::SharedLibraryFactory::getBaseClassName() const -{ - return mPriv->baseClassName; -} - -bool shlibpp::SharedLibraryFactory::useFactoryFunction(void *factory) -{ - return mPriv->useFactoryFunction(factory); -} diff --git a/deps/sharedlibpp/src/shlibpp/SharedLibrary.h b/deps/sharedlibpp/src/shlibpp/SharedLibrary.h deleted file mode 100644 index a044e143d..000000000 --- a/deps/sharedlibpp/src/shlibpp/SharedLibrary.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#ifndef SHAREDLIBPP_SHAREDLIBRARY_H -#define SHAREDLIBPP_SHAREDLIBRARY_H - -#include -#include - -namespace shlibpp { - -/** - * Low-level wrapper for loading shared libraries (DLLs) and accessing - * symbols within it. - */ -class SHLIBPP_API SharedLibrary -{ -public: - /** - * Initialize, without opening a shared library yet. - */ - SharedLibrary(); - - /** - * Load the named shared library / DLL. - * - * @param filename name of file (see open method) - */ - SharedLibrary(const char *filename); - - /** - * Destructor. Will close() if needed. - */ - virtual ~SharedLibrary(); - - SharedLibrary(const SharedLibrary& rhs) = delete; - SharedLibrary(SharedLibrary&& rhs) noexcept = delete; - SharedLibrary& operator=(const SharedLibrary& rhs) = delete; - SharedLibrary& operator=(SharedLibrary&& rhs) noexcept = delete; - - /** - * Load the named shared library / DLL. The library is found - * using the algoithm of ACE::ldfind. Operating-system-specific - * extensions will be tried, and the relevant path for shared - * libraries. - * - * @param filename name of file. - * @return true on success - */ - bool open(const char *filename); - - /** - * Shared library no longer needed, unload if not in use elsewhere. - * @return true on success - */ - bool close(); - - /** - * Returns a human-readable string describing the most recent error that - * occurred from a call to one of its functions. - * - * @return the most recent error - */ - std::string error(); - - /** - * Look up a symbol in the shared library. - */ - void *getSymbol(const char *symbolName); - - /** - * Check if the shared library is valid - * - * @return true iff a valid library has been loaded. - */ - bool isValid() const; - -#ifndef DOXYGEN_SHOULD_SKIP_THIS -private: - class SHLIBPP_HIDDEN Private; - Private* mPriv; -#endif -}; - -} // namespace shlibpp - -#endif // SHAREDLIBPP_SHAREDLIBRARY_H diff --git a/deps/sharedlibpp/src/shlibpp/SharedLibraryClass-inl.h b/deps/sharedlibpp/src/shlibpp/SharedLibraryClass-inl.h deleted file mode 100644 index 33ab54f95..000000000 --- a/deps/sharedlibpp/src/shlibpp/SharedLibraryClass-inl.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#ifndef SHAREDLIBPP_SHAREDLIBRARYCLASS_INL_H -#define SHAREDLIBPP_SHAREDLIBRARYCLASS_INL_H - - -template -shlibpp::SharedLibraryClass::SharedLibraryClass() : - content(nullptr), - pfactory(nullptr) -{ -} - -template -shlibpp::SharedLibraryClass::SharedLibraryClass(SharedLibraryClassFactory& factory) : - SharedLibraryClass() -{ - open(factory); -} - -template -shlibpp::SharedLibraryClass::~SharedLibraryClass() -{ - close(); -} - -template -bool shlibpp::SharedLibraryClass::open(SharedLibraryClassFactory& factory) -{ - close(); - content = factory.create(); - pfactory = &factory; - factory.addRef(); - - return content != nullptr; -} - -template -bool shlibpp::SharedLibraryClass::close() -{ - if (content != nullptr) { - pfactory->destroy(content); - if (pfactory->removeRef() == 0) { - delete pfactory; - } - } - - content = nullptr; - pfactory = nullptr; - - return true; -} - -template -T& shlibpp::SharedLibraryClass::getContent() -{ - return *content; -} - -template -const T& shlibpp::SharedLibraryClass::getContent() const -{ - return *content; -} - -template -bool shlibpp::SharedLibraryClass::isValid() const -{ - return content != nullptr; -} - - -template -T& shlibpp::SharedLibraryClass::operator*() -{ - return (*content); -} - - -template -const T& shlibpp::SharedLibraryClass::operator*() const -{ - return (*content); -} - - -template -T* shlibpp::SharedLibraryClass::operator->() -{ - return (content); -} - -template -const T* shlibpp::SharedLibraryClass::operator->() const -{ - return (content); -} - -#endif // SHAREDLIBPP_SHAREDLIBRARYCLASS_INL_H diff --git a/deps/sharedlibpp/src/shlibpp/SharedLibraryClass.h b/deps/sharedlibpp/src/shlibpp/SharedLibraryClass.h deleted file mode 100644 index 6a5ffe48d..000000000 --- a/deps/sharedlibpp/src/shlibpp/SharedLibraryClass.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#ifndef SHAREDLIBPP_SHAREDLIBRARYCLASS_H -#define SHAREDLIBPP_SHAREDLIBRARYCLASS_H - -#include - -namespace shlibpp { - -/** - * Container for an object created using a factory provided by a shared library. - * Used to ensure the object is destroyed by a method also provided by the - * shared library. Mixing creation and destruction methods could be very bad. - */ -template -class SharedLibraryClass -{ -public: - - /** - * Constructor for empty instance. - */ - SharedLibraryClass(); - - /** - * Constructor for valid instance of a class from a shared library. - * - * @param factory the factory to use to construct (and eventually - * destroy) the instance. - */ - SharedLibraryClass(SharedLibraryClassFactory& factory); - - /** - * Destructor. - */ - virtual ~SharedLibraryClass(); - - /** - * Construct an instance using the specified factory. If an - * instance has already been made, it is destroyed. - * - * @param factory the factory to use to construct (and eventually - * destroy) the instance. - * @return true on success - */ - bool open(SharedLibraryClassFactory& factory); - - /** - * Destroy an instance if one has been created. - * - * @return true on success - */ - virtual bool close(); - - /** - * Gives access to the created instance. - * - * No check made to ensure an instance is in fact present. - * Call SharedLibraryClass::isValid first if unsure. - * - * @return the created instance - */ - T& getContent(); - - /** - * Gives access to the created instance (const version). - * - * No check made to ensure an instance is in fact present. - * Call SharedLibraryClass::isValid first if unsure. - * - * @return the created instance - */ - const T& getContent() const; - - /** - * Check whether a valid instance has been created. - * - * @return true iff a valid instance has been created - */ - bool isValid() const; - - /** - * Shorthand for SharedLibraryClass::getContent - * - * @return the created instance - */ - T& operator*(); - - /** - * Shorthand for SharedLibraryClass::getContent (const version) - * - * @return the created instance - */ - const T& operator*() const; - - /** - * A pointer version of SharedLibraryClass::getContent - * - * @return a pointer to the created instance, or nullptr if there is none - */ - T* operator->(); - - /** - * A pointer version of SharedLibraryClass::getContent (const version) - * - * @return a pointer to the created instance, or nullptr if there is none - */ - const T* operator->() const; - -#ifndef DOXYGEN_SHOULD_SKIP_THIS -private: - T* content; - SharedLibraryClassFactory *pfactory; -#endif -}; - -} // namespace shlibpp - - -#include - -#endif // SHAREDLIBPP_SHAREDLIBRARYCLASS_H diff --git a/deps/sharedlibpp/src/shlibpp/SharedLibraryClassApi.h b/deps/sharedlibpp/src/shlibpp/SharedLibraryClassApi.h deleted file mode 100644 index 80b368b3f..000000000 --- a/deps/sharedlibpp/src/shlibpp/SharedLibraryClassApi.h +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#ifndef SHAREDLIBPP_SHAREDLIBRARYCLASSAPI_H -#define SHAREDLIBPP_SHAREDLIBRARYCLASSAPI_H - -#include -#include -#include - -namespace shlibpp { - -// Be careful loading C++ classes from DLLs. Generally you -// need an exact or very close match between compilers used -// to compile those DLLs and your own code. - -extern "C" { - - /** - * Collection of hooks for creating/destroying a plugin. - * Be careful to check carefully for compatibility before - * using create() or destroy(). - */ - struct SHLIBPP_API SharedLibraryClassApi { - public: - int32_t startCheck; // A 32-bit integer that is checked when loading - // a plugin. - // Don't touch anything further if it isn't. - int32_t structureSize; // size of the SharedLibraryClassApi. - // If this doesn't match what you expect, - // Don't touch anything further if it isn't. - int32_t systemVersion; // Overall version of plugin system. - // This does *not* cover compiler version etc. - - using createFn_t = void*(*)(); - using destroyFn_t = void(*)(void*); - using getFn_t = int32_t(*)(char*, size_t); - - createFn_t create; // Instantiate a plugin object. - destroyFn_t destroy; // Destroy a plugin object. - getFn_t getVersion; // Plugin-related version. - getFn_t getAbi; // Compiler-related version. - getFn_t getClassName; // Name of plugin (subclass). - getFn_t getBaseClassName; // Name superclass. - - int32_t roomToGrow[SHLIBPP_SHAREDLIBRARYCLASSAPI_PADDING]; // Padding. - int32_t endCheck; // A 32-bit integer that is checked when loading - // a plugin. - }; - -} // extern "C" - -} // namespace shlibpp - - -#define SHLIBPP_SHARED_CLASS_FN extern "C" SHLIBPP_EXPORT - -constexpr int32_t SHLIBPP_DEFAULT_START_CHECK = - static_cast('S') + - (static_cast('H') << 8) + - (static_cast('P') << 16) + - (static_cast('P') << 24); -constexpr int32_t SHLIBPP_DEFAULT_END_CHECK = - static_cast('P') + - (static_cast('L') << 8) + - (static_cast('U') << 16) + - (static_cast('G') << 24); -constexpr int32_t SHLIBPP_DEFAULT_SYSTEM_VERSION = 5; -#define SHLIBPP_DEFAULT_FACTORY_NAME shlibpp_default_factory - -#define SHLIBPP_STRINGIFY2(X) #X -#define SHLIBPP_STRINGIFY(X) SHLIBPP_STRINGIFY2(X) -#define SHLIBPP_DEFAULT_FACTORY_NAME_STRING SHLIBPP_STRINGIFY(SHLIBPP_DEFAULT_FACTORY_NAME) - - -/** - * Macro to create a bunch of functions with undecorated names that can - * be found within a plugin library to handle creation/deletion of that - * plugin. Use with care. - * - * @param factoryname the name of the "hook" function to make. - * A collection of other helper functions with names composed of the - * factoryname with _create/_destroy/... appended. - * @param startcheck a 32-bit integer that is checked when loading a plugin. - * @param endcheck a 32-bit integer that is checked when loading a plugin. - * @param systemversiona a 32-bit integer representing the version of the plugin - * api that is checked when loading a plugin. - * @param classname the class that the hook will be able to instantiate. - * @param basename the superclass that the user of the plugin should be - * working with. - */ -#define SHLIBPP_DEFINE_SHARED_SUBCLASS_CUSTOM(startcheck, endcheck, systemversion, factoryname, classname, basename) \ - SHLIBPP_SHARED_CLASS_FN void* factoryname ## _create () \ - { \ - classname* cn = new classname; \ - basename* bn = dynamic_cast(cn); \ - if (!bn) { \ - delete cn; \ - } \ - return static_cast(bn); \ - } \ - \ - SHLIBPP_SHARED_CLASS_FN void factoryname ## _destroy (void* obj) \ - { \ - classname* cn = dynamic_cast(static_cast(obj)); \ - if(cn) { \ - delete cn; \ - } \ - } \ - \ - SHLIBPP_SHARED_CLASS_FN int32_t factoryname ## _getVersion (char* ver, size_t len) \ - { \ - return 0; \ - } \ - \ - SHLIBPP_SHARED_CLASS_FN int32_t factoryname ## _getAbi (char* abi, size_t len) \ - { \ - return 0; \ - } \ - \ - SHLIBPP_SHARED_CLASS_FN int32_t factoryname ## _getClassName (char* name, size_t len) \ - { \ - char cname[] = # classname; \ - strncpy(name, cname, len); \ - return strlen(cname) + 1; \ - } \ - \ - SHLIBPP_SHARED_CLASS_FN int32_t factoryname ## _getBaseClassName (char* name, size_t len) \ - { \ - char cname[] = # basename; \ - strncpy(name, cname, len); \ - return strlen(cname) + 1; \ - } \ - \ - SHLIBPP_SHARED_CLASS_FN int32_t factoryname(void* api, size_t len) { \ - struct shlibpp::SharedLibraryClassApi* sapi = static_cast(api); \ - if (len < sizeof(shlibpp::SharedLibraryClassApi)) { \ - return -1; \ - } \ - sapi->startCheck = startcheck; \ - sapi->structureSize = sizeof(shlibpp::SharedLibraryClassApi); \ - sapi->systemVersion = systemversion; \ - sapi->create = factoryname ## _create; \ - sapi->destroy = factoryname ## _destroy; \ - sapi->getVersion = factoryname ## _getVersion; \ - sapi->getAbi = factoryname ## _getAbi; \ - sapi->getClassName = factoryname ## _getClassName; \ - sapi->getBaseClassName = factoryname ## _getBaseClassName; \ - for (int i=0; iroomToGrow[i] = 0; \ - } \ - sapi->endCheck = endcheck; \ - return sapi->startCheck; \ - } -// The double cast in the _create() and _destroy() functions are -// required to ensure that everything works when `basename` is not the -// first inherited class: -// _create() will return a valid `basename` or a null pointer if -// `classname` does not inherit from `basename`. -// _destroy() will ensure that we are calling `classname` destructor -// even if `basename` is not the first inherited class. If the -// dynamic_cast fails, it will not delete the object (that is probably -// leaked), but it is less dangerous than executing some other random -// function. - -#define SHLIBPP_DEFINE_SHARED_SUBCLASS(factoryname, classname, basename) \ - SHLIBPP_DEFINE_SHARED_SUBCLASS_CUSTOM(SHLIBPP_DEFAULT_START_CHECK, \ - SHLIBPP_DEFAULT_END_CHECK, \ - SHLIBPP_DEFAULT_SYSTEM_VERSION, \ - factoryname, \ - classname, \ - basename) - -#define SHLIBPP_DEFINE_DEFAULT_SHARED_CLASS(classname) \ - SHLIBPP_DEFINE_SHARED_SUBCLASS_CUSTOM(SHLIBPP_DEFAULT_START_CHECK, \ - SHLIBPP_DEFAULT_END_CHECK, \ - SHLIBPP_DEFAULT_SYSTEM_VERSION, \ - SHLIBPP_DEFAULT_FACTORY_NAME, \ - classname, \ - classname) - -#define SHLIBPP_DEFINE_SHARED_CLASS(factoryname, classname) \ - SHLIBPP_DEFINE_SHARED_SUBCLASS_CUSTOM(SHLIBPP_DEFAULT_START_CHECK, \ - SHLIBPP_DEFAULT_END_CHECK, \ - SHLIBPP_DEFAULT_SYSTEM_VERSION, \ - factoryname, \ - classname, \ - classname) - -#endif // SHAREDLIBPP_SHAREDLIBRARYCLASSAPI_H diff --git a/deps/sharedlibpp/src/shlibpp/SharedLibraryClassFactory-inl.h b/deps/sharedlibpp/src/shlibpp/SharedLibraryClassFactory-inl.h deleted file mode 100644 index f126f0599..000000000 --- a/deps/sharedlibpp/src/shlibpp/SharedLibraryClassFactory-inl.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#ifndef SHAREDLIBPP_SHAREDLIBRARYCLASSFACTORY_INL_H -#define SHAREDLIBPP_SHAREDLIBRARYCLASSFACTORY_INL_H - -template -shlibpp::SharedLibraryClassFactory::SharedLibraryClassFactory(int32_t startCheck, - int32_t endCheck, - int32_t systemVersion, - const char *factoryName) : - SharedLibraryFactory(startCheck, endCheck, systemVersion, factoryName) -{ -} - -template -shlibpp::SharedLibraryClassFactory::SharedLibraryClassFactory(const char *dll_name, - int32_t startCheck, - int32_t endCheck, - int32_t systemVersion, - const char *factoryName) : - SharedLibraryFactory(dll_name, startCheck, endCheck, systemVersion, factoryName) -{ -} - -template -shlibpp::SharedLibraryClassFactory::SharedLibraryClassFactory(const char *dll_name, - const char *factoryName) : - SharedLibraryFactory(dll_name, factoryName) -{ -} - -template -T* shlibpp::SharedLibraryClassFactory::create() const -{ - if (!isValid()) { - return nullptr; - } - return static_cast(getApi().create()); -} - -template -void shlibpp::SharedLibraryClassFactory::destroy(T *obj) const -{ - if (!isValid()) { - return; - } - getApi().destroy(obj); -} - -#endif // SHAREDLIBPP_SHAREDLIBRARYCLASSFACTORY_INL_H diff --git a/deps/sharedlibpp/src/shlibpp/SharedLibraryClassFactory.h b/deps/sharedlibpp/src/shlibpp/SharedLibraryClassFactory.h deleted file mode 100644 index e0826a208..000000000 --- a/deps/sharedlibpp/src/shlibpp/SharedLibraryClassFactory.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#ifndef SHAREDLIBPP_SHAREDLIBRARYCLASSFACTORY_H -#define SHAREDLIBPP_SHAREDLIBRARYCLASSFACTORY_H - -#include -#include - -namespace shlibpp { - -/** - * A type-safe wrapper for SharedLibraryFactory, committing to - * creation/destruction of instances of a particular super-class. - * - * Note that we take on faith that the named factory method in the - * named shared library does in fact create the named type. - */ -template -class SharedLibraryClassFactory : public SharedLibraryFactory -{ -public: - explicit SharedLibraryClassFactory(int32_t startCheck = SHLIBPP_DEFAULT_START_CHECK, - int32_t endCheck = SHLIBPP_DEFAULT_END_CHECK, - int32_t systemVersion = SHLIBPP_DEFAULT_SYSTEM_VERSION, - const char *factoryName = nullptr); - - explicit SharedLibraryClassFactory(const char *dll_name, - int32_t startCheck = SHLIBPP_DEFAULT_START_CHECK, - int32_t endCheck = SHLIBPP_DEFAULT_END_CHECK, - int32_t systemVersion = SHLIBPP_DEFAULT_SYSTEM_VERSION, - const char *factoryName = nullptr); - - explicit SharedLibraryClassFactory(const char *dll_name, - const char *factoryName = nullptr); - - T *create() const; - - void destroy(T *obj) const; -}; - -} // namespace shlibpp - -#include - -#endif // SHAREDLIBPP_SHAREDLIBRARYCLASSFACTORY_H diff --git a/deps/sharedlibpp/src/shlibpp/SharedLibraryFactory.h b/deps/sharedlibpp/src/shlibpp/SharedLibraryFactory.h deleted file mode 100644 index 6efeb4dab..000000000 --- a/deps/sharedlibpp/src/shlibpp/SharedLibraryFactory.h +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#ifndef SHAREDLIBPP_SHAREDLIBRARYFACTORY_H -#define SHAREDLIBPP_SHAREDLIBRARYFACTORY_H - -#include -#include - -namespace shlibpp { - -class SharedLibraryClassApi; - -/** - * A wrapper for a named factory method in a named shared library. - * This wrapper will do some basic checks that the named method does - * indeed behave like a shlibpp plugin hook before offering access to it. - * This is to avoid accidents, it is not a security mechanism. - */ -class SHLIBPP_API SharedLibraryFactory -{ -public: - /** - * The status of a factory can be: - * - None: Not configured yet - * - OK: Present and sane - * - LibraryNotFound: Named shared library was not found - * - LibraryNotLoaded: Named shared library failed to load - * - FactoryNotFound: Named method wasn't present in library - * - FactoryNotFunctional: Named method is not working right - */ - enum class Status : std::uint32_t - { - None = 0, //!< Not configured yet. - OK, //!< Present and sane. - LibraryNotFound, //!< Named shared library was not found. - LibraryNotLoaded, //!< Named shared library failed to load. - FactoryNotFound, //!< Named method wasn't present in library. - FactoryNotFunctional //!< Named method is not working right. - }; - - /** - * Constructor for unconfigured factory with custom start check, end check, - * system version and factory name. - * - * @param startCheck a 32-bit integer that is checked when loading a plugin. - * It must be the same used when creating the plugin - * @param endCheck a 32-bit integer that is checked when loading a plugin. - * It must be the same used when creating the plugin - * @param systemVersion a number representing the version of the plugin api - * that is checked when loading a plugin. - * It must be the same used when creating the plugin. - * @param factoryName name of factory method, a symbol within the shared - * library. - * If set, it must be the same used when creating the - * plugin. - */ - explicit SharedLibraryFactory(int32_t startCheck = -1, - int32_t endCheck = -1, - int32_t systemVersion = -1, - const char *factoryName = nullptr); - - /** - * Constructor with custom start check, end check, system version and - * factoryName - * - * @param dll_name name/path of shared library. - * @param startCheck a 32-bit integer that is checked when loading a plugin. - * It must be the same used when creating the plugin - * @param endCheck a 32-bit integer that is checked when loading a plugin. - * It must be the same used when creating the plugin - * @param systemVersion a number representing the version of the plugin api - * that is checked when loading a plugin. - * It must be the same used when creating the plugin. - * @param factoryName name of factory method, a symbol within the shared - * library. - * If set, it must be the same used when creating the - * plugin. - */ - SharedLibraryFactory(const char *dll_name, - int32_t startCheck = -1, - int32_t endCheck = -1, - int32_t systemVersion = -1, - const char *factoryName = nullptr); - - /** - * Constructor with default start check, end check and system version. - * - * @param dll_name name/path of shared library. - * @param factoryName name of factory method, a symbol within the shared - * library. - * If set, it must be the same used when creating the - * plugin. - */ - SharedLibraryFactory(const char *dll_name, - const char *factoryName = nullptr); - - /** - * Destructor - */ - virtual ~SharedLibraryFactory(); - - /** - * Configure the factory. - * - * @param dll_name name/path of shared library. - * @param startCheck a 32-bit integer that is checked when loading a plugin. - * It must be the same used when creating the plugin - * @param endCheck a 32-bit integer that is checked when loading a plugin. - * It must be the same used when creating the plugin - * @param systemVersion a number representing the version of the plugin api - * that is checked when loading a plugin. - * It must be the same used when creating the plugin. - * @param factoryName name of factory method, a symbol within the shared - * library. - * If set, it must be the same used when creating the - * plugin. - * @return true on success. - */ - bool open(const char *dll_name, - int32_t startCheck = -1, - int32_t endCheck = -1, - int32_t systemVersion = -1, - const char *factoryName = nullptr); - - /** - * Configure the factory. - * - * @param dll_name name/path of shared library. - * @param factoryName name of factory method, a symbol within the shared - * library. - * If set, it must be the same used when creating the - * plugin. - * @return true on success. - */ - bool open(const char *dll_name, - const char *factoryName = nullptr); - - /** - * Check if factory is configured and present. - * - * @return true iff factory is good to go. - */ - bool isValid() const; - - /** - * Get the status of the factory. - * - * @return one of the SharedLibraryFactory::STATUS_* codes. - */ - Status getStatus() const; - - /** - * Get the latest error of the factory. - * - * @return the latest error. - */ - std::string getError() const; - - /** - - * Get the factory API, which has creation/deletion methods. - * - * @return the factory API - */ - const SharedLibraryClassApi& getApi() const; - - /** - * Get the current reference count of this factory. - * - * @return the current reference count of this factory. - */ - int getReferenceCount() const; - - /** - * Increment the reference count of this factory. - * - * @return the current reference count of this factory, after increment. - */ - int addRef(); - - /** - * Decrement the reference count of this factory. - * - * @return the current reference count of this factory, after decrement. - */ - int removeRef(); - - /** - * Get the name associated with this factory. - * - * @return the name associated with this factory. - */ - std::string getName() const; - - /** - * Get the type associated with this factory. - * - * @return the type associated with this factory. - */ - std::string getClassName() const; - - /** - * Get the base type associated with this factory. - * - * @return the base type associated with this factory. - */ - std::string getBaseClassName() const; - - /** - * - * Specify function to use as factory. - * - * @param factory function to use as factory. - * - * @result true on success. - * - */ - bool useFactoryFunction(void *factory); - -#ifndef DOXYGEN_SHOULD_SKIP_THIS -private: - class SHLIBPP_HIDDEN Private; - Private* mPriv; -#endif -}; - -} // namespace shlibpp - -#endif // SHAREDLIBPP_SHAREDLIBRARYFACTORY_H diff --git a/deps/sharedlibpp/src/shlibpp/api.h b/deps/sharedlibpp/src/shlibpp/api.h deleted file mode 100644 index 7416c207c..000000000 --- a/deps/sharedlibpp/src/shlibpp/api.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#ifndef SHAREDLIBPP_API_H -#define SHAREDLIBPP_API_H - -#if defined _WIN32 || defined __CYGWIN__ -# define SHLIBPP_HELPER_DLL_EXPORT __declspec(dllexport) -# define SHLIBPP_HELPER_DLL_IMPORT __declspec(dllimport) -# define SHLIBPP_HELPER_DLL_LOCAL -#else -# if __GNUC__ >= 4 -# define SHLIBPP_HELPER_DLL_EXPORT __attribute__ ((visibility("default"))) -# define SHLIBPP_HELPER_DLL_IMPORT __attribute__ ((visibility("default"))) -# define SHLIBPP_HELPER_DLL_LOCAL __attribute__ ((visibility("hidden"))) -# else -# define SHLIBPP_HELPER_DLL_EXPORT -# define SHLIBPP_HELPER_DLL_IMPORT -# define SHLIBPP_HELPER_DLL_LOCAL -# endif -#endif - -#define SHLIBPP_EXPORT SHLIBPP_HELPER_DLL_EXPORT -#define SHLIBPP_IMPORT SHLIBPP_HELPER_DLL_IMPORT -#define SHLIBPP_LOCAL SHLIBPP_HELPER_DLL_LOCAL - -#ifdef SHLIBPP_STATIC -# define SHLIBPP_API -# define SHLIBPP_HIDDEN -#else -# ifdef BUILDING_SHLIBPP -# define SHLIBPP_API SHLIBPP_HELPER_DLL_EXPORT -# else -# define SHLIBPP_API SHLIBPP_HELPER_DLL_IMPORT -# endif -# define SHLIBPP_HIDDEN SHLIBPP_HELPER_DLL_LOCAL -#endif - -#endif // SHAREDLIBPP_API_H diff --git a/deps/sharedlibpp/src/shlibpp/config.h.in b/deps/sharedlibpp/src/shlibpp/config.h.in deleted file mode 100644 index 2dd197d45..000000000 --- a/deps/sharedlibpp/src/shlibpp/config.h.in +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#ifndef SHAREDLIBPP_CONFIG_H -#define SHAREDLIBPP_CONFIG_H - -#define SHLIBPP_POINTER_SIZE @CMAKE_SIZEOF_VOID_P@ -#define SHLIBPP_SHAREDLIBRARYCLASSAPI_PADDING (30-2*(SHLIBPP_POINTER_SIZE/4)) - -#endif // SHAREDLIBPP_CONFIG_H diff --git a/deps/sharedlibpp/src/shlibpp/version.h.in b/deps/sharedlibpp/src/shlibpp/version.h.in deleted file mode 100644 index 0249e766f..000000000 --- a/deps/sharedlibpp/src/shlibpp/version.h.in +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#ifndef SHAREDLIBPP_VERSION_H -#define SHAREDLIBPP_VERSION_H - -#include -#include - -#define SHLIBPP_VERSION_MAJOR @shlibpp_VERSION_MAJOR@ -#define SHLIBPP_VERSION_MINOR @shlibpp_VERSION_MINOR@ -#define SHLIBPP_VERSION_PATCH @shlibpp_VERSION_PATCH@ -#define SHLIBPP_VERSION "@shlibpp_VERSION@" - -namespace shlibpp { - -SHLIBPP_API int getVersionMajor(); -SHLIBPP_API int getVersionMinor(); -SHLIBPP_API int getVersionPatch(); -SHLIBPP_API std::string getVersion(); - -} // namespace shlibpp - -#endif // SHAREDLIBPP_VERSION_H diff --git a/deps/sharedlibpp/src/version.cpp b/deps/sharedlibpp/src/version.cpp deleted file mode 100644 index 935d2877a..000000000 --- a/deps/sharedlibpp/src/version.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2006-2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * BSD-3-Clause license. See the accompanying LICENSE file for details. - */ - -#include - -int shlibpp::getVersionMajor() -{ - return SHLIBPP_VERSION_MAJOR; -} - -int shlibpp::getVersionMinor() -{ - return SHLIBPP_VERSION_MINOR; -} - -int shlibpp::getVersionPatch() -{ - return SHLIBPP_VERSION_PATCH; -} - -std::string shlibpp::getVersion() -{ - return SHLIBPP_VERSION; -} diff --git a/example/.clang-format b/example/.clang-format deleted file mode 100644 index bc30ce6ff..000000000 --- a/example/.clang-format +++ /dev/null @@ -1,108 +0,0 @@ ---- -Language: Cpp -# BasedOnStyle: WebKit -AccessModifierOffset: -4 -AlignAfterOpenBracket: Align -AlignConsecutiveAssignments: false -AlignConsecutiveDeclarations: false -AlignEscapedNewlines: Left -AlignOperands: true -AlignTrailingComments: false -AllowAllParametersOfDeclarationOnNextLine: false -AllowShortBlocksOnASingleLine: false -AllowShortCaseLabelsOnASingleLine: false -AllowShortFunctionsOnASingleLine: Inline -AllowShortIfStatementsOnASingleLine: false -AllowShortLoopsOnASingleLine: false -AlwaysBreakAfterDefinitionReturnType: None -AlwaysBreakAfterReturnType: None -AlwaysBreakBeforeMultilineStrings: false -AlwaysBreakTemplateDeclarations: true -BinPackArguments: false -BinPackParameters: false -BraceWrapping: - AfterClass: true - AfterControlStatement: false - AfterEnum: true - AfterFunction: true - AfterNamespace: false - AfterObjCDeclaration: false - AfterStruct: true - AfterUnion: false - BeforeCatch: true - BeforeElse: true - IndentBraces: false - SplitEmptyFunction: false - SplitEmptyRecord: false - SplitEmptyNamespace: false -BreakBeforeBinaryOperators: NonAssignment -BreakBeforeBraces: Custom -BreakBeforeInheritanceComma: true -BreakBeforeTernaryOperators: true -BreakConstructorInitializersBeforeComma: true -BreakConstructorInitializers: BeforeComma -BreakAfterJavaFieldAnnotations: false -BreakStringLiterals: true -ColumnLimit: 100 -CommentPragmas: '^ IWYU pragma:' -CompactNamespaces: false -ConstructorInitializerAllOnOneLineOrOnePerLine: false -ConstructorInitializerIndentWidth: 4 -ContinuationIndentWidth: 4 -Cpp11BracedListStyle: true -DerivePointerAlignment: false -DisableFormat: false -ExperimentalAutoDetectBinPacking: false -FixNamespaceComments: true -ForEachMacros: - - foreach - - Q_FOREACH - - BOOST_FOREACH -IncludeBlocks: Preserve -IncludeCategories: - - Regex: '^"(llvm|llvm-c|clang|clang-c)/' - Priority: 2 - - Regex: '^(<|"(gtest|gmock|isl|json)/)' - Priority: 3 - - Regex: '.*' - Priority: 1 -IncludeIsMainRegex: '(Test)?$' -IndentCaseLabels: true -IndentWidth: 4 -IndentWrappedFunctionNames: false -JavaScriptQuotes: Leave -JavaScriptWrapImports: true -KeepEmptyLinesAtTheStartOfBlocks: true -MacroBlockBegin: '' -MacroBlockEnd: '' -MaxEmptyLinesToKeep: 1 -NamespaceIndentation: All -ObjCBlockIndentWidth: 4 -ObjCSpaceAfterProperty: true -ObjCSpaceBeforeProtocolList: true -PenaltyBreakAssignment: 2 -PenaltyBreakBeforeFirstCallParameter: 19 -PenaltyBreakComment: 300 -PenaltyBreakFirstLessLess: 120 -PenaltyBreakString: 1000 -PenaltyExcessCharacter: 1000000 -PenaltyReturnTypeOnItsOwnLine: 60 -PointerAlignment: Left -ReflowComments: true -SortIncludes: true -SortUsingDeclarations: true -SpaceAfterCStyleCast: true -SpaceAfterTemplateKeyword: true -SpaceBeforeAssignmentOperators: true -SpaceBeforeParens: ControlStatements -SpaceInEmptyParentheses: false -SpacesBeforeTrailingComments: 1 -SpacesInAngles: false -SpacesInContainerLiterals: true -SpacesInCStyleCastParentheses: false -SpacesInParentheses: false -SpacesInSquareBrackets: false -Standard: Cpp11 -TabWidth: 4 -UseTab: Never -... diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt deleted file mode 100644 index 374aad6b9..000000000 --- a/example/CMakeLists.txt +++ /dev/null @@ -1,56 +0,0 @@ -cmake_minimum_required(VERSION 3.5) -project(ExampleToolbox LANGUAGES CXX VERSION 0.1) - -# C++ standard -set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -# Export all symbols in Windows -set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) - -# Utility for defining install folders -include(GNUInstallDirs) - -# Tweak linker flags in Linux. -# Matlab is very strict on missing symbols and by default ld do not warn if -# something is missing. -if(UNIX AND NOT APPLE) - get_filename_component(LINKER_BIN ${CMAKE_LINKER} NAME) - if(${LINKER_BIN} STREQUAL "ld") - set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--unresolved-symbols=report-all") - endif() -endif() - -# =========== -# C++ LIBRARY -# =========== - -# Find the needed WBToolbox components: -# - ToolboxCore contains the core classes such as Block and Signal -# - ToolboxMex is required at runtime for loading the library from Simulink -find_package(WBToolbox 4 REQUIRED COMPONENTS ToolboxCore ToolboxMex) - -# Find the project for the multiplatform support of plugin libraries. -# It is shipped with WBToolbox and it should be already installed in your system. -find_package(shlibpp REQUIRED) - -# Create the plugin library. This must be a SHARED library. -add_library(ExampleToolbox SHARED - include/SignalMath.h - src/SignalMath.cpp - src/Factory.cpp) - -# Manually set the name of the output library. This is not required and it -# is done only for sake of clarity. -set_target_properties(ExampleToolbox PROPERTIES - OUTPUT_NAME "ExampleToolbox") - -# Link the library with the Core component containing the core classes -# and the target that provides the plugin support -target_link_libraries(ExampleToolbox - WBToolbox::Core shlibpp::shlibpp) - -# Setup the include directories -target_include_directories(ExampleToolbox PUBLIC - $ - $) diff --git a/example/README.md b/example/README.md deleted file mode 100644 index 5b5d269a0..000000000 --- a/example/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# Toolbox Example - -This folder contains a simple toolbox with a test block. It can be used as starting point to create a new toolbox based on the machinery provided by Whole Body Toolbox. - -It is also the result of the tutorial [Toolbox Example](https://robotology.github.io/wb-toolbox/mkdocs/create_new_library/). - -### Instructions - -Execute the following commands to build the example: - -```bash -cd example/ -mkdir build -cd build -cmake .. -cmake --build . -``` - -On a Linux distribution, you can test the Toolbox Example library as follows: - -```bash -cd example/ -export LD_LIBRARY_PATH=$(pwd)/build:$LD_LIBRARY_PATH -export MATLABPATH=$(pwd)/matlab:$MATLABPATH -matlab -``` - -Finally, open the `Model.mdl` file and run it. \ No newline at end of file diff --git a/example/include/SignalMath.h b/example/include/SignalMath.h deleted file mode 100644 index 4a3fff687..000000000 --- a/example/include/SignalMath.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#ifndef EXAMPLE_SIGNALMATH_H -#define EXAMPLE_SIGNALMATH_H - -#include -#include - -#include -#include - -namespace example { - class SignalMath; -} // namespace example - -class example::SignalMath : public wbt::Block -{ -private: - enum class Operation - { - ADDITION, - SUBTRACTION, - MULTIPLICATION, - }; - - Operation m_operation; - -public: - static const std::string ClassName; - - SignalMath() = default; - ~SignalMath() override = default; - - unsigned numberOfParameters() override; - bool parseParameters(wbt::BlockInformation* blockInfo) override; - bool configureSizeAndPorts(wbt::BlockInformation* blockInfo) override; - bool initialize(wbt::BlockInformation* blockInfo) override; - bool output(const wbt::BlockInformation* blockInfo) override; - bool terminate(const wbt::BlockInformation* blockInfo) override; -}; - -#endif // EXAMPLE_SIGNALMATH_H diff --git a/example/matlab/ExampleToolbox.slx b/example/matlab/ExampleToolbox.slx deleted file mode 100644 index 3ca0ffbda4030034d7ee788186840f80200b13c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22004 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 SkwAAr48WTj_|~Si`|Cf#4Pe&* diff --git a/example/matlab/Model.mdl b/example/matlab/Model.mdl deleted file mode 100644 index 65cd53201..000000000 --- a/example/matlab/Model.mdl +++ /dev/null @@ -1,1174 +0,0 @@ -Model { - Name "Model" - Version 9.1 - SavedCharacterEncoding "UTF-8" - GraphicalInterface { - NumRootInports 0 - NumRootOutports 0 - ParameterArgumentNames "" - ComputedModelVersion "1.12" - NumModelReferences 0 - NumTestPointedSignals 0 - NumProvidedFunctions 0 - NumRequiredFunctions 0 - NumResetEvents 0 - HasInitializeEvent 0 - HasTerminateEvent 0 - IsExportFunctionModel 0 - NumParameterArguments 0 - NumExternalFileReferences 1 - ExternalFileReference { - Reference "ExampleToolbox/Signal Math" - Path "Model/w// mask" - SID "8" - Type "LIBRARY_BLOCK" - } - OrderedModelArguments 1 - } - DiagnosticSuppressor "on" - SuppressorTable "22 serialization::archive 11 0 6 0 0 0 1 0" - Notes "" - NotesPlugin "on" - LogicAnalyzerGraphicalSettings "" - LogicAnalyzerPlugin "on" - LogicAnalyzerSignalOrdering "" - CustomCodeFunctionData "" - SLCCPlugin "on" - ScopeRefreshTime 0.035000 - OverrideScopeRefreshTime on - DisableAllScopes off - DataTypeOverride "UseLocalSettings" - DataTypeOverrideAppliesTo "AllNumericTypes" - MinMaxOverflowLogging "UseLocalSettings" - MinMaxOverflowArchiveMode "Overwrite" - FPTRunName "Run 1" - MaxMDLFileLineLength 120 - LastSavedArchitecture "glnxa64" - Object { - $PropName "BdWindowsInfo" - $ObjectID 1 - $ClassName "Simulink.BDWindowsInfo" - Object { - $PropName "WindowsInfo" - $ObjectID 2 - $ClassName "Simulink.WindowInfo" - IsActive [1] - Location [200.0, 70.0, 1575.0, 918.0] - Object { - $PropName "ModelBrowserInfo" - $ObjectID 3 - $ClassName "Simulink.ModelBrowserInfo" - Visible [0] - DockPosition "Left" - Width [50] - Height [50] - Filter [9] - } - Object { - $PropName "ExplorerBarInfo" - $ObjectID 4 - $ClassName "Simulink.ExplorerBarInfo" - Visible [1] - } - Object { - $PropName "EditorsInfo" - $ObjectID 5 - $ClassName "Simulink.EditorInfo" - IsActive [1] - ViewObjType "SimulinkTopLevel" - LoadSaveID "0" - Extents [1521.0, 688.0] - ZoomFactor [1.5] - Offset [-87.952221478008482, -101.92174592542986] - } - Object { - $PropName "DockComponentsInfo" - $ObjectID 6 - $ClassName "Simulink.DockComponentInfo" - Type "GLUE2:PropertyInspector" - ID "Property Inspector" - Visible [0] - CreateCallback "" - UserData "" - Floating [0] - DockPosition "Right" - Width [640] - Height [480] - } - WindowState "AAAA/wAAAAD9AAAAAgAAAAAAAAC9AAAB+PwCAAAAA/sAAAAWAEQAbwBjAGsAVwBpAGQAZwBlAHQAMwEAAAAxAAAB+AAAA" - "AAAAAAA+wAAABYARABvAGMAawBXAGkAZABnAGUAdAA0AAAAAAD/////AAAAAAAAAAD7AAAAUgBHAEwAVQBFADIAIAB0AHIAZQBlACAAYwBvAG0Ac" - "ABvAG4AZQBuAHQALwBHAEwAVQBFADIAIAB0AHIAZQBlACAAYwBvAG0AcABvAG4AZQBuAHQAAAAAAP////8AAAB4AP///wAAAAEAAAAAAAAAAPwCA" - "AAAAfsAAABUAEcATABVAEUAMgA6AFAAcgBvAHAAZQByAHQAeQBJAG4AcwBwAGUAYwB0AG8AcgAvAFAAcgBvAHAAZQByAHQAeQAgAEkAbgBzAHAAZ" - "QBjAHQAbwByAAAAAAD/////AAAAMQD///8AAAYXAAAC9gAAAAEAAAACAAAAAQAAAAL8AAAAAQAAAAIAAAAP/////wAAAAAA/////wAAAAAAAAAA/" - "////wEAAAAA/////wAAAAAAAAAA/////wAAAAAA/////wAAAAAAAAAA/////wAAAAAA/////wAAAAAAAAAA/////wAAAAAA/////wAAAAAAAAAA/" - "////wEAAACG/////wAAAAAAAAAA/////wEAAADu/////wAAAAAAAAAA/////wAAAAAA/////wAAAAAAAAAA/////wEAAAF0/////wAAAAAAAAAA/" - "////wAAAAAA/////wAAAAAAAAAA/////wAAAAAA/////wAAAAAAAAAA/////wAAAAAA/////wAAAAAAAAAA/////wEAAAOq/////wAAAAAAAAAA/" - "////wEAAAPf/////wAAAAAAAAAA/////wAAAAAA/////wAAAAAAAAAA" - } - } - HideAutomaticNames off - Created "Wed Aug 08 16:01:42 2018" - Creator "dferigo" - UpdateHistory "UpdateHistoryNever" - ModifiedByFormat "%" - LastModifiedBy "dferigo" - ModifiedDateFormat "%" - LastModifiedDate "Fri Aug 10 16:26:57 2018" - RTWModifiedTimeStamp 455819216 - ModelVersionFormat "1.%" - SampleTimeColors off - SampleTimeAnnotations off - LibraryLinkDisplay "all" - WideLines off - ShowLineDimensions off - ShowPortDataTypes off - PortDataTypeDisplayFormat "AliasTypeOnly" - ShowEditTimeErrors on - ShowEditTimeWarnings on - ShowEditTimeAdvisorChecks off - ShowPortUnits off - ShowDesignRanges off - ShowLoopsOnError on - IgnoreBidirectionalLines off - ShowStorageClass off - ShowTestPointIcons on - ShowSignalResolutionIcons on - ShowViewerIcons on - SortedOrder off - VariantCondition off - ShowSubsystemDomainSpec off - ExecutionContextIcon off - ShowLinearizationAnnotations on - ShowVisualizeInsertedRTB on - ShowMarkup on - BlockNameDataTip off - BlockParametersDataTip off - BlockDescriptionStringDataTip off - BlockVariantConditionDataTip off - ToolBar on - StatusBar on - BrowserShowLibraryLinks off - FunctionConnectors off - BrowserLookUnderMasks off - MultiThreadCoSim on - SimulationMode "normal" - VisualizeLoggedSignalsWhenLoggingToFile off - PauseTimes "5" - NumberOfSteps 1 - SnapshotBufferSize 10 - SnapshotInterval 10 - NumberOfLastSnapshots 0 - EnablePacing off - PacingRate 1 - LinearizationMsg "none" - Profile off - ParamWorkspaceSource "MATLABWorkspace" - AccelSystemTargetFile "accel.tlc" - AccelTemplateMakefile "accel_default_tmf" - AccelMakeCommand "make_rtw" - TryForcingSFcnDF off - Object { - $PropName "DataLoggingOverride" - $ObjectID 7 - $ClassName "Simulink.SimulationData.ModelLoggingInfo" - model_ "Model" - overrideMode_ [0.0] - Array { - Type "Cell" - Dimension 1 - Cell "Model" - PropName "logAsSpecifiedByModels_" - } - Array { - Type "Cell" - Dimension 1 - Cell [] - PropName "logAsSpecifiedByModelsSSIDs_" - } - } - ExtModeBatchMode off - ExtModeEnableFloating on - ExtModeTrigType "manual" - ExtModeTrigMode "normal" - ExtModeTrigPort "1" - ExtModeTrigElement "any" - ExtModeTrigDuration 1000 - ExtModeTrigDurationFloating "auto" - ExtModeTrigHoldOff 0 - ExtModeTrigDelay 0 - ExtModeTrigDirection "rising" - ExtModeTrigLevel 0 - ExtModeArchiveMode "off" - ExtModeAutoIncOneShot off - ExtModeIncDirWhenArm off - ExtModeAddSuffixToVar off - ExtModeWriteAllDataToWs off - ExtModeArmWhenConnect on - ExtModeSkipDownloadWhenConnect off - ExtModeLogAll on - ExtModeAutoUpdateStatusClock on - ShowModelReferenceBlockVersion off - ShowModelReferenceBlockIO off - OrderedModelArguments on - Array { - Type "Handle" - Dimension 1 - Simulink.ConfigSet { - $ObjectID 8 - Version "1.18.0" - DisabledProps [] - Description "" - Array { - Type "Handle" - Dimension 9 - Simulink.SolverCC { - $ObjectID 9 - Version "1.18.0" - DisabledProps [] - Description "" - StartTime "0.0" - StopTime "10.0" - AbsTol "auto" - AutoScaleAbsTol "on" - FixedStep "auto" - InitialStep "auto" - MaxOrder 5 - ZcThreshold "auto" - ConsecutiveZCsStepRelTol "10*128*eps" - MaxConsecutiveZCs "1000" - ExtrapolationOrder 4 - NumberNewtonIterations 1 - MaxStep "auto" - MinStep "auto" - MaxConsecutiveMinStep "1" - RelTol "1e-3" - EnableMultiTasking off - ConcurrentTasks off - Solver "VariableStepAuto" - SolverName "VariableStepAuto" - SolverJacobianMethodControl "auto" - ShapePreserveControl "DisableAll" - ZeroCrossControl "UseLocalSettings" - ZeroCrossAlgorithm "Nonadaptive" - AlgebraicLoopSolver "TrustRegion" - SolverInfoToggleStatus off - IsAutoAppliedInSIP off - SolverResetMethod "Fast" - PositivePriorityOrder off - AutoInsertRateTranBlk off - SampleTimeConstraint "Unconstrained" - InsertRTBMode "Whenever possible" - SampleTimeProperty [] - DecoupledContinuousIntegration off - MinimalZcImpactIntegration off - } - Simulink.DataIOCC { - $ObjectID 10 - Version "1.18.0" - DisabledProps [] - Description "" - Decimation "1" - ExternalInput "[t, u]" - FinalStateName "xFinal" - InitialState "xInitial" - LimitDataPoints off - MaxDataPoints "1000" - LoadExternalInput off - LoadInitialState off - SaveFinalState off - SaveCompleteFinalSimState off - SaveFormat "Dataset" - SignalLoggingSaveFormat "Dataset" - SaveOutput on - SaveState off - SignalLogging on - DSMLogging on - InspectSignalLogs off - VisualizeSimOutput on - StreamToWorkspace off - StreamVariableName "streamout" - SaveTime on - ReturnWorkspaceOutputs off - StateSaveName "xout" - TimeSaveName "tout" - OutputSaveName "yout" - SignalLoggingName "logsout" - DSMLoggingName "dsmout" - OutputOption "RefineOutputTimes" - OutputTimes "[]" - ReturnWorkspaceOutputsName "out" - Refine "1" - LoggingToFile off - DatasetSignalFormat "timeseries" - LoggingFileName "out.mat" - LoggingIntervals "[-inf, inf]" - } - Simulink.OptimizationCC { - $ObjectID 11 - Version "1.18.0" - Array { - Type "Cell" - Dimension 8 - Cell "BooleansAsBitfields" - Cell "PassReuseOutputArgsAs" - Cell "PassReuseOutputArgsThreshold" - Cell "ZeroExternalMemoryAtStartup" - Cell "ZeroInternalMemoryAtStartup" - Cell "OptimizeModelRefInitCode" - Cell "NoFixptDivByZeroProtection" - Cell "UseSpecifiedMinMax" - PropName "DisabledProps" - } - Description "" - BlockReduction on - BooleanDataType on - ConditionallyExecuteInputs on - DefaultParameterBehavior "Tunable" - UseDivisionForNetSlopeComputation "off" - UseFloatMulNetSlope off - DefaultUnderspecifiedDataType "double" - UseSpecifiedMinMax off - InlineInvariantSignals off - OptimizeBlockIOStorage on - BufferReuse on - EnhancedBackFolding off - CachingGlobalReferences off - GlobalBufferReuse on - StrengthReduction off - AdvancedOptControl "" - ExpressionFolding on - BooleansAsBitfields off - BitfieldContainerType "uint_T" - EnableMemcpy on - MemcpyThreshold 64 - PassReuseOutputArgsAs "Structure reference" - PassReuseOutputArgsThreshold 12 - ExpressionDepthLimit 128 - LocalBlockOutputs on - RollThreshold 5 - StateBitsets off - DataBitsets off - ActiveStateOutputEnumStorageType "Native Integer" - ZeroExternalMemoryAtStartup on - ZeroInternalMemoryAtStartup on - InitFltsAndDblsToZero off - NoFixptDivByZeroProtection off - EfficientFloat2IntCast off - EfficientMapNaN2IntZero on - LifeSpan "auto" - MaxStackSize "Inherit from target" - BufferReusableBoundary on - SimCompilerOptimization "off" - AccelVerboseBuild off - OptimizeBlockOrder "off" - OptimizeDataStoreBuffers on - BusAssignmentInplaceUpdate on - DifferentSizesBufferReuse off - OptimizationLevel "level2" - OptimizationPriority "Balanced" - OptimizationCustomize on - UseRowMajorAlgorithm off - LabelGuidedReuse off - } - Simulink.DebuggingCC { - $ObjectID 12 - Version "1.18.0" - Array { - Type "Cell" - Dimension 1 - Cell "UseOnlyExistingSharedCode" - PropName "DisabledProps" - } - Description "" - RTPrefix "error" - ConsistencyChecking "none" - ArrayBoundsChecking "none" - SignalInfNanChecking "none" - StringTruncationChecking "error" - SignalRangeChecking "none" - ReadBeforeWriteMsg "UseLocalSettings" - WriteAfterWriteMsg "UseLocalSettings" - WriteAfterReadMsg "UseLocalSettings" - AlgebraicLoopMsg "warning" - ArtificialAlgebraicLoopMsg "warning" - SaveWithDisabledLinksMsg "warning" - SaveWithParameterizedLinksMsg "warning" - CheckSSInitialOutputMsg on - UnderspecifiedInitializationDetection "Simplified" - MergeDetectMultiDrivingBlocksExec "error" - CheckExecutionContextPreStartOutputMsg off - CheckExecutionContextRuntimeOutputMsg off - SignalResolutionControl "UseLocalSettings" - BlockPriorityViolationMsg "warning" - MinStepSizeMsg "warning" - TimeAdjustmentMsg "none" - MaxConsecutiveZCsMsg "error" - MaskedZcDiagnostic "warning" - IgnoredZcDiagnostic "warning" - SolverPrmCheckMsg "none" - InheritedTsInSrcMsg "warning" - MultiTaskDSMMsg "error" - MultiTaskCondExecSysMsg "error" - MultiTaskRateTransMsg "error" - SingleTaskRateTransMsg "none" - TasksWithSamePriorityMsg "warning" - ExportedTasksRateTransMsg "none" - SigSpecEnsureSampleTimeMsg "warning" - CheckMatrixSingularityMsg "none" - IntegerOverflowMsg "warning" - Int32ToFloatConvMsg "warning" - ParameterDowncastMsg "error" - ParameterOverflowMsg "error" - ParameterUnderflowMsg "none" - ParameterPrecisionLossMsg "warning" - ParameterTunabilityLossMsg "warning" - FixptConstUnderflowMsg "none" - FixptConstOverflowMsg "none" - FixptConstPrecisionLossMsg "none" - UnderSpecifiedDataTypeMsg "none" - UnnecessaryDatatypeConvMsg "none" - VectorMatrixConversionMsg "none" - InvalidFcnCallConnMsg "error" - FcnCallInpInsideContextMsg "error" - SignalLabelMismatchMsg "none" - UnconnectedInputMsg "warning" - UnconnectedOutputMsg "warning" - UnconnectedLineMsg "warning" - UseOnlyExistingSharedCode "error" - SFcnCompatibilityMsg "none" - FrameProcessingCompatibilityMsg "error" - UniqueDataStoreMsg "none" - BusObjectLabelMismatch "warning" - RootOutportRequireBusObject "warning" - AssertControl "UseLocalSettings" - AllowSymbolicDim on - RowMajorDimensionSupport off - ModelReferenceIOMsg "none" - ModelReferenceMultiInstanceNormalModeStructChecksumCheck "error" - ModelReferenceVersionMismatchMessage "none" - ModelReferenceIOMismatchMessage "none" - UnknownTsInhSupMsg "warning" - ModelReferenceDataLoggingMessage "warning" - ModelReferenceSymbolNameMessage "warning" - ModelReferenceExtraNoncontSigs "error" - StateNameClashWarn "none" - SimStateInterfaceChecksumMismatchMsg "warning" - SimStateOlderReleaseMsg "error" - ChecksumConsistencyForSSReuse "none" - LibraryContextMissingDiagnostic "none" - InitInArrayFormatMsg "warning" - StrictBusMsg "ErrorLevel1" - BusNameAdapt "WarnAndRepair" - NonBusSignalsTreatedAsBus "none" - SymbolicDimMinMaxWarning "warning" - LossOfSymbolicDimsSimulationWarning "warning" - LossOfSymbolicDimsCodeGenerationWarning "error" - SymbolicDimsDataTypeCodeGenerationDiagnostic "error" - BlockIODiagnostic "none" - SFUnusedDataAndEventsDiag "warning" - SFUnexpectedBacktrackingDiag "error" - SFInvalidInputDataAccessInChartInitDiag "warning" - SFNoUnconditionalDefaultTransitionDiag "error" - SFTransitionOutsideNaturalParentDiag "warning" - SFUnreachableExecutionPathDiag "warning" - SFUndirectedBroadcastEventsDiag "warning" - SFTransitionActionBeforeConditionDiag "warning" - SFOutputUsedAsStateInMooreChartDiag "error" - SFTemporalDelaySmallerThanSampleTimeDiag "warning" - SFSelfTransitionDiag "warning" - SFExecutionAtInitializationDiag "warning" - SFMachineParentedDataDiag "warning" - IntegerSaturationMsg "warning" - AllowedUnitSystems "all" - UnitsInconsistencyMsg "warning" - AllowAutomaticUnitConversions on - RCSCRenamedMsg "warning" - RCSCObservableMsg "warning" - ForceCombineOutputUpdateInSim off - UnitDatabase "" - } - Simulink.HardwareCC { - $ObjectID 13 - Version "1.18.0" - DisabledProps [] - Description "" - ProdBitPerChar 8 - ProdBitPerShort 16 - ProdBitPerInt 32 - ProdBitPerLong 32 - ProdBitPerLongLong 64 - ProdBitPerFloat 32 - ProdBitPerDouble 64 - ProdBitPerPointer 64 - ProdBitPerSizeT 64 - ProdBitPerPtrDiffT 64 - ProdLargestAtomicInteger "Char" - ProdLargestAtomicFloat "Float" - ProdIntDivRoundTo "Zero" - ProdEndianess "LittleEndian" - ProdWordSize 64 - ProdShiftRightIntArith on - ProdLongLongMode off - ProdHWDeviceType "Intel->x86-64 (Windows64)" - TargetBitPerChar 8 - TargetBitPerShort 16 - TargetBitPerInt 32 - TargetBitPerLong 32 - TargetBitPerLongLong 64 - TargetBitPerFloat 32 - TargetBitPerDouble 64 - TargetBitPerPointer 32 - TargetBitPerSizeT 32 - TargetBitPerPtrDiffT 32 - TargetLargestAtomicInteger "Char" - TargetLargestAtomicFloat "None" - TargetShiftRightIntArith on - TargetLongLongMode off - TargetIntDivRoundTo "Undefined" - TargetEndianess "Unspecified" - TargetWordSize 32 - TargetPreprocMaxBitsSint 32 - TargetPreprocMaxBitsUint 32 - TargetHWDeviceType "Specified" - TargetUnknown off - ProdEqTarget on - UseEmbeddedCoderFeatures on - UseSimulinkCoderFeatures on - } - Simulink.ModelReferenceCC { - $ObjectID 14 - Version "1.18.0" - DisabledProps [] - Description "" - UpdateModelReferenceTargets "IfOutOfDateOrStructuralChange" - EnableRefExpFcnMdlSchedulingChecks on - CheckModelReferenceTargetMessage "error" - EnableParallelModelReferenceBuilds off - ParallelModelReferenceErrorOnInvalidPool on - ParallelModelReferenceMATLABWorkerInit "None" - ModelReferenceNumInstancesAllowed "Multi" - PropagateVarSize "Infer from blocks in model" - ModelDependencies "" - ModelReferencePassRootInputsByReference on - ModelReferenceMinAlgLoopOccurrences off - PropagateSignalLabelsOutOfModel on - SupportModelReferenceSimTargetCustomCode off - } - Simulink.SFSimCC { - $ObjectID 15 - Version "1.18.0" - DisabledProps [] - Description "" - SimCustomSourceCode "" - SimCustomHeaderCode "" - SimCustomInitializer "" - SimCustomTerminator "" - SimReservedNameArray [] - SimUserSources "" - SimUserIncludeDirs "" - SimUserLibraries "" - SimUserDefines "" - SimCustomCompilerFlags "" - SimCustomLinkerFlags "" - SFSimEcho on - SimCtrlC on - SimIntegrity on - SimUseLocalCustomCode off - SimParseCustomCode on - SimBuildMode "sf_incremental_build" - SimGenImportedTypeDefs off - ModelFunctionsGlobalVisibility "on" - CompileTimeRecursionLimit 50 - EnableRuntimeRecursion on - MATLABDynamicMemAlloc on - MATLABDynamicMemAllocThreshold 65536 - } - Simulink.RTWCC { - $BackupClass "Simulink.RTWCC" - $ObjectID 16 - Version "1.18.0" - Array { - Type "Cell" - Dimension 16 - Cell "IncludeHyperlinkInReport" - Cell "GenerateTraceInfo" - Cell "GenerateTraceReport" - Cell "GenerateTraceReportSl" - Cell "GenerateTraceReportSf" - Cell "GenerateTraceReportEml" - Cell "PortableWordSizes" - Cell "GenerateWebview" - Cell "GenerateCodeMetricsReport" - Cell "GenerateCodeReplacementReport" - Cell "GenerateMissedCodeReplacementReport" - Cell "GenerateErtSFunction" - Cell "CreateSILPILBlock" - Cell "CodeExecutionProfiling" - Cell "CodeProfilingSaveOptions" - Cell "CodeProfilingInstrumentation" - PropName "DisabledProps" - } - SystemTargetFile "grt.tlc" - HardwareBoard "None" - TLCOptions "" - GenCodeOnly off - MakeCommand "make_rtw" - GenerateMakefile on - PackageGeneratedCodeAndArtifacts off - PackageName "" - TemplateMakefile "grt_default_tmf" - PostCodeGenCommand "" - Description "" - GenerateReport off - SaveLog off - RTWVerbose on - RetainRTWFile off - RTWBuildHooks [] - ProfileTLC off - TLCDebug off - TLCCoverage off - TLCAssert off - RTWUseLocalCustomCode off - RTWUseSimCustomCode off - CustomSourceCode "" - CustomHeaderCode "" - CustomInclude "" - CustomSource "" - CustomLibrary "" - CustomDefine "" - CustomLAPACKCallback "" - CustomFFTCallback "" - CustomInitializer "" - CustomTerminator "" - Toolchain "Automatically locate an installed toolchain" - BuildConfiguration "Faster Builds" - CustomToolchainOptions [] - IncludeHyperlinkInReport off - LaunchReport off - PortableWordSizes off - CreateSILPILBlock "None" - CodeExecutionProfiling off - CodeExecutionProfileVariable "executionProfile" - CodeProfilingSaveOptions "SummaryOnly" - CodeProfilingInstrumentation off - SILDebugging off - TargetLang "C" - IncludeBusHierarchyInRTWFileBlockHierarchyMap off - GenerateTraceInfo off - GenerateTraceReport off - GenerateTraceReportSl off - GenerateTraceReportSf off - GenerateTraceReportEml off - GenerateWebview off - GenerateCodeMetricsReport off - GenerateCodeReplacementReport off - GenerateMissedCodeReplacementReport off - RTWCompilerOptimization "off" - ObjectivePriorities [] - RTWCustomCompilerOptimizations "" - CheckMdlBeforeBuild "Off" - SharedConstantsCachingThreshold 1024 - Array { - Type "Handle" - Dimension 2 - Simulink.CodeAppCC { - $ObjectID 17 - Version "1.18.0" - Array { - Type "Cell" - Dimension 28 - Cell "IgnoreCustomStorageClasses" - Cell "IgnoreTestpoints" - Cell "BlockCommentType" - Cell "InsertBlockDesc" - Cell "InsertPolySpaceComments" - Cell "SFDataObjDesc" - Cell "MATLABFcnDesc" - Cell "SimulinkDataObjDesc" - Cell "DefineNamingRule" - Cell "SignalNamingRule" - Cell "ParamNamingRule" - Cell "InternalIdentifier" - Cell "InlinedPrmAccess" - Cell "CustomSymbolStr" - Cell "CustomSymbolStrGlobalVar" - Cell "CustomSymbolStrType" - Cell "CustomSymbolStrField" - Cell "CustomSymbolStrFcn" - Cell "CustomSymbolStrModelFcn" - Cell "CustomSymbolStrFcnArg" - Cell "CustomSymbolStrBlkIO" - Cell "CustomSymbolStrTmpVar" - Cell "CustomSymbolStrMacro" - Cell "CustomSymbolStrUtil" - Cell "CustomSymbolStrEmxType" - Cell "CustomSymbolStrEmxFcn" - Cell "CustomUserTokenString" - Cell "ReqsInCode" - PropName "DisabledProps" - } - Description "" - Comment "" - ForceParamTrailComments off - GenerateComments on - CommentStyle "Auto" - IgnoreCustomStorageClasses on - IgnoreTestpoints off - MaxIdLength 31 - PreserveName off - PreserveNameWithParent off - ShowEliminatedStatement off - OperatorAnnotations off - SimulinkDataObjDesc off - SFDataObjDesc off - MATLABFcnDesc off - MangleLength 1 - SharedChecksumLength 8 - CustomSymbolStrGlobalVar "$R$N$M" - CustomSymbolStrType "$N$R$M_T" - CustomSymbolStrField "$N$M" - CustomSymbolStrFcn "$R$N$M$F" - CustomSymbolStrModelFcn "$R$N" - CustomSymbolStrFcnArg "rt$I$N$M" - CustomSymbolStrBlkIO "rtb_$N$M" - CustomSymbolStrTmpVar "$N$M" - CustomSymbolStrMacro "$R$N$M" - CustomSymbolStrUtil "$N$C" - CustomSymbolStrEmxType "emxArray_$M$N" - CustomSymbolStrEmxFcn "emx$M$N" - CustomUserTokenString "" - CustomCommentsFcn "" - DefineNamingRule "None" - DefineNamingFcn "" - ParamNamingRule "None" - ParamNamingFcn "" - SignalNamingRule "None" - SignalNamingFcn "" - InsertBlockDesc off - InsertPolySpaceComments off - SimulinkBlockComments on - BlockCommentType "BlockPathComment" - StateflowObjectComments off - MATLABSourceComments off - EnableCustomComments off - InternalIdentifierFile "" - InternalIdentifier "Shortened" - InlinedPrmAccess "Literals" - ReqsInCode off - UseSimReservedNames off - ReservedNameArray [] - } - Simulink.GRTTargetCC { - $BackupClass "Simulink.TargetCC" - $ObjectID 18 - Version "1.18.0" - Array { - Type "Cell" - Dimension 15 - Cell "IncludeMdlTerminateFcn" - Cell "SuppressErrorStatus" - Cell "ERTCustomFileBanners" - Cell "GenerateSampleERTMain" - Cell "ExistingSharedCode" - Cell "GenerateTestInterfaces" - Cell "ModelStepFunctionPrototypeControlCompliant" - Cell "GenerateAllocFcn" - Cell "PurelyIntegerCode" - Cell "SupportComplex" - Cell "SupportAbsoluteTime" - Cell "SupportContinuousTime" - Cell "SupportNonInlinedSFcns" - Cell "RemoveDisableFunc" - Cell "RemoveResetFunc" - PropName "DisabledProps" - } - Description "" - TargetFcnLib "ansi_tfl_table_tmw.mat" - TargetLibSuffix "" - TargetPreCompLibLocation "" - GenFloatMathFcnCalls "NOT IN USE" - TargetLangStandard "C99 (ISO)" - CodeReplacementLibrary "None" - UtilityFuncGeneration "Auto" - MultiwordTypeDef "System defined" - MultiwordLength 2048 - DynamicStringBufferSize 256 - GenerateFullHeader on - InferredTypesCompatibility off - ExistingSharedCode "" - GenerateSampleERTMain off - GenerateTestInterfaces off - ModelReferenceCompliant on - ParMdlRefBuildCompliant on - CompOptLevelCompliant on - ConcurrentExecutionCompliant on - IncludeMdlTerminateFcn on - GeneratePreprocessorConditionals "Use local settings" - CombineOutputUpdateFcns on - CombineSignalStateStructs off - SuppressErrorStatus off - IncludeFileDelimiter "Auto" - ERTCustomFileBanners off - SupportAbsoluteTime on - LogVarNameModifier "rt_" - MatFileLogging on - MultiInstanceERTCode off - CodeInterfacePackaging "Nonreusable function" - SupportNonFinite on - SupportComplex on - PurelyIntegerCode off - SupportContinuousTime on - SupportNonInlinedSFcns on - RemoveDisableFunc off - RemoveResetFunc off - SupportVariableSizeSignals off - ParenthesesLevel "Nominal" - CastingMode "Nominal" - MATLABClassNameForMDSCustomization "Simulink.SoftwareTarget.GRTCustomization" - ModelStepFunctionPrototypeControlCompliant off - CPPClassGenCompliant on - AutosarCompliant off - MDXCompliant off - GRTInterface off - GenerateAllocFcn off - UseToolchainInfoCompliant on - GenerateSharedConstants on - CoderGroups [] - AccessMethods [] - LookupTableObjectStructAxisOrder "1,2,3,4,..." - LUTObjectStructOrderExplicitValues "Size,Breakpoints,Table" - LUTObjectStructOrderEvenSpacing "Size,Breakpoints,Table" - ArrayLayout "Column-major" - ERTHeaderFileRootName "$R$E" - ERTSourceFileRootName "$R$E" - ERTDataFileRootName "$R_data" - UseMalloc off - ExtMode off - ExtModeStaticAlloc off - ExtModeTesting off - ExtModeStaticAllocSize 1000000 - ExtModeTransport 0 - ExtModeMexFile "ext_comm" - ExtModeMexArgs "" - ExtModeIntrfLevel "Level1" - RTWCAPISignals off - RTWCAPIParams off - RTWCAPIStates off - RTWCAPIRootIO off - GenerateASAP2 off - MultiInstanceErrorCode "Error" - } - PropName "Components" - } - } - SlCovCC.ConfigComp { - $ObjectID 19 - Version "1.18.0" - DisabledProps [] - Description "Simulink Coverage Configuration Component" - Name "Simulink Coverage" - CovEnable off - CovScope "EntireSystem" - CovIncludeTopModel on - RecordCoverage off - CovPath "/" - CovSaveName "covdata" - CovCompData "" - CovMetricSettings "dwe" - CovFilter "" - CovHTMLOptions "" - CovNameIncrementing off - CovHtmlReporting off - CovForceBlockReductionOff on - CovEnableCumulative on - CovSaveCumulativeToWorkspaceVar off - CovSaveSingleToWorkspaceVar off - CovCumulativeVarName "covCumulativeData" - CovCumulativeReport off - CovSaveOutputData on - CovOutputDir "slcov_output/$ModelName$" - CovDataFileName "$ModelName$_cvdata" - CovShowResultsExplorer on - CovReportOnPause on - CovModelRefEnable "off" - CovModelRefExcluded "" - CovExternalEMLEnable on - CovSFcnEnable on - CovBoundaryAbsTol 1e-05 - CovBoundaryRelTol 0.01 - CovUseTimeInterval off - CovStartTime 0 - CovStopTime 0 - CovMcdcMode "Masking" - } - PropName "Components" - } - Name "Configuration" - ExtraOptions "" - CurrentDlgPage "Solver" - ConfigPrmDlgPosition [ 145, 177, 1135, 847 ] - } - PropName "ConfigurationSets" - } - Simulink.ConfigSet { - $PropName "ActiveConfigurationSet" - $ObjectID 8 - } - Object { - $PropName "DataTransfer" - $ObjectID 20 - $ClassName "Simulink.GlobalDataTransfer" - DefaultTransitionBetweenSyncTasks "Ensure deterministic transfer (maximum delay)" - DefaultTransitionBetweenAsyncTasks "Ensure data integrity only" - DefaultTransitionBetweenContTasks "Ensure deterministic transfer (minimum delay)" - DefaultExtrapolationMethodBetweenContTasks "None" - AutoInsertRateTranBlk [0] - } - ExplicitPartitioning off - BlockDefaults { - ForegroundColor "black" - BackgroundColor "white" - DropShadow off - NamePlacement "normal" - FontName "Helvetica" - FontSize 10 - FontWeight "normal" - FontAngle "normal" - ShowName on - HideAutomaticName on - BlockRotation 0 - BlockMirror off - } - AnnotationDefaults { - HorizontalAlignment "left" - VerticalAlignment "top" - ForegroundColor "black" - BackgroundColor "white" - DropShadow off - FontName "Helvetica" - FontSize 10 - FontWeight "normal" - FontAngle "normal" - MarkupType "model" - UseDisplayTextAsClickCallback off - AnnotationType "note_annotation" - FixedHeight off - FixedWidth off - Interpreter "off" - } - LineDefaults { - FontName "Helvetica" - FontSize 9 - FontWeight "normal" - FontAngle "normal" - } - MaskDefaults { - SelfModifiable "off" - IconFrame "on" - IconOpaque "opaque" - RunInitForIconRedraw "analyze" - IconRotate "none" - PortRotate "default" - IconUnits "autoscale" - } - MaskParameterDefaults { - Evaluate "on" - Tunable "on" - NeverSave "off" - Internal "off" - ReadOnly "off" - Enabled "on" - Visible "on" - ToolTip "on" - } - BlockParameterDefaults { - Block { - BlockType Constant - Value "1" - VectorParams1D on - SamplingMode "Sample based" - OutMin "[]" - OutMax "[]" - OutDataTypeStr "Inherit: Inherit from 'Constant value'" - LockScale off - SampleTime "inf" - FramePeriod "inf" - PreserveConstantTs off - } - Block { - BlockType Display - Format "short" - Decimation "10" - Floating off - Lockdown off - SampleTime "-1" - } - Block { - BlockType S-Function - FunctionName "system" - SFunctionModules "''" - PortCounts "[]" - MultiThreadCoSim "auto" - } - } - System { - Name "Model" - Location [200, 70, 1775, 988] - Open on - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "150" - ReportName "simulink-default.rpt" - SIDHighWatermark "11" - Block { - BlockType Constant - Name "Constant" - SID "2" - Position [175, 185, 260, 215] - ZOrder 3 - NamePlacement "alternate" - Value "[1, 2, 3, 4, 5]" - Port { - PortNumber 1 - Name "input1" - } - } - Block { - BlockType Constant - Name "Constant1" - SID "3" - Position [175, 220, 260, 250] - ZOrder 4 - Value "[2, 2, 2, 2, 2]" - Port { - PortNumber 1 - Name "input2" - } - } - Block { - BlockType Constant - Name "Constant2" - SID "9" - Position [175, 0, 260, 30] - ZOrder 10 - NamePlacement "alternate" - Value "[1, 2, 3, 4, 5]" - } - Block { - BlockType Constant - Name "Constant3" - SID "10" - Position [175, 35, 260, 65] - ZOrder 11 - Value "[2, 2, 2, 2, 2]" - } - Block { - BlockType Display - Name "Display" - SID "4" - Ports [1] - Position [500, 167, 580, 273] - ZOrder 5 - Decimation "1" - } - Block { - BlockType Display - Name "Display1" - SID "11" - Ports [1] - Position [500, -18, 580, 88] - ZOrder 12 - Decimation "1" - } - Block { - BlockType Reference - Name "w/ mask" - SID "8" - Ports [2, 1] - Position [335, -1, 470, 66] - ZOrder 9 - LibraryVersion "1.8" - SourceBlock "ExampleToolbox/Signal Math" - SourceType "" - SourceProductName "Example Toolbox" - MultiThreadCoSim "auto" - operation "Multiplication" - } - Block { - BlockType S-Function - Name "w/o mask" - SID "7" - Ports [2, 1] - Position [370, 184, 430, 251] - ZOrder 8 - FunctionName "WBToolbox" - Parameters "'SignalMath','ExampleToolbox','Addition'" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - Port { - PortNumber 1 - Name "output" - } - } - Line { - Name "input1" - ZOrder 11 - Labels [1, 0] - SrcBlock "Constant" - SrcPort 1 - DstBlock "w/o mask" - DstPort 1 - } - Line { - Name "input2" - ZOrder 12 - Labels [1, 1] - SrcBlock "Constant1" - SrcPort 1 - DstBlock "w/o mask" - DstPort 2 - } - Line { - Name "output" - ZOrder 13 - Labels [1, 1] - SrcBlock "w/o mask" - SrcPort 1 - DstBlock "Display" - DstPort 1 - } - Line { - ZOrder 14 - SrcBlock "Constant2" - SrcPort 1 - DstBlock "w/ mask" - DstPort 1 - } - Line { - ZOrder 15 - SrcBlock "Constant3" - SrcPort 1 - DstBlock "w/ mask" - DstPort 2 - } - Line { - ZOrder 16 - SrcBlock "w/ mask" - SrcPort 1 - DstBlock "Display1" - DstPort 1 - } - } -} diff --git a/example/matlab/slblocks.m b/example/matlab/slblocks.m deleted file mode 100644 index 1fc5e2d8c..000000000 --- a/example/matlab/slblocks.m +++ /dev/null @@ -1,11 +0,0 @@ -% Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT). All rights reserved. -% This software may be modified and distributed under the terms of the -% GNU Lesser General Public License v2.1 or any later version. - -function blkStruct = slblocks - -Browser.Library = 'ExampleToolbox'; -Browser.Name = 'Example Toolbox'; -Browser.IsFlat = 0; - -blkStruct.Browser = Browser; \ No newline at end of file diff --git a/example/src/Factory.cpp b/example/src/Factory.cpp deleted file mode 100644 index cd3db4abe..000000000 --- a/example/src/Factory.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "SignalMath.h" - -// Class factory API -#include - -// Add the example::SignalMath class to the plugin factory -SHLIBPP_DEFINE_SHARED_SUBCLASS(SignalMath, example::SignalMath, wbt::Block); diff --git a/example/src/SignalMath.cpp b/example/src/SignalMath.cpp deleted file mode 100644 index d49635d8c..000000000 --- a/example/src/SignalMath.cpp +++ /dev/null @@ -1,166 +0,0 @@ -#include "SignalMath.h" - -#include -#include -#include - -using namespace example; - -unsigned SignalMath::numberOfParameters() -{ - // The base wbt::Block class needs parameters (e.g. the ClassName). - // You must specify here how many more parameters this class needs. - // Our example needs just one more: the operation to perform. - return Block::numberOfParameters() + 1; -} - -// This method should let BlockInformation know the parameters metadata -bool SignalMath::parseParameters(wbt::BlockInformation* blockInfo) -{ - // Initialize information for our only parameter - int rows = 1; - int cols = 1; - std::string name = "Operation"; // This label is used to access the param later - unsigned index = Block::numberOfParameters(); // Indices start from 0 - wbt::ParameterType type = wbt::ParameterType::STRING; - - // Create the parameter - wbt::ParameterMetadata parameterMetadata(type, index, rows, cols, name); - - // Add the parameter metadata into the BlockInformation - if (!blockInfo->addParameterMetadata(parameterMetadata)) { - wbtError << "Failed to store parameter metadata"; - return false; - } - - // Ask to the BlockInformation interface to parse the parameters and store them into - // the m_parameters variable. This variable is contained in the wbt::Block class. - bool paramParsedOk = blockInfo->parseParameters(m_parameters); - - // Return the outcome of the parameter parsing. - // If the parsing fails, the execution stops. - return paramParsedOk; -} - -// Keep in mind that after this step, all the allocated memory will be deleted. -// Memory persistency is guaranteed starting from the initialize method. -bool SignalMath::configureSizeAndPorts(wbt::BlockInformation* blockInfo) -{ - // The base wbt::Block class need to be configured - if (!wbt::Block::configureSizeAndPorts(blockInfo)) { - return false; - } - - // Create data about input and output ports. - wbt::BlockInformation::PortData input1; - wbt::BlockInformation::PortData input2; - wbt::BlockInformation::PortData output; - input1 = {/*portIndex=*/0, std::vector{wbt::Signal::DynamicSize}, wbt::DataType::DOUBLE}; - input2 = {/*portIndex=*/1, std::vector{wbt::Signal::DynamicSize}, wbt::DataType::DOUBLE}; - output = {/*portIndex=*/0, std::vector{wbt::Signal::DynamicSize}, wbt::DataType::DOUBLE}; - - // Populate a structure with the overall input / output data - wbt::BlockInformation::IOData ioData; - ioData.input.push_back(input1); - ioData.input.push_back(input2); - ioData.output.push_back(output); - - // Store this data into the BlockInformation - if (!blockInfo->setIOPortsData(ioData)) { - wbtError << "Failed to configure input / output ports"; - return false; - } - - return true; -} - -bool SignalMath::initialize(wbt::BlockInformation* blockInfo) -{ - // The base wbt::Block class need to be initialized - if (!Block::initialize(blockInfo)) { - return false; - } - - // Parse the parameters - if (!SignalMath::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; - return false; - } - - // Read the Operation parameter and store it as a private member - std::string operation; - if (!m_parameters.getParameter("Operation", operation)) { - wbtError << "Failed to parse Operation parameter"; - return false; - } - - // Check the content of the parameter - if (operation == "Addition") { - m_operation = Operation::ADDITION; - } - else if (operation == "Subtraction") { - m_operation = Operation::SUBTRACTION; - } - else if (operation == "Multiplication") { - m_operation = Operation::MULTIPLICATION; - ; - } - else { - wbtError << "Operation " << operation << " not supported"; - return false; - } - - // Check that the size of the input signals match - if (blockInfo->getInputPortWidth(/*index=*/0) != blockInfo->getInputPortWidth(/*index=*/1)) { - wbtError << "Input signals widths do not match"; - return false; - } - - return true; -} - -bool SignalMath::output(const wbt::BlockInformation* blockInfo) -{ - // Get the input signals - wbt::InputSignalPtr input1 = blockInfo->getInputPortSignal(/*index=*/0); - wbt::InputSignalPtr input2 = blockInfo->getInputPortSignal(/*index=*/1); - - // Get the output signal - wbt::OutputSignalPtr output = blockInfo->getOutputPortSignal(/*index=*/0); - - // Check the signal validity - if (!input1 || !input2 || !output) { - wbtError << "Signals not valid"; - return false; - } - - // Check the width of the output signal. - // This is recommended for dynamically sized signals. - if (output->getWidth() != input1->getWidth()) { - wbtError << "Output signal has a width of " << output->getWidth() - << " while input signals have a width of " << input1->getWidth(); - return false; - } - - // Perform the given operation - for (unsigned i = 0; i < output->getWidth(); ++i) { - switch (m_operation) { - case Operation::ADDITION: - output->set(i, input1->get(i) + input2->get(i)); - break; - case Operation::SUBTRACTION: - output->set(i, input1->get(i) - input2->get(i)); - break; - case Operation::MULTIPLICATION: - output->set(i, input1->get(i) * input2->get(i)); - break; - } - } - - return true; -} - -bool SignalMath::terminate(const wbt::BlockInformation* /*blockInfo*/) -{ - return true; -} diff --git a/toolbox/CMakeLists.txt b/toolbox/CMakeLists.txt index c8a37e049..4b2b583d7 100644 --- a/toolbox/CMakeLists.txt +++ b/toolbox/CMakeLists.txt @@ -2,6 +2,8 @@ # This software may be modified and distributed under the terms of the # GNU Lesser General Public License v2.1 or any later version. +find_package(shlibpp REQUIRED) +find_package(BlockFactory COMPONENTS BlockFactoryCore REQUIRED) # ================= # FIND DEPENDENCIES # ================= @@ -70,7 +72,6 @@ include(InstallBasicPackageFiles) # TOOLBOX TARGETS # =============== -add_subdirectory(core) add_subdirectory(library) # ===================== diff --git a/toolbox/core/CMakeLists.txt b/toolbox/core/CMakeLists.txt deleted file mode 100644 index fc3399b3f..000000000 --- a/toolbox/core/CMakeLists.txt +++ /dev/null @@ -1,149 +0,0 @@ -# Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT). All rights reserved. -# This software may be modified and distributed under the terms of the -# GNU Lesser General Public License v2.1 or any later version. - -# =================== -# CORE SHARED LIBRARY -# =================== - -set(TOOLBOX_CORE_SRC - src/Block.cpp - src/BlockInformation.cpp - src/Log.cpp - src/Parameter.cpp - src/Parameters.cpp - src/ConvertStdVector.cpp - src/Signal.cpp) - -set(TOOLBOX_CORE_HDR - include/Core/Block.h - include/Core/BlockInformation.h - include/Core/Log.h - include/Core/Parameter.h - include/Core/Parameters.h - include/Core/ConvertStdVector.h - include/Core/Signal.h) - -add_library(Core ${TOOLBOX_CORE_SRC} ${TOOLBOX_CORE_HDR}) -add_library(WBToolbox::Core ALIAS Core) - -target_include_directories(Core PUBLIC - $ - $) - -set_target_properties(Core PROPERTIES - # VERSION ${PROJECT_VERSION} - PUBLIC_HEADER "${TOOLBOX_CORE_HDR}" - OUTPUT_NAME "ToolboxCore") - -install( - TARGETS Core - EXPORT ToolboxCoreExport - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/WBToolbox/Core) - -install_basic_package_files(ToolboxCore - VERSION ${PROJECT_VERSION} - COMPATIBILITY AnyNewerVersion - EXPORT ToolboxCoreExport - FIRST_TARGET Core - NAMESPACE WBToolbox:: - NO_CHECK_REQUIRED_COMPONENTS_MACRO) - -# ===================== -# CORE SIMULINK LIBRARY -# ===================== - -if(WBT_USES_MATLAB) - - # Install TLC file - install( - FILES ${CMAKE_CURRENT_SOURCE_DIR}/WBToolbox.tlc - DESTINATION ${CMAKE_INSTALL_PREFIX}/mex) - - # Compile S-Function - matlab_add_mex( - NAME Mex - OUTPUT_NAME WBToolbox - SRC src/SimulinkBlockInformation.cpp - include/Core/SimulinkBlockInformation.h - src/WBToolbox.cpp - LINK_TO WBToolbox::Core MxAnyType shlibpp::shlibpp) - add_library(WBToolbox::Mex ALIAS Mex) - - target_compile_definitions(Mex PUBLIC "MATLAB_MEX_FILE") - - target_include_directories(Mex PUBLIC - ${Matlab_INCLUDE_DIRS} - ${Matlab_ROOT_DIR}/simulink/include) - - # Install S-Function - install( - TARGETS Mex - EXPORT ToolboxMexExport - DESTINATION mex) - - install_basic_package_files(ToolboxMex - VERSION ${PROJECT_VERSION} - COMPATIBILITY AnyNewerVersion - EXPORT ToolboxMexExport - FIRST_TARGET Mex - DEPENDENCIES ToolboxCore MxAnyType shlibpp - NAMESPACE WBToolbox:: - NO_CHECK_REQUIRED_COMPONENTS_MACRO) -endif() - -# ================== -# CORE CODER LIBRARY -# ================== - -set(CODER_HDR - include/Core/CoderBlockInformation.h - include/Core/GeneratedCodeWrapper.h) - -set(CODER_SRC - src/CoderBlockInformation.cpp) - -add_library(Coder ${CODER_HDR} ${CODER_SRC}) -add_library(WBToolbox::Coder ALIAS Coder) - -set_target_properties(Coder PROPERTIES - # VERSION ${PROJECT_VERSION} - PUBLIC_HEADER "${CODER_HDR}" - OUTPUT_NAME "ToolboxCoder" -) - -target_link_libraries(Coder PUBLIC WBToolbox::Core) -target_include_directories(Coder INTERFACE - $ - $) - -# CMake macro and functions -install( - FILES "${CMAKE_SOURCE_DIR}/cmake/AddGeneratedCodeLib.cmake" - DESTINATION "${CMAKE_INSTALL_DATADIR}/WBToolbox/cmake" -) - -install( - TARGETS Coder - EXPORT ToolboxCoderExport - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/WBToolbox/Core -) - -set(EXTRA_CONTENT - "list(APPEND CMAKE_MODULE_PATH @CMAKE_INSTALL_PREFIX@/share/WBToolbox/cmake)") - -install_basic_package_files(ToolboxCoder - VERSION ${PROJECT_VERSION} - COMPATIBILITY AnyNewerVersion - EXPORT ToolboxCoderExport - FIRST_TARGET Coder - DEPENDENCIES ToolboxCore - NAMESPACE WBToolbox:: - NO_CHECK_REQUIRED_COMPONENTS_MACRO - INCLUDE_CONTENT ${EXTRA_CONTENT}) diff --git a/toolbox/core/WBToolbox.tlc b/toolbox/core/WBToolbox.tlc deleted file mode 100644 index e3da24ed8..000000000 --- a/toolbox/core/WBToolbox.tlc +++ /dev/null @@ -1,272 +0,0 @@ -%% File : WBToolbox.tlc -%% Abstract: Inlined tlc file for S-function WBToolbox.cpp -%% - -%implements "WBToolbox" "C" - -%% Function: NotifyErrors -%% ====================== -%% -%% Abstract: Utility for copying the code used for forwarding -%% errors to the model driver. -%% - -%function NotifyErrors(prefix) Output - - std::string error = wbt::Log::getSingleton().getErrors(); - error = "%" + error; - - // Trim the message if needed - if (error.length() >= 1024) { - error = error.substr(0, 1024-1); - } - - // This shouldn't happen - if (getRTM()->errorStatus) { - delete getRTM()->errorStatus; - getRTM()->errorStatus = nullptr; - } - - getRTM()->errorStatus = new char[1024]; - sprintf(const_cast(getRTM()->errorStatus), "%s", error.c_str()); - return; - %return -%endfunction %% NotifyErrors - -%% Function: Outputs -%% ================= - -%function Outputs(block, system) Output - - %%assign identifier = Identifier - - %% Save the PWork vector locations in TLC variables - %assign PWorkStorage_Block = LibBlockPWork(blockPWork, "", "", 0) - %assign PWorkStorage_BlockInfo = LibBlockPWork(blockPWork, "", "", 1) - - { - // Get the CoderBlockInformation from the PWork - wbt::CoderBlockInformation* blockInfo = nullptr; - blockInfo = static_cast(%); - - // Get the Block from the PWork - wbt::Block* blockPtr = nullptr; - blockPtr = static_cast(%); - - // Calculate the output - // -------------------- - bool ok; - ok = blockPtr->output(blockInfo); - - // Report errors - if (!ok) { - %assign variable = "[Output]" - %assign dummy = NotifyErrors(variable) - } - } - // End of % Block: % -%endfunction %% Outputs - -%% Function: BlockTypeSetup -%% ======================== - -%function BlockTypeSetup(block, system) void - - %")> - %")> - %")> - %")> - %")> - %")> - -%endfunction - -%% Function: BlockInstanceSetup -%% ============================ - -%function BlockInstanceSetup(block, system) void - - %.h>")> - -%endfunction - -%% Function: Start -%% =============== - -%function Start(block, system) Output - - %% Save the PWork vector locations in TLC variables - %assign PWorkStorage_Block = LibBlockPWork(blockPWork, "", "", 0) - %assign PWorkStorage_BlockInfo = LibBlockPWork(blockPWork, "", "", 1) - - { - // Create and store the CoderBlockInformation object - wbt::CoderBlockInformation* blockInfo = new wbt::CoderBlockInformation(); - % = static_cast(blockInfo); - - // Initialize the parameters - // ------------------------- - - wbt::Parameters params; - - %assign numberOfParameters = SFcnParamSettings[0].numberOfParameters - %assign className = SFcnParamSettings[0].className - - %foreach i = numberOfParameters - - %assign i = i + 1 - %assign index = SFcnParamSettings[i].index - %assign name = SFcnParamSettings[i].name - %assign rows = SFcnParamSettings[i].rows - %assign cols = SFcnParamSettings[i].cols - %assign type = SFcnParamSettings[i].type - %assign storage = SFcnParamSettings[i].storage - - %if SFcnParamSettings[i].isScalar == 1.0 - %assign valueScalar = SFcnParamSettings[i].valueScalar - %if storage != "std::string" - params.storeParameter<%>(%, - %else - params.storeParameter<%>("%", - %endif - wbt::ParameterMetadata(wbt::%, %, %, %, "%")); - %else - %assign valueVector = SFcnParamSettings[i].valueVector - { - std::vector<%> valueVector; - %if cols > 0 - valueVector.reserve(%); - %endif - %foreach element = cols - %if storage != "std::string" - valueVector.push_back(%); - %else - valueVector.push_back("%"); - %endif - %endforeach - params.storeParameter<%>(valueVector, - wbt::ParameterMetadata(wbt::%, %, %, %, "%")); - } - %endif - %endforeach - - // Store the parameters in the CoderBlockInformation object - blockInfo->storeRTWParameters(params); - - // Initialize input / output Signals - // --------------------------------- - - %assign numInputPorts = LibBlockNumInputPorts(block) - %assign numOutputPorts = LibBlockNumOutputPorts(block) - - // Inputs - %foreach i = numInputPorts - - %assign dims = LibBlockInputSignalDimensions(i) - %assign numDims = LibBlockInputSignalNumDimensions(i) - %if numDims == 1 - %assign rows = 1 - %assign cols = dims[0] - %else - %assign rows = dims[0] - %assign cols = dims[1] - %endif - %%assign width = LibBlockInputSignalWidth(i) - %assign address = LibBlockInputSignalAddr(i, "", "", 0) - blockInfo->setInputSignal(%, static_cast(%
), {%, %}); - %endforeach - - // Outputs - %foreach i = numOutputPorts - - %assign dims = LibBlockOutputSignalDimensions(i) - %assign numDims = LibBlockOutputSignalNumDimensions(i) - %if numDims == 1 - %assign rows = 1 - %assign cols = dims[0] - %else - %assign rows = dims[0] - %assign cols = dims[1] - %endif - %%assign width = LibBlockOutputSignalWidth(i) - %assign address = LibBlockOutputSignalAddr(i, "", "", 0) - %%blockInfo->setOutputSignal(%, static_cast(%
), %); - blockInfo->setOutputSignal(%, static_cast(%
), {%, %}); - %endforeach - - // Initialize the class - // -------------------- - - // Allocate the block object - wbt::Block* blockPtr = static_cast(new wbt::%()); - - // Run a dummy configureSizeAndPorts step. This is currently required for properly - // handling optional input / outputs static variables. - // TODO: find a better way to handle them. - { - auto tmpCoderBlockInfo = std::unique_ptr( - new wbt::CoderBlockInformation); - tmpCoderBlockInfo->storeRTWParameters(params); - blockPtr->configureSizeAndPorts(tmpCoderBlockInfo.get()); - } - - // Initialize the block - bool ok = blockPtr->initialize(blockInfo); - - // Report errors - if (!ok) { - %assign variable = "[Initialize]" - %assign dummy = NotifyErrors(variable) - } - - // Call the initializeInitialConditions() method - ok = blockPtr->initializeInitialConditions(blockInfo); - - // Report errors - if (!ok) { - %assign variable = "[InitializeInitialConditions]" - %assign dummy = NotifyErrors(variable) - } - - // Store the block in the PWork vector - % = static_cast(blockPtr); - } - // End of % Block: % - -%endfunction %% Start - -%% Function: Terminate -%% =================== - -%function Terminate(block, system) Output - - %% Save the PWork vector locations in TLC variables - %assign PWorkStorage_Block = LibBlockPWork(blockPWork, "", "", 0) - %assign PWorkStorage_BlockInfo = LibBlockPWork(blockPWork, "", "", 1) - - { - // Get the CoderBlockInformation from the PWork - wbt::CoderBlockInformation* blockInfo = nullptr; - blockInfo = static_cast(%); - - // Get the Block from the PWork - wbt::Block* blockPtr = nullptr; - blockPtr = static_cast(%); - - // Terminate the class - // ------------------- - bool ok; - ok = blockPtr->terminate(blockInfo); - - delete blockInfo; - delete blockPtr; - - // Report errors - if (!ok) { - %assign variable = "[Terminate]" - %assign dummy = NotifyErrors(variable) - } - } - // End of % Block: % - -%endfunction %% Terminate diff --git a/toolbox/core/include/Core/Block.h b/toolbox/core/include/Core/Block.h deleted file mode 100644 index 67914f212..000000000 --- a/toolbox/core/include/Core/Block.h +++ /dev/null @@ -1,305 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#ifndef WBT_BLOCK_H -#define WBT_BLOCK_H - -#include "Core/Parameters.h" -#include -#include - -namespace wbt { - class Block; - class BlockInformation; -} // namespace wbt - -/** - * @brief Basic abstract class for wrapping generic algorithms - * - * ### Rationale - * - * This class is aimed to wrap generic algorithms and it represents the most basic component of - * `WB-Toolbox`. - * - * The entire execution of an generic algorithm can be split in the following major steps: - * - * - Initialization: implemented with Block::configureSizeAndPorts, Block::initialize - * - Execution: implemented with Block::output - * - Termination: implemented with Block::terminate - * - * Considering that the main aim of this toolbox at its beginning was its integration with Simulink, - * it contains other methods for exposing the algorithm as a Simulink block. - * - * ### Main concept - * - * A generic application is the composition of many algorithms sharing and processing each other - * data. Every algorithm is represented by a wbt::Block, and the data shared with other blocks is - * carried by wbt::Signal. - * - * The block is generally unaware of the data that it will process, and it is only interested in - * knowing how many input / output signals are connected, their size and data type. Blocks have the - * concept of _ports_, which are the connections between external wbt::Signal and the block itself. - * - * @remark A signal can be plugged to more than one port. - * - * This kind of information is set by a wbt::BlockInformation object, and it can be specific to the - * framework where the algorithm runs (e.g. standalone C++ code, Simulink, etc). - * - * Beyond this, an algorithm often needs parameters. This class provides functionalities to gather - * them in a wbt::Parameters object. - * - * ### Other information - * - * You can create a new block by deriving this class and implementing at least all the pure virtual - * methods. - * - * @note This class and the entire toolbox assume that algorithms are represented as instantaneous - * systems, there is no default storage capability between different sampling times. However, - * blocks can wrap generic classes which can retain data, outsourcing data persistence outside - * the framework given by `WB-Toolbox`. - * \par - * @note Despite some of the methods inside this class looks Simulink-dependent, objects of this - * class are completely generic. In fact, it only provides algorithm callbacks, and the - * setting of input / output data is demanded to the wbt::BlockInformation interface. For what - * concerns Simulink, a wbt::SimulinkBlockInformation implementation is provided. - * \par - * - * @see wbt::BlockInformation Class for providing information about signals and parameters. - * @see wbt::WBBlock Specialization of wbt::Block which provides useful resources for developing - * whole-body blocks. - * - * @section block_parameters Block Parameters - * - * | Type | Index | Rows | Cols | Name | - * | ---- | :---: | :--: | :--: | ---- | - * | PARAM_STRING | 0 | 1 | 1 | "className" | - * - * @see wbt::ParameterMetadata::ParameterMetadata for the data types of these variables. - */ -class wbt::Block -{ -protected: - /// Container for block's parameter. You can get this member using Block::getParameters - Parameters m_parameters; - -public: - /** - * @brief Create and returns a new Block object of the specified class - * - * If the class does not exist returns `nullptr`. - * - * @param blockClassName The derived class name to be instantiated. - * @return The newly created Block object or `nullptr`. - */ - // static wbt::Block* instantiateBlockWithClassName(const std::string& blockClassName); - - /** - * @brief Destructor - */ - virtual ~Block() = default; - - /** - * Static variable matching Block::numberOfParameters. It might be useful to define parametric - * constants for parameter indices in child blocks. - * - * @see WBBlock::NumberOfParameters - */ - static constexpr unsigned NumberOfParameters = 2; - - /** - * @brief Returns the number of configuration parameters needed by this block - * - * @return The number of parameters. - */ - virtual unsigned numberOfParameters(); - - /** - * @brief Returns the vector of additional block options - * - * Implement this method if you want to store in the Block additional options that can be parsed - * later from BlockInformation::optionFromKey. - * - * @return A vector containing a list of options. - */ - virtual std::vector additionalBlockOptions(); - - /** - * @brief Returns the number of discrete states of the block - * - * The base implementation returns 0, i.e. no discrete states. - * - * @note If you return a number > 0, you should implement the Block::updateDiscreteState - * function. - * @return The number of discrete states. - */ - virtual unsigned numberOfDiscreteStates(); - - /** - * @brief Returns the number of continuous states of the block - * - * The base implementation returns 0, i.e. no continuous states. - * - * @note If you return a number > 0, you should implement the Block::stateDerivative function. - * @return The number of continuous states. - */ - virtual unsigned numberOfContinuousStates(); - - /** - * @brief Update the internal discrete state - * - * i.e. `x[i+1] = f(x[i])` - * - * @param blockInfo A BlockInformation object. - * @return True for success, false otherwise. - */ - virtual bool updateDiscreteState(const BlockInformation* blockInfo); - - /** - * @brief Update the internal continuous state - * - * @param blockInfo The SimStruct structure. - * @return True for success, false otherwise. - */ - virtual bool stateDerivative(const BlockInformation* blockInfo); - - /** - * @brief Specify if the parameter at the specified index is tunable - * - * Tunable means that it can be changed during the simulation. Usually parameters are defined - * before the beginning of the simulation and they stay constant for all its duration. - * - * @note For the time being tunable parameters are not used in this toolbox. - * - * @param[in] index Index of the parameter. - * @param[out] tunable True if the parameter is tunable, false otherwise. - */ - virtual void parameterAtIndexIsTunable(unsigned index, bool& tunable); - - /** - * @brief Parse the parameters stored into the BlockInformation object - * - * Implement this method to create the metadata of the parameters your block needs (using - * wbt::ParameterMetadata), store them into the blockInfo object with - * BlockInformation::addParameterMetadata, and parse them using - * BlockInformation::parseParameters. - * - * An example of the implementation is the following: - * - * ```cpp - * bool Jacobian::parseParameters(BlockInformation* blockInfo) - * { - * ParameterMetadata frameMetadata(PARAM_STRING, PARAM_IDX_FRAME, 1, 1, "frame"); - * bool ok = blockInfo->addParameterMetadata(frameMetadata); - * - * if (!ok) { - * wbtError << "Failed to store parameters metadata."; - * return false; - * } - - * return blockInfo->parseParameters(m_parameters); - * } - * ``` - * - * @param blockInfo The pointer to a BlockInformation object. - * @return True for success, false otherwise. - * @see BlockInformation::addParameterMetadata, BlockInformation::parseParameters - */ - virtual bool parseParameters(BlockInformation* blockInfo); - - /** - * @brief Gather all the stored parameters - * - * After the parameters have been successfully stored and parsed using the - * Block::parseParameter, you can gather them using this method. - * - * @param[out] params A wbt::Parameters object containing block's parameters. - * @return bool True for success, false otherwise. - */ - bool getParameters(wbt::Parameters& params) const; - - /** - * @brief Configure the input and output ports - * - * Implement this method to set information about number and size of input and output signals. - * The terminology `port` comes as Simulink inheritage, and it marks the connection of a signal - * (which resides in some buffer in the program memory) to the block's input or output. - * - * These information can be used later (e.g. in the Block::initialize and Block::output) for - * preallocating resources and accessing data knowing its size in advance. - * - * @note If the size is not known at this stage (Signal::DynamicSize), at latest it should be - * set in the Block::initialize step - * @warning Do not allocate any data in this stage! Object are destroyed afterwards and created - * again before the Block::initialize step. Every allocated memory and stored values - * will be deleted. Only information stored in `blockInfo` will persist. - * - * @param blockInfo The pointer to a BlockInformation object. - * @return True if the block was configured successfully, false otherwise. - * @see BlockInformation::setNumberOfInputPorts, BlockInformation::setInputPortVectorSize - */ - virtual bool configureSizeAndPorts(BlockInformation* blockInfo); - - /** - * Never called. - * - * @param blockInfo The pointer to a BlockInformation object. - * @return True for success, false otherwise. - */ - virtual bool checkParameters(const BlockInformation* blockInfo); - - /** - * @brief Initialize the block - * - * Implement this method to initialize and allocate the resources the algorithm needs during its - * execution. - * - * @param blockInfo The pointer to a BlockInformation object. - * @return True for success, false otherwise. - */ - virtual bool initialize(BlockInformation* blockInfo); - - /** - * @brief Initialize block's initial conditions - * - * Implement this method to specify block's initial conditions. Its execution will happen after - * Block::initialize and before the first call of Block::output. The default is an empty - * implementation. - * - * @note this function is also called on a reset event. In Simulink, an example is when the - * block resides in an enabled subsystem. - * - * @param blockInfo The pointer to a BlockInformation object. - * @return True for success, false otherwise. - */ - virtual bool initializeInitialConditions(const BlockInformation* blockInfo); - - /** - * @brief Cleanup block resources - * - * This method is called during the termination of the execution. Implement this method to - * deallocate all the memory requested during the previous steps or to perform other terminating - * operations. - * - * @param blockInfo The pointer to a BlockInformation object. - * @return True for success, false otherwise. - */ - virtual bool terminate(const BlockInformation* blockInfo); - - /** - * @brief Compute the output of the block - * - * This method is called at every iteration of the model. Implement here a single step of the - * algorithm. - * - * @param blockInfo The pointer to a BlockInformation object. - * @return True for success, false otherwise. - */ - virtual bool output(const BlockInformation* blockInfo) = 0; -}; - -#endif // WBT_BLOCK_H diff --git a/toolbox/core/include/Core/BlockInformation.h b/toolbox/core/include/Core/BlockInformation.h deleted file mode 100644 index b13b578ce..000000000 --- a/toolbox/core/include/Core/BlockInformation.h +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#ifndef WBT_BLOCKINFORMATION_H -#define WBT_BLOCKINFORMATION_H - -#include -#include -#include -#include -#include - -namespace wbt { - class BlockInformation; - class ParameterMetadata; - class Parameters; - class Configuration; - class RobotInterface; - class Signal; - using InputSignalPtr = std::shared_ptr; - using OutputSignalPtr = std::shared_ptr; - enum class DataType; - // List of possible key for defining block options: - extern const std::string BlockOptionPrioritizeOrder; -} // namespace wbt - -namespace iDynTree { - class KinDynComputations; -} - -/** - * @brief Abstract class for storing generic Block properties - * - * BlockInformation provides an interface for handling implementation-specific properties such as - * input / output number, size and type, number of parameters, ... - * - * A wbt::Block needs to know on what kind of data it operates, and retrieving this information is - * often specific on the framework on top of which blocks run. In order to allow using the same - * Block class from different frameworks (e.g. Simulink, C++, etc), different implementation of this - * interface can be developed to provide a transparent translation of such functionalities. - * - * As an example, take the BlockInformation::parseParameters. In Simulink parameters are read from - * block's masks and Matlab provides a library for reading them. The SimulinkBlockInformation - * implementation will be linked against that library. However, if you want to call the same Block - * class (which is just a wrapper of an algorithm) from a pure C++ main, parameters are read e.g. - * from an xml file. In this case, BlockInformation::parseParameters will parse the xml and fill the - * wbt::Parameters argument. - * - * @see wbt::Block, wbt::Parameters, wbt::Signal - */ -class wbt::BlockInformation -{ -public: - using Rows = int; - using Cols = int; - using PortIndex = int; - - using VectorSize = int; - using MatrixSize = std::pair; - - struct Port - { // The struct provides an enum scope - enum - { - Index = 0, - Dimensions = 1, - DataType = 2, - }; - }; - using PortDimension = std::vector; - using PortData = std::tuple; - - BlockInformation() = default; - virtual ~BlockInformation() = default; - - // ===================== - // BLOCK OPTIONS METHODS - // ===================== - - /** - * @brief Convert a block option from its string identifier to a specific implementation - * - * @param[in] key Identifier of the block option. - * @param[out] option Implementation-specific block option. - * @return True if the option has been converted, false otherwise. - */ - virtual bool optionFromKey(const std::string& key, double& option) const = 0; - - // ================== - // PARAMETERS METHODS - // ================== - - /** - * @brief Parse the wbt::Block's parameters - * - * This method allows defining how to gather block's parameters from a specific implementation. - * - * @param[out] parameters A container filled with the parsed parameters. - * @return True for success, false otherwise. - */ - virtual bool parseParameters(wbt::Parameters& parameters) = 0; - - /** - * @brief Add a parameter metadata - * - * In order to parse parameters with BlockInformation::parseParameters, adding in advance their - * metadata can strongly simplify the entire process. - * - * @param paramMD The metadata to add. - * @return True for success, false otherwise. - */ - virtual bool addParameterMetadata(const wbt::ParameterMetadata& paramMD) = 0; - - // ======================== - // PORT INFORMATION SETTERS - // ======================== - - struct IOData; - - /** - * @brief Set input / output ports data - * - * Specify I/O ports data such as BlockInformation::PortIndex, BlockInformation::PortDimension, - * and wbt::DataType storing the information in a BlockInformation::IOData structure. - * - * @param ioData The structure containing I/O ports data. - * @return True for success, false otherwise. - * - * @see setNumberOfInputPorts, setInputPortVectorSize, setInputPortMatrixSize, - * setInputPortDataType - * @note This method automatically sets the number of inputs and outputs. - */ - virtual bool setIOPortsData(const IOData& ioData) = 0; - - // ======================== - // PORT INFORMATION GETTERS - // ======================== - - /** - * @brief Get data of an input port - * - * @param idx The index of the port. - * @return A PortData object containing the port's data. - */ - virtual PortData getInputPortData(PortIndex idx) const = 0; - - /** - * @brief Get data of an output port - * - * @param idx The index of the port. - * @return A PortData object containing the port's data. - */ - virtual PortData getOutputPortData(PortIndex idx) const = 0; - - /** - * @brief Get the size of a 1D input port - * - * @param idx The index of the port. - * @return The size of the port. - */ - virtual VectorSize getInputPortWidth(const PortIndex idx) const = 0; - - /** - * @brief Get the size of a 1D output port - * - * @param idx The index of the port. - * @return The size of the port. - */ - virtual VectorSize getOutputPortWidth(const PortIndex idx) const = 0; - - /** - * @brief Get the size of a 2D input port - * - * @param idx The index of the port. - * @return The size of the port. - */ - virtual MatrixSize getInputPortMatrixSize(const PortIndex idx) const = 0; - - /** - * @brief Get the size of a 2D output port - * - * @param idx The index of the port. - * @return The size of the port. - */ - virtual MatrixSize getOutputPortMatrixSize(const PortIndex idx) const = 0; - - // ============= - // BLOCK SIGNALS - // ============= - - /** - * @brief Get the signal connected to a 1D input port - * - * @param idx The index of the port. - * @param size The size of the signal. - * @return The pointer to the signal connected to the input port for success, a `nullptr` - * otherwise. - */ - virtual wbt::InputSignalPtr getInputPortSignal(const PortIndex idx, - const VectorSize size = -1) const = 0; - - /** - * @brief Get the signal connected to a 1D output port - * - * @param idx The index of the port. - * @param size The size of the signal. - *@return The pointer to the signal connected to the output port for success, a `nullptr` - * otherwise. - */ - virtual wbt::OutputSignalPtr getOutputPortSignal(const PortIndex idx, - const VectorSize size = -1) const = 0; -}; - -struct wbt::BlockInformation::IOData -{ - std::vector input; - std::vector output; -}; - -#endif // WBT_BLOCKINFORMATION_H diff --git a/toolbox/core/include/Core/CoderBlockInformation.h b/toolbox/core/include/Core/CoderBlockInformation.h deleted file mode 100644 index e5cef269b..000000000 --- a/toolbox/core/include/Core/CoderBlockInformation.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#ifndef WBT_CODERBLOCKINFORMATION_H -#define WBT_CODERBLOCKINFORMATION_H - -#include "Core/BlockInformation.h" -#include "Core/Signal.h" - -#include -#include - -namespace wbt { - class CoderBlockInformation; -} - -class wbt::CoderBlockInformation final : public wbt::BlockInformation -{ -private: - class impl; - std::unique_ptr pImpl; - -public: - CoderBlockInformation(); - ~CoderBlockInformation() override; - - // BLOCK OPTIONS METHODS - // ===================== - - bool optionFromKey(const std::string& key, double& option) const override; - - // PARAMETERS METHODS - // ================== - - bool addParameterMetadata(const wbt::ParameterMetadata& paramMD) override; - bool parseParameters(wbt::Parameters& parameters) override; - - // PORT INFORMATION SETTERS - // ======================== - - bool setIOPortsData(const IOData& ioData) override; - - // PORT INFORMATION GETTERS - // ======================== - - PortData getInputPortData(PortIndex idx) const override; - PortData getOutputPortData(PortIndex idx) const override; - VectorSize getInputPortWidth(const PortIndex idx) const override; - VectorSize getOutputPortWidth(const PortIndex idx) const override; - MatrixSize getInputPortMatrixSize(const PortIndex idx) const override; - MatrixSize getOutputPortMatrixSize(const PortIndex idx) const override; - - // BLOCK SIGNALS - // ============= - - wbt::InputSignalPtr - getInputPortSignal(const PortIndex idx, - const VectorSize size = wbt::Signal::DynamicSize) const override; - wbt::OutputSignalPtr - getOutputPortSignal(const PortIndex idx, - const VectorSize size = wbt::Signal::DynamicSize) const override; - - // METHODS OUTSIDE THE INTERFACE - // ============================= - - bool storeRTWParameters(const Parameters& parameters); - bool setInputSignal(const PortIndex idx, void* address, const PortDimension& dims); - bool setOutputSignal(const PortIndex idx, void* address, const PortDimension& dims); -}; - -#endif // WBT_CODERBLOCKINFORMATION_H diff --git a/toolbox/core/include/Core/ConvertStdVector.h b/toolbox/core/include/Core/ConvertStdVector.h deleted file mode 100644 index 6131f9848..000000000 --- a/toolbox/core/include/Core/ConvertStdVector.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#ifndef WBT_CONVERTSTDVECTOR_H -#define WBT_CONVERTSTDVECTOR_H - -#include -#include - -// Details about templates in http://drake.mit.edu/cxx_inl.html - -// Template declaration -// ==================== - -// Its definition will be in the cpp file. This is allowed because all the allowed variant are -// either explicitly declared or explicitly specialized. -namespace wbt { - template - void convertStdVector(const std::vector& input, std::vector& output); -} - -// Explicit declaration for all the other supported types -// ======================================================== - -// Int to other numeric types -extern template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -extern template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -extern template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -// Bool to other numeric types -extern template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -extern template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -extern template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -// Double to other numeric types -extern template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -extern template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -extern template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -// String to string -extern template void -wbt::convertStdVector(const std::vector& input, - std::vector& output); - -// Explicit specialization for std::string type -// ============================================ - -namespace wbt { - // String to numeric - template <> - void convertStdVector(const std::vector& input, - std::vector& output); - template <> - void convertStdVector(const std::vector& input, - std::vector& output); - template <> - void convertStdVector(const std::vector& input, - std::vector& output); - // Numeric to string - template <> - void convertStdVector(const std::vector& input, - std::vector& output); - template <> - void convertStdVector(const std::vector& input, - std::vector& output); - template <> - void convertStdVector(const std::vector& input, - std::vector& output); -} // namespace wbt - -#endif diff --git a/toolbox/core/include/Core/GeneratedCodeWrapper.h b/toolbox/core/include/Core/GeneratedCodeWrapper.h deleted file mode 100644 index d5362666a..000000000 --- a/toolbox/core/include/Core/GeneratedCodeWrapper.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#ifndef WBT_GENERATEDCODEWRAPPER_H -#define WBT_GENERATEDCODEWRAPPER_H - -#ifndef MODEL -#error "MODEL option not specified" -#endif - -#include -#include -#include - -namespace wbt { - template - class GeneratedCodeWrapper; -} - -template -class wbt::GeneratedCodeWrapper -{ -private: - std::unique_ptr m_model; - std::string m_modelName; - unsigned m_numSampleTimes; - - bool modelFailed() const; - -public: - GeneratedCodeWrapper(const std::string& modelName = {}, const unsigned& numSampleTimes = 0); - ~GeneratedCodeWrapper() = default; - - bool initialize(); - bool step(); - bool terminate(); - - // double* getOutput(const unsigned& index) const; - - std::string getErrors() const; - // std::string getWarnings() const; -}; - -template -bool wbt::GeneratedCodeWrapper::modelFailed() const -{ - if (m_model) { - if (m_model->getRTM()) { - if (!m_model->getRTM()->errorStatus) - return false; - } - } - return true; -} - -template -wbt::GeneratedCodeWrapper::GeneratedCodeWrapper(const std::string& modelName, - const unsigned& numSampleTimes) - : m_modelName(modelName) - , m_numSampleTimes(numSampleTimes) -{} - -template -bool wbt::GeneratedCodeWrapper::initialize() -{ - if (m_model) { - m_model.reset(); - } - - m_model = std::unique_ptr(new T()); - m_model->initialize(); - - if (modelFailed()) { - return false; - } - - return true; -} - -template -bool wbt::GeneratedCodeWrapper::step() -{ - if (!m_model) { - return false; - } - - m_model->step(); - - if (modelFailed()) { - return false; - } - - return true; -} - -template -bool wbt::GeneratedCodeWrapper::terminate() -{ - if (!m_model) { - return false; - } - - m_model->terminate(); - - if (modelFailed()) { - return false; - } - - return true; -} - -template -std::string wbt::GeneratedCodeWrapper::getErrors() const -{ - if (!m_model) { - return {}; - } - - if (modelFailed()) { - return {m_model->getRTM()->errorStatus}; - } - - return {}; -} - -#endif // WBT_GENERATEDCODEWRAPPER_H diff --git a/toolbox/core/include/Core/Log.h b/toolbox/core/include/Core/Log.h deleted file mode 100644 index 0b77b2e64..000000000 --- a/toolbox/core/include/Core/Log.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#ifndef WBT_LOG_H -#define WBT_LOG_H - -#include -#include -#include - -#ifdef NDEBUG -#define WBT_LOG_VERBOSITY wbt::Log::Verbosity::RELEASE -#else -#define WBT_LOG_VERBOSITY wbt::Log::Verbosity::DEBUG -#endif - -#ifndef wbtError -#define wbtError \ - wbt::Log::getSingleton().getLogStringStream( \ - wbt::Log::Type::ERROR, __FILE__, __LINE__, __FUNCTION__) -#endif - -#ifndef wbtWarning -#define wbtWarning \ - wbt::Log::getSingleton().getLogStringStream( \ - wbt::Log::Type::WARNING, __FILE__, __LINE__, __FUNCTION__) -#endif - -namespace wbt { - class Log; -} // namespace wbt - -/** - * @brief Class for handling log messages - * - * Errors and Warnings are currently supported. - */ -class wbt::Log -{ -public: - enum class Type - { - ERROR, - WARNING - }; - - enum class Verbosity - { - RELEASE, - DEBUG - }; - -private: - class impl; - std::unique_ptr pImpl; - -public: - Log(); - ~Log() = default; - - /** - * @brief Get the Log singleton - * - * There is only one instance in the whole program of this class. - * - * @return The log singleton. - */ - static wbt::Log& getSingleton(); - - /** - * @brief Get the stringstream object for adding log messages - * - * @param type The log type. - * @param file The file from which this method is called (preprocessor directive). - * @param line The line from which this method is called (preprocessor directive). - * @param function The function from which this method is called (preprocessor directive). - * @return The stringstream object matching the log type. - */ - std::stringstream& getLogStringStream(const Type& type, - const std::string& file, - const unsigned& line, - const std::string& function); - - /** - * @brief Get the stored error messages. - * @return The error messages. - */ - std::string getErrors() const; - - /** - * @brief Get the stored warning messages. - * @return The warning messages. - */ - std::string getWarnings() const; - - /** - * @brief Clear the stored error messages. - */ - void clearErrors(); - - /** - * @brief Clear the stored warning messages. - */ - void clearWarnings(); - - /** - * @brief Clear all the stored log messages. - */ - void clear(); -}; - -#endif // WBT_LOG_H diff --git a/toolbox/core/include/Core/Parameter.h b/toolbox/core/include/Core/Parameter.h deleted file mode 100644 index 600d66692..000000000 --- a/toolbox/core/include/Core/Parameter.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#ifndef WBT_PARAMETER_H -#define WBT_PARAMETER_H - -#include -#include - -namespace wbt { - class ParameterMetadata; - template - class Parameter; - enum class ParameterType; -} // namespace wbt - -/** - * @brief Defines the types of parameters supported by wbt::Parameter - * @see wbt::ParameterMetadata, wbt::Parameter - */ -enum class wbt::ParameterType -{ - // Scalar / Vector / Matrix - INT, - BOOL, - DOUBLE, - STRING, - // Cell - CELL_INT, - CELL_BOOL, - CELL_DOUBLE, - CELL_STRING, - // Struct - STRUCT_INT, - STRUCT_BOOL, - STRUCT_DOUBLE, - STRUCT_STRING, - STRUCT_CELL_INT, - STRUCT_CELL_BOOL, - STRUCT_CELL_DOUBLE, - STRUCT_CELL_STRING -}; - -/** - * @brief Class for storing parameter metadata - * - * A metadata must be constructed with an index and a name, and they cannot be changed afterwards. - * Only bool, int, double or std::string types are currently supported. - * - * @see wbt::Parameter, wbt::ParameterType - */ -class wbt::ParameterMetadata -{ -public: - enum - { - DynamicSize = -1 - }; - - const unsigned index; - const std::string name; - - int rows; - int cols; - wbt::ParameterType type; - - ParameterMetadata() = delete; - ~ParameterMetadata() = default; - - ParameterMetadata(const ParameterType& t, - const unsigned& ParamIndex, - const int& paramRows, - const int& paramCols, - const std::string& ParamName = {}); - ParameterMetadata(const ParameterMetadata& paramMD); - ParameterMetadata(ParameterMetadata&& paramMD); - - ParameterMetadata& operator=(const ParameterMetadata& paramMD); - ParameterMetadata& operator=(ParameterMetadata&& paramMD); - bool operator==(const ParameterMetadata& rhs) const; - inline bool operator!=(const ParameterMetadata& rhs) const { return !(*this == rhs); } -}; - -/** - * @brief Class for storing a generic parameter - * - * A generic parameters can be either a scalar or a vector. Supported types are defined by the - * wbt::ParameterType enum.Use wbt::ParameterMetadata to set these information. - * - * @tparam The type of the container type. For vector parameters, T is the type of an element of the - * container. - * @see wbt::Parameters, wbt::ParameterMetadata - */ -template -class wbt::Parameter -{ -private: - using ParamVector = std::vector; - - bool m_isScalar; - T m_valueScalar; - ParamVector m_valueVector; - wbt::ParameterMetadata m_metadata; - -public: - enum class Type; - Parameter() = delete; - ~Parameter() = default; - - Parameter(const T& value, const wbt::ParameterMetadata& md) - : m_isScalar(true) - , m_valueScalar(value) - , m_metadata(md) - {} - Parameter(const ParamVector& valueVec, const wbt::ParameterMetadata& md) - : m_valueVector(valueVec) - , m_isScalar(false) - , m_metadata(md) - {} - - bool isScalar() const { return m_isScalar; } - T getScalarParameter() const { return m_valueScalar; } - ParamVector getVectorParameter() const { return m_valueVector; } - wbt::ParameterMetadata getMetadata() const { return m_metadata; } -}; - -#endif // WBT_PARAMETER_H diff --git a/toolbox/core/include/Core/Parameters.h b/toolbox/core/include/Core/Parameters.h deleted file mode 100644 index 4462d4466..000000000 --- a/toolbox/core/include/Core/Parameters.h +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#ifndef WBT_PARAMETERS_H -#define WBT_PARAMETERS_H - -#include -#include -#include - -namespace wbt { - template - class Parameter; - class ParameterMetadata; - class Parameters; - const int PARAM_INVALID_INDEX = -1; - const std::string PARAM_INVALID_NAME = {}; -} // namespace wbt - -/** - * @brief Class for storing block's parameters - * - * This class can contain scalar and vector parameters of the supported types. - * - * @see wbt::Parameter, wbt::ParameterMetadata, wbt::ParameterType - */ -class wbt::Parameters -{ -public: - using ParamIndex = int; - using ParamName = std::string; - -private: - class impl; - std::unique_ptr pImpl; - -public: - Parameters(); - Parameters(const wbt::Parameters& other); - Parameters& operator=(const Parameters& other); - - ~Parameters(); - - /** - * @brief Get the name of a stored parameter from its index. - * @param index The index of the parameter. - * @return The name if the parameter exists, wbt::PARAM_INVALID_NAME otherwise. - */ - ParamName getParamName(const ParamIndex& index) const; - - /** - * @brief Get the index of a stored parameter from its name. - * @param name The name of the parameter. - * @return The index if the parameter exists, wbt::PARAM_INVALID_INDEX otherwise. - */ - ParamIndex getParamIndex(const ParamName& name) const; - - /** - * @brief Get the number of stored parameters - * - * @return The number of stored parameters. - */ - unsigned getNumberOfParameters() const; - - /** - * @brief Check if a parameter with a given name is stored - * - * @param name The name of the parameter. - * @return True if the parameters exists, false otherwise. - */ - bool existName(const ParamName& name) const; - - /** - * @brief Store a scalar parameter - * - * @tparam The type of the parameter to store. Despite this, the parameter get cast accordingly - * to its metadata. - * @param param The value of the scalar parameter to store. - * @param paramMetadata The metadata associated to the parameter to store. - * @return True for success, false otherwise. - */ - template - bool storeParameter(const T& param, const wbt::ParameterMetadata& paramMetadata); - - /** - * @brief Store a vector parameter - * - * @tparam The type of the parameter to store. Despite this, the parameter get cast accordingly - * to its metadata. - * @param param The value of the vector parameter to store. - * @param paramMetadata The metadata associated to the parameter to store. - * @return True for success, false otherwise. - */ - template - bool storeParameter(const std::vector& param, const wbt::ParameterMetadata& paramMetadata); - - /** - * @brief Store a parameter - * - * @tparam The type of the parameter to store. - * @param parameter The parameter object to store. - * @return True for success, false otherwise. - * - * @see wbt::Parameter - */ - template - bool storeParameter(const Parameter& parameter); - - /** - * @brief Get a scalar parameter - * - * @tparam The type of the output argument - * @param name The name of the parameter. - * @param[out] param The variable where the parameter value will be stored. Data get cast - * internally, even for string to numeric types. - * @return True for success, false otherwise. - */ - template - bool getParameter(const ParamName& name, T& param) const; - - /** - * @brief Get a vector parameter - * - * @tparam The type of the output argument - * @param name The name of the parameter. - * @param[out] param The variable where the parameter value will be stored. Data get cast - * internally, even for string to numeric types. - * @return True for success, false otherwise. - */ - template - bool getParameter(const ParamName& name, std::vector& param) const; - - /** - * @brief Get all the integer parameters - * - * @return The integer parameters - */ - std::vector> getIntParameters() const; - - /** - * @brief Get all the boolean parameters - * - * @return The boolean parameters - */ - std::vector> getBoolParameters() const; - - /** - * @brief Get all the double parameters - * - * @return The double parameters - */ - std::vector> getDoubleParameters() const; - - /** - * @brief Get all the string parameters - * - * @return The string parameters - */ - std::vector> getStringParameters() const; - - /** - * @brief Get the metadata associated to a stored parameter - * - * @param name The name of the parameter. - * @return The metadata associate with the parameter for success, a metadata with a stored name - * `dummy` otherwise. - */ - wbt::ParameterMetadata getParameterMetadata(const ParamName& name); -}; - -// ============ -// GETPARAMETER -// ============ - -// SCALAR -namespace wbt { - // Explicit declaration for numeric types - extern template bool Parameters::getParameter(const Parameters::ParamName& name, - int& param) const; - extern template bool Parameters::getParameter(const Parameters::ParamName& name, - bool& param) const; - extern template bool Parameters::getParameter(const Parameters::ParamName& name, - double& param) const; - // Explicit specialization for std::string - template <> - bool Parameters::getParameter(const Parameters::ParamName& name, - std::string& param) const; -} // namespace wbt - -// VECTOR -namespace wbt { - // Explicit declaration for numeric types - extern template bool Parameters::getParameter(const Parameters::ParamName& name, - std::vector& param) const; - extern template bool Parameters::getParameter(const Parameters::ParamName& name, - std::vector& param) const; - extern template bool Parameters::getParameter(const Parameters::ParamName& name, - std::vector& param) const; - extern template bool - Parameters::getParameter(const Parameters::ParamName& name, - std::vector& param) const; -} // namespace wbt - -// ============== -// STOREPARAMETER -// ============== - -// SCALAR -namespace wbt { - // Explicit declaration for numeric types - extern template bool Parameters::storeParameter(const int& param, - const ParameterMetadata& paramMetadata); - extern template bool Parameters::storeParameter(const bool& param, - const ParameterMetadata& paramMetadata); - extern template bool Parameters::storeParameter(const double& param, - const ParameterMetadata& paramMetadata); - // Explicit specialization for std::string - template <> - bool Parameters::storeParameter(const std::string& param, - const ParameterMetadata& paramMetadata); -} // namespace wbt - -// VECTOR -namespace wbt { - // Explicit declaration for numeric types - extern template bool Parameters::storeParameter(const std::vector& param, - const ParameterMetadata& paramMetadata); - extern template bool Parameters::storeParameter(const std::vector& param, - const ParameterMetadata& paramMetadata); - extern template bool Parameters::storeParameter(const std::vector& param, - const ParameterMetadata& paramMetadata); - extern template bool - Parameters::storeParameter(const std::vector& param, - const ParameterMetadata& paramMetadata); -} // namespace wbt - -// PARAMETER -namespace wbt { - // Explicit declaration for numeric types - extern template bool Parameters::storeParameter(const Parameter& parameter); - extern template bool Parameters::storeParameter(const Parameter& parameter); - extern template bool Parameters::storeParameter(const Parameter& parameter); - extern template bool - Parameters::storeParameter(const Parameter& parameter); -} // namespace wbt - -#endif // WBT_PARAMETERS_H diff --git a/toolbox/core/include/Core/Signal.h b/toolbox/core/include/Core/Signal.h deleted file mode 100644 index 327209d8c..000000000 --- a/toolbox/core/include/Core/Signal.h +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#ifndef WBT_SIGNAL_H -#define WBT_SIGNAL_H - -#include - -namespace wbt { - class Signal; - enum class DataType; -} // namespace wbt - -/** - * @brief Defines allowed signal data types - * - * This enum defines the data types of signals that are handled by this toolbox. - * - * @note Currently only `DOUBLE` is fully implemented. - * @see Signal::Signal, BlockInformation::setInputPortType, BlockInformation::setOutputPortType - */ -enum class wbt::DataType -{ - DOUBLE, - SINGLE, - INT8, - UINT8, - INT16, - UINT16, - INT32, - UINT32, - BOOLEAN, -}; - -/** - * @brief Class to represent data shared between blocks, labelled as signals. - * - * Analogously to the block-algorithm corrispondence, this class introduces the signal-data - * corrispondence. Signals are basically the connections between blocks. - * - * Signals do not directly translate to block's input and output. Signals are plugged to block - * ports, and this block port fill the signal with data. - * - * @remark A signal can be plugged to more than one block port. - * @see wbt::Block - */ -class wbt::Signal -{ -public: - /// Defines the format of signals supported by Signal. It specifies what kind of data the - /// Signal::m_bufferPtr points. - /// - /// - `NONCONTIGUOUS` matches the default Simulink input signals. Signal::m_bufferPtr is a - /// pointer to an array of pointers, each of them storing an element of the signal. - /// - `CONTIGUOUS` means that the Signal::m_bufferPtr points to a contiguous array of - /// Signal::m_portDataType type. - /// - `CONTIGUOUS_ZEROCOPY` matches the default Simulink output signals. Signal::m_bufferPtr is - /// a pointer to an _external_ array of Signal::m_portDataType type. - /// - /// @note `CONTIGUOUS_ZEROCOPY` is the only format that doesn't copy data from the original - /// buffer address. Instead, both `CONTIGUOUS` and `NONCONTIGUOUS` data formats copy - /// the content of the buffer inside the Signal object. For performance reason, prefer - /// using `CONTIGUOUS_ZEROCOPY`. - /// @see initializeBufferFromContiguous, initializeBufferFromContiguousZeroCopy, - /// initializeBufferFromNonContiguous - /// @see BlockInformation::getInputPortSignal, BlockInformation::getOutputPortSignal - enum class DataFormat - { - NONCONTIGUOUS = 0, - CONTIGUOUS = 1, - CONTIGUOUS_ZEROCOPY = 2 - }; - -private: - class impl; - std::unique_ptr pImpl; - -public: - enum - { - DynamicSize = -1 - }; - - Signal(const DataFormat& dataFormat = DataFormat::CONTIGUOUS_ZEROCOPY, - const DataType& dataType = DataType::DOUBLE); - ~Signal(); - - Signal(const Signal& other); - Signal& operator=(const Signal& other) = delete; - - Signal(Signal&& other); - Signal& operator=(Signal&& other) = delete; - - /** - * @brief Initialize the signal from a contiguous buffer - * - * This method allocates a new array with the same size of `buffer` and copies the data. In this - * case, the Signal object will own the data. - * - * @param buffer The pointer to the original contiguous buffer. - * @return True for success, false otherwise. - * @see Signal::DataFormat - */ - bool initializeBufferFromContiguous(const void* buffer); - - /** - * @brief Initialize the signal from a contiguous buffer without copying data - * - * This methods accepts an external contiguous buffer and holds its pointer. The data is not - * owned by this object. - * - * @note You must set the signal width with Signal::setWidth in order to have a valid signal. - * - * @param buffer The pointer to the original contiguous buffer. - * @return True for success, false otherwise. - * @see Signal::DataFormat - */ - bool initializeBufferFromContiguousZeroCopy(const void* buffer); - - /** - * @brief Initialize the signal from a non-contiguous buffer - * - * This method allocates a new array with the same size of `bufferPtrs` and copies the data. In - * this case, the Signal object will own the data. `bufferPtrs` points to an array of pointers. - * Each of these pointers points to a data element. - * - * @note You must set the signal width with Signal::setWidth in order to have a valid signal. - * - * @param bufferPtrs The pointer to the original non-contiguous buffer. - * @return True for success, false otherwise. - * @see Signal::DataFormat - */ - bool initializeBufferFromNonContiguous(const void* const* bufferPtrs); - - /** - * @brief Check if the signal is valid - * - * Checks if Signal::m_bufferPtr is not `nullptr` and Signal::m_width is greater than zero. - * - * @return True for valid signal, false otherwise. - */ - bool isValid() const; - - /** - * @brief Read the width of the signal - * - * By default the width of Signal is Signal::DynamicSize. However, for being a valid signal, an - * object must have a specified width. - * - * @return The signal width. - * @see Signal::setWidth, Signal::isValid - */ - int getWidth() const; - - /** - * @brief Read the wbt::DataType of the signal - * - * The default type is DataType::DOUBLE. - * - * @return The signal data type. - */ - DataType getPortDataType() const; - - /** - * @brief Read the Signal::DataFormat of the signal - * - * The default type is DataFormat::CONTIGUOUS_ZEROCOPY. - * - * @return The signal data format. - */ - DataFormat getDataFormat() const; - - /** - * @brief Get the pointer to the buffer storing signal's data - * - * The buffer is stored as a void pointer in Signal::m_bufferPtr. In order to use the buffer it - * should be properly cast to the right data type. Be sure that the Signal::DataType match the - * type of the buffer otherwise pointer arithmetics does not work. - * - * If `T` does not match Signal::m_portDataType the returned value is a `nullptr`. - * - * @note Always check if the pointer is not `nullptr` before using it. - * @tparam The data type of the returned buffer. - * @return The pointer to the buffer if the class is properly configured, `nullptr` otherwise. - * @see Signal::setBuffer - */ - template - T* getBuffer(); - - /** - * @brief Get the pointer to the buffer storing signal's data - * - * Documented in Signal::getBuffer - * - */ - template - const T* getBuffer() const; - - /** - * @brief Get a single element of the signal - * - * This method returns the `i-th` element of the handled buffer. - * - * @note It is recommended to use Signal::isValid before using this method. - * @tparam The data type of the returned signal. It must match Signal::m_portDataType. - * @param i The index of the element. It should not exceed Signal::m_width. - * @return The `i-th` element of the vector if the signal is valid, or the default value of the - * type otherwise. - */ - template - T get(const unsigned i) const; - - /** - * @brief Set the width of the signal - * - * @param width The width to set. - */ - void setWidth(const unsigned width); - - /** - * @brief Set the value of a sigle element of the buffer - * - * @param index The index of the element to write. - * @param data The content of the data to write. - * @return True for success, false otherwise. - * - * @todo Port this to a template - */ - bool set(const unsigned index, const double data); - - /** - * @brief Set the pointer to the buffer storing signal's data - * - * This method allows changing the handled buffer. In the DataFormat::CONTIGUOUS case the data - * is copied inside the object. Instead, in the DataFormat::CONTIGUOUS_ZEROCOPY only the pointer - * to the buffer is changed. - * - * This method is not allowed for DataFormat::NONCONTIGUOUS format. - * - * @tparam The data type of the new buffer. - * @param data The new buffer address. - * @param length The size of the new buffer. - * @return True if the buffer was set sucessfully, false otherwise. - */ - template - bool setBuffer(const T* data, const unsigned length); -}; - -// Explicit declaration of templates for all the supported types -// ============================================================= - -// TODO: for the time being, only DOUBLE is allowed. The toolbox has an almost complete support to -// many other data types, but they need to be tested. - -namespace wbt { - // DataType::DOUBLE - extern template double* Signal::getBuffer(); - extern template const double* Signal::getBuffer() const; - extern template double Signal::get(const unsigned i) const; - extern template bool Signal::setBuffer(const double* data, const unsigned length); -} // namespace wbt - -#endif // WBT_SIGNAL_H diff --git a/toolbox/core/include/Core/SimulinkBlockInformation.h b/toolbox/core/include/Core/SimulinkBlockInformation.h deleted file mode 100644 index 2de495cdc..000000000 --- a/toolbox/core/include/Core/SimulinkBlockInformation.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#ifndef WBT_SIMULINKBLOCKINFORMATION_H -#define WBT_SIMULINKBLOCKINFORMATION_H - -#include "AnyType.h" -#include "BlockInformation.h" -#include "Parameter.h" -#include "Signal.h" - -#include -#include -#include - -namespace wbt { - class SimulinkBlockInformation; -} // namespace wbt - -class wbt::SimulinkBlockInformation final : public wbt::BlockInformation -{ -private: - SimStruct* simstruct; - std::string m_confBlockName; - std::vector m_paramsMetadata; - - wbt::DataType mapSimulinkToPortType(const DTypeId typeId) const; - DTypeId mapPortTypeToSimulink(const wbt::DataType dataType) const; - -public: - using ParameterIndex = unsigned; - - SimulinkBlockInformation(SimStruct* simstruct); - ~SimulinkBlockInformation() override = default; - - // BLOCK OPTIONS METHODS - // ===================== - - bool optionFromKey(const std::string& key, double& option) const override; - - // PARAMETERS METHODS - // ================== - - bool addParameterMetadata(const wbt::ParameterMetadata& paramMD) override; - bool parseParameters(wbt::Parameters& parameters) override; - - // PORT INFORMATION SETTERS - // ======================== - - bool setIOPortsData(const IOData& ioData) override; - - // PORT INFORMATION GETTERS - // ======================== - - PortData getInputPortData(const PortIndex idx) const override; - PortData getOutputPortData(const PortIndex idx) const override; - VectorSize getInputPortWidth(const PortIndex idx) const override; - VectorSize getOutputPortWidth(const PortIndex idx) const override; - MatrixSize getInputPortMatrixSize(const PortIndex idx) const override; - MatrixSize getOutputPortMatrixSize(const PortIndex idx) const override; - - // BLOCK SIGNALS - // ============= - - wbt::InputSignalPtr - getInputPortSignal(const PortIndex idx, - const VectorSize size = wbt::Signal::DynamicSize) const override; - wbt::OutputSignalPtr - getOutputPortSignal(const PortIndex idx, - const VectorSize size = wbt::Signal::DynamicSize) const override; - - // METHODS OUTSIDE THE INTERFACE - // ============================= - - // Ports methods - bool updateInputPortData(const PortData& portData); - bool updateOutputPortData(const PortData& portData); - bool setNumberOfInputPorts(const unsigned numberOfPorts); - bool setNumberOfOutputPorts(const unsigned numberOfPorts); - bool setInputPortType(const PortIndex idx, const wbt::DataType type); - bool setOutputPortType(const PortIndex idx, const wbt::DataType type); - bool setInputPortVectorSize(const PortIndex idx, const VectorSize& size); - bool setInputPortMatrixSize(const PortIndex idx, const MatrixSize& size); - bool setOutputPortVectorSize(const PortIndex idx, const VectorSize& size); - bool setOutputPortMatrixSize(const PortIndex idx, const MatrixSize& size); - - // Scalar parameters - bool getScalarParameterAtIndex(const ParameterIndex idx, double& value) const; - bool getBooleanParameterAtIndex(const ParameterIndex idx, bool& value) const; - bool getStringParameterAtIndex(const ParameterIndex idx, std::string& value) const; - - // Struct parameters - bool getStringFieldAtIndex(const ParameterIndex idx, - const std::string& fieldName, - std::string& value) const; - bool getScalarFieldAtIndex(const ParameterIndex idx, - const std::string& fieldName, - double& value) const; - bool getBooleanFieldAtIndex(const ParameterIndex idx, - const std::string& fieldName, - bool& value) const; - bool getCellFieldAtIndex(const ParameterIndex idx, - const std::string& fieldName, - AnyCell& value) const; - bool getVectorDoubleFieldAtIndex(const ParameterIndex idx, - const std::string& fieldName, - std::vector& value) const; - - // Cell / Struct / Vector paramters - bool getCellAtIndex(const ParameterIndex idx, AnyCell& value) const; - bool getStructAtIndex(const ParameterIndex idx, AnyStruct& value) const; - bool getVectorAtIndex(const ParameterIndex idx, std::vector& value) const; -}; - -#endif /* WBT_SIMULINKBLOCKINFORMATION_H */ diff --git a/toolbox/core/src/Block.cpp b/toolbox/core/src/Block.cpp deleted file mode 100644 index dc86084e6..000000000 --- a/toolbox/core/src/Block.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#include "Core/Block.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" - -#include - -using namespace wbt; - -unsigned Block::numberOfParameters() -{ - return Block::NumberOfParameters; -} - -std::vector Block::additionalBlockOptions() -{ - return {}; -} - -void Block::parameterAtIndexIsTunable(unsigned /*index*/, bool& tunable) -{ - tunable = false; -} - -bool Block::checkParameters(const BlockInformation* /*blockInfo*/) -{ - return true; -} - -bool Block::parseParameters(BlockInformation* blockInfo) -{ - if (!blockInfo->addParameterMetadata({ParameterType::STRING, 0, 1, 1, "className"}) - || !blockInfo->addParameterMetadata({ParameterType::STRING, 1, 1, 1, "libName"})) { - wbtError << "Failed to add parameters metadata."; - return false; - } - - return blockInfo->parseParameters(m_parameters); -} - -bool Block::configureSizeAndPorts(BlockInformation* blockInfo) -{ - if (!Block::parseParameters(blockInfo)) { - wbtError << "Failed to parse Block parameters."; - return false; - } - - return true; -} - -bool Block::initialize(BlockInformation* blockInfo) -{ - if (!Block::parseParameters(blockInfo)) { - wbtError << "Failed to parse Block parameters."; - return false; - } - - return true; -} - -unsigned Block::numberOfDiscreteStates() -{ - return 0; -} - -unsigned Block::numberOfContinuousStates() -{ - return 0; -} - -bool Block::updateDiscreteState(const BlockInformation* /*blockInfo*/) -{ - return true; -} - -bool Block::stateDerivative(const BlockInformation* /*blockInfo*/) -{ - return true; -} - -bool Block::initializeInitialConditions(const BlockInformation* /*blockInfo*/) -{ - return true; -} - -bool Block::terminate(const BlockInformation* /*blockInfo*/) -{ - return true; -} - -bool Block::getParameters(wbt::Parameters& params) const -{ - params = m_parameters; - return true; -} diff --git a/toolbox/core/src/BlockInformation.cpp b/toolbox/core/src/BlockInformation.cpp deleted file mode 100644 index ce529faf0..000000000 --- a/toolbox/core/src/BlockInformation.cpp +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#include "Core/BlockInformation.h" - -const std::string wbt::BlockOptionPrioritizeOrder = "wbt.BlockOptionPrioritizeOrder"; diff --git a/toolbox/core/src/CoderBlockInformation.cpp b/toolbox/core/src/CoderBlockInformation.cpp deleted file mode 100644 index 3dc85b99f..000000000 --- a/toolbox/core/src/CoderBlockInformation.cpp +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#include "Core/CoderBlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" - -#include -#include -#include -#include -#include -#include - -using namespace wbt; - -class CoderBlockInformation::impl -{ -public: - unsigned numberOfInputs; - unsigned numberOfOutputs; - - std::vector paramsMetadata; - std::unordered_map> inputSignals; - std::unordered_map> outputSignals; - - std::string confBlockName; - Parameters parametersFromRTW; - - std::unordered_map - inputPortDimensions; - std::unordered_map - outputPortDimensions; -}; - -CoderBlockInformation::CoderBlockInformation() - : pImpl{new CoderBlockInformation::impl()} -{} - -CoderBlockInformation::~CoderBlockInformation() = default; - -// BLOCK OPTIONS METHODS -// ===================== - -bool CoderBlockInformation::optionFromKey(const std::string& /*key*/, double& /*option*/) const -{ - return true; -} - -// PORT INFORMATION SETTERS -// ======================== - -bool CoderBlockInformation::setIOPortsData(const BlockInformation::IOData& /*ioData*/) -{ - // This method is called only in the Block::configureSizeAndPorts method, which is never called - // in the Simulink Coder pipeline. - return false; -} - -// PORT INFORMATION GETTERS -// ======================== - -BlockInformation::VectorSize CoderBlockInformation::getInputPortWidth(const PortIndex idx) const -{ - if (pImpl->inputPortDimensions.find(idx) == pImpl->inputPortDimensions.end()) { - wbtError << "Failed to get width of signal at index " << idx << "."; - return 0; - } - - // mdlRTW writes always a {rows, cols} structure, and vectors are row vectors. - // This means that their dimension is the cols entry. - return pImpl->inputPortDimensions.at(idx).at(1); -} - -BlockInformation::VectorSize CoderBlockInformation::getOutputPortWidth(const PortIndex idx) const -{ - if (pImpl->outputPortDimensions.find(idx) == pImpl->outputPortDimensions.end()) { - wbtError << "Failed to get width of signal at index " << idx << "."; - return 0; - } - - // mdlRTW writes always a {rows, cols} structure, and vectors are row vectors. - // This means that their dimension is the cols entry. - return pImpl->outputPortDimensions.at(idx).at(1); -} - -wbt::InputSignalPtr CoderBlockInformation::getInputPortSignal(const PortIndex idx, - const VectorSize size) const -{ - if (pImpl->inputSignals.find(idx) == pImpl->inputSignals.end()) { - wbtError << "Trying to get non-existing signal " << idx << "."; - return {}; - } - - // TODO: portWidth is used only if the signal is dynamically sized. In Simulink, in this case - // the size is gathered from the SimStruct. From the coder instead? Is it possible having - // a signal with dynamic size in the rtw file?? - // TODO: is it better this check or the one implemented in getOutputPortSignal? - if (size != Signal::DynamicSize && pImpl->inputSignals.at(idx)->getWidth() != size) { - wbtError << "Signals with dynamic sizes (index " << idx - << ") are not supported by the CoderBlockInformation."; - return {}; - } - - if (!pImpl->inputSignals.at(idx)->isValid()) { - wbtError << "Input signal at index " << idx << " is not valid."; - return {}; - } - - return pImpl->inputSignals.at(idx); -} - -wbt::OutputSignalPtr CoderBlockInformation::getOutputPortSignal(const PortIndex idx, - const VectorSize /*size*/) const -{ - if (pImpl->outputSignals.find(idx) == pImpl->outputSignals.end()) { - wbtError << "Trying to get non-existing signal " << idx << "."; - return {}; - } - - if (pImpl->outputSignals.at(idx)->getWidth() == Signal::DynamicSize) { - wbtError << "Signals with dynamic sizes (index " << idx - << ") are not supported by the CoderBlockInformation."; - return {}; - } - - if (!pImpl->outputSignals.at(idx)->isValid()) { - wbtError << "Output signal at index " << idx << " is not valid."; - return {}; - } - - return pImpl->outputSignals.at(idx); -} - -BlockInformation::MatrixSize -CoderBlockInformation::getInputPortMatrixSize(const BlockInformation::PortIndex idx) const -{ - if (pImpl->inputPortDimensions.find(idx) == pImpl->inputPortDimensions.end()) { - wbtError << "Trying to get the size of non-existing signal " << idx << "."; - return {}; - } - - return {pImpl->inputPortDimensions.at(idx)[0], pImpl->inputPortDimensions.at(idx)[1]}; -} - -BlockInformation::MatrixSize -CoderBlockInformation::getOutputPortMatrixSize(const BlockInformation::PortIndex idx) const -{ - if (pImpl->outputPortDimensions.find(idx) == pImpl->outputPortDimensions.end()) { - wbtError << "Trying to get the size of non-existing signal " << idx << "."; - return {}; - } - - return {pImpl->outputPortDimensions.at(idx)[0], pImpl->outputPortDimensions.at(idx)[1]}; -} - -bool CoderBlockInformation::addParameterMetadata(const wbt::ParameterMetadata& paramMD) -{ - for (auto md : pImpl->paramsMetadata) { - if (md.name == paramMD.name) { - wbtError << "Trying to store an already existing " << md.name << " parameter."; - return false; - } - } - - pImpl->paramsMetadata.push_back(paramMD); - return true; -} - -// PARAMETERS METHODS -// ================== - -bool CoderBlockInformation::parseParameters(wbt::Parameters& parameters) -{ - if (pImpl->parametersFromRTW.getNumberOfParameters() == 0) { - wbtError << "The Parameters object containing the parameters to parse is empty."; - return false; - } - - for (wbt::ParameterMetadata& md : pImpl->paramsMetadata) { - // Check that all the parameters that are parsed have already been stored from the coder - if (!pImpl->parametersFromRTW.existName(md.name)) { - wbtError << "Trying to get a parameter value for " << md.name - << ", but its value has never been stored."; - return false; - } - - // Handle the case of dynamically sized columns. In this case the metadata passed - // from the Block (containing DynamicSize) is modified with the length of the - // vector that is going to be stored. - if (md.cols == ParameterMetadata::DynamicSize) { - const auto colsFromRTW = pImpl->parametersFromRTW.getParameterMetadata(md.name).cols; - if (colsFromRTW == ParameterMetadata::DynamicSize) { - wbtError << "Trying to store the cols of a dynamically sized parameters, but the " - << "metadata does not specify a valid size. Probably the block didn't " - << "updat the size in its initialization phase."; - return false; - } - md.cols = colsFromRTW; - } - - if (md != pImpl->parametersFromRTW.getParameterMetadata(md.name)) { - wbtError << "Trying to parse a parameter which metadata differs from the metadata " - << "stored by Simulink Coder."; - return false; - } - } - - // This implementation of BlockInformation contains all the parameters from the very beginning, - // stored using the storeRTWParameters method. Here for simplicity all the stored parameters are - // returned, even if the metadata contain only a subset of them. - parameters = pImpl->parametersFromRTW; - return true; -} - -BlockInformation::PortData -CoderBlockInformation::getInputPortData(BlockInformation::PortIndex idx) const -{ - // TODO: hardcoded DataType::DOUBLE. - return std::make_tuple(idx, pImpl->inputPortDimensions.at(idx), DataType::DOUBLE); -} - -BlockInformation::PortData -CoderBlockInformation::getOutputPortData(BlockInformation::PortIndex idx) const -{ - // TODO: hardcoded DataType::DOUBLE. - return std::make_tuple(idx, pImpl->outputPortDimensions.at(idx), DataType::DOUBLE); -} - -bool CoderBlockInformation::storeRTWParameters(const Parameters& parameters) -{ - if (parameters.getNumberOfParameters() == 0) { - wbtError << "The Parameters object passed doesn't contain any parameter."; - return false; - } - - pImpl->parametersFromRTW = parameters; - return true; -} - -bool CoderBlockInformation::setInputSignal(const PortIndex portNumber, - void* address, - const PortDimension& dims) -{ - if ((pImpl->inputSignals.find(portNumber) != pImpl->inputSignals.end()) - || (pImpl->inputPortDimensions.find(portNumber) != pImpl->inputPortDimensions.end())) { - wbtError << "The signal " << portNumber << "has already been previously stored."; - return false; - } - - if (!address) { - wbtError << "The pointer to the signal to store is a nullptr."; - return false; - } - - if (dims.size() > 2) { - wbtError << "Signal with more than 2 dimensions are not currently supported."; - return false; - } - - // Store the input signal - // TODO: hardcoded DataType::DOUBLE - pImpl->inputSignals.insert( - {portNumber, - std::make_shared(Signal::DataFormat::CONTIGUOUS_ZEROCOPY, DataType::DOUBLE)}); - - // Compute the width of the signal - unsigned numElements = 1; - for (auto dimension : dims) { - numElements *= dimension; - } - - // Configure the signal - pImpl->inputSignals[portNumber]->setWidth(numElements); - if (!pImpl->inputSignals[portNumber]->initializeBufferFromContiguousZeroCopy(address)) { - wbtError << "Failed to configure buffer for input signal connected to the port with index " - << portNumber << "."; - return false; - } - - // Store the dimensions in the map - pImpl->inputPortDimensions.emplace(portNumber, dims); - - return true; -} - -bool CoderBlockInformation::setOutputSignal(const PortIndex portNumber, - void* address, - const PortDimension& dims) -{ - if ((pImpl->outputSignals.find(portNumber) != pImpl->outputSignals.end()) - || (pImpl->outputPortDimensions.find(portNumber) != pImpl->outputPortDimensions.end())) { - wbtError << "The signal " << portNumber << "has already been previously stored."; - return false; - } - - if (!address) { - wbtError << "The pointer to the signal to store is a nullptr."; - return false; - } - - if (dims.size() > 2) { - wbtError << "Signal with more than 2 dimensions are not currently supported."; - return false; - } - - // Store the output signal - // TODO: hardcoded DataType::DOUBLE - pImpl->outputSignals.insert( - {portNumber, - std::make_shared(Signal::DataFormat::CONTIGUOUS_ZEROCOPY, DataType::DOUBLE)}); - - // Compute the width of the signal - unsigned numElements = 1; - for (auto dimension : dims) { - numElements *= dimension; - } - - // Configure the signal - pImpl->outputSignals[portNumber]->setWidth(numElements); - if (!pImpl->outputSignals[portNumber]->initializeBufferFromContiguousZeroCopy(address)) { - wbtError << "Failed to configure buffer for output signal connected to the port with index " - << portNumber << "."; - return false; - } - - // Store the dimensions in the map - pImpl->outputPortDimensions.emplace(portNumber, dims); - - return true; -} diff --git a/toolbox/core/src/ConvertStdVector.cpp b/toolbox/core/src/ConvertStdVector.cpp deleted file mode 100644 index 2a8da8ce2..000000000 --- a/toolbox/core/src/ConvertStdVector.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#include "Core/ConvertStdVector.h" -#include - -// Template definition -// =================== - -template -void wbt::convertStdVector(const std::vector& input, std::vector& output) -{ - output = std::vector(input.begin(), input.end()); -} - -// Explicit instantiation for all the other supported types -// ======================================================== - -template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -// Bool to other numeric types -template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -// Double to other numeric types -template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -template void wbt::convertStdVector(const std::vector& input, - std::vector& output); -// String to string -template void wbt::convertStdVector(const std::vector& input, - std::vector& output); - -// Explicit specialization for std::string type -// ============================================ - -template <> -void wbt::convertStdVector(const std::vector& input, - std::vector& output) -{ - output.clear(); - output.resize(input.size()); - std::transform(input.begin(), input.end(), output.begin(), [](const std::string& str) { - return std::stoi(str); - }); -} - -template <> -void wbt::convertStdVector(const std::vector& input, - std::vector& output) -{ - output.clear(); - output.resize(input.size()); - std::transform(input.begin(), input.end(), output.begin(), [](const std::string& str) { - return static_cast(std::stoi(str)); - }); -} - -template <> -void wbt::convertStdVector(const std::vector& input, - std::vector& output) -{ - output.clear(); - output.resize(input.size()); - std::transform(input.begin(), input.end(), output.begin(), [](const std::string& str) { - return std::stod(str); - }); -} - -template <> -void wbt::convertStdVector(const std::vector& input, - std::vector& output) -{ - output.clear(); - output.resize(input.size()); - std::transform(input.begin(), input.end(), output.begin(), [](const int& num) { - return std::to_string(num); - }); -} - -template <> -void wbt::convertStdVector(const std::vector& input, - std::vector& output) -{ - output.clear(); - output.resize(input.size()); - std::transform(input.begin(), input.end(), output.begin(), [](const bool& num) { - return std::to_string(num); - }); -} - -template <> -void wbt::convertStdVector(const std::vector& input, - std::vector& output) -{ - output.clear(); - output.resize(input.size()); - std::transform(input.begin(), input.end(), output.begin(), [](const double& num) { - return std::to_string(num); - }); -} - -// template <> -// void wbt::convertStdVector(const std::vector& input, -// std::vector& output) -//{ -// output = input; -// return; -//} diff --git a/toolbox/core/src/Log.cpp b/toolbox/core/src/Log.cpp deleted file mode 100644 index 8034366d8..000000000 --- a/toolbox/core/src/Log.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#include "Core/Log.h" - -#include - -using namespace wbt; - -class Log::impl -{ -public: - std::vector> errorsSStream; - std::vector> warningsSStream; - - const Verbosity verbosity = WBT_LOG_VERBOSITY; - - static std::string - serializeVectorStringStream(const std::vector>& ss); -}; - -Log::Log() - : pImpl{new Log::impl()} -{} - -Log& Log::getSingleton() -{ - static Log logInstance; - return logInstance; -} - -std::stringstream& Log::getLogStringStream(const Log::Type& type, - const std::string& file, - const unsigned& line, - const std::string& function) -{ - switch (pImpl->verbosity) { - case Log::Verbosity::RELEASE: - switch (type) { - case Log::Type::ERROR: - pImpl->errorsSStream.emplace_back(new std::stringstream); - return *pImpl->errorsSStream.back(); - case Log::Type::WARNING: - pImpl->warningsSStream.emplace_back(new std::stringstream); - return *pImpl->warningsSStream.back(); - } - case Log::Verbosity::DEBUG: - switch (type) { - case Log::Type::ERROR: { - pImpl->errorsSStream.emplace_back(new std::stringstream); - auto& ss = *pImpl->errorsSStream.back(); - ss << std::endl - << file << "@" << function << ":" << std::to_string(line) << std::endl; - return ss; - } - case Log::Type::WARNING: { - pImpl->warningsSStream.emplace_back(new std::stringstream); - auto& ss = *pImpl->warningsSStream.back(); - ss << std::endl - << file << "@" << function << ":" << std::to_string(line) << std::endl; - return ss; - } - } - } -} - -std::string -Log::impl::serializeVectorStringStream(const std::vector>& ss) -{ - std::stringstream output; - - for (const auto& ss_elem : ss) { - output << ss_elem->str() << std::endl; - } - - return output.str(); -} - -std::string Log::getErrors() const -{ - return impl::serializeVectorStringStream(pImpl->errorsSStream); -} - -std::string Log::getWarnings() const -{ - return impl::serializeVectorStringStream(pImpl->warningsSStream); -} - -void Log::clearWarnings() -{ - pImpl->warningsSStream.clear(); -} - -void Log::clearErrors() -{ - pImpl->errorsSStream.clear(); -} - -void Log::clear() -{ - clearErrors(); - clearWarnings(); -} diff --git a/toolbox/core/src/Parameter.cpp b/toolbox/core/src/Parameter.cpp deleted file mode 100644 index 0d23eb4cc..000000000 --- a/toolbox/core/src/Parameter.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#include "Core/Parameter.h" - -using namespace wbt; - -const std::string defaultParamPrefix = "ParamIndex_"; - -ParameterMetadata::ParameterMetadata(const ParameterType& t, - const unsigned& paramIndex, - const int& paramRows, - const int& paramCols, - const std::string& paramName) - : index(paramIndex) - , name(paramName.empty() ? (defaultParamPrefix + std::to_string(index)) : paramName) - , rows(paramRows) - , cols(paramCols) - , type(t) -{} - -ParameterMetadata::ParameterMetadata(const ParameterMetadata& paramMD) - : index(paramMD.index) - , name(paramMD.name.empty() ? (defaultParamPrefix + std::to_string(index)) : paramMD.name) - , rows(paramMD.rows) - , cols(paramMD.cols) - , type(paramMD.type) -{} - -ParameterMetadata::ParameterMetadata(ParameterMetadata&& other) - : index(other.index) - , name(other.name.empty() ? (defaultParamPrefix + std::to_string(index)) : other.name) - , rows(other.rows) - , cols(other.cols) - , type(other.type) -{} - -ParameterMetadata& ParameterMetadata::operator=(const ParameterMetadata& other) -{ - *this = ParameterMetadata(other.type, other.index, other.rows, other.cols, other.name); - return *this; -} - -ParameterMetadata& ParameterMetadata::operator=(ParameterMetadata&& other) -{ - ParameterMetadata paramMD(other.type, other.index, other.rows, other.cols, other.name); - *this = paramMD; - return *this; -} - -bool ParameterMetadata::operator==(const ParameterMetadata& rhs) const -{ - bool ok = true; - ok = ok && (this->index == rhs.index); - ok = ok && (this->name == rhs.name); - ok = ok && (this->rows == rhs.rows); - ok = ok && (this->cols == rhs.cols); - ok = ok && (this->type == rhs.type); - return ok; -} diff --git a/toolbox/core/src/Parameters.cpp b/toolbox/core/src/Parameters.cpp deleted file mode 100644 index 95ae63703..000000000 --- a/toolbox/core/src/Parameters.cpp +++ /dev/null @@ -1,664 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#include "Core/Parameters.h" -#include "Core/ConvertStdVector.h" -#include "Core/Log.h" -#include "Core/Parameter.h" - -#include -#include -#include -#include - -using namespace wbt; - -// ================ -// PARAMETERS::IMPL -// ================ - -class Parameters::impl -{ -public: - // Typedefs for generic scalar / vector parameters - using ParameterInt = Parameter; - using ParameterBool = Parameter; - using ParameterDouble = Parameter; - using ParameterString = Parameter; - - // Typedefs for the storage of vector parameters - using ParamVectorInt = std::vector; - using ParamVectorBool = std::vector; - using ParamVectorDouble = std::vector; - using ParamVectorString = std::vector; - - // Maps for storing parameters and their metadata - std::unordered_map paramsInt; - std::unordered_map paramsBool; - std::unordered_map paramsDouble; - std::unordered_map paramsString; - - // Maps for handling the internal indexing - std::unordered_map nameToType; - std::unordered_map indexToName; - std::unordered_map nameToIndex; - - bool existIndex(const ParamIndex& index) const; - bool existName(const ParamName& name, const wbt::ParameterType& type) const; - - impl* clone() { return new impl(*this); } -}; - -bool Parameters::impl::existName(const Parameters::ParamName& name, - const wbt::ParameterType& type) const -{ - switch (type) { - case ParameterType::INT: - case ParameterType::CELL_INT: - case ParameterType::STRUCT_INT: - case ParameterType::STRUCT_CELL_INT: - if (paramsInt.find(name) == paramsInt.end()) { - return false; - } - break; - case ParameterType::BOOL: - case ParameterType::CELL_BOOL: - case ParameterType::STRUCT_BOOL: - case ParameterType::STRUCT_CELL_BOOL: - if (paramsBool.find(name) == paramsBool.end()) { - return false; - } - break; - case ParameterType::DOUBLE: - case ParameterType::CELL_DOUBLE: - case ParameterType::STRUCT_DOUBLE: - case ParameterType::STRUCT_CELL_DOUBLE: - if (paramsDouble.find(name) == paramsDouble.end()) { - return false; - } - break; - case ParameterType::STRING: - case ParameterType::CELL_STRING: - case ParameterType::STRUCT_STRING: - case ParameterType::STRUCT_CELL_STRING: - if (paramsString.find(name) == paramsString.end()) { - return false; - } - break; - } - return true; -} - -bool Parameters::impl::existIndex(const Parameters::ParamIndex& index) const -{ - if (indexToName.find(index) == indexToName.end()) { - return false; - } - - return true; -} - -// ========== -// PARAMETERS -// ========== - -Parameters::Parameters() - : pImpl{new impl()} -{} - -// Defining the destructor as default here in the cpp avoids the usage -// of a custom pimpl deleter -Parameters::~Parameters() = default; - -Parameters::Parameters(const wbt::Parameters& other) - : pImpl{other.pImpl->clone()} -{} - -wbt::Parameters& Parameters::operator=(const wbt::Parameters& other) -{ - pImpl.reset(other.pImpl->clone()); - return *this; -} - -Parameters::ParamName Parameters::getParamName(const Parameters::ParamIndex& index) const -{ - if (pImpl->indexToName.find(index) == pImpl->indexToName.end()) { - return PARAM_INVALID_NAME; - } - - return pImpl->indexToName.at(index); -} - -Parameters::ParamIndex Parameters::getParamIndex(const Parameters::ParamName& name) const -{ - if (pImpl->nameToIndex.find(name) == pImpl->nameToIndex.end()) { - return PARAM_INVALID_INDEX; - } - - return pImpl->nameToIndex.at(name); -} - -bool Parameters::existName(const Parameters::ParamName& name) const -{ - if (pImpl->existName(name, ParameterType::INT) || pImpl->existName(name, ParameterType::BOOL) - || pImpl->existName(name, ParameterType::DOUBLE) - || pImpl->existName(name, ParameterType::STRING) - || pImpl->existName(name, ParameterType::STRUCT_INT) - || pImpl->existName(name, ParameterType::STRUCT_BOOL) - || pImpl->existName(name, ParameterType::STRUCT_DOUBLE) - || pImpl->existName(name, ParameterType::STRUCT_STRING)) { - return true; - } - return false; -} - -unsigned Parameters::getNumberOfParameters() const -{ - const size_t numIntParams = pImpl->paramsInt.size(); - const size_t numBoolParams = pImpl->paramsBool.size(); - const size_t numDoubleParams = pImpl->paramsDouble.size(); - const size_t numStringParams = pImpl->paramsString.size(); - - return numIntParams + numBoolParams + numDoubleParams + numStringParams; -} - -std::vector> Parameters::getIntParameters() const -{ - std::vector> vectorParams; - - for (auto p : pImpl->paramsInt) { - vectorParams.push_back(p.second); - } - - return vectorParams; -} - -std::vector> Parameters::getBoolParameters() const -{ - std::vector> vectorParams; - - for (auto p : pImpl->paramsBool) { - vectorParams.push_back(p.second); - } - - return vectorParams; -} - -std::vector> Parameters::getDoubleParameters() const -{ - std::vector> vectorParams; - - for (auto p : pImpl->paramsDouble) { - vectorParams.push_back(p.second); - } - - return vectorParams; -} - -std::vector> Parameters::getStringParameters() const -{ - std::vector> vectorParams; - - for (auto p : pImpl->paramsString) { - vectorParams.push_back(p.second); - } - - return vectorParams; -} - -wbt::ParameterMetadata Parameters::getParameterMetadata(const ParamName& name) -{ - if (!existName(name) || !pImpl->existName(name, pImpl->nameToType.at(name))) { - // TODO: here dummy metadata are returned. This can be improved. - wbtError << "Failed to get metadata of " << name << " parameter."; - return {ParameterType::INT, 0, 0, 0, "dummy"}; - } - - switch (pImpl->nameToType[name]) { - case ParameterType::INT: - case ParameterType::CELL_INT: - case ParameterType::STRUCT_INT: - case ParameterType::STRUCT_CELL_INT: - return pImpl->paramsInt.at(name).getMetadata(); - case ParameterType::BOOL: - case ParameterType::CELL_BOOL: - case ParameterType::STRUCT_BOOL: - case ParameterType::STRUCT_CELL_BOOL: - return pImpl->paramsBool.at(name).getMetadata(); - case ParameterType::DOUBLE: - case ParameterType::CELL_DOUBLE: - case ParameterType::STRUCT_DOUBLE: - case ParameterType::STRUCT_CELL_DOUBLE: - return pImpl->paramsDouble.at(name).getMetadata(); - case ParameterType::STRING: - case ParameterType::CELL_STRING: - case ParameterType::STRUCT_STRING: - case ParameterType::STRUCT_CELL_STRING: - return pImpl->paramsString.at(name).getMetadata(); - } -} - -// ========= -// TEMPLATES -// ========= - -// GETPARAMETER -// ============ - -// SCALAR -// ------ - -// Instantiate the declared templates -template bool Parameters::getParameter(const Parameters::ParamName& name, int& param) const; -template bool Parameters::getParameter(const Parameters::ParamName& name, bool& param) const; -template bool Parameters::getParameter(const Parameters::ParamName& name, - double& param) const; - -template -bool wbt::Parameters::getParameter(const wbt::Parameters::ParamName& name, T& param) const -{ - if (!existName(name) || !pImpl->existName(name, pImpl->nameToType.at(name))) { - wbtError << "Trying to get a non existing " << name << " parameter."; - return false; - } - - switch (pImpl->nameToType.at(name)) { - case ParameterType::INT: - case ParameterType::CELL_INT: - case ParameterType::STRUCT_INT: - case ParameterType::STRUCT_CELL_INT: - if (!pImpl->paramsInt.at(name).isScalar()) { - wbtError << "Trying to get a scalar from a vector parameter."; - return false; - } - param = static_cast(pImpl->paramsInt.at(name).getScalarParameter()); - break; - case ParameterType::BOOL: - case ParameterType::CELL_BOOL: - case ParameterType::STRUCT_BOOL: - case ParameterType::STRUCT_CELL_BOOL: - if (!pImpl->paramsBool.at(name).isScalar()) { - wbtError << "Trying to get a scalar from a vector parameter."; - return false; - } - param = static_cast(pImpl->paramsBool.at(name).getScalarParameter()); - break; - case ParameterType::DOUBLE: - case ParameterType::CELL_DOUBLE: - case ParameterType::STRUCT_DOUBLE: - case ParameterType::STRUCT_CELL_DOUBLE: - if (!pImpl->paramsDouble.at(name).isScalar()) { - wbtError << "Trying to get a scalar from a vector parameter."; - return false; - } - param = static_cast(pImpl->paramsDouble.at(name).getScalarParameter()); - break; - case ParameterType::STRING: - case ParameterType::CELL_STRING: - case ParameterType::STRUCT_STRING: - case ParameterType::STRUCT_CELL_STRING: - if (!pImpl->paramsString.at(name).isScalar()) { - wbtError << "Trying to get a scalar from a vector parameter."; - return false; - } - param = static_cast(std::stod(pImpl->paramsString.at(name).getScalarParameter())); - break; - } - return true; -} - -// VECTOR -// ------ - -template bool Parameters::getParameter(const Parameters::ParamName& name, - std::vector& param) const; -template bool Parameters::getParameter(const Parameters::ParamName& name, - std::vector& param) const; -template bool Parameters::getParameter(const Parameters::ParamName& name, - std::vector& param) const; -template bool Parameters::getParameter(const Parameters::ParamName& name, - std::vector& param) const; - -template -bool wbt::Parameters::getParameter(const wbt::Parameters::ParamName& name, - std::vector& param) const -{ - if (!existName(name) || !pImpl->existName(name, pImpl->nameToType.at(name))) { - wbtError << "Trying to get a non existing " << name << " parameter."; - return false; - } - - param.clear(); - - switch (pImpl->nameToType.at(name)) { - case ParameterType::INT: - case ParameterType::CELL_INT: - case ParameterType::STRUCT_INT: - case ParameterType::STRUCT_CELL_INT: { - if (pImpl->paramsInt.at(name).isScalar()) { - wbtError << "Trying to get a vector from a scalar parameter."; - return false; - } - std::vector output; - convertStdVector(pImpl->paramsInt.at(name).getVectorParameter(), param); - break; - } - case ParameterType::BOOL: - case ParameterType::CELL_BOOL: - case ParameterType::STRUCT_BOOL: - case ParameterType::STRUCT_CELL_BOOL: { - if (pImpl->paramsBool.at(name).isScalar()) { - wbtError << "Trying to get a vector from a scalar parameter."; - return false; - } - std::vector output; - convertStdVector(pImpl->paramsBool.at(name).getVectorParameter(), param); - break; - } - case ParameterType::DOUBLE: - case ParameterType::CELL_DOUBLE: - case ParameterType::STRUCT_DOUBLE: - case ParameterType::STRUCT_CELL_DOUBLE: { - if (pImpl->paramsDouble.at(name).isScalar()) { - wbtError << "Trying to get a vector from a scalar parameter."; - return false; - } - std::vector output; - convertStdVector(pImpl->paramsDouble.at(name).getVectorParameter(), param); - break; - } - case ParameterType::STRING: - case ParameterType::CELL_STRING: - case ParameterType::STRUCT_STRING: - case ParameterType::STRUCT_CELL_STRING: { - if (pImpl->paramsString.at(name).isScalar()) { - wbtError << "Trying to get a vector from a scalar parameter."; - return false; - } - std::vector output; - convertStdVector(pImpl->paramsString.at(name).getVectorParameter(), param); - break; - } - } - return true; -} - -// STOREPARAMETER -// ============ - -// SCALAR -// ------ - -template bool Parameters::storeParameter(const int& param, - const ParameterMetadata& paramMetadata); -template bool Parameters::storeParameter(const bool& param, - const ParameterMetadata& paramMetadata); -template bool Parameters::storeParameter(const double& param, - const ParameterMetadata& paramMetadata); - -template -bool wbt::Parameters::storeParameter(const T& param, const wbt::ParameterMetadata& paramMetadata) -{ - if (existName(paramMetadata.name) || pImpl->existName(paramMetadata.name, paramMetadata.type)) { - wbtError << "Trying to store an already existing " << paramMetadata.name << " parameter."; - return false; - } - - if (paramMetadata.rows != 1 && paramMetadata.cols != 1) { - wbtError << "2D parameters are not supported."; - return false; - } - - switch (paramMetadata.type) { - case ParameterType::INT: - case ParameterType::CELL_INT: - case ParameterType::STRUCT_INT: - case ParameterType::STRUCT_CELL_INT: - pImpl->paramsInt.emplace(std::make_pair( - paramMetadata.name, impl::ParameterInt(static_cast(param), paramMetadata))); - break; - case ParameterType::BOOL: - case ParameterType::CELL_BOOL: - case ParameterType::STRUCT_BOOL: - case ParameterType::STRUCT_CELL_BOOL: - pImpl->paramsBool.emplace(std::make_pair( - paramMetadata.name, impl::ParameterBool(static_cast(param), paramMetadata))); - break; - case ParameterType::DOUBLE: - case ParameterType::CELL_DOUBLE: - case ParameterType::STRUCT_DOUBLE: - case ParameterType::STRUCT_CELL_DOUBLE: - pImpl->paramsDouble.emplace( - std::make_pair(paramMetadata.name, - impl::ParameterDouble(static_cast(param), paramMetadata))); - break; - case ParameterType::STRING: - case ParameterType::CELL_STRING: - case ParameterType::STRUCT_STRING: - case ParameterType::STRUCT_CELL_STRING: - pImpl->paramsString.emplace(std::make_pair( - paramMetadata.name, impl::ParameterString(std::to_string(param), paramMetadata))); - break; - } - - pImpl->nameToType[paramMetadata.name] = paramMetadata.type; - pImpl->nameToIndex[paramMetadata.name] = paramMetadata.index; - pImpl->indexToName[paramMetadata.index] = paramMetadata.name; - - return true; -} - -// VECTOR -// ------ - -template bool Parameters::storeParameter(const std::vector& param, - const ParameterMetadata& paramMetadata); -template bool Parameters::storeParameter(const std::vector& param, - const ParameterMetadata& paramMetadata); -template bool Parameters::storeParameter(const std::vector& param, - const ParameterMetadata& paramMetadata); -template bool Parameters::storeParameter(const std::vector& param, - const ParameterMetadata& paramMetadata); - -template -bool wbt::Parameters::storeParameter(const std::vector& param, - const wbt::ParameterMetadata& paramMetadata) -{ - if (existName(paramMetadata.name) || pImpl->existName(paramMetadata.name, paramMetadata.type)) { - wbtError << "Trying to store an already existing " << paramMetadata.name << " parameter."; - return false; - } - - if (paramMetadata.rows != 1 && paramMetadata.cols != param.size()) { - wbtError << "2D parameters are not supported."; - return false; - } - - switch (paramMetadata.type) { - case ParameterType::INT: - case ParameterType::CELL_INT: - case ParameterType::STRUCT_INT: - case ParameterType::STRUCT_CELL_INT: { - std::vector paramInt(param.size()); - convertStdVector(param, paramInt); - pImpl->paramsInt.emplace( - std::make_pair(paramMetadata.name, impl::ParameterInt(paramInt, paramMetadata))); - break; - } - case ParameterType::BOOL: - case ParameterType::CELL_BOOL: - case ParameterType::STRUCT_BOOL: - case ParameterType::STRUCT_CELL_BOOL: { - std::vector paramBool(param.size()); - convertStdVector(param, paramBool); - pImpl->paramsBool.emplace( - std::make_pair(paramMetadata.name, impl::ParameterBool(paramBool, paramMetadata))); - break; - } - case ParameterType::DOUBLE: - case ParameterType::CELL_DOUBLE: - case ParameterType::STRUCT_DOUBLE: - case ParameterType::STRUCT_CELL_DOUBLE: { - std::vector paramDouble(param.size()); - convertStdVector(param, paramDouble); - pImpl->paramsDouble.emplace(std::make_pair( - paramMetadata.name, impl::ParameterDouble(paramDouble, paramMetadata))); - break; - } - case ParameterType::STRING: - case ParameterType::CELL_STRING: - case ParameterType::STRUCT_STRING: - case ParameterType::STRUCT_CELL_STRING: { - std::vector paramString(param.size()); - convertStdVector(param, paramString); - pImpl->paramsString.emplace(std::make_pair( - paramMetadata.name, impl::ParameterString(paramString, paramMetadata))); - break; - } - } - - pImpl->nameToType[paramMetadata.name] = paramMetadata.type; - pImpl->nameToIndex[paramMetadata.name] = paramMetadata.index; - pImpl->indexToName[paramMetadata.index] = paramMetadata.name; - - return true; -} - -// PARAMETER -// --------- - -template bool Parameters::storeParameter(const Parameter& parameter); -template bool Parameters::storeParameter(const Parameter& parameter); -template bool Parameters::storeParameter(const Parameter& parameter); -template bool Parameters::storeParameter(const Parameter& parameter); - -template -bool wbt::Parameters::storeParameter(const wbt::Parameter& parameter) -{ - if (existName(parameter.getMetadata().name)) { - wbtError << "Trying to store an already existing " << parameter.getMetadata().name - << " parameter."; - return false; - } - - if (parameter.isScalar()) { - return storeParameter(parameter.getScalarParameter(), parameter.getMetadata()); - } - else { - return storeParameter(parameter.getVectorParameter(), parameter.getMetadata()); - } -} - -// TEMPLATE SPECIALIZATIONS -// ======================== - -template <> -bool Parameters::getParameter(const ParamName& name, std::string& param) const -{ - if (!existName(name) || !pImpl->existName(name, pImpl->nameToType.at(name))) { - wbtError << "Trying to get a non existing " << name << " parameter."; - return false; - } - - switch (pImpl->nameToType.at(name)) { - case ParameterType::INT: - case ParameterType::CELL_INT: - case ParameterType::STRUCT_INT: - case ParameterType::STRUCT_CELL_INT: - if (!pImpl->paramsInt.at(name).isScalar()) { - wbtError << "Trying to get a scalar from a vector parameter."; - return false; - } - param = std::to_string(pImpl->paramsInt.at(name).getScalarParameter()); - break; - case ParameterType::BOOL: - case ParameterType::CELL_BOOL: - case ParameterType::STRUCT_BOOL: - case ParameterType::STRUCT_CELL_BOOL: - if (!pImpl->paramsBool.at(name).isScalar()) { - wbtError << "Trying to get a scalar from a vector parameter."; - return false; - } - param = std::to_string(pImpl->paramsBool.at(name).getScalarParameter()); - break; - case ParameterType::DOUBLE: - case ParameterType::CELL_DOUBLE: - case ParameterType::STRUCT_DOUBLE: - case ParameterType::STRUCT_CELL_DOUBLE: - if (!pImpl->paramsDouble.at(name).isScalar()) { - wbtError << "Trying to get a scalar from a vector parameter."; - return false; - } - param = std::to_string(pImpl->paramsDouble.at(name).getScalarParameter()); - break; - case ParameterType::STRING: - case ParameterType::CELL_STRING: - case ParameterType::STRUCT_STRING: - case ParameterType::STRUCT_CELL_STRING: - if (!pImpl->paramsString.at(name).isScalar()) { - wbtError << "Trying to get a scalar from a vector parameter."; - return false; - } - param = pImpl->paramsString.at(name).getScalarParameter(); - break; - } - return true; -} - -template <> -bool wbt::Parameters::storeParameter(const std::string& param, - const wbt::ParameterMetadata& paramMetadata) -{ - if (existName(paramMetadata.name) || pImpl->existName(paramMetadata.name, paramMetadata.type)) { - wbtError << "Trying to store an already existing " << paramMetadata.name << " parameter."; - return false; - } - - if (paramMetadata.rows != 1 && paramMetadata.cols != 1) { - wbtError << "2D parameters are not supported."; - return false; - } - - switch (paramMetadata.type) { - case ParameterType::INT: - case ParameterType::CELL_INT: - case ParameterType::STRUCT_INT: - case ParameterType::STRUCT_CELL_INT: - pImpl->paramsInt.emplace(std::make_pair( - paramMetadata.name, impl::ParameterInt(std::stoi(param), paramMetadata))); - break; - case ParameterType::BOOL: - case ParameterType::CELL_BOOL: - case ParameterType::STRUCT_BOOL: - case ParameterType::STRUCT_CELL_BOOL: - pImpl->paramsBool.emplace(std::make_pair( - paramMetadata.name, - impl::ParameterBool(static_cast(std::stoi(param)), paramMetadata))); - break; - case ParameterType::DOUBLE: - case ParameterType::CELL_DOUBLE: - case ParameterType::STRUCT_DOUBLE: - case ParameterType::STRUCT_CELL_DOUBLE: - pImpl->paramsDouble.emplace(std::make_pair( - paramMetadata.name, impl::ParameterDouble(std::stod(param), paramMetadata))); - break; - case ParameterType::STRING: - case ParameterType::CELL_STRING: - case ParameterType::STRUCT_STRING: - case ParameterType::STRUCT_CELL_STRING: - pImpl->paramsString.emplace( - std::make_pair(paramMetadata.name, impl::ParameterString(param, paramMetadata))); - break; - } - - pImpl->nameToType[paramMetadata.name] = paramMetadata.type; - pImpl->nameToIndex[paramMetadata.name] = paramMetadata.index; - pImpl->indexToName[paramMetadata.index] = paramMetadata.name; - - return true; -} diff --git a/toolbox/core/src/Signal.cpp b/toolbox/core/src/Signal.cpp deleted file mode 100644 index 2b053d820..000000000 --- a/toolbox/core/src/Signal.cpp +++ /dev/null @@ -1,373 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#include "Core/Signal.h" -#include "Core/Log.h" - -#include -#include -#include -#include -#include -#include - -using namespace wbt; - -// ============ -// SIGNAL::IMPL -// ============ - -class Signal::impl -{ -public: - int width = Signal::DynamicSize; - const DataType portDataType; - const DataFormat dataFormat; - - void* bufferPtr = nullptr; - - template - T* getBufferImpl(); - - void deleteBuffer(); - void allocateBuffer(const void* const bufferInput, void*& bufferOutput, const unsigned& length); - - impl(const DataFormat& dFormat, const DataType& dType) - : portDataType(dType) - , dataFormat(dFormat) - {} - - impl* clone() { return new impl(*this); } -}; - -void Signal::impl::allocateBuffer(const void* const bufferInput, - void*& bufferOutput, - const unsigned& length) -{ - if (dataFormat == DataFormat::CONTIGUOUS_ZEROCOPY) { - wbtWarning << "Trying to allocate a buffer with a non-supported " - << "CONTIGUOUS_ZEROCOPY data format."; - return; - } - - switch (portDataType) { - case DataType::DOUBLE: { - // Allocate the array - bufferOutput = static_cast(new double[length]); - // Cast to double - const double* const bufferInputDouble = static_cast(bufferInput); - double* bufferOutputDouble = static_cast(bufferOutput); - // Copy data - std::copy(bufferInputDouble, bufferInputDouble + length, bufferOutputDouble); - return; - } - default: - // TODO: Implement other DataType - wbtError << "The specified DataType is not yet supported. Used DOUBLE instead."; - return; - } -} - -void Signal::impl::deleteBuffer() -{ - if (dataFormat == DataFormat::CONTIGUOUS_ZEROCOPY || !bufferPtr) { - return; - } - - switch (portDataType) { - case DataType::DOUBLE: - delete static_cast(bufferPtr); - bufferPtr = nullptr; - return; - default: - // TODO: Implement other DataType - wbtError << "The specified DataType is not yet supported. Used DOUBLE instead."; - return; - } -} - -// ====== -// SIGNAL -// ====== - -Signal::~Signal() -{ - pImpl->deleteBuffer(); -} - -Signal::Signal(const Signal& other) - : pImpl{other.pImpl->clone()} -{ - if (pImpl->bufferPtr) { - switch (pImpl->dataFormat) { - case DataFormat::CONTIGUOUS_ZEROCOPY: - // We just need the buffer pointer, which has been already copied - // by the pImpl clone. - break; - case DataFormat::NONCONTIGUOUS: - case DataFormat::CONTIGUOUS: - // Copy the allocated data - pImpl->allocateBuffer(other.pImpl->bufferPtr, pImpl->bufferPtr, other.pImpl->width); - break; - } - } -} - -Signal::Signal(const DataFormat& dataFormat, const DataType& dataType) - : pImpl{new impl(dataFormat, dataType)} -{} - -Signal::Signal(Signal&& other) - : pImpl{other.pImpl->clone()} -{ - other.pImpl->width = 0; - other.pImpl->bufferPtr = nullptr; -} - -bool Signal::initializeBufferFromContiguousZeroCopy(const void* buffer) -{ - if (pImpl->dataFormat != DataFormat::CONTIGUOUS_ZEROCOPY) { - wbtError << "Trying to initialize a CONTIGUOUS_ZEROCOPY signal but the configured " - << "DataFormat does not match."; - return false; - } - - pImpl->bufferPtr = const_cast(buffer); - return true; -} - -bool Signal::initializeBufferFromContiguous(const void* buffer) -{ - if (pImpl->dataFormat != DataFormat::CONTIGUOUS) { - wbtError << "Trying to initialize a CONTIGUOUS signal but the configured " - << "DataFormat does not match."; - return false; - } - - if (pImpl->width <= 0) { - wbtError << "Signal width unknown. Unable to initialize the buffer if the " - << "signal size is not set."; - return false; - } - - // Copy data from the external contiguous buffer to the internal buffer - pImpl->allocateBuffer(buffer, pImpl->bufferPtr, pImpl->width); - - return true; -} - -bool Signal::initializeBufferFromNonContiguous(const void* const* bufferPtrs) -{ - if (pImpl->dataFormat != DataFormat::NONCONTIGUOUS) { - wbtError << "Trying to initialize a NONCONTIGUOUS signal but the configured " - << "DataFormat does not match."; - return false; - } - - if (pImpl->width <= 0) { - wbtError << "Signal width unknown. Unable to initialize the buffer if the " - << "signal size is not set."; - return false; - } - - if (pImpl->portDataType == DataType::DOUBLE) { - // Allocate a new vector to store data from the non-contiguous signal - pImpl->bufferPtr = static_cast(new double[pImpl->width]); - double* bufferPtrDouble = static_cast(pImpl->bufferPtr); - - // Copy data from MATLAB's memory to the Signal object - for (auto i = 0; i < pImpl->width; ++i) { - const double* valuePtr = static_cast(*bufferPtrs); - bufferPtrDouble[i] = valuePtr[i]; - } - } - return true; -} - -bool Signal::isValid() const -{ - return pImpl->bufferPtr && (pImpl->width > 0); -} - -void Signal::setWidth(const unsigned width) -{ - pImpl->width = width; -} - -int Signal::getWidth() const -{ - return pImpl->width; -} - -DataType Signal::getPortDataType() const -{ - return pImpl->portDataType; -} - -Signal::DataFormat Signal::getDataFormat() const -{ - return pImpl->dataFormat; -} - -bool Signal::set(const unsigned index, const double data) -{ - if (pImpl->width <= index) { - wbtError << "The signal index exceeds its width."; - return false; - } - - if (!pImpl->bufferPtr) { - wbtError << "The pointer to data is null. The signal was not configured properly."; - return false; - } - - switch (pImpl->portDataType) { - case DataType::DOUBLE: { - double* buffer = static_cast(pImpl->bufferPtr); - buffer[index] = data; - break; - } - case DataType::SINGLE: { - float* buffer = static_cast(pImpl->bufferPtr); - buffer[index] = data; - break; - } - default: - // TODO: Implement other DataType - wbtError << "The specified DataType is not yet supported. Used DOUBLE instead."; - return false; - break; - } - return true; -} - -// Explicit template instantiations -// ================================ -template double* Signal::getBuffer(); -template const double* Signal::getBuffer() const; -template double Signal::get(const unsigned i) const; -template bool Signal::setBuffer(const double* data, const unsigned length); - -// Template definitions -// =================== - -template -T Signal::get(const unsigned i) const -{ - const T* buffer = getBuffer(); - - if (!buffer) { - wbtError << "The buffer inside the signal has not been initialized properly."; - return {}; - } - - if (i >= pImpl->width) { - wbtError << "Trying to access an element that exceeds signal width."; - return {}; - } - - return buffer[i]; -} - -template -T* Signal::impl::getBufferImpl() -{ - const std::map mapDataTypeToHash = { - {DataType::DOUBLE, typeid(double).hash_code()}, - {DataType::SINGLE, typeid(float).hash_code()}, - {DataType::INT8, typeid(int8_t).hash_code()}, - {DataType::UINT8, typeid(uint8_t).hash_code()}, - {DataType::INT16, typeid(int16_t).hash_code()}, - {DataType::UINT16, typeid(uint16_t).hash_code()}, - {DataType::INT32, typeid(int32_t).hash_code()}, - {DataType::UINT32, typeid(uint32_t).hash_code()}, - {DataType::BOOLEAN, typeid(bool).hash_code()}}; - - if (!bufferPtr) { - wbtError << "The pointer to data is null. The signal was not configured properly."; - return nullptr; - } - - // Check the returned matches the same type of the portType. - // If this is not met, applying pointer arithmetics on the returned - // pointer would show unknown behaviour. - if (typeid(T).hash_code() != mapDataTypeToHash.at(portDataType)) { - wbtError << "Trying to get the buffer using a type different than its DataType"; - return nullptr; - } - - // Cast pointer and return it - return static_cast(bufferPtr); -} - -template -T* Signal::getBuffer() -{ - return pImpl->getBufferImpl(); -} - -template -const T* Signal::getBuffer() const -{ - return pImpl->getBufferImpl(); -} - -template -bool Signal::setBuffer(const T* data, const unsigned length) -{ - // Non contiguous signals follow the Simulink convention of being read-only. - // They are used only for input signals. - if (pImpl->dataFormat == DataFormat::NONCONTIGUOUS) { - wbtError << "Changing buffer address to NONCONTIGUOUS is not allowed."; - return false; - } - - // Fail if the length is greater of the signal width - if (pImpl->dataFormat == DataFormat::CONTIGUOUS_ZEROCOPY && length > pImpl->width) { - wbtError << "Trying to set a buffer with a length greater than the signal width."; - return false; - } - - // Check that T matches the type of raw buffer stored. Use getBuffer since it will return - // nullptr if this is not met. - if (!getBuffer()) { - wbtError << "Trying to get a pointer with a type not matching the signal's DataType."; - return false; - } - - switch (pImpl->dataFormat) { - case DataFormat::CONTIGUOUS: - // Delete the current array - if (pImpl->bufferPtr) { - delete getBuffer(); - pImpl->bufferPtr = nullptr; - pImpl->width = 0; - } - // Allocate a new empty array - pImpl->bufferPtr = static_cast(new T[length]); - pImpl->width = length; - // Fill it with new data - std::copy(data, data + length, getBuffer()); - break; - case DataFormat::CONTIGUOUS_ZEROCOPY: - // Reset current data if width changes - if (length != pImpl->width) { - std::fill(getBuffer(), getBuffer() + length, 0); - } - // Copy new data - std::copy(data, data + length, getBuffer()); - // Update the width - pImpl->width = length; - break; - case DataFormat::NONCONTIGUOUS: - wbtError << "The code should never arrive here. Unexpected error."; - return false; - } - - return true; -} diff --git a/toolbox/core/src/SimulinkBlockInformation.cpp b/toolbox/core/src/SimulinkBlockInformation.cpp deleted file mode 100644 index 0c3348f9c..000000000 --- a/toolbox/core/src/SimulinkBlockInformation.cpp +++ /dev/null @@ -1,900 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#include "Core/SimulinkBlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" -#include "Core/Signal.h" -#include "MxAnyType.h" - -#include -#include -#include -#include -#include -#include - -using namespace wbt; - -SimulinkBlockInformation::SimulinkBlockInformation(SimStruct* S) - : simstruct(S) -{} - -// BLOCK OPTIONS METHODS -// ===================== - -bool SimulinkBlockInformation::optionFromKey(const std::string& key, double& option) const -{ - if (key == wbt::BlockOptionPrioritizeOrder) { - option = SS_OPTION_PLACE_ASAP; - return true; - } - - wbtError << "Unrecognized block option."; - return false; -} - -// PARAMETERS METHODS -// ================== - -bool SimulinkBlockInformation::getStringParameterAtIndex(const ParameterIndex idx, - std::string& value) const -{ - const mxArray* blockParam = ssGetSFcnParam(simstruct, idx); - return MxAnyType(blockParam).asString(value); -} - -bool SimulinkBlockInformation::getScalarParameterAtIndex(const ParameterIndex idx, - double& value) const -{ - const mxArray* blockParam = ssGetSFcnParam(simstruct, idx); - return MxAnyType(blockParam).asDouble(value); -} - -bool SimulinkBlockInformation::getBooleanParameterAtIndex(const ParameterIndex idx, - bool& value) const -{ - double tmpValue = 0; - const mxArray* blockParam = ssGetSFcnParam(simstruct, idx); - - // The Simulink mask often doesn't store boolean data from the mask as bool but as double. - // Calling asBool() will fail in this case. If this happens, asDouble() is used as fallback. - if (MxAnyType(blockParam).asBool(value)) { - return true; - } - else if (MxAnyType(blockParam).asDouble(tmpValue)) { - value = static_cast(tmpValue); - return true; - } - - wbtError << "Failed to parse bool parameter"; - return false; -} - -bool SimulinkBlockInformation::getCellAtIndex(const ParameterIndex idx, AnyCell& value) const -{ - const mxArray* blockParam = ssGetSFcnParam(simstruct, idx); - return MxAnyType(blockParam).asAnyCell(value); -} - -bool SimulinkBlockInformation::getStructAtIndex(const ParameterIndex idx, AnyStruct& value) const -{ - const mxArray* blockParam = ssGetSFcnParam(simstruct, idx); - return MxAnyType(blockParam).asAnyStruct(value); -} - -bool SimulinkBlockInformation::getVectorAtIndex(const ParameterIndex idx, - std::vector& value) const -{ - const mxArray* blockParam = ssGetSFcnParam(simstruct, idx); - return MxAnyType(blockParam).asVectorDouble(value); -} - -bool SimulinkBlockInformation::getStringFieldAtIndex(const ParameterIndex idx, - const std::string& fieldName, - std::string& value) const -{ - AnyStruct s; - - if (!getStructAtIndex(idx, s)) { - wbtError << "Failed to get struct at index " << idx << "."; - return false; - } - - if (s.find(fieldName) == s.end()) { - wbtError << "Struct at index " << idx << " does not contain any " << fieldName << " field."; - return false; - } - - return s.at(fieldName)->asString(value); -} - -bool SimulinkBlockInformation::getScalarFieldAtIndex(const ParameterIndex idx, - const std::string& fieldName, - double& value) const -{ - AnyStruct s; - - if (!getStructAtIndex(idx, s)) { - wbtError << "Failed to get struct at index " << idx << "."; - return false; - } - - if (s.find(fieldName) == s.end()) { - wbtError << "Struct at index " << idx << " does not contain any " << fieldName << " field."; - return false; - } - - return s.at(fieldName)->asDouble(value); -} - -bool SimulinkBlockInformation::getBooleanFieldAtIndex(const ParameterIndex idx, - const std::string& fieldName, - bool& value) const -{ - AnyStruct s; - - if (!getStructAtIndex(idx, s)) { - wbtError << "Failed to get struct at index " << idx << "."; - return false; - } - - if (s.find(fieldName) == s.end()) { - wbtError << "Struct at index " << idx << " does not contain any " << fieldName << " field."; - return false; - } - - return s.at(fieldName)->asBool(value); -} - -bool SimulinkBlockInformation::getCellFieldAtIndex(const ParameterIndex idx, - const std::string& fieldName, - AnyCell& value) const -{ - AnyStruct s; - - if (!getStructAtIndex(idx, s)) { - wbtError << "Failed to get struct at index " << idx << "."; - return false; - } - - if (s.find(fieldName) == s.end()) { - wbtError << "Struct at index " << idx << " does not contain any " << fieldName << " field."; - return false; - } - - return s.at(fieldName)->asAnyCell(value); -} - -bool SimulinkBlockInformation::getVectorDoubleFieldAtIndex(const ParameterIndex idx, - const std::string& fieldName, - std::vector& value) const -{ - AnyStruct s; - - if (!getStructAtIndex(idx, s)) { - wbtError << "Failed to get struct at index " << idx << "."; - return false; - } - - if (s.find(fieldName) == s.end()) { - wbtError << "Struct at index " << idx << " does not contain any " << fieldName << " field."; - return false; - } - - return s.at(fieldName)->asVectorDouble(value); -} - -// PORT INFORMATION SETTERS -// ======================== - -bool SimulinkBlockInformation::setNumberOfInputPorts(const unsigned numberOfPorts) -{ - return ssSetNumInputPorts(simstruct, numberOfPorts); -} - -bool SimulinkBlockInformation::setNumberOfOutputPorts(const unsigned numberOfPorts) -{ - return ssSetNumOutputPorts(simstruct, numberOfPorts); -} - -bool SimulinkBlockInformation::setInputPortVectorSize(const PortIndex idx, const VectorSize& size) -{ - if (size == Signal::DynamicSize) { - // TODO: in this case, explore how to use mdlSetOutputPortDimensionInfo and - // mdlSetDefaultPortDimensionInfo - return ssSetInputPortVectorDimension(simstruct, idx, DYNAMICALLY_SIZED); - } - - return ssSetInputPortVectorDimension(simstruct, idx, size); -} - -bool SimulinkBlockInformation::setInputPortMatrixSize(const PortIndex idx, const MatrixSize& size) -{ - // Refer to: https://it.mathworks.com/help/simulink/sfg/sssetoutputportmatrixdimensions.html - if (size.first == Signal::DynamicSize || size.second == Signal::DynamicSize) { - // TODO: in this case, explore how to use mdlSetOutputPortDimensionInfo and - // mdlSetDefaultPortDimensionInfo - ssSetInputPortMatrixDimensions(simstruct, idx, DYNAMICALLY_SIZED, DYNAMICALLY_SIZED); - } - - return ssSetInputPortMatrixDimensions(simstruct, idx, size.first, size.first); -} - -bool SimulinkBlockInformation::setOutputPortVectorSize(const PortIndex idx, const VectorSize& size) -{ - if (size == Signal::DynamicSize) { - // TODO: in this case, explore how to use mdlSetOutputPortDimensionInfo and - // mdlSetDefaultPortDimensionInfo - return ssSetOutputPortVectorDimension(simstruct, idx, DYNAMICALLY_SIZED); - } - - return ssSetOutputPortVectorDimension(simstruct, idx, size); -} - -bool SimulinkBlockInformation::setOutputPortMatrixSize(const PortIndex idx, const MatrixSize& size) -{ - // Refer to: https://it.mathworks.com/help/simulink/sfg/sssetinputportmatrixdimensions.html - if (size.first == Signal::DynamicSize || size.second == Signal::DynamicSize) { - // TODO: in this case, explore how to use mdlSetOutputPortDimensionInfo and - // mdlSetDefaultPortDimensionInfo - return ssSetOutputPortMatrixDimensions( - simstruct, idx, DYNAMICALLY_SIZED, DYNAMICALLY_SIZED); - } - - return ssSetOutputPortMatrixDimensions(simstruct, idx, size.first, size.second); -} - -bool SimulinkBlockInformation::setInputPortType(const PortIndex idx, const wbt::DataType type) -{ - ssSetInputPortDirectFeedThrough(simstruct, idx, 1); - ssSetInputPortDataType(simstruct, idx, mapPortTypeToSimulink(type)); - return true; -} - -bool SimulinkBlockInformation::setOutputPortType(const PortIndex idx, const wbt::DataType type) -{ - ssSetOutputPortDataType(simstruct, idx, mapPortTypeToSimulink(type)); - return true; -} - -// PORT INFORMATION GETTERS -// ======================== - -BlockInformation::VectorSize SimulinkBlockInformation::getInputPortWidth(const PortIndex idx) const -{ - return ssGetInputPortWidth(simstruct, idx); -} - -BlockInformation::VectorSize SimulinkBlockInformation::getOutputPortWidth(const PortIndex idx) const -{ - return ssGetOutputPortWidth(simstruct, idx); -} - -wbt::InputSignalPtr SimulinkBlockInformation::getInputPortSignal(const PortIndex idx, - const VectorSize size) const -{ - // Read if the signal is contiguous or non-contiguous - boolean_T isContiguous = ssGetInputPortRequiredContiguous(simstruct, idx); - Signal::DataFormat sigDataFormat = - isContiguous ? Signal::DataFormat::CONTIGUOUS_ZEROCOPY : Signal::DataFormat::NONCONTIGUOUS; - - // Check if the signal is dynamically sized (which means that the dimension - // cannot be read) - bool isDynamicallySized = (ssGetInputPortWidth(simstruct, idx) == DYNAMICALLY_SIZED); - - // Note that if the signal is dynamically sized, portWidth is necessary - if (isDynamicallySized && size == Signal::DynamicSize) { - wbtError << "Trying to get a dynamically sized signal without specifying its size."; - return {}; - } - - // Read the width of the signal if it is not provided as input and the signal is not - // dynamically sized - VectorSize signalSize = size; - if (!isDynamicallySized && size == Signal::DynamicSize) { - signalSize = ssGetInputPortWidth(simstruct, idx); - } - - // Get the data type of the Signal if set (default: double) - DTypeId dataType = ssGetInputPortDataType(simstruct, idx); - - switch (sigDataFormat) { - case Signal::DataFormat::CONTIGUOUS_ZEROCOPY: { - // Initialize the signal - auto signal = std::make_shared(Signal::DataFormat::CONTIGUOUS_ZEROCOPY, - mapSimulinkToPortType(dataType)); - signal->setWidth(signalSize); - - // Initialize signal's data - if (!signal->initializeBufferFromContiguousZeroCopy( - ssGetInputPortSignal(simstruct, idx))) { - wbtError << "Failed to inititialize CONTIGUOUS_ZEROCOPY signal at index " << idx - << "."; - return {}; - } - - // Check signal validity - if (!signal->isValid()) { - wbtError << "Input signal at index " << idx << " is not valid."; - return {}; - } - - return signal; - } - case Signal::DataFormat::NONCONTIGUOUS: { - // Initialize the signal - auto signal = std::make_shared(Signal::DataFormat::NONCONTIGUOUS, - mapSimulinkToPortType(dataType)); - signal->setWidth(signalSize); - - // Initialize signal's data - InputPtrsType port = ssGetInputPortSignalPtrs(simstruct, idx); - if (!signal->initializeBufferFromNonContiguous(static_cast(port))) { - wbtError << "Failed to inititialize NONCONTIGUOUS signal at index " << idx << "."; - return {}; - } - - // Check signal validity - if (!signal->isValid()) { - wbtError << "Input signal at index " << idx << " is not valid."; - return {}; - } - - return signal; - } - case Signal::DataFormat::CONTIGUOUS: { - wbtError << "Failed to inititialize CONTIGUOUS signal at index " << idx << "." - << std::endl - << "CONTIGUOUS input signals are not yet supported. " - << "Use CONTIGUOUS_ZEROCOPY instead."; - return {}; - } - } -} - -wbt::OutputSignalPtr SimulinkBlockInformation::getOutputPortSignal(const PortIndex idx, - const VectorSize size) const -{ - // Check if the signal is dynamically sized (which means that the dimension - // cannot be read) - bool isDynamicallySized = (ssGetOutputPortWidth(simstruct, idx) == DYNAMICALLY_SIZED); - - // Note that if the signal is dynamically sized, portWidth is necessary - if (isDynamicallySized && size == Signal::DynamicSize) { - wbtError << "Trying to get a dynamically sized signal without specifying its size."; - return {}; - } - - // Read the width of the signal if it is not provided as input and the signal is not - // dynamically sized - VectorSize signalSize = size; - if (!isDynamicallySized && size == Signal::DynamicSize) { - signalSize = ssGetOutputPortWidth(simstruct, idx); - } - - // Get the data type of the Signal if set (default: double) - DTypeId dataType = ssGetOutputPortDataType(simstruct, idx); - - auto signal = std::make_shared(Signal::DataFormat::CONTIGUOUS_ZEROCOPY, - mapSimulinkToPortType(dataType)); - signal->setWidth(signalSize); - - if (!signal->initializeBufferFromContiguousZeroCopy(ssGetOutputPortSignal(simstruct, idx))) { - wbtError << "Failed to inititialize CONTIGUOUS_ZEROCOPY signal at index " << idx << "."; - return {}; - } - - if (!signal->isValid()) { - wbtError << "Output signal at index " << idx << " is not valid."; - return {}; - } - - return signal; -} - -BlockInformation::MatrixSize -SimulinkBlockInformation::getInputPortMatrixSize(const PortIndex idx) const -{ - if (ssGetInputPortNumDimensions(simstruct, idx) < 2) { - wbtError << "Signal at index " << idx - << "does not contain a matrix. Failed to gete its size."; - return {}; - } - - const int_T* sizes = ssGetInputPortDimensions(simstruct, idx); - return {sizes[0], sizes[1]}; -} - -BlockInformation::MatrixSize -SimulinkBlockInformation::getOutputPortMatrixSize(const PortIndex idx) const -{ - if (ssGetOutputPortNumDimensions(simstruct, idx) < 2) { - wbtError << "Signal at index " << idx - << "does not contain a matrix. Failed to gete its size."; - return {}; - } - - const int_T* sizes = ssGetOutputPortDimensions(simstruct, idx); - return {sizes[0], sizes[1]}; -} - -DataType SimulinkBlockInformation::mapSimulinkToPortType(const DTypeId typeId) const -{ - switch (typeId) { - case SS_DOUBLE: - return DataType::DOUBLE; - case SS_SINGLE: - return DataType::SINGLE; - case SS_INT8: - return DataType::INT8; - case SS_UINT8: - return DataType::UINT8; - case SS_INT16: - return DataType::INT16; - case SS_UINT16: - return DataType::UINT16; - case SS_INT32: - return DataType::INT32; - case SS_UINT32: - return DataType::UINT32; - case SS_BOOLEAN: - return DataType::BOOLEAN; - default: - return DataType::DOUBLE; - } -} - -DTypeId SimulinkBlockInformation::mapPortTypeToSimulink(const wbt::DataType dataType) const -{ - switch (dataType) { - case DataType::DOUBLE: - return SS_DOUBLE; - case DataType::SINGLE: - return SS_SINGLE; - case DataType::INT8: - return SS_INT8; - case DataType::UINT8: - return SS_UINT8; - case DataType::INT16: - return SS_INT16; - case DataType::UINT16: - return SS_UINT16; - case DataType::INT32: - return SS_INT32; - case DataType::UINT32: - return SS_UINT32; - case DataType::BOOLEAN: - return SS_BOOLEAN; - } -} - -bool SimulinkBlockInformation::addParameterMetadata(const wbt::ParameterMetadata& paramMD) -{ - for (auto md : m_paramsMetadata) { - if (md.name == paramMD.name) { - wbtError << "Trying to store an already existing " << md.name << " parameter."; - return false; - } - } - - // Add the new metadata to the block information - m_paramsMetadata.push_back(paramMD); - return true; -} - -bool SimulinkBlockInformation::parseParameters(wbt::Parameters& parameters) -{ - auto metadataContainsScalarParam = [](const wbt::ParameterMetadata& md) -> const bool { - return md.rows == 1 && md.cols == 1; - }; - - for (wbt::ParameterMetadata paramMD : m_paramsMetadata) { - - bool ok; - - // TODO Right now the cells are reshaped to a 1 x NumElements by MxAnyType - if (paramMD.rows == ParameterMetadata::DynamicSize) { - wbtError << "Dynamically sized rows are not currently supported."; - return false; - } - - // Handle the case of dynamically sized columns. In this case the metadata passed - // from the Block (containing DynamicSize) is modified with the length of the - // vector that is going to be stored. - // This is necessary in the pipeline for storing the metadata in the RTW file, which should - // not have any dynamic size. - const bool hasDynSizeColumns = (paramMD.cols == ParameterMetadata::DynamicSize); - auto handleDynSizeColumns = [](int& sizeToUpdate, const int& realSize) -> const bool { - if (realSize == ParameterMetadata::DynamicSize) { - wbtError << "Trying to store the cols of a dynamically sized parameters, but the " - << "metadata does not specify a valid size. Probably the block didn't " - << "updat the size in its initialization phase."; - return false; - } - sizeToUpdate = realSize; - return true; - }; - - switch (paramMD.type) { - // SCALAR / VECTOR PARAMETERS - // -------------------------- - // - // getScalarParameterAtIndex and getVectorAtIndex operate on type double. - // The cast to other types is handled by storeParameter internally, - // accordingly to the type stored in the metadata. - // - // Despite bool has its own bool parser, considering that both int and double - // are loaded as double (Simulink limitation), in order to simplify the - // maintainability of this code, everything is handled as double. - // - case ParameterType::INT: - case ParameterType::BOOL: - case ParameterType::DOUBLE: { - if (metadataContainsScalarParam(paramMD)) { - double paramValue; - if (!getScalarParameterAtIndex(paramMD.index, paramValue)) { - wbtError << "Failed to get scalar parameter at index " << paramMD.index - << "."; - return false; - } - ok = parameters.storeParameter(paramValue, paramMD); - } - else { - std::vector paramVector; - if (!getVectorAtIndex(paramMD.index, paramVector)) { - wbtError << "Failed to get vector parameter at index " << paramMD.index - << "."; - return false; - } - if (hasDynSizeColumns) { - if (!handleDynSizeColumns(paramMD.cols, paramVector.size())) { - return false; - } - } - ok = parameters.storeParameter(paramVector, paramMD); - } - break; - } - case ParameterType::STRING: { - if (metadataContainsScalarParam(paramMD)) { - std::string paramValue; - if (!getStringParameterAtIndex(paramMD.index, paramValue)) { - wbtError << "Failed to get string parameter at index " << paramMD.index - << "."; - return false; - } - ok = parameters.storeParameter(paramValue, paramMD); - } - else { - wbtError << "Char arrays are not yet supported."; - return false; - } - break; - } - // CELL PARAMETERS - // --------------- - case ParameterType::CELL_INT: - case ParameterType::CELL_BOOL: - case ParameterType::CELL_DOUBLE: { - AnyCell cell; - if (!getCellAtIndex(paramMD.index, cell)) { - wbtError << "Failed to get cell parameter at index " << paramMD.index << "."; - return false; - } - std::vector paramVector; - for (auto element : cell) { - double value; - if (!element->asDouble(value)) { - wbtError << "Failed to parse an element of the cell at index " - << paramMD.index << " as a double."; - return false; - } - paramVector.push_back(value); - } - if (hasDynSizeColumns) { - if (!handleDynSizeColumns(paramMD.cols, paramVector.size())) { - return false; - } - } - ok = parameters.storeParameter(paramVector, paramMD); - break; - } - case ParameterType::CELL_STRING: { - AnyCell cell; - if (!getCellAtIndex(paramMD.index, cell)) { - wbtError << "Failed to get cell parameter at index " << paramMD.index << "."; - return false; - } - std::vector paramVector; - for (auto element : cell) { - std::string value; - if (!element->asString(value)) { - wbtError << "Failed to parse an element of the cell at index " - << paramMD.index << " as a string."; - return false; - } - paramVector.push_back(value); - } - if (hasDynSizeColumns) { - if (!handleDynSizeColumns(paramMD.cols, paramVector.size())) { - return false; - } - } - ok = parameters.storeParameter(paramVector, paramMD); - break; - } - // STRUCT PARAMETERS - // ----------------- - case ParameterType::STRUCT_INT: - case ParameterType::STRUCT_BOOL: - case ParameterType::STRUCT_DOUBLE: { - if (metadataContainsScalarParam(paramMD)) { - double paramValue; - if (!getScalarFieldAtIndex(paramMD.index, paramMD.name, paramValue)) { - wbtError << "Failed to get scalar field " << paramMD.name - << " from the struct at index " << paramMD.index << "."; - return false; - } - ok = parameters.storeParameter(paramValue, paramMD); - } - else { - std::vector paramVector; - if (!getVectorDoubleFieldAtIndex(paramMD.index, paramMD.name, paramVector)) { - wbtError << "Failed to get vector field " << paramMD.name - << " from the struct at index " << paramMD.index << "."; - return false; - } - if (hasDynSizeColumns) { - if (!handleDynSizeColumns(paramMD.cols, paramVector.size())) { - return false; - } - } - ok = parameters.storeParameter(paramVector, paramMD); - } - break; - } - case ParameterType::STRUCT_STRING: { - if (metadataContainsScalarParam(paramMD)) { - std::string paramValue; - if (!getStringFieldAtIndex(paramMD.index, paramMD.name, paramValue)) { - wbtError << "Failed to get string field " << paramMD.name - << " from the struct at index " << paramMD.index << "."; - return false; - } - ok = parameters.storeParameter(paramValue, paramMD); - } - else { - wbtError << "Char arrays are not yet supported."; - return false; - } - break; - } - case ParameterType::STRUCT_CELL_INT: - case ParameterType::STRUCT_CELL_BOOL: - case ParameterType::STRUCT_CELL_DOUBLE: { - AnyCell cell; - std::vector paramVector; - if (!getCellFieldAtIndex(paramMD.index, paramMD.name, cell)) { - wbtError << "Failed to get cell field " << paramMD.name - << " from the struct at index " << paramMD.index << "."; - return false; - } - for (auto element : cell) { - double value; - if (!element->asDouble(value)) { - wbtError << "Failed to parse an element of the cell field " << paramMD.name - << " from the struct at index " << paramMD.index - << " as a double."; - return false; - } - paramVector.push_back(value); - } - if (hasDynSizeColumns) { - if (!handleDynSizeColumns(paramMD.cols, paramVector.size())) { - return false; - } - } - ok = parameters.storeParameter(paramVector, paramMD); - break; - } - case ParameterType::STRUCT_CELL_STRING: { - AnyCell cell; - std::vector paramVector; - if (!getCellFieldAtIndex(paramMD.index, paramMD.name, cell)) { - wbtError << "Failed to get cell field " << paramMD.name - << " from the struct at index " << paramMD.index << "."; - return false; - } - for (auto element : cell) { - std::string value; - if (!element->asString(value)) { - wbtError << "Failed to parse an element of the cell field " << paramMD.name - << " from the struct at index " << paramMD.index - << " as a string."; - return false; - } - paramVector.push_back(value); - } - if (hasDynSizeColumns) { - if (!handleDynSizeColumns(paramMD.cols, paramVector.size())) { - return false; - } - } - ok = parameters.storeParameter(paramVector, paramMD); - break; - } - } - - if (!ok) { - wbtError << "Failed to process parameter with index " << paramMD.index << "."; - return false; - } - } - - // Remove the metadata of the parameters already parsed. - // This is necessary for adding later more metadata and calling again this method - // (storing again an already stored parameter raises an error). - m_paramsMetadata.clear(); - - return true; -} - -bool SimulinkBlockInformation::setIOPortsData(const BlockInformation::IOData& ioData) -{ - // Set the number of input ports - if (!setNumberOfInputPorts(ioData.input.size())) { - wbtError << "Failed to set the number of input ports."; - return false; - } - - // Set the number of output ports - if (!setNumberOfOutputPorts(ioData.output.size())) { - wbtError << "Failed to set the number of output ports."; - return false; - } - - // Set the other input ports properties - for (const auto& portData : ioData.input) { - if (!updateInputPortData(portData)) { - return false; - } - } - - // Set the other output ports properties - for (const auto& portData : ioData.output) { - if (!updateOutputPortData(portData)) { - return false; - } - } - - return true; -} - -bool SimulinkBlockInformation::updateInputPortData(const BlockInformation::PortData& portData) -{ - // Get the port dimensions - const auto& portDimensions = std::get(portData); - if (portDimensions.size() > 2) { - wbtError << "Only vector (1D) and matrix (2D) input ports are supported."; - return false; - } - - // Get the port index and type - const auto& portIndex = std::get(portData); - const auto& portDataType = std::get(portData); - - bool ok = false; - - switch (portDimensions.size()) { - // 1D Vector - case 1: { - const VectorSize width = portDimensions.at(0); - ok = setInputPortVectorSize(portIndex, width) - && setInputPortType(portIndex, portDataType); - break; - } - // 2D Matrix - case 2: { - const Rows rows = portDimensions.at(0); - const Cols cols = portDimensions.at(1); - ok = setInputPortMatrixSize(portIndex, {rows, cols}) - && setInputPortType(portIndex, portDataType); - break; - } - } - - if (!ok) { - wbtError << "Failed to configure input port with index " << portIndex << "."; - return false; - } - - return true; -} - -bool SimulinkBlockInformation::updateOutputPortData(const BlockInformation::PortData& portData) -{ - // Get the port dimensions - const auto portDimensions = std::get(portData); - if (portDimensions.size() > 2) { - wbtError << "Only vector (1D) and matrix (2D) output ports are supported."; - return false; - } - - // Get the port index and type - const auto portIndex = std::get(portData); - const auto portDataType = std::get(portData); - - bool ok = false; - - switch (portDimensions.size()) { - // 1D Vector - case 1: { - const VectorSize width = portDimensions.at(0); - ok = setOutputPortVectorSize(portIndex, width) - && setOutputPortType(portIndex, portDataType); - break; - } - // 2D Matrix - case 2: { - const Rows rows = portDimensions.at(0); - const Cols cols = portDimensions.at(1); - ok = setOutputPortMatrixSize(portIndex, {rows, cols}) - && setOutputPortType(portIndex, portDataType); - break; - } - } - - if (!ok) { - wbtError << "Failed to configure output port with index " << portIndex << "."; - return false; - } - - return true; -} - -BlockInformation::PortData -SimulinkBlockInformation::getInputPortData(const BlockInformation::PortIndex idx) const -{ - const wbt::DataType dt = mapSimulinkToPortType(ssGetInputPortDataType(simstruct, idx)); - std::vector portDimension; - - switch (ssGetInputPortNumDimensions(simstruct, idx)) { - case 1: - portDimension = {ssGetInputPortWidth(simstruct, idx)}; - break; - case 2: { - const auto dims = ssGetInputPortDimensions(simstruct, idx); - portDimension = {dims[0], dims[1]}; - break; - } - } - - return std::make_tuple(idx, portDimension, dt); -} - -BlockInformation::PortData -SimulinkBlockInformation::getOutputPortData(const BlockInformation::PortIndex idx) const -{ - const wbt::DataType dt = mapSimulinkToPortType(ssGetOutputPortDataType(simstruct, idx)); - std::vector portDimension; - - switch (ssGetOutputPortNumDimensions(simstruct, idx)) { - case 1: - portDimension = {ssGetOutputPortWidth(simstruct, idx)}; - break; - case 2: { - const auto dims = ssGetOutputPortDimensions(simstruct, idx); - portDimension = {dims[0], dims[1]}; - break; - } - } - - return std::make_tuple(idx, portDimension, dt); -} diff --git a/toolbox/core/src/WBToolbox.cpp b/toolbox/core/src/WBToolbox.cpp deleted file mode 100644 index fb3946f57..000000000 --- a/toolbox/core/src/WBToolbox.cpp +++ /dev/null @@ -1,857 +0,0 @@ -/* - * Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT) - * All rights reserved. - * - * This software may be modified and distributed under the terms of the - * GNU Lesser General Public License v2.1 or any later version. - */ - -#define S_FUNCTION_LEVEL 2 -#define S_FUNCTION_NAME WBToolbox - -#include "Core/Block.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" -#include "Core/SimulinkBlockInformation.h" -#include "shlibpp/SharedLibrary.h" -#include "shlibpp/SharedLibraryClass.h" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -// ========= -// UTILITIES -// ========= - -using BlockFactory = shlibpp::SharedLibraryClassFactory; -using BlockFactoryPtr = std::shared_ptr; - -class BlockFactorySingleton -{ - using ClassFactoryName = std::string; - using ClassFactoryLibrary = std::string; - using BlockFactoryData = std::pair; - -public: - static std::string platformSpecificLibName(const std::string& library) - { -#if defined(_WIN32) - return library + "dll"; -#elif defined(__linux__) - return "lib" + library + ".so"; -#elif defined(__APPLE__) - return "lib" + library + ".dylib"; -#endif - } - - static BlockFactoryPtr getInstance(BlockFactoryData data) - { - static std::map factoryMap; - - ClassFactoryLibrary classFactoryLibrary = platformSpecificLibName(data.first); - ClassFactoryName& classFactoryName = data.second; - BlockFactoryData blockFactoryData = {classFactoryLibrary, classFactoryName}; - - // Clean possible leftovers - if (factoryMap.find(blockFactoryData) != factoryMap.end() - && !factoryMap[blockFactoryData]) { - factoryMap.erase(blockFactoryData); - } - - // Allocate the factory that loads the dll the first time - if (factoryMap.find(blockFactoryData) == factoryMap.end()) { - - // Allocate the factory - auto factory = std::make_shared(classFactoryLibrary.c_str(), - classFactoryName.c_str()); - if (!factory || !factory->isValid()) { - wbtError << "Failed to create factory"; - return {}; - } - - // Store it in the map - factoryMap.emplace(std::make_pair( - {classFactoryLibrary, classFactoryName}, std::move(factory))); - } - - if (!factoryMap[blockFactoryData] || !factoryMap[blockFactoryData]->isValid()) { - wbtError << "Failed to create factory"; - return {}; - } - - // Return the block factory - return factoryMap[blockFactoryData]; - } -}; - -const bool ForwardLogsToStdErr = true; - -static void catchLogMessages(bool status, SimStruct* S) -{ - // Initialize static buffers - const unsigned bufferLen = 1024; - - // Notify warnings - if (!wbt::Log::getSingleton().getWarnings().empty()) { - // Get the warnings - std::string warningMsg = wbt::Log::getSingleton().getWarnings(); - - // Trim the message if needed - if (warningMsg.length() >= bufferLen) { - warningMsg = warningMsg.substr(0, bufferLen - 1); - } - - // Forward to Simulink - char warningBuffer[bufferLen]; - sprintf(warningBuffer, "%s", warningMsg.c_str()); - ssWarning(S, warningBuffer); - - if (ForwardLogsToStdErr) { - fprintf(stderr, "%s", warningBuffer); - } - - // Clean the notified warnings - wbt::Log::getSingleton().clearWarnings(); - } - - // Notify errors - if (!status) { - // Get the errors - std::string errorMsg = wbt::Log::getSingleton().getErrors(); - - // Trim the message if needed - if (errorMsg.length() >= bufferLen) { - errorMsg = errorMsg.substr(0, bufferLen - 1); - } - - // Forward to Simulink - char errorBuffer[bufferLen]; - sprintf(errorBuffer, "%s", errorMsg.c_str()); - ssSetErrorStatus(S, errorBuffer); - - if (ForwardLogsToStdErr) { - fprintf(stderr, "%s", errorBuffer); - } - - // Clean the notified errors - wbt::Log::getSingleton().clearErrors(); - return; - } -} - -// ========== -// S-FUNCTION -// ========== - -// Function: MDL_CHECK_PARAMETERS -#define MDL_CHECK_PARAMETERS -#if defined(MDL_CHECK_PARAMETERS) && defined(MATLAB_MEX_FILE) -static void mdlCheckParameters(SimStruct* S) -{ - UNUSED_ARG(S); - // TODO: still to find a way to call Block implementation -} -#endif /*MDL_CHECK_PARAMETERS*/ - -#define MDL_SET_INPUT_PORT_DIMENSION_INFO -static void mdlSetInputPortDimensionInfo(SimStruct* S, int_T port, const DimsInfo_T* dimsInfo) -{ - // If the port is set as dynamic and the proposed dimension is not dynamic (hence calculated by - // the signal propagation) accept it - if (ssGetInputPortWidth(S, port) == DYNAMICALLY_SIZED) { - if (dimsInfo->width != DYNAMICALLY_SIZED) { - if (!ssSetInputPortDimensionInfo(S, port, dimsInfo)) { - wbtError << "Failed to set proposed sizes."; - catchLogMessages(false, S); - return; - } - } - } -} - -#define MDL_SET_OUTPUT_PORT_DIMENSION_INFO -static void mdlSetOutputPortDimensionInfo(SimStruct* S, int_T port, const DimsInfo_T* dimsInfo) -{ - // If the port is set as dynamic and the proposed dimension is not dynamic (hence calculated by - // the signal propagation) accept it - if (ssGetOutputPortWidth(S, port) == DYNAMICALLY_SIZED) { - if (dimsInfo->width != DYNAMICALLY_SIZED) { - if (!ssSetOutputPortDimensionInfo(S, port, dimsInfo)) { - wbtError << "Failed to set proposed sizes."; - catchLogMessages(false, S); - return; - } - } - } -} - -// Function: mdlInitializeSizes =============================================== -// Abstract: -// The sizes information is used by Simulink to determine the S-function -// block's characteristics (number of inputs, s, states, etc.). -static void mdlInitializeSizes(SimStruct* S) -{ - // Initialize the Log singleton - wbt::Log::getSingleton().clear(); - - if (ssGetSFcnParamsCount(S) < 1) { - wbtError << "The block type parameter must be specified"; - catchLogMessages(false, S); - return; - } - - // Get the class name and the library name from the parameter - const std::string className(mxArrayToString(ssGetSFcnParam(S, 0))); - const std::string blockLibraryName(mxArrayToString(ssGetSFcnParam(S, 1))); - - // Get the block factory - BlockFactoryPtr factory = BlockFactorySingleton::getInstance({blockLibraryName, className}); - - if (!factory) { - wbtError << "Failed to get factory object"; - catchLogMessages(false, S); - return; - } - - if (!factory->isValid()) { - wbtError << "Factory error (" << static_cast(factory->getStatus()) - << "): " << factory->getError().c_str(); - catchLogMessages(false, S); - return; - } - - // Allocate the block from the factory. Since this object is supposed to be deleted - // by the end of this function scope, SharedLibraryClass can be used and provides RAII. - shlibpp::SharedLibraryClass block(*factory); - - // Notify errors - if (!block.isValid()) { - wbtError << "Could not create an object of type " + className; - catchLogMessages(false, S); - return; - } - - // We cannot save data in PWork during the initializeSizes phase. - - // Two PWorks: - // 0: pointer to a Block implementation - // 1: pointer to a BlockInformation implementation - ssSetNumPWork(S, 2); - - // Setup the block parameters' properties - ssSetNumSFcnParams(S, block->numberOfParameters()); - ssSetSFcnParamTunable(S, 0, false); - for (unsigned i = 0; i < ssGetNumSFcnParams(S); ++i) { - bool tunable = false; - block->parameterAtIndexIsTunable(i, tunable); - ssSetSFcnParamTunable(S, i, tunable); - } - -#if defined(MATLAB_MEX_FILE) - if (ssGetNumSFcnParams(S) == ssGetSFcnParamsCount(S)) { - mdlCheckParameters(S); - if (ssGetErrorStatus(S)) { - return; - } - } - else { - int_T numOfExpectedParams = ssGetNumSFcnParams(S); - int_T numOfBlockParams = ssGetSFcnParamsCount(S); - wbtError << "Number of parameters (" << numOfBlockParams - << ") different from those expected (" << numOfExpectedParams << ")"; - catchLogMessages(false, S); - return; - } -#endif - - wbt::SimulinkBlockInformation blockInfo(S); - bool ok = block->configureSizeAndPorts(&blockInfo); - catchLogMessages(ok, S); - - if (!ok) { - return; - } - - for (auto i = 0; i < ssGetNumInputPorts(S); ++i) { - // Set explicitly the inputs port to be SS_NOT_REUSABLE_AND_GLOBAL (which actually - // is already the default value). Since the toolbox supports contiguous input signals, - // this option should not be changed. - ssSetInputPortOptimOpts(S, i, SS_NOT_REUSABLE_AND_GLOBAL); - // Set input signals to be allocated in a contiguous memory storage - ssSetInputPortRequiredContiguous(S, i, true); - } - - ssSetNumSampleTimes(S, 1); - - ssSetSimStateCompliance(S, USE_CUSTOM_SIM_STATE); //?? - - ssSetNumDiscStates(S, block->numberOfDiscreteStates()); - ssSetNumContStates(S, 0); // block->numberOfContinuousStates()); - - uint_T options = SS_OPTION_WORKS_WITH_CODE_REUSE | SS_OPTION_EXCEPTION_FREE_CODE - | SS_OPTION_ALLOW_INPUT_SCALAR_EXPANSION | SS_OPTION_USE_TLC_WITH_ACCELERATOR - | SS_OPTION_CALL_TERMINATE_ON_EXIT; - // also ? - // SS_OPTION_RUNTIME_EXCEPTION_FREE_CODE - - std::vector additionalOptions = block->additionalBlockOptions(); - - for (const auto& additionalOption : additionalOptions) { - double option; - if (!blockInfo.optionFromKey(additionalOption, option)) { - wbtError << "Failed to get option from key."; - catchLogMessages(false, S); - return; - } - // Store the parsed option - options |= static_cast(option); - } - - // Set the options - ssSetOptions(S, options); -} - -// Function: mdlInitializeSampleTimes ========================================= -// Abstract: -// This function is used to specify the sample time(s) for your -// S-function. You must register the same number of sample times as -// specified in ssSetNumSampleTimes. -static void mdlInitializeSampleTimes(SimStruct* S) -{ - ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME); - ssSetOffsetTime(S, 0, 0.0); - ssSetModelReferenceSampleTimeDefaultInheritance(S); -} - -// Function: mdlStart ======================================================= -// Abstract: -// This function is called once at start of model execution. If you -// have states that should be initialized once, this is the place -// to do it. -#define MDL_START -static void mdlStart(SimStruct* S) -{ - // Get the class name and the library name from the parameter - const std::string className(mxArrayToString(ssGetSFcnParam(S, 0))); - const std::string blockLibraryName(mxArrayToString(ssGetSFcnParam(S, 1))); - - // Get the block factory - BlockFactoryPtr factory = BlockFactorySingleton::getInstance({blockLibraryName, className}); - - if (!factory) { - wbtError << "Failed to get factory object"; - catchLogMessages(false, S); - return; - } - - if (!factory->isValid()) { - wbtError << "Factory error (" << static_cast(factory->getStatus()) - << "): " << factory->getError().c_str(); - catchLogMessages(false, S); - return; - } - - // Allocate the block from the factory and store its pointer in the PWork - wbt::Block* block = factory->create(); - ssSetPWorkValue(S, 0, block); - - // Allocate the BlockInformation object and store its pointer in the PWork - wbt::BlockInformation* blockInfo = new wbt::SimulinkBlockInformation(S); - ssSetPWorkValue(S, 1, blockInfo); - - if (!block || !blockInfo) { - wbtError << "Failed to create objects before storing them in the PWork."; - catchLogMessages(false, S); - return; - } - - // Call the initialize() method - bool ok = block->initialize(blockInfo); - catchLogMessages(ok, S); -} - -#define MDL_UPDATE -#if defined(MDL_UPDATE) && defined(MATLAB_MEX_FILE) -static void mdlUpdate(SimStruct* S, int_T tid) -{ - UNUSED_ARG(tid); - if (ssGetNumPWork(S) != 2) { - wbtError << "PWork should contain two elements."; - catchLogMessages(false, S); - return; - } - - // Get the Block object - wbt::Block* block = static_cast(ssGetPWorkValue(S, 0)); - // Get the SimulinkBlockInformation object - wbt::SimulinkBlockInformation* blockInfo; - blockInfo = static_cast(ssGetPWorkValue(S, 1)); - - if (!block || !blockInfo) { - wbtError << "Failed to get pointers from the PWork vector."; - catchLogMessages(false, S); - return; - } - - // Call the updateDiscreteState() method - bool ok = block->updateDiscreteState(blockInfo); - catchLogMessages(ok, S); -} -#endif - -// Initialize the state vectors of this C MEX S-function -#define MDL_INITIALIZE_CONDITIONS -#if defined(MDL_INITIALIZE_CONDITIONS) && defined(MATLAB_MEX_FILE) -static void mdlInitializeConditions(SimStruct* S) -{ - if (ssGetNumPWork(S) != 2) { - wbtError << "PWork should contain two elements."; - catchLogMessages(false, S); - return; - } - - // Get the Block object - wbt::Block* block = static_cast(ssGetPWorkValue(S, 0)); - // Get the SimulinkBlockInformation object - wbt::SimulinkBlockInformation* blockInfo; - blockInfo = static_cast(ssGetPWorkValue(S, 1)); - - if (!block || !blockInfo) { - wbtError << "Failed to get pointers from the PWork vector."; - catchLogMessages(false, S); - return; - } - - // Call the initializeInitialConditions() method - bool ok = block->initializeInitialConditions(blockInfo); - catchLogMessages(ok, S); -} -#endif - -#define MDL_DERIVATIVES -#if defined(MDL_DERIVATIVES) && defined(MATLAB_MEX_FILE) -static void mdlDerivatives(SimStruct* /*S*/) -{ - /* Add mdlDerivatives code here */ -} -#endif - -// Function: mdlOutputs ======================================================= -// Abstract: -// In this function, you compute the outputs of your S-function -// block. -static void mdlOutputs(SimStruct* S, int_T tid) -{ - UNUSED_ARG(tid); - if (ssGetNumPWork(S) != 2) { - wbtError << "PWork should contain two elements."; - catchLogMessages(false, S); - return; - } - - // Get the Block object - wbt::Block* block = static_cast(ssGetPWorkValue(S, 0)); - // Get the SimulinkBlockInformation object - wbt::SimulinkBlockInformation* blockInfo; - blockInfo = static_cast(ssGetPWorkValue(S, 1)); - - if (!block || !blockInfo) { - wbtError << "Failed to get pointers from the PWork vector."; - catchLogMessages(false, S); - return; - } - - // Call the output() method - bool ok = block->output(blockInfo); - catchLogMessages(ok, S); -} - -static void mdlTerminate(SimStruct* S) -{ - if (!ssGetPWork(S)) { - return; - } - - if (ssGetNumPWork(S) != 2) { - wbtError << "PWork should contain two elements."; - catchLogMessages(false, S); - return; - } - - // Get the Block object - wbt::Block* block = static_cast(ssGetPWorkValue(S, 0)); - // Get the SimulinkBlockInformation object - wbt::SimulinkBlockInformation* blockInfo; - blockInfo = static_cast(ssGetPWorkValue(S, 1)); - - if (block) { - if (!block->terminate(blockInfo)) { - wbtError << "Failed to terminate block."; - catchLogMessages(false, S); - } - } - else { - wbtWarning << "Failed to get Block pointer from the PWork vector." << std::endl - << "Could't terminate block"; - } - - // Get the class name and the library name from the parameter - const std::string className(mxArrayToString(ssGetSFcnParam(S, 0))); - const std::string blockLibraryName(mxArrayToString(ssGetSFcnParam(S, 1))); - - // Get the block factory - BlockFactoryPtr factory = BlockFactorySingleton::getInstance({blockLibraryName, className}); - - if (!factory) { - wbtError << "Failed to get factory object"; - catchLogMessages(false, S); - return; - } - - if (!factory->isValid()) { - wbtError << "Factory error (" << static_cast(factory->getStatus()) - << "): " << factory->getError().c_str(); - catchLogMessages(false, S); - return; - } - - // Delete the resources allocated in the PWork vector - delete blockInfo; - - factory->destroy(block); - - // Clean the PWork vector - ssSetPWorkValue(S, 0, nullptr); - ssSetPWorkValue(S, 1, nullptr); -} - -#if defined(MATLAB_MEX_FILE) -#define MDL_RTW - -template -std::vector toRTWNumericVector(const std::vector& vectorInput) -{ - std::vector output; - output.reserve(vectorInput.size()); - - output.assign(vectorInput.begin(), vectorInput.end()); - return output; -} - -std::string toRTWStringVector(const std::vector& stringInput) -{ - std::string output; - - for (unsigned i = 0; i < stringInput.size(); ++i) { - if (i == 0) { - output += "[\"" + stringInput[i] + "\""; - } - else { - output += ", \"" + stringInput[i] + "\""; - } - } - output += "]"; - return output; -} - -const std::pair parameterTypeToString(const wbt::ParameterType& type) -{ - switch (type) { - case wbt::ParameterType::INT: - return {"ParameterType::INT", "int"}; - case wbt::ParameterType::BOOL: - return {"ParameterType::BOOL", "bool"}; - case wbt::ParameterType::DOUBLE: - return {"ParameterType::DOUBLE", "double"}; - case wbt::ParameterType::STRING: - return {"ParameterType::STRING", "std::string"}; - case wbt::ParameterType::CELL_INT: - return {"ParameterType::CELL_INT", "int"}; - case wbt::ParameterType::CELL_BOOL: - return {"ParameterType::CELL_BOOL", "bool"}; - case wbt::ParameterType::CELL_DOUBLE: - return {"ParameterType::CELL_DOUBLE", "double"}; - case wbt::ParameterType::CELL_STRING: - return {"ParameterType::CELL_STRING", "std::string"}; - case wbt::ParameterType::STRUCT_INT: - return {"ParameterType::STRUCT_INT", "int"}; - case wbt::ParameterType::STRUCT_BOOL: - return {"ParameterType::STRUCT_BOOL", "bool"}; - case wbt::ParameterType::STRUCT_DOUBLE: - return {"ParameterType::STRUCT_DOUBLE", "double"}; - case wbt::ParameterType::STRUCT_STRING: - return {"ParameterType::STRUCT_STRING", "std::string"}; - case wbt::ParameterType::STRUCT_CELL_INT: - return {"ParameterType::STRUCT_CELL_INT", "int"}; - case wbt::ParameterType::STRUCT_CELL_BOOL: - return {"ParameterType::STRUCT_CELL_BOOL", "bool"}; - case wbt::ParameterType::STRUCT_CELL_DOUBLE: - return {"ParameterType::STRUCT_CELL_DOUBLE", "double"}; - case wbt::ParameterType::STRUCT_CELL_STRING: - return {"ParameterType::STRUCT_CELL_STRING", "std::string"}; - } -} - -template -bool writeParameterToRTW(const wbt::Parameter param, SimStruct* S) -{ - if (param.getMetadata().cols == wbt::ParameterMetadata::DynamicSize - || param.getMetadata().rows == wbt::ParameterMetadata::DynamicSize) { - wbtError << "Storing in the rtw file dynamically-sized parameters is not supported."; - return false; - } - - if (param.isScalar()) { - return ssWriteRTWParamSettings( - S, - 8, - SSWRITE_VALUE_NUM, - "index", - static_cast(param.getMetadata().index), - SSWRITE_VALUE_QSTR, - "name", - param.getMetadata().name.c_str(), - SSWRITE_VALUE_NUM, - "isScalar", - static_cast(param.isScalar()), - SSWRITE_VALUE_NUM, - "rows", - static_cast(param.getMetadata().rows), - SSWRITE_VALUE_NUM, - "cols", - static_cast(param.getMetadata().cols), - SSWRITE_VALUE_QSTR, - "type", - parameterTypeToString(param.getMetadata().type).first.c_str(), - SSWRITE_VALUE_QSTR, - "storage", - parameterTypeToString(param.getMetadata().type).second.c_str(), - SSWRITE_VALUE_NUM, - "valueScalar", - static_cast(param.getScalarParameter())); - } - else { - const std::vector vectorRealT = toRTWNumericVector(param.getVectorParameter()); - return ssWriteRTWParamSettings( - S, - 8, - SSWRITE_VALUE_NUM, - "index", - static_cast(param.getMetadata().index), - SSWRITE_VALUE_QSTR, - "name", - param.getMetadata().name.c_str(), - SSWRITE_VALUE_NUM, - "isScalar", - static_cast(param.isScalar()), - SSWRITE_VALUE_NUM, - "rows", - static_cast(param.getMetadata().rows), - SSWRITE_VALUE_NUM, - "cols", - static_cast(param.getMetadata().cols), - SSWRITE_VALUE_QSTR, - "type", - parameterTypeToString(param.getMetadata().type).first.c_str(), - SSWRITE_VALUE_QSTR, - "storage", - parameterTypeToString(param.getMetadata().type).second.c_str(), - SSWRITE_VALUE_VECT, - "valueVector", - vectorRealT.data(), - param.getVectorParameter().size()); - } -} - -// Specialize the template for std::string -template <> -bool writeParameterToRTW(const wbt::Parameter param, SimStruct* S) -{ - if (param.getMetadata().cols == wbt::ParameterMetadata::DynamicSize - || param.getMetadata().rows == wbt::ParameterMetadata::DynamicSize) { - wbtError << "Storing in the rtw file dynamically-sized parameters is not supported."; - return false; - } - - if (param.isScalar()) { - return ssWriteRTWParamSettings( - S, - 8, - SSWRITE_VALUE_NUM, - "index", - static_cast(param.getMetadata().index), - SSWRITE_VALUE_QSTR, - "name", - param.getMetadata().name.c_str(), - SSWRITE_VALUE_NUM, - "isScalar", - static_cast(param.isScalar()), - SSWRITE_VALUE_NUM, - "rows", - static_cast(param.getMetadata().rows), - SSWRITE_VALUE_NUM, - "cols", - static_cast(param.getMetadata().cols), - SSWRITE_VALUE_QSTR, - "type", - parameterTypeToString(param.getMetadata().type).first.c_str(), - SSWRITE_VALUE_QSTR, - "storage", - parameterTypeToString(param.getMetadata().type).second.c_str(), - SSWRITE_VALUE_QSTR, - "valueScalar", - param.getScalarParameter().c_str()); - } - else { - const std::string serializedVectorOfStrings = toRTWStringVector(param.getVectorParameter()); - return ssWriteRTWParamSettings( - S, - 8, - SSWRITE_VALUE_NUM, - "index", - static_cast(param.getMetadata().index), - SSWRITE_VALUE_QSTR, - "name", - param.getMetadata().name.c_str(), - SSWRITE_VALUE_NUM, - "isScalar", - static_cast(param.isScalar()), - SSWRITE_VALUE_NUM, - "rows", - static_cast(param.getMetadata().rows), - SSWRITE_VALUE_NUM, - "cols", - static_cast(param.getMetadata().cols), - SSWRITE_VALUE_QSTR, - "type", - parameterTypeToString(param.getMetadata().type).first.c_str(), - SSWRITE_VALUE_QSTR, - "storage", - parameterTypeToString(param.getMetadata().type).second.c_str(), - SSWRITE_VALUE_VECT_STR, - "valueVector", - serializedVectorOfStrings.c_str(), - param.getMetadata().cols); - } -} - -bool writeRTW(SimStruct* S, const wbt::Parameters& params) -{ - // RTW Parameters record metadata - // ============================== - - // The first entry in the parameter record (SFcnParamSettings[0]) contains - // information useful to parse the others - - // Get the number or parameters - const unsigned numberOfParameters = params.getNumberOfParameters(); - - // Get the class name - std::string className; - params.getParameter("className", className); - - // Create the record - ssWriteRTWParamSettings(S, - 2, - SSWRITE_VALUE_NUM, - "numberOfParameters", - static_cast(numberOfParameters), - SSWRITE_VALUE_QSTR, - "className", - className.c_str()); - - // RTW Parameters - // ============== - - bool ok = true; - - for (const auto& param : params.getIntParameters()) { - ok = ok && writeParameterToRTW(param, S); - } - - for (const auto& param : params.getBoolParameters()) { - ok = ok && writeParameterToRTW(param, S); - } - - for (const auto& param : params.getDoubleParameters()) { - ok = ok && writeParameterToRTW(param, S); - } - - for (const auto& param : params.getStringParameters()) { - ok = ok && writeParameterToRTW(param, S); - } - - if (!ok) { - wbtError << "Failed to write parameters to RTW file."; - catchLogMessages(false, S); - return false; - } - - return true; -} - -static void mdlRTW(SimStruct* S) -{ - if (ssGetNumPWork(S) > 0 && ssGetPWork(S)) { - - // Get the block object from the PWork - wbt::Block* block = static_cast(ssGetPWorkValue(S, 0)); - - bool ok; - wbt::Parameters params; - - if (!block) { - wbtError << "Unable to get the class from the PWork vector."; - catchLogMessages(false, S); - return; - } - - // Get the parameters from the block - ok = block->getParameters(params); - catchLogMessages(ok, S); - if (!ok) { - wbtError << "Failed to get parameters from the block during the code " - << "generation process"; - return; - } - - // Use parameters metadata to populate the rtw file used by the coder - ok = writeRTW(S, params); - catchLogMessages(ok, S); - if (!ok) { - wbtError << "Failed to write parameters to the RTW file during the code " - << "generation process"; - return; - } - - // Store the PWork vector in the rtw file - ok = ssWriteRTWWorkVect(S, "PWork", 1, "blockPWork", ssGetNumPWork(S)); - catchLogMessages(ok, S); - if (!ok) { - wbtError << "Failed to store the PWork vector during the code " - << "generation process"; - return; - } - } -} -#endif - -// Required S-function trailer -#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */ -#include /* MEX-file interface mechanism */ -#else -#include "cg_sfun.h" /* Code generation registration function */ -#endif From 54e99c4fed28642bb77c83634cf55c780a8171a2 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Wed, 5 Dec 2018 15:42:21 +0100 Subject: [PATCH 02/37] Update CMake project with new target names Furthermore, some common code was moved higher in the hierarchy and the PackageConfig file was simplified (no more components needed). --- CMakeLists.txt | 88 ++++++++++++++++++++++++++------ deps/thrift/CMakeLists.txt | 2 +- toolbox/CMakeLists.txt | 91 ---------------------------------- toolbox/library/CMakeLists.txt | 70 ++++++++++---------------- 4 files changed, 100 insertions(+), 151 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f2962d937..a1637dddf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,39 @@ if(WBT_BUILD_DOCS) return() endif() +# ================= +# FIND DEPENDENCIES +# ================= + +find_package(YCM 0.9 REQUIRED) +find_package(Matlab COMPONENTS + MX_LIBRARY + ENG_LIBRARY + MAIN_PROGRAM + # SIMULINK # Requires CMake > 3.7 +) + +find_package(YARP 3.0.0 REQUIRED) + +# Fail if YARP is not compiled as shared library +# see https://github.com/robotology/codyco-modules/issues/44 +if(NOT ${YARP_IS_SHARED_LIBRARY}) + message(FATAL_ERROR "YARP was found, but it was compiled as static library. A shared library version of YARP is required.") +endif() + +find_package(iDynTree 0.7.2 REQUIRED) + +# This find loads Eigen. +# It would be nice using the EigenConfig shipped with eigen package, but +# on Ubuntu 16.04 eigen is old and provides only FindEigen. +find_package(Eigen3 REQUIRED) + +# ==================== +# OPTIONS AND INCLUDES +# ==================== + # C++ standard -set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Build type @@ -35,31 +66,57 @@ if(NOT BUILD_SHARED_LIBS) set(CMAKE_POSITION_INDEPENDENT_CODE ON) endif() -# Tweak linker flags in Linux -if(UNIX AND NOT APPLE) - get_filename_component(LINKER_BIN ${CMAKE_LINKER} NAME) - if(${LINKER_BIN} STREQUAL "ld") - set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--unresolved-symbols=report-all") # TODO +# Settings for RPATH +if(NOT MSVC) + option(WBT_ENABLE_RPATH "Enable RPATH installation" TRUE) + mark_as_advanced(WBT_ENABLE_RPATH) +endif() + +# Export all symbols in Windows +set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) + +# Add a postfix to Windows libraries compiled in debug +if(MSVC) + set(CMAKE_DEBUG_POSTFIX "d") +endif() + +# Control where binaries and libraries are placed in the build folder. +# This simplifies tests running in Windows. +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}") +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}") +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}") + +include(AddInstallRPATHSupport) +add_install_rpath_support(BIN_DIRS ${CMAKE_INSTALL_PREFIX}/bin + LIB_DIRS ${CMAKE_INSTALL_PREFIX}/mex ${CMAKE_INSTALL_PREFIX}/lib + DEPENDS WBT_ENABLE_RPATH + USE_LINK_PATH) + +# Get include-what-you-see information when compiling +option(WBT_USE_IWYU "Get the output of include-what-you-use" OFF) +if(WBT_USE_IWYU) + find_program(IWYU_PATH NAMES include-what-you-use iwyu) + if(IWYU_PATH) + set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE ${IWYU_PATH}) endif() endif() # Add custom functions / macros list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) -find_package(YCM 0.9 REQUIRED) +include(GNUInstallDirs) include(YCMDefaultDirs) - -find_package(Matlab COMPONENTS - MX_LIBRARY - ENG_LIBRARY - MAIN_PROGRAM - # SIMULINK # Requires CMake > 3.7 -) +include(InstallBasicPackageFiles) +include(AddUninstallTarget) if(NOT WBT_USES_MATLAB) - option(WBT_USES_MATLAB "Compile also Matlab-related components" ${Matlab_FOUND}) + option(WBT_USES_MATLAB "Install Matlab / Simulink resources" ${Matlab_FOUND}) endif() +# ============== +# SUBDIRECTORIES +# ============== + add_subdirectory(deps) add_subdirectory(toolbox) @@ -67,4 +124,3 @@ if(WBT_USES_MATLAB) add_subdirectory(matlab) endif() -include(AddUninstallTarget) diff --git a/deps/thrift/CMakeLists.txt b/deps/thrift/CMakeLists.txt index 223070d1c..aa127bbdb 100644 --- a/deps/thrift/CMakeLists.txt +++ b/deps/thrift/CMakeLists.txt @@ -38,7 +38,7 @@ target_include_directories(ClockRpc PUBLIC install( TARGETS ClockRpc - EXPORT WBToolboxLibraryExport + EXPORT WBToolboxExport LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/toolbox/CMakeLists.txt b/toolbox/CMakeLists.txt index 4b2b583d7..aaa98c180 100644 --- a/toolbox/CMakeLists.txt +++ b/toolbox/CMakeLists.txt @@ -4,96 +4,5 @@ find_package(shlibpp REQUIRED) find_package(BlockFactory COMPONENTS BlockFactoryCore REQUIRED) -# ================= -# FIND DEPENDENCIES -# ================= - -find_package(YARP 3.0.0 REQUIRED) - -# Fail if YARP is not compiled as shared library -# see https://github.com/robotology/codyco-modules/issues/44 -if(NOT ${YARP_IS_SHARED_LIBRARY}) - message(FATAL_ERROR "YARP was found, but it was compiled as static library. A shared library version of YARP is required.") -endif() - -find_package(iDynTree 0.7.2 REQUIRED) - -# This find loads Eigen. -# It would be nice using the EigenConfig shipped with eigen package, but -# on Ubuntu 16.04 eigen is old and provides only FindEigen. -find_package(Eigen3 REQUIRED) - -# ==================== -# OPTIONS AND INCLUDES -# ==================== - -# Add configure_block macro -include(Utilities) - -# Settings for RPATH -if(NOT MSVC) - option(WBT_ENABLE_RPATH "Enable RPATH installation" TRUE) - mark_as_advanced(WBT_ENABLE_RPATH) -endif() - -# Export all symbols in Windows -set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) - -# Add a postfix to Windows libraries compiled in debug -if(MSVC) - set(CMAKE_DEBUG_POSTFIX "d") -endif() - -# Control where binaries and libraries are placed in the build folder. -# This simplifies tests running in Windows. -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}") -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}") -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}") - -include(AddInstallRPATHSupport) -add_install_rpath_support(BIN_DIRS ${CMAKE_INSTALL_PREFIX}/bin - LIB_DIRS ${CMAKE_INSTALL_PREFIX}/mex ${CMAKE_INSTALL_PREFIX}/lib - DEPENDS WBT_ENABLE_RPATH - USE_LINK_PATH) - -# Get include-what-you-see information when compiling -option(WBT_USE_IWYU "Get the output of include-what-you-use" OFF) -if(WBT_USE_IWYU) - find_program(IWYU_PATH NAMES include-what-you-use iwyu) - if(IWYU_PATH) - set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE ${IWYU_PATH}) - endif() -endif() - -include(GNUInstallDirs) -include(InstallBasicPackageFiles) - -# =============== -# TOOLBOX TARGETS -# =============== add_subdirectory(library) - -# ===================== -# MAIN WBTOOLBOX TARGET -# ===================== - -# Dummy target -add_library(WBToolbox INTERFACE) - -set(WBTOOLBOX_DEPENDENCIES YCM ToolboxCore ToolboxCoder WBToolboxLibrary) -if (WBT_USES_MATLAB) - list(APPEND WBTOOLBOX_DEPENDENCIES ToolboxMex) -endif() - -install( - TARGETS WBToolbox - EXPORT WBToolbox) - -install_basic_package_files(WBToolbox - VERSION ${PROJECT_VERSION} - COMPATIBILITY AnyNewerVersion - EXPORT WBToolbox - DEPENDENCIES ${WBTOOLBOX_DEPENDENCIES} - NAMESPACE WBToolbox:: - INCLUDE_FILE ${CMAKE_SOURCE_DIR}/cmake/ExtraPackageConfigVars.cmake.in) diff --git a/toolbox/library/CMakeLists.txt b/toolbox/library/CMakeLists.txt index 6c14d8001..b6b3650d9 100644 --- a/toolbox/library/CMakeLists.txt +++ b/toolbox/library/CMakeLists.txt @@ -2,30 +2,14 @@ # This software may be modified and distributed under the terms of the # GNU Lesser General Public License v2.1 or any later version. -# ================= -# FIND DEPENDENCIES -# ================= - -find_package(YARP 3.0.0 REQUIRED) - -# Fail if YARP is not compiled as shared library -# see https://github.com/robotology/codyco-modules/issues/44 -if(NOT ${YARP_IS_SHARED_LIBRARY}) - message(FATAL_ERROR "YARP was found, but it was compiled as static library. A shared library version of YARP is required.") -endif() - -find_package(iDynTree 0.7.2 REQUIRED) - -# This find loads Eigen. -# It would be nice using the EigenConfig shipped with eigen package, but -# on Ubuntu 16.04 eigen is old and provides only FindEigen. -find_package(Eigen3 REQUIRED) - # ============== # WBTOOLBOX BASE # ============== -add_library(LibraryBase +# Add configure_block macro +include(Utilities) + +add_library(WBToolboxBase src/RobotInterface.cpp src/Configuration.cpp src/WholeBodySingleton.cpp @@ -35,8 +19,8 @@ add_library(LibraryBase include/Base/WholeBodySingleton.h include/Base/WBBlock.h) -target_link_libraries(LibraryBase - WBToolbox::Core +target_link_libraries(WBToolboxBase + BlockFactory::Core YARP::YARP_OS YARP::YARP_init YARP::YARP_dev @@ -44,7 +28,7 @@ target_link_libraries(LibraryBase iDynTree::idyntree-modelio-urdf iDynTree::idyntree-high-level) -target_include_directories(LibraryBase PUBLIC +target_include_directories(WBToolboxBase PUBLIC $ $ $) @@ -210,24 +194,24 @@ configure_block(BLOCK_NAME "Get Limits" get_property(ALL_LIBRARY_HEADERS GLOBAL PROPERTY WBT_HEADERS) get_property(ALL_LIBRARY_SOURCES GLOBAL PROPERTY WBT_SOURCES) -add_library(Library SHARED +add_library(WBToolboxLibrary SHARED src/Factory.cpp ${ALL_LIBRARY_HEADERS} ${ALL_LIBRARY_SOURCES}) -add_library(WBToolbox::Library ALIAS Library) +add_library(WBToolbox::Library ALIAS WBToolboxLibrary) if(MSVC) # Import math symbols from standard cmath - target_compile_definitions(Library PRIVATE "_USE_MATH_DEFINES") + target_compile_definitions(WBToolboxLibrary PRIVATE "_USE_MATH_DEFINES") endif() -target_include_directories(Library PUBLIC +target_include_directories(WBToolboxLibrary PUBLIC $ $) -target_include_directories(Library SYSTEM PRIVATE ${EIGEN3_INCLUDE_DIR}) +target_include_directories(WBToolboxLibrary SYSTEM PRIVATE ${EIGEN3_INCLUDE_DIR}) -set_target_properties(Library PROPERTIES +set_target_properties(WBToolboxLibrary PROPERTIES PUBLIC_HEADER "${ALL_LIBRARY_HEADERS}" OUTPUT_NAME "WBToolboxLibrary") @@ -240,15 +224,15 @@ list(APPEND WBTOOLBOXLIBRARY_EXT_LIBRARIES iDynTree::idyntree-modelio-urdf iDynTree::idyntree-high-level) -target_link_libraries(Library PUBLIC LibraryBase) -target_link_libraries(Library PRIVATE WBToolbox::Core shlibpp::shlibpp ${WBTOOLBOXLIBRARY_EXT_LIBRARIES}) +target_link_libraries(WBToolboxLibrary PUBLIC WBToolboxBase) +target_link_libraries(WBToolboxLibrary PRIVATE BlockFactory::Core shlibpp::shlibpp ${WBTOOLBOXLIBRARY_EXT_LIBRARIES}) if(WBT_USES_ICUB) - target_compile_definitions(Library PRIVATE "WBT_USES_ICUB") - target_link_libraries(Library PUBLIC ctrlLib) + target_compile_definitions(WBToolboxLibrary PRIVATE "WBT_USES_ICUB") + target_link_libraries(WBToolboxLibrary PUBLIC ctrlLib) # Manually include iCub include folders. They are not exported by the linked library. - target_include_directories(Library PRIVATE ${ctrlLib_INCLUDE_DIRS}) + target_include_directories(WBToolboxLibrary PRIVATE ${ctrlLib_INCLUDE_DIRS}) # if (${ICUB_USE_IPOPT}) # target_link_libraries(WBToolboxLibrary PUBLIC iKin) @@ -257,16 +241,16 @@ if(WBT_USES_ICUB) endif() if(WBT_USES_QPOASES) - target_compile_definitions(Library PUBLIC "WBT_USES_QPOASES") - target_link_libraries(Library PUBLIC ${qpOASES_LIBRARIES}) + target_compile_definitions(WBToolboxLibrary PUBLIC "WBT_USES_QPOASES") + target_link_libraries(WBToolboxLibrary PUBLIC ${qpOASES_LIBRARIES}) # Manually include qpOASES include folders. They are not exported by the linked library. - target_include_directories(Library PRIVATE ${qpOASES_INCLUDE_DIRS}) + target_include_directories(WBToolboxLibrary PRIVATE ${qpOASES_INCLUDE_DIRS}) endif() install( - TARGETS LibraryBase Library - EXPORT WBToolboxLibraryExport + TARGETS WBToolboxBase WBToolboxLibrary + EXPORT WBToolboxExport LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} @@ -279,11 +263,11 @@ if(WBT_USES_QPOASES) list(APPEND WBTOOLBOX_LIBRARY_PUBLIC_DEPENDS qpOASES) endif() -install_basic_package_files(WBToolboxLibrary +install_basic_package_files(WBToolbox VERSION ${PROJECT_VERSION} COMPATIBILITY AnyNewerVersion - EXPORT WBToolboxLibraryExport - FIRST_TARGET LibraryBase - DEPENDENCIES YARP iDynTree ${WBTOOLBOX_LIBRARY_PUBLIC_DEPENDS} ToolboxCore # TODO: Eigen3 + EXPORT WBToolboxExport + FIRST_TARGET WBToolboxBase + DEPENDENCIES YARP iDynTree ${WBTOOLBOX_LIBRARY_PUBLIC_DEPENDS} BlockFactoryCore NAMESPACE WBToolbox:: NO_CHECK_REQUIRED_COMPONENTS_MACRO) From ba95a4e275ddee756716cefe718d19f176f8ce85 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Wed, 5 Dec 2018 15:43:05 +0100 Subject: [PATCH 03/37] Updated the blocks with the new BlockFactory headers and namespace --- toolbox/library/include/Base/WBBlock.h | 35 +++++---- .../library/include/Base/WholeBodySingleton.h | 10 ++- .../include/Block/CentroidalMomentum.h | 15 ++-- .../library/include/Block/DiscreteFilter.h | 22 +++--- toolbox/library/include/Block/DotJNu.h | 17 +++-- .../library/include/Block/ForwardKinematics.h | 17 +++-- toolbox/library/include/Block/GetLimits.h | 20 ++++-- .../library/include/Block/GetMeasurement.h | 17 +++-- .../library/include/Block/InverseDynamics.h | 15 ++-- .../library/include/Block/InverseKinematics.h | 4 +- toolbox/library/include/Block/Jacobian.h | 17 +++-- toolbox/library/include/Block/MassMatrix.h | 15 ++-- .../Block/MinimumJerkTrajectoryGenerator.h | 19 +++-- toolbox/library/include/Block/QpOases.h | 26 ++++--- .../include/Block/RealTimeSynchronizer.h | 21 +++--- .../library/include/Block/RelativeTransform.h | 17 +++-- .../include/Block/RemoteInverseKinematics.h | 6 +- .../include/Block/SetMotorParameters.h | 17 +++-- toolbox/library/include/Block/SetReferences.h | 20 ++++-- .../include/Block/SimulatorSynchronizer.h | 21 +++--- toolbox/library/include/Block/YarpClock.h | 19 +++-- toolbox/library/include/Block/YarpRead.h | 21 +++--- toolbox/library/include/Block/YarpWrite.h | 21 +++--- toolbox/library/src/CentroidalMomentum.cpp | 19 ++--- toolbox/library/src/DiscreteFilter.cpp | 43 +++++------ toolbox/library/src/DotJNu.cpp | 33 ++++----- toolbox/library/src/Factory.cpp | 40 +++++------ toolbox/library/src/ForwardKinematics.cpp | 31 ++++---- toolbox/library/src/GetLimits.cpp | 41 +++++------ toolbox/library/src/GetMeasurement.cpp | 45 ++++++------ toolbox/library/src/InverseDynamics.cpp | 29 ++++---- toolbox/library/src/Jacobian.cpp | 33 ++++----- toolbox/library/src/MassMatrix.cpp | 19 ++--- .../src/MinimumJerkTrajectoryGenerator.cpp | 41 +++++------ toolbox/library/src/QpOases.cpp | 69 +++++++++--------- toolbox/library/src/RealTimeSynchronizer.cpp | 21 +++--- toolbox/library/src/RelativeTransform.cpp | 31 ++++---- toolbox/library/src/RobotInterface.cpp | 24 +++---- toolbox/library/src/SetMotorParameters.cpp | 65 ++++++++--------- toolbox/library/src/SetReferences.cpp | 71 ++++++++++--------- toolbox/library/src/SimulatorSynchronizer.cpp | 25 +++---- toolbox/library/src/WBBlock.cpp | 39 +++++----- toolbox/library/src/WholeBodySingleton.cpp | 38 +++++----- toolbox/library/src/YarpClock.cpp | 15 ++-- toolbox/library/src/YarpRead.cpp | 61 ++++++++-------- toolbox/library/src/YarpWrite.cpp | 33 ++++----- 46 files changed, 705 insertions(+), 573 deletions(-) diff --git a/toolbox/library/include/Base/WBBlock.h b/toolbox/library/include/Base/WBBlock.h index 3a0d6284e..4460d2679 100644 --- a/toolbox/library/include/Base/WBBlock.h +++ b/toolbox/library/include/Base/WBBlock.h @@ -9,16 +9,21 @@ #ifndef WBT_WBBLOCK_H #define WBT_WBBLOCK_H -#include "Core/Block.h" +#include #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + class Signal; + } // namespace core +} // namespace blockfactory + namespace wbt { class WBBlock; - class Signal; - class BlockInformation; class RobotInterface; - using InputSignalPtr = std::shared_ptr; + using InputSignalPtr = std::shared_ptr; } // namespace wbt namespace iDynTree { @@ -26,12 +31,14 @@ namespace iDynTree { } // namespace iDynTree /** - * @brief Extension of wbt::Block for simplifying the development of whole-body blocks + * @brief Extension of blockfactory::core::Block for simplifying the development of whole-body + * blocks * - * This class provides support of parsing the parameters for creating a wbt::RobotInterface object, - * and helpers for retrieving iDynTree::KinDynComputations and wbt::RobotInterface objects. + * This class provides support of parsing the parameters for creating a wbt::RobotInterface + * object, and helpers for retrieving iDynTree::KinDynComputations and wbt::RobotInterface + * objects. * - * @see wbt::Block + * @see blockfactory::core::block * * @section wbblock_parameters WBBlock Parameters * @@ -47,10 +54,10 @@ namespace iDynTree { * | ::STRUCT_DOUBLE | 0 + Block::NumberOfParameters | 1 | 3 | "GravityVector" | * | ::STRING | 1 + Block::NumberOfParameters | 1 | 1 | "ConfBlockName" | * - * @note The first set of parameters are fields of the same struct. For this reason they share the - * same index. + * @note The first set of parameters are fields of the same struct. For this reason they share + * the same index. */ -class wbt::WBBlock : public wbt::Block +class wbt::WBBlock : public blockfactory::core::Block { protected: // TODO: pImpl @@ -96,9 +103,9 @@ class wbt::WBBlock : public wbt::Block WBBlock(); ~WBBlock() override; unsigned numberOfParameters() override; - bool parseParameters(BlockInformation* blockInfo) override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; + bool parseParameters(blockfactory::core::BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_WBBLOCK_H diff --git a/toolbox/library/include/Base/WholeBodySingleton.h b/toolbox/library/include/Base/WholeBodySingleton.h index 84b26a4b9..4bd0c5ef2 100644 --- a/toolbox/library/include/Base/WholeBodySingleton.h +++ b/toolbox/library/include/Base/WholeBodySingleton.h @@ -16,10 +16,15 @@ namespace wbt { class WholeBodySingleton; class RobotInterface; - class Parameters; class Configuration; } // namespace wbt +namespace blockfactory { + namespace core { + class Parameters; + } // namespace core +} // namespace blockfactory + namespace iDynTree { class KinDynComputations; } @@ -145,7 +150,8 @@ class wbt::WholeBodySingleton * @see WholeBodySingleton::storeConfiguration, wbt::Configuration, * Parameters::containConfigurationData */ - std::shared_ptr storeConfiguration(const wbt::Parameters& parameters); + std::shared_ptr + storeConfiguration(const blockfactory::core::Parameters& parameters); /** * Delete the wbt::RobotInterface referred by confKey. No-op if it doesn't exist. diff --git a/toolbox/library/include/Block/CentroidalMomentum.h b/toolbox/library/include/Block/CentroidalMomentum.h index ca700619d..f70d38717 100644 --- a/toolbox/library/include/Block/CentroidalMomentum.h +++ b/toolbox/library/include/Block/CentroidalMomentum.h @@ -14,8 +14,13 @@ #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class CentroidalMomentum; } // namespace wbt @@ -32,10 +37,10 @@ class wbt::CentroidalMomentum final : public wbt::WBBlock CentroidalMomentum(); ~CentroidalMomentum() override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool terminate(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool terminate(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_CENTROIDALMOMENTUM_H diff --git a/toolbox/library/include/Block/DiscreteFilter.h b/toolbox/library/include/Block/DiscreteFilter.h index c04a89531..11921aa36 100644 --- a/toolbox/library/include/Block/DiscreteFilter.h +++ b/toolbox/library/include/Block/DiscreteFilter.h @@ -9,13 +9,18 @@ #ifndef WBT_FILTER_H #define WBT_FILTER_H -#include "Core/Block.h" +#include #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class DiscreteFilter; } // namespace wbt @@ -41,7 +46,7 @@ namespace wbt { * */ // clang-format on -class wbt::DiscreteFilter final : public wbt::Block +class wbt::DiscreteFilter final : public blockfactory::core::Block { private: class impl; @@ -52,11 +57,12 @@ class wbt::DiscreteFilter final : public wbt::Block ~DiscreteFilter() override; unsigned numberOfParameters() override; - bool parseParameters(BlockInformation* blockInfo) override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool initializeInitialConditions(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool parseParameters(blockfactory::core::BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool + initializeInitialConditions(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_FILTER_H diff --git a/toolbox/library/include/Block/DotJNu.h b/toolbox/library/include/Block/DotJNu.h index f0e166ec5..f4a2def1b 100644 --- a/toolbox/library/include/Block/DotJNu.h +++ b/toolbox/library/include/Block/DotJNu.h @@ -14,8 +14,13 @@ #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class DotJNu; } // namespace wbt @@ -42,11 +47,11 @@ class wbt::DotJNu final : public wbt::WBBlock ~DotJNu() override; unsigned numberOfParameters() override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool parseParameters(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool terminate(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool parseParameters(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool terminate(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_DOTJNU_H diff --git a/toolbox/library/include/Block/ForwardKinematics.h b/toolbox/library/include/Block/ForwardKinematics.h index 8a52a41dd..3fbd6cb03 100644 --- a/toolbox/library/include/Block/ForwardKinematics.h +++ b/toolbox/library/include/Block/ForwardKinematics.h @@ -14,8 +14,13 @@ #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class ForwardKinematics; } // namespace wbt @@ -42,11 +47,11 @@ class wbt::ForwardKinematics final : public wbt::WBBlock ~ForwardKinematics() override; unsigned numberOfParameters() override; - bool parseParameters(BlockInformation* blockInfo) override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool terminate(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool parseParameters(blockfactory::core::BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool terminate(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_FORWARDKINEMATICS_H diff --git a/toolbox/library/include/Block/GetLimits.h b/toolbox/library/include/Block/GetLimits.h index 734d9a5b1..a5a39a8d3 100644 --- a/toolbox/library/include/Block/GetLimits.h +++ b/toolbox/library/include/Block/GetLimits.h @@ -14,8 +14,13 @@ #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class GetLimits; } // namespace wbt @@ -42,12 +47,13 @@ class wbt::GetLimits final : public wbt::WBBlock ~GetLimits() override; unsigned numberOfParameters() override; - bool parseParameters(BlockInformation* blockInfo) override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool initializeInitialConditions(const BlockInformation* blockInfo) override; - bool terminate(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool parseParameters(blockfactory::core::BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool + initializeInitialConditions(const blockfactory::core::BlockInformation* blockInfo) override; + bool terminate(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_GETLIMITS_H diff --git a/toolbox/library/include/Block/GetMeasurement.h b/toolbox/library/include/Block/GetMeasurement.h index 6f271991e..d1f7d8773 100644 --- a/toolbox/library/include/Block/GetMeasurement.h +++ b/toolbox/library/include/Block/GetMeasurement.h @@ -14,8 +14,13 @@ #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class GetMeasurement; } // namespace wbt @@ -42,11 +47,11 @@ class wbt::GetMeasurement final : public wbt::WBBlock ~GetMeasurement() override; unsigned numberOfParameters() override; - bool parseParameters(BlockInformation* blockInfo) override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool terminate(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool parseParameters(blockfactory::core::BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool terminate(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_GETMEASUREMENT_H diff --git a/toolbox/library/include/Block/InverseDynamics.h b/toolbox/library/include/Block/InverseDynamics.h index 98d5e0bd9..59ac9b540 100644 --- a/toolbox/library/include/Block/InverseDynamics.h +++ b/toolbox/library/include/Block/InverseDynamics.h @@ -14,8 +14,13 @@ #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class InverseDynamics; } // namespace wbt @@ -33,10 +38,10 @@ class wbt::InverseDynamics final : public wbt::WBBlock ~InverseDynamics() override; unsigned numberOfParameters() override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool terminate(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool terminate(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_INVERSEDYNAMICS_H diff --git a/toolbox/library/include/Block/InverseKinematics.h b/toolbox/library/include/Block/InverseKinematics.h index 87a572280..97f621c9a 100644 --- a/toolbox/library/include/Block/InverseKinematics.h +++ b/toolbox/library/include/Block/InverseKinematics.h @@ -18,9 +18,9 @@ class wbt::InverseKinematics : public wbt::WBIModelBlock InverseKinematics(); virtual unsigned numberOfParameters(); - virtual bool configureSizeAndPorts(BlockInformation* blockInfo, wbt::Error* error); + virtual bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo, wbt::Error* error); - virtual bool initialize(BlockInformation* blockInfo, wbt::Error* error); + virtual bool initialize(blockfactory::core::BlockInformation* blockInfo, wbt::Error* error); virtual bool terminate(BlockInformation* blockInfo, wbt::Error* error); virtual bool output(BlockInformation* blockInfo, wbt::Error* error); }; diff --git a/toolbox/library/include/Block/Jacobian.h b/toolbox/library/include/Block/Jacobian.h index d0704eaa4..7963ae3bf 100644 --- a/toolbox/library/include/Block/Jacobian.h +++ b/toolbox/library/include/Block/Jacobian.h @@ -14,8 +14,13 @@ #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class Jacobian; } // namespace wbt @@ -42,11 +47,11 @@ class wbt::Jacobian final : public wbt::WBBlock ~Jacobian() override; unsigned numberOfParameters() override; - bool parseParameters(BlockInformation* blockInfo) override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool terminate(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool parseParameters(blockfactory::core::BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool terminate(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_JACOBIAN_H diff --git a/toolbox/library/include/Block/MassMatrix.h b/toolbox/library/include/Block/MassMatrix.h index 151c4a397..a01e445ea 100644 --- a/toolbox/library/include/Block/MassMatrix.h +++ b/toolbox/library/include/Block/MassMatrix.h @@ -14,8 +14,13 @@ #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class MassMatrix; } // namespace wbt @@ -32,10 +37,10 @@ class wbt::MassMatrix final : public wbt::WBBlock MassMatrix(); ~MassMatrix() override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool terminate(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool terminate(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_MASSMATRIX_H diff --git a/toolbox/library/include/Block/MinimumJerkTrajectoryGenerator.h b/toolbox/library/include/Block/MinimumJerkTrajectoryGenerator.h index 1eb8f77ad..0cef902e7 100644 --- a/toolbox/library/include/Block/MinimumJerkTrajectoryGenerator.h +++ b/toolbox/library/include/Block/MinimumJerkTrajectoryGenerator.h @@ -9,13 +9,18 @@ #ifndef WBT_MINJERKTRAJGENERATOR_H #define WBT_MINJERKTRAJGENERATOR_H -#include "Core/Block.h" +#include #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class MinimumJerkTrajectoryGenerator; } // namespace wbt @@ -37,7 +42,7 @@ namespace wbt { * | ::BOOL | 6 + Block::NumberOfParameters | 1 | 1 | "ResetOnSettlingTimeChange" | * */ -class wbt::MinimumJerkTrajectoryGenerator final : public wbt::Block +class wbt::MinimumJerkTrajectoryGenerator final : public blockfactory::core::Block { private: class impl; @@ -48,10 +53,10 @@ class wbt::MinimumJerkTrajectoryGenerator final : public wbt::Block ~MinimumJerkTrajectoryGenerator() override; unsigned numberOfParameters() override; - bool parseParameters(BlockInformation* blockInfo) override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool parseParameters(blockfactory::core::BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_MINJERKTRAJGENERATOR_H diff --git a/toolbox/library/include/Block/QpOases.h b/toolbox/library/include/Block/QpOases.h index b400db063..ae2a8b27c 100644 --- a/toolbox/library/include/Block/QpOases.h +++ b/toolbox/library/include/Block/QpOases.h @@ -6,16 +6,21 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "Core/Block.h" +#ifndef WBT_QPOASES_H +#define WBT_QPOASES_H + +#include #include #include -#ifndef WBT_QPOASES_H -#define WBT_QPOASES_H +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory namespace wbt { - class BlockInformation; class QpOases; } // namespace wbt @@ -36,7 +41,7 @@ namespace wbt { * | ParameterType::BOOL | 5 + Block::NumberOfParameters | 1 | 1 | "StopWhenFails" | * */ -class wbt::QpOases final : public wbt::Block +class wbt::QpOases final : public blockfactory::core::Block { private: class impl; @@ -47,11 +52,12 @@ class wbt::QpOases final : public wbt::Block ~QpOases() override; unsigned numberOfParameters() override; - bool parseParameters(BlockInformation* blockInfo) override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool initializeInitialConditions(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool parseParameters(blockfactory::core::BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool + initializeInitialConditions(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_QPOASES_H diff --git a/toolbox/library/include/Block/RealTimeSynchronizer.h b/toolbox/library/include/Block/RealTimeSynchronizer.h index 0ca0bc1b8..7b3db4842 100644 --- a/toolbox/library/include/Block/RealTimeSynchronizer.h +++ b/toolbox/library/include/Block/RealTimeSynchronizer.h @@ -9,13 +9,18 @@ #ifndef WBT_REALTIMESYNCHRONIZER_H #define WBT_REALTIMESYNCHRONIZER_H -#include "Core/Block.h" +#include #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class RealTimeSynchronizer; } // namespace wbt @@ -31,7 +36,7 @@ namespace wbt { * | ::DOUBLE | 0 + Block::NumberOfParameters | 1 | 1 | "Period" | * */ -class wbt::RealTimeSynchronizer final : public wbt::Block +class wbt::RealTimeSynchronizer final : public blockfactory::core::Block { private: class impl; @@ -42,11 +47,11 @@ class wbt::RealTimeSynchronizer final : public wbt::Block ~RealTimeSynchronizer() override; unsigned numberOfParameters() override; - bool parseParameters(BlockInformation* blockInfo) override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool terminate(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool parseParameters(blockfactory::core::BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool terminate(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_REALTIMESYNCHRONIZER_H diff --git a/toolbox/library/include/Block/RelativeTransform.h b/toolbox/library/include/Block/RelativeTransform.h index 14e9fba5f..ce38ae760 100644 --- a/toolbox/library/include/Block/RelativeTransform.h +++ b/toolbox/library/include/Block/RelativeTransform.h @@ -14,8 +14,13 @@ #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class RelativeTransform; } // namespace wbt @@ -43,11 +48,11 @@ class wbt::RelativeTransform final : public wbt::WBBlock ~RelativeTransform() override; unsigned numberOfParameters() override; - bool parseParameters(BlockInformation* blockInfo) override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool terminate(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool parseParameters(blockfactory::core::BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool terminate(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_RELATIVETRASFORM_H diff --git a/toolbox/library/include/Block/RemoteInverseKinematics.h b/toolbox/library/include/Block/RemoteInverseKinematics.h index 9b6621fb8..3e927e614 100644 --- a/toolbox/library/include/Block/RemoteInverseKinematics.h +++ b/toolbox/library/include/Block/RemoteInverseKinematics.h @@ -8,7 +8,7 @@ namespace wbt { class BlockInformation; } // namespace wbt -class wbt::RemoteInverseKinematics : public wbt::Block +class wbt::RemoteInverseKinematics : public blockfactory::core::Block { struct RemoteInverseKinematicsPimpl; @@ -20,9 +20,9 @@ class wbt::RemoteInverseKinematics : public wbt::Block virtual unsigned numberOfParameters(); virtual unsigned numberOfDiscreteStates(); - virtual bool configureSizeAndPorts(BlockInformation* blockInfo, wbt::Error* error); + virtual bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo, wbt::Error* error); - virtual bool initialize(BlockInformation* blockInfo, wbt::Error* error); + virtual bool initialize(blockfactory::core::BlockInformation* blockInfo, wbt::Error* error); virtual bool terminate(BlockInformation* blockInfo, wbt::Error* error); virtual bool output(BlockInformation* blockInfo, wbt::Error* error); }; diff --git a/toolbox/library/include/Block/SetMotorParameters.h b/toolbox/library/include/Block/SetMotorParameters.h index a00718820..b887b771c 100644 --- a/toolbox/library/include/Block/SetMotorParameters.h +++ b/toolbox/library/include/Block/SetMotorParameters.h @@ -15,8 +15,13 @@ #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class SetMotorParameters; } // namespace wbt @@ -50,11 +55,11 @@ class wbt::SetMotorParameters final : public wbt::WBBlock ~SetMotorParameters() override; unsigned numberOfParameters() override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool parseParameters(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool terminate(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool parseParameters(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool terminate(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_SETMOTORPARAMETERS_H diff --git a/toolbox/library/include/Block/SetReferences.h b/toolbox/library/include/Block/SetReferences.h index 3e6221588..9446e0802 100644 --- a/toolbox/library/include/Block/SetReferences.h +++ b/toolbox/library/include/Block/SetReferences.h @@ -14,8 +14,13 @@ #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class SetReferences; } // namespace wbt @@ -43,12 +48,13 @@ class wbt::SetReferences final : public wbt::WBBlock ~SetReferences() override; unsigned numberOfParameters() override; - bool parseParameters(BlockInformation* blockInfo) override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool initializeInitialConditions(const BlockInformation* blockInfo) override; - bool terminate(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool parseParameters(blockfactory::core::BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool + initializeInitialConditions(const blockfactory::core::BlockInformation* blockInfo) override; + bool terminate(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_SETREFERENCES_H diff --git a/toolbox/library/include/Block/SimulatorSynchronizer.h b/toolbox/library/include/Block/SimulatorSynchronizer.h index a5ae32963..c00cb214b 100644 --- a/toolbox/library/include/Block/SimulatorSynchronizer.h +++ b/toolbox/library/include/Block/SimulatorSynchronizer.h @@ -9,14 +9,19 @@ #ifndef WBT_SIMULATORSYNCHRONIZER_H #define WBT_SIMULATORSYNCHRONIZER_H -#include "Core/Block.h" +#include #include #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class SimulatorSynchronizer; } // namespace wbt @@ -34,7 +39,7 @@ namespace wbt { * | ::STRING | 2 + WBBlock::NumberOfParameters | 1 | 1 | "GazeboClockPort" | * */ -class wbt::SimulatorSynchronizer final : public wbt::Block +class wbt::SimulatorSynchronizer final : public blockfactory::core::Block { private: class impl; @@ -46,11 +51,11 @@ class wbt::SimulatorSynchronizer final : public wbt::Block unsigned numberOfParameters() override; std::vector additionalBlockOptions() override; - bool parseParameters(BlockInformation* blockInfo) override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool terminate(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool parseParameters(blockfactory::core::BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool terminate(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_SIMULATORSYNCHRONIZER_H diff --git a/toolbox/library/include/Block/YarpClock.h b/toolbox/library/include/Block/YarpClock.h index 43f5baa72..e82c76244 100644 --- a/toolbox/library/include/Block/YarpClock.h +++ b/toolbox/library/include/Block/YarpClock.h @@ -9,29 +9,34 @@ #ifndef WBT_YARPCLOCK_H #define WBT_YARPCLOCK_H -#include "Core/Block.h" +#include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class YarpClock; } // namespace wbt /** * @brief The wbt::YarpClock class */ -class wbt::YarpClock final : public wbt::Block +class wbt::YarpClock final : public blockfactory::core::Block { public: YarpClock() = default; ~YarpClock() override = default; unsigned numberOfParameters() override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool terminate(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool terminate(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_YARPCLOCK_H diff --git a/toolbox/library/include/Block/YarpRead.h b/toolbox/library/include/Block/YarpRead.h index 9b164370c..9232e0bb6 100644 --- a/toolbox/library/include/Block/YarpRead.h +++ b/toolbox/library/include/Block/YarpRead.h @@ -9,13 +9,18 @@ #ifndef WBT_YARPREAD_H #define WBT_YARPREAD_H -#include "Core/Block.h" +#include #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class YarpRead; } // namespace wbt @@ -35,7 +40,7 @@ namespace wbt { * | ::BOOL | 6 + Block::NumberOfParameters | 1 | 1 | "ErrorOnMissingPort" | * */ -class wbt::YarpRead final : public wbt::Block +class wbt::YarpRead final : public blockfactory::core::Block { private: class impl; @@ -46,11 +51,11 @@ class wbt::YarpRead final : public wbt::Block ~YarpRead() override; unsigned numberOfParameters() override; - bool parseParameters(BlockInformation* blockInfo) override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool terminate(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool parseParameters(blockfactory::core::BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool terminate(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_YARPREAD_H diff --git a/toolbox/library/include/Block/YarpWrite.h b/toolbox/library/include/Block/YarpWrite.h index 1b7e74003..7ce393ed2 100644 --- a/toolbox/library/include/Block/YarpWrite.h +++ b/toolbox/library/include/Block/YarpWrite.h @@ -9,13 +9,18 @@ #ifndef WBT_YARPWRITE_H #define WBT_YARPWRITE_H -#include "Core/Block.h" +#include #include #include +namespace blockfactory { + namespace core { + class BlockInformation; + } // namespace core +} // namespace blockfactory + namespace wbt { - class BlockInformation; class YarpWrite; } // namespace wbt @@ -31,7 +36,7 @@ namespace wbt { * | ::BOOL | 2 + Block::NumberOfParameters | 1 | 1 | "ErrorOnMissingPort" | * */ -class wbt::YarpWrite final : public wbt::Block +class wbt::YarpWrite final : public blockfactory::core::Block { private: class impl; @@ -42,11 +47,11 @@ class wbt::YarpWrite final : public wbt::Block ~YarpWrite() override; unsigned numberOfParameters() override; - bool parseParameters(BlockInformation* blockInfo) override; - bool configureSizeAndPorts(BlockInformation* blockInfo) override; - bool initialize(BlockInformation* blockInfo) override; - bool terminate(const BlockInformation* blockInfo) override; - bool output(const BlockInformation* blockInfo) override; + bool parseParameters(blockfactory::core::BlockInformation* blockInfo) override; + bool configureSizeAndPorts(blockfactory::core::BlockInformation* blockInfo) override; + bool initialize(blockfactory::core::BlockInformation* blockInfo) override; + bool terminate(const blockfactory::core::BlockInformation* blockInfo) override; + bool output(const blockfactory::core::BlockInformation* blockInfo) override; }; #endif // WBT_YARPWRITE_H diff --git a/toolbox/library/src/CentroidalMomentum.cpp b/toolbox/library/src/CentroidalMomentum.cpp index 53f9e6c11..cec0cc068 100644 --- a/toolbox/library/src/CentroidalMomentum.cpp +++ b/toolbox/library/src/CentroidalMomentum.cpp @@ -9,10 +9,10 @@ #include "CentroidalMomentum.h" #include "Base/Configuration.h" #include "Base/RobotInterface.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Signal.h" +#include +#include +#include #include #include #include @@ -21,6 +21,7 @@ #include using namespace wbt; +using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT // =================================== @@ -95,7 +96,7 @@ bool CentroidalMomentum::configureSizeAndPorts(BlockInformation* blockInfo) }); if (!ok) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -117,7 +118,7 @@ bool CentroidalMomentum::output(const BlockInformation* blockInfo) // Get the KinDynComputations object auto kinDyn = getKinDynComputations(); if (!kinDyn) { - wbtError << "Failed to retrieve the KinDynComputations object."; + bfError << "Failed to retrieve the KinDynComputations object."; return false; } @@ -130,7 +131,7 @@ bool CentroidalMomentum::output(const BlockInformation* blockInfo) InputSignalPtr jointsVelocitySignal = blockInfo->getInputPortSignal(InputIndex::JointVelocity); if (!basePoseSig || !jointsPosSig || !baseVelocitySignal || !jointsVelocitySignal) { - wbtError << "Input signals not valid."; + bfError << "Input signals not valid."; return false; } @@ -138,7 +139,7 @@ bool CentroidalMomentum::output(const BlockInformation* blockInfo) basePoseSig, jointsPosSig, baseVelocitySignal, jointsVelocitySignal, kinDyn.get()); if (!ok) { - wbtError << "Failed to set the robot state."; + bfError << "Failed to set the robot state."; return false; } @@ -151,13 +152,13 @@ bool CentroidalMomentum::output(const BlockInformation* blockInfo) // Get the output signal OutputSignalPtr output = blockInfo->getOutputPortSignal(OutputIndex::CentroidalMomentum); if (!output) { - wbtError << "Output signal not valid."; + bfError << "Output signal not valid."; return false; } // Fill the output buffer if (!output->setBuffer(toEigen(pImpl->centroidalMomentum).data(), output->getWidth())) { - wbtError << "Failed to set output buffer."; + bfError << "Failed to set output buffer."; return false; } diff --git a/toolbox/library/src/DiscreteFilter.cpp b/toolbox/library/src/DiscreteFilter.cpp index 6785c59aa..02a523d9f 100644 --- a/toolbox/library/src/DiscreteFilter.cpp +++ b/toolbox/library/src/DiscreteFilter.cpp @@ -7,12 +7,12 @@ */ #include "DiscreteFilter.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" -#include "Core/Signal.h" +#include +#include +#include +#include +#include #include #include @@ -22,6 +22,7 @@ #include using namespace wbt; +using namespace blockfactory::core; using namespace iCub::ctrl; using namespace yarp::sig; @@ -87,7 +88,7 @@ bool DiscreteFilter::parseParameters(BlockInformation* blockInfo) for (const auto& md : metadata) { if (!blockInfo->addParameterMetadata(md)) { - wbtError << "Failed to store parameter metadata"; + bfError << "Failed to store parameter metadata"; return false; } } @@ -123,7 +124,7 @@ bool DiscreteFilter::configureSizeAndPorts(BlockInformation* blockInfo) }); if (!ok) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -140,7 +141,7 @@ bool DiscreteFilter::initialize(BlockInformation* blockInfo) // ========== if (!DiscreteFilter::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } @@ -166,7 +167,7 @@ bool DiscreteFilter::initialize(BlockInformation* blockInfo) ok = ok && m_parameters.getParameter("MedianOrder", medianFilter_order); if (!ok) { - wbtError << "Failed to get parameters after their parsing."; + bfError << "Failed to get parameters after their parsing."; return false; } @@ -176,13 +177,13 @@ bool DiscreteFilter::initialize(BlockInformation* blockInfo) if (filter_type == "Generic") { // Check if numerator and denominator are not empty if (num_coeff.empty() || den_coeff.empty()) { - wbtError << "Empty numerator or denominator not allowed."; + bfError << "Empty numerator or denominator not allowed."; return false; } // Check if numerator or denominator are scalar and zero if ((num_coeff.size() == 1 && num_coeff.front() == 0.0) || (den_coeff.size() == 1 && den_coeff.front() == 0.0)) { - wbtError << "Passed numerator or denominator not valid."; + bfError << "Passed numerator or denominator not valid."; return false; } } @@ -198,12 +199,12 @@ bool DiscreteFilter::initialize(BlockInformation* blockInfo) if (initStatus) { // y0 and output signal dimensions should match if (y0.size() != outputSignalSize) { - wbtError << "y0 and output signal sizes don't match."; + bfError << "y0 and output signal sizes don't match."; return false; } // u0 and input signal dimensions should match (used only for Generic) if ((filter_type == "Generic") && (u0.size() != inputPortWidth)) { - wbtError << "(Generic) u0 and input signal sizes don't match."; + bfError << "(Generic) u0 and input signal sizes don't match."; return false; } // Allocate the initial conditions @@ -230,8 +231,8 @@ bool DiscreteFilter::initialize(BlockInformation* blockInfo) // ----------------------- else if (filter_type == "FirstOrderLowPassFilter") { if (firstOrderLowPassFilter_fc == 0.0 || firstOrderLowPassFilter_ts == 0.0) { - wbtError << "(FirstOrderLowPassFilter) You need to " - "specify Fc and Ts."; + bfError << "(FirstOrderLowPassFilter) You need to " + "specify Fc and Ts."; return false; } pImpl->filter = std::unique_ptr( @@ -241,13 +242,13 @@ bool DiscreteFilter::initialize(BlockInformation* blockInfo) // ------------ else if (filter_type == "MedianFilter") { if (medianFilter_order == 0) { - wbtError << "(MedianFilter) You need to specify the filter order."; + bfError << "(MedianFilter) You need to specify the filter order."; return false; } pImpl->filter = std::unique_ptr(new MedianFilter(medianFilter_order)); } else { - wbtError << "Filter type not recognized."; + bfError << "Filter type not recognized."; return false; } @@ -281,7 +282,7 @@ bool DiscreteFilter::initializeInitialConditions(const BlockInformation* /*block pImpl->filter->init(pImpl->y0); } else { - wbtError << "Failed to get the IFilter object."; + bfError << "Failed to get the IFilter object."; return false; } } @@ -292,7 +293,7 @@ bool DiscreteFilter::initializeInitialConditions(const BlockInformation* /*block bool DiscreteFilter::output(const BlockInformation* blockInfo) { if (!pImpl->filter) { - wbtError << "Failed to retrieve the filter object."; + bfError << "Failed to retrieve the filter object."; return false; } @@ -301,7 +302,7 @@ bool DiscreteFilter::output(const BlockInformation* blockInfo) OutputSignalPtr outputSignal = blockInfo->getOutputPortSignal(OutputIndex::FilteredSignal); if (!inputSignal || !outputSignal) { - wbtError << "Signals not valid."; + bfError << "Signals not valid."; return false; } @@ -315,7 +316,7 @@ bool DiscreteFilter::output(const BlockInformation* blockInfo) // Forward the filtered signals to the output port if (!outputSignal->setBuffer(outputVector.data(), outputVector.length())) { - wbtError << "Failed to set output buffer."; + bfError << "Failed to set output buffer."; return false; } diff --git a/toolbox/library/src/DotJNu.cpp b/toolbox/library/src/DotJNu.cpp index 7b0a1b4ea..52ed774d1 100644 --- a/toolbox/library/src/DotJNu.cpp +++ b/toolbox/library/src/DotJNu.cpp @@ -9,12 +9,12 @@ #include "DotJNu.h" #include "Base/Configuration.h" #include "Base/RobotInterface.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" -#include "Core/Signal.h" +#include +#include +#include +#include +#include #include #include #include @@ -25,6 +25,7 @@ #include using namespace wbt; +using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT // =================================== @@ -78,7 +79,7 @@ bool DotJNu::parseParameters(BlockInformation* blockInfo) const ParameterMetadata frameMetadata(ParameterType::STRING, ParamIndex::Frame, 1, 1, "Frame"); if (!blockInfo->addParameterMetadata(frameMetadata)) { - wbtError << "Failed to store parameters metadata."; + bfError << "Failed to store parameters metadata."; return false; } @@ -124,7 +125,7 @@ bool DotJNu::configureSizeAndPorts(BlockInformation* blockInfo) }); if (!ok) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -141,13 +142,13 @@ bool DotJNu::initialize(BlockInformation* blockInfo) // ========== if (!DotJNu::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } std::string frame; if (!m_parameters.getParameter("Frame", frame)) { - wbtError << "Cannot retrieve string from frame parameter."; + bfError << "Cannot retrieve string from frame parameter."; return false; } @@ -159,14 +160,14 @@ bool DotJNu::initialize(BlockInformation* blockInfo) auto kinDyn = getKinDynComputations(); if (!kinDyn) { - wbtError << "Cannot retrieve handle to KinDynComputations."; + bfError << "Cannot retrieve handle to KinDynComputations."; return false; } if (frame != "com") { pImpl->frameIndex = kinDyn->getFrameIndex(frame); if (pImpl->frameIndex == iDynTree::FRAME_INVALID_INDEX) { - wbtError << "Cannot find " + frame + " in the frame list."; + bfError << "Cannot find " + frame + " in the frame list."; return false; } } @@ -192,7 +193,7 @@ bool DotJNu::output(const BlockInformation* blockInfo) // Get the KinDynComputations object auto kinDyn = getKinDynComputations(); if (!kinDyn) { - wbtError << "Failed to retrieve the KinDynComputations object."; + bfError << "Failed to retrieve the KinDynComputations object."; return false; } @@ -205,7 +206,7 @@ bool DotJNu::output(const BlockInformation* blockInfo) InputSignalPtr jointsVelocitySignal = blockInfo->getInputPortSignal(InputIndex::JointVelocity); if (!basePoseSig || !jointsPosSig || !baseVelocitySignal || !jointsVelocitySignal) { - wbtError << "Input signals not valid."; + bfError << "Input signals not valid."; return false; } @@ -213,7 +214,7 @@ bool DotJNu::output(const BlockInformation* blockInfo) basePoseSig, jointsPosSig, baseVelocitySignal, jointsVelocitySignal, kinDyn.get()); if (!ok) { - wbtError << "Failed to set the robot state."; + bfError << "Failed to set the robot state."; return false; } @@ -232,12 +233,12 @@ bool DotJNu::output(const BlockInformation* blockInfo) // Forward the output to Simulink OutputSignalPtr output = blockInfo->getOutputPortSignal(OutputIndex::DotJNu); if (!output) { - wbtError << "Output signal not valid."; + bfError << "Output signal not valid."; return false; } if (!output->setBuffer(pImpl->dotJNu.data(), output->getWidth())) { - wbtError << "Failed to set output buffer."; + bfError << "Failed to set output buffer."; } return true; diff --git a/toolbox/library/src/Factory.cpp b/toolbox/library/src/Factory.cpp index 3d2e7cf50..7100229cf 100644 --- a/toolbox/library/src/Factory.cpp +++ b/toolbox/library/src/Factory.cpp @@ -47,37 +47,37 @@ #include "shlibpp/SharedLibraryClassApi.h" // YARP-dependent blocks -SHLIBPP_DEFINE_SHARED_SUBCLASS(GetLimits, wbt::GetLimits, wbt::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(GetMeasurement, wbt::GetMeasurement, wbt::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(RealTimeSynchronizer, wbt::RealTimeSynchronizer, wbt::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(SetMotorParameters, wbt::SetMotorParameters, wbt::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(SetReferences, wbt::SetReferences, wbt::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(SimulatorSynchronizer, wbt::SimulatorSynchronizer, wbt::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(YarpClock, wbt::YarpClock, wbt::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(YarpRead, wbt::YarpRead, wbt::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(YarpWrite, wbt::YarpWrite, wbt::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(GetLimits, wbt::GetLimits, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(GetMeasurement, wbt::GetMeasurement, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(RealTimeSynchronizer, wbt::RealTimeSynchronizer, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(SetMotorParameters, wbt::SetMotorParameters, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(SetReferences, wbt::SetReferences, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(SimulatorSynchronizer, wbt::SimulatorSynchronizer, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(YarpClock, wbt::YarpClock, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(YarpRead, wbt::YarpRead, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(YarpWrite, wbt::YarpWrite, blockfactory::core::Block) // iDyntree-dependent blocks -SHLIBPP_DEFINE_SHARED_SUBCLASS(CentroidalMomentum, wbt::CentroidalMomentum, wbt::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(DotJNu, wbt::DotJNu, wbt::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(ForwardKinematics, wbt::ForwardKinematics, wbt::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(InverseDynamics, wbt::InverseDynamics, wbt::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(Jacobian, wbt::Jacobian, wbt::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(MassMatrix, wbt::MassMatrix, wbt::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(RelativeTransform, wbt::RelativeTransform, wbt::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(CentroidalMomentum, wbt::CentroidalMomentum, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(DotJNu, wbt::DotJNu, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(ForwardKinematics, wbt::ForwardKinematics, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(InverseDynamics, wbt::InverseDynamics, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(Jacobian, wbt::Jacobian, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(MassMatrix, wbt::MassMatrix, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(RelativeTransform, wbt::RelativeTransform, blockfactory::core::Block) // iCub-dependent blocks #ifdef WBT_USES_ICUB -SHLIBPP_DEFINE_SHARED_SUBCLASS(DiscreteFilter, wbt::DiscreteFilter, wbt::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(DiscreteFilter, wbt::DiscreteFilter, blockfactory::core::Block) SHLIBPP_DEFINE_SHARED_SUBCLASS(MinimumJerkTrajectoryGenerator, wbt::MinimumJerkTrajectoryGenerator, - wbt::Block) + blockfactory::core::Block) #endif // Other blocks #ifdef WBT_USES_QPOASES -SHLIBPP_DEFINE_SHARED_SUBCLASS(QpOases, wbt::QpOases, wbt::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(QpOases, wbt::QpOases, blockfactory::core::Block) #endif #ifdef WBT_USES_IPOPT -SHLIBPP_DEFINE_SHARED_SUBCLASS(InverseKinematics, wbt::InverseKinematics, wbt::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(InverseKinematics, wbt::InverseKinematics, blockfactory::core::Block) #endif diff --git a/toolbox/library/src/ForwardKinematics.cpp b/toolbox/library/src/ForwardKinematics.cpp index 2392a2e05..868c75ccf 100644 --- a/toolbox/library/src/ForwardKinematics.cpp +++ b/toolbox/library/src/ForwardKinematics.cpp @@ -9,12 +9,12 @@ #include "ForwardKinematics.h" #include "Base/Configuration.h" #include "Base/RobotInterface.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" -#include "Core/Signal.h" +#include +#include +#include +#include +#include #include #include #include @@ -25,6 +25,7 @@ #include using namespace wbt; +using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT // =================================== @@ -75,7 +76,7 @@ bool ForwardKinematics::parseParameters(BlockInformation* blockInfo) const ParameterMetadata frameMetadata(ParameterType::STRING, ParamIndex::Frame, 1, 1, "Frame"); if (!blockInfo->addParameterMetadata(frameMetadata)) { - wbtError << "Failed to store parameters metadata."; + bfError << "Failed to store parameters metadata."; return false; } @@ -117,7 +118,7 @@ bool ForwardKinematics::configureSizeAndPorts(BlockInformation* blockInfo) }); if (!ok) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -134,13 +135,13 @@ bool ForwardKinematics::initialize(BlockInformation* blockInfo) // ========== if (!ForwardKinematics::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } std::string frame; if (!m_parameters.getParameter("Frame", frame)) { - wbtError << "Cannot retrieve string from frame parameter."; + bfError << "Cannot retrieve string from frame parameter."; return false; } @@ -152,14 +153,14 @@ bool ForwardKinematics::initialize(BlockInformation* blockInfo) auto kinDyn = getKinDynComputations(); if (!kinDyn) { - wbtError << "Cannot retrieve handle to KinDynComputations."; + bfError << "Cannot retrieve handle to KinDynComputations."; return false; } if (frame != "com") { pImpl->frameIndex = kinDyn->getFrameIndex(frame); if (pImpl->frameIndex == iDynTree::FRAME_INVALID_INDEX) { - wbtError << "Cannot find " + frame + " in the frame list."; + bfError << "Cannot find " + frame + " in the frame list."; return false; } } @@ -185,7 +186,7 @@ bool ForwardKinematics::output(const BlockInformation* blockInfo) // Get the KinDynComputations object auto kinDyn = getKinDynComputations(); if (!kinDyn) { - wbtError << "Failed to retrieve the KinDynComputations object."; + bfError << "Failed to retrieve the KinDynComputations object."; return false; } @@ -196,14 +197,14 @@ bool ForwardKinematics::output(const BlockInformation* blockInfo) InputSignalPtr jointsPosSig = blockInfo->getInputPortSignal(InputIndex::JointConfiguration); if (!basePoseSig || !jointsPosSig) { - wbtError << "Input signals not valid."; + bfError << "Input signals not valid."; return false; } bool ok = setRobotState(basePoseSig, jointsPosSig, nullptr, nullptr, kinDyn.get()); if (!ok) { - wbtError << "Failed to set the robot state."; + bfError << "Failed to set the robot state."; return false; } @@ -223,7 +224,7 @@ bool ForwardKinematics::output(const BlockInformation* blockInfo) // Get the output signal memory location OutputSignalPtr output = blockInfo->getOutputPortSignal(OutputIndex::Transform); if (!output) { - wbtError << "Output signal not valid."; + bfError << "Output signal not valid."; return false; } diff --git a/toolbox/library/src/GetLimits.cpp b/toolbox/library/src/GetLimits.cpp index 4a37c9bc8..b65ebbdcc 100644 --- a/toolbox/library/src/GetLimits.cpp +++ b/toolbox/library/src/GetLimits.cpp @@ -9,12 +9,12 @@ #include "GetLimits.h" #include "Base/Configuration.h" #include "Base/RobotInterface.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" -#include "Core/Signal.h" +#include +#include +#include +#include +#include #include #include #include @@ -28,6 +28,7 @@ #include using namespace wbt; +using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT // =================================== @@ -85,7 +86,7 @@ bool GetLimits::parseParameters(BlockInformation* blockInfo) ParameterType::STRING, ParamIndex::LimitType, 1, 1, "LimitType"); if (!blockInfo->addParameterMetadata(limitTypeMetadata)) { - wbtError << "Failed to store parameters metadata."; + bfError << "Failed to store parameters metadata."; return false; } @@ -125,7 +126,7 @@ bool GetLimits::configureSizeAndPorts(BlockInformation* blockInfo) }); if (!ok) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -144,13 +145,13 @@ bool GetLimits::initialize(BlockInformation* blockInfo) // ========== if (!GetLimits::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } // Read the control type if (!m_parameters.getParameter("LimitType", pImpl->limitType)) { - wbtError << "Failed to get parameters after their parsing."; + bfError << "Failed to get parameters after their parsing."; return false; } @@ -206,7 +207,7 @@ bool GetLimits::output(const BlockInformation* blockInfo) || pImpl->limitType == "ControlBoardVelocity") { // Get the interface if (!robotInterface->getInterface(iControlLimits2) || !iControlLimits2) { - wbtError << "Failed to get IControlLimits2 interface."; + bfError << "Failed to get IControlLimits2 interface."; return false; } } @@ -214,7 +215,7 @@ bool GetLimits::output(const BlockInformation* blockInfo) if (pImpl->limitType == "ControlBoardPosition") { for (unsigned i = 0; i < dofs; ++i) { if (!iControlLimits2->getLimits(i, &min, &max)) { - wbtError << "Failed to get limits from the interface."; + bfError << "Failed to get limits from the interface."; return false; } pImpl->limits.min[i] = GetLimits::impl::deg2rad(min); @@ -224,7 +225,7 @@ bool GetLimits::output(const BlockInformation* blockInfo) else if (pImpl->limitType == "ControlBoardVelocity") { for (unsigned i = 0; i < dofs; ++i) { if (!iControlLimits2->getVelLimits(i, &min, &max)) { - wbtError << "Failed to get limits from the interface."; + bfError << "Failed to get limits from the interface."; return false; } pImpl->limits.min[i] = GetLimits::impl::deg2rad(min); @@ -243,7 +244,7 @@ bool GetLimits::output(const BlockInformation* blockInfo) // Get the KinDynComputations pointer const auto& kindyncomp = robotInterface->getKinDynComputations(); if (!kindyncomp) { - wbtError << "Failed to retrieve the KinDynComputations object."; + bfError << "Failed to retrieve the KinDynComputations object."; return false; } @@ -259,7 +260,7 @@ bool GetLimits::output(const BlockInformation* blockInfo) iDynTree::JointIndex jointIndex = model.getJointIndex(joint); if (jointIndex == iDynTree::JOINT_INVALID_INDEX) { - wbtError << "Invalid iDynTree joint index."; + bfError << "Invalid iDynTree joint index."; return false; } @@ -267,14 +268,14 @@ bool GetLimits::output(const BlockInformation* blockInfo) p_joint = model.getJoint(jointIndex); if (!p_joint->hasPosLimits()) { - wbtWarning << "Joint " << joint << " has no model limits."; + bfWarning << "Joint " << joint << " has no model limits."; pImpl->limits.min[i] = -std::numeric_limits::infinity(); pImpl->limits.max[i] = std::numeric_limits::infinity(); } else { if (!p_joint->getPosLimits(0, min, max)) { - wbtError << "Failed to get joint limits from the URDF model " - << "for the joint " << joint + "."; + bfError << "Failed to get joint limits from the URDF model " + << "for the joint " << joint + "."; return false; } pImpl->limits.min[i] = min; @@ -288,7 +289,7 @@ bool GetLimits::output(const BlockInformation* blockInfo) // else if (limitType == "ModelEffort") { // } else { - wbtError << "Limit type " + pImpl->limitType + " not recognized."; + bfError << "Limit type " + pImpl->limitType + " not recognized."; return false; } } @@ -297,7 +298,7 @@ bool GetLimits::output(const BlockInformation* blockInfo) OutputSignalPtr maxPort = blockInfo->getOutputPortSignal(OutputIndex::MaxLimit); if (!minPort || !maxPort) { - wbtError << "Output signals not valid."; + bfError << "Output signals not valid."; return false; } @@ -309,7 +310,7 @@ bool GetLimits::output(const BlockInformation* blockInfo) ok = ok && maxPort->setBuffer(pImpl->limits.max.data(), dofs); if (!ok) { - wbtError << "Failed to set output buffers."; + bfError << "Failed to set output buffers."; return false; } diff --git a/toolbox/library/src/GetMeasurement.cpp b/toolbox/library/src/GetMeasurement.cpp index e6726f403..d0ad3cbae 100644 --- a/toolbox/library/src/GetMeasurement.cpp +++ b/toolbox/library/src/GetMeasurement.cpp @@ -9,12 +9,12 @@ #include "GetMeasurement.h" #include "Base/Configuration.h" #include "Base/RobotInterface.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" -#include "Core/Signal.h" +#include +#include +#include +#include +#include #include #include #include @@ -27,6 +27,7 @@ #include using namespace wbt; +using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT // =================================== @@ -95,7 +96,7 @@ bool GetMeasurement::parseParameters(BlockInformation* blockInfo) ParameterType::STRING, ParamIndex::MeasType, 1, 1, "MeasuredType"); if (!blockInfo->addParameterMetadata(measTypeMetadata)) { - wbtError << "Failed to store parameters metadata."; + bfError << "Failed to store parameters metadata."; return false; } @@ -133,7 +134,7 @@ bool GetMeasurement::configureSizeAndPorts(BlockInformation* blockInfo) }); if (!ok) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -150,14 +151,14 @@ bool GetMeasurement::initialize(BlockInformation* blockInfo) // ========== if (!GetMeasurement::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } // Read the measured type std::string measuredType; if (!m_parameters.getParameter("MeasuredType", measuredType)) { - wbtError << "Could not read measured type parameter."; + bfError << "Could not read measured type parameter."; return false; } @@ -190,7 +191,7 @@ bool GetMeasurement::initialize(BlockInformation* blockInfo) pImpl->measuredType = impl::MeasuredType::MOTOR_PWM; } else { - wbtError << "Measurement not supported."; + bfError << "Measurement not supported."; return false; } @@ -226,7 +227,7 @@ bool GetMeasurement::output(const BlockInformation* blockInfo) // Get the interface yarp::dev::IEncoders* iEncoders = nullptr; if (!robotInterface->getInterface(iEncoders) || !iEncoders) { - wbtError << "Failed to get IEncoders interface."; + bfError << "Failed to get IEncoders interface."; return false; } // Get the measurement @@ -238,7 +239,7 @@ bool GetMeasurement::output(const BlockInformation* blockInfo) // Get the interface yarp::dev::IEncoders* iEncoders = nullptr; if (!robotInterface->getInterface(iEncoders) || !iEncoders) { - wbtError << "Failed to get IEncoders interface."; + bfError << "Failed to get IEncoders interface."; return false; } // Get the measurement @@ -250,7 +251,7 @@ bool GetMeasurement::output(const BlockInformation* blockInfo) // Get the interface yarp::dev::IEncoders* iEncoders = nullptr; if (!robotInterface->getInterface(iEncoders) || !iEncoders) { - wbtError << "Failed to get IEncoders interface."; + bfError << "Failed to get IEncoders interface."; return false; } // Get the measurement @@ -262,7 +263,7 @@ bool GetMeasurement::output(const BlockInformation* blockInfo) // Get the interface yarp::dev::ITorqueControl* iTorqueControl = nullptr; if (!robotInterface->getInterface(iTorqueControl) || !iTorqueControl) { - wbtError << "Failed to get ITorqueControl interface."; + bfError << "Failed to get ITorqueControl interface."; return false; } // Get the measurement @@ -277,7 +278,7 @@ bool GetMeasurement::output(const BlockInformation* blockInfo) // Get the interface yarp::dev::IMotorEncoders* iMotorEncoders = nullptr; if (!robotInterface->getInterface(iMotorEncoders) || !iMotorEncoders) { - wbtError << "Failed to get IMotorEncoders interface."; + bfError << "Failed to get IMotorEncoders interface."; return false; } // Get the measurement @@ -289,7 +290,7 @@ bool GetMeasurement::output(const BlockInformation* blockInfo) // Get the interface yarp::dev::IMotorEncoders* iMotorEncoders = nullptr; if (!robotInterface->getInterface(iMotorEncoders) || !iMotorEncoders) { - wbtError << "Failed to get IMotorEncoders interface."; + bfError << "Failed to get IMotorEncoders interface."; return false; } // Get the measurement @@ -301,7 +302,7 @@ bool GetMeasurement::output(const BlockInformation* blockInfo) // Get the interface yarp::dev::IMotorEncoders* iMotorEncoders = nullptr; if (!robotInterface->getInterface(iMotorEncoders) || !iMotorEncoders) { - wbtError << "Failed to get IMotorEncoders interface."; + bfError << "Failed to get IMotorEncoders interface."; return false; } // Get the measurement @@ -313,7 +314,7 @@ bool GetMeasurement::output(const BlockInformation* blockInfo) // Get the interface yarp::dev::ICurrentControl* iCurrentControl = nullptr; if (!robotInterface->getInterface(iCurrentControl) || !iCurrentControl) { - wbtError << "Failed to get ICurrentControl interface."; + bfError << "Failed to get ICurrentControl interface."; return false; } // Get the measurement @@ -324,7 +325,7 @@ bool GetMeasurement::output(const BlockInformation* blockInfo) // Get the interface yarp::dev::IPWMControl* iPWMControl = nullptr; if (!robotInterface->getInterface(iPWMControl) || !iPWMControl) { - wbtError << "Failed to get IPWMControl interface."; + bfError << "Failed to get IPWMControl interface."; return false; } // Get the measurement @@ -334,20 +335,20 @@ bool GetMeasurement::output(const BlockInformation* blockInfo) } if (!ok) { - wbtError << "Failed to get measurement."; + bfError << "Failed to get measurement."; return false; } // Get the output signal OutputSignalPtr output = blockInfo->getOutputPortSignal(OutputIndex::Measurement); if (!output) { - wbtError << "Output signal not valid."; + bfError << "Output signal not valid."; return false; } // Fill the output buffer if (!output->setBuffer(pImpl->measurement.data(), output->getWidth())) { - wbtError << "Failed to set output buffer."; + bfError << "Failed to set output buffer."; return false; } diff --git a/toolbox/library/src/InverseDynamics.cpp b/toolbox/library/src/InverseDynamics.cpp index 645f7bd3a..f5104e142 100644 --- a/toolbox/library/src/InverseDynamics.cpp +++ b/toolbox/library/src/InverseDynamics.cpp @@ -9,10 +9,10 @@ #include "InverseDynamics.h" #include "Base/Configuration.h" #include "Base/RobotInterface.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Signal.h" +#include +#include +#include #include #include #include @@ -28,6 +28,7 @@ #include using namespace wbt; +using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT // =================================== @@ -116,7 +117,7 @@ bool InverseDynamics::configureSizeAndPorts(BlockInformation* blockInfo) }); if (!ok) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -145,7 +146,7 @@ bool InverseDynamics::initialize(BlockInformation* blockInfo) // Get the KinDynComputations pointer const auto& kindyn = getRobotInterface()->getKinDynComputations(); if (!kindyn) { - wbtError << "Failed to get the KinDynComputations object"; + bfError << "Failed to get the KinDynComputations object"; return false; } @@ -168,7 +169,7 @@ bool InverseDynamics::output(const BlockInformation* blockInfo) // Get the KinDynComputations object auto kinDyn = getKinDynComputations(); if (!kinDyn) { - wbtError << "Failed to retrieve the KinDynComputations object."; + bfError << "Failed to retrieve the KinDynComputations object."; return false; } @@ -181,7 +182,7 @@ bool InverseDynamics::output(const BlockInformation* blockInfo) InputSignalPtr jointsVelocitySignal = blockInfo->getInputPortSignal(InputIndex::JointVelocity); if (!basePoseSig || !jointsPosSig || !baseVelocitySignal || !jointsVelocitySignal) { - wbtError << "Input signals not valid."; + bfError << "Input signals not valid."; return false; } @@ -189,7 +190,7 @@ bool InverseDynamics::output(const BlockInformation* blockInfo) basePoseSig, jointsPosSig, baseVelocitySignal, jointsVelocitySignal, kinDyn.get()); if (!ok) { - wbtError << "Failed to set the robot state."; + bfError << "Failed to set the robot state."; return false; } @@ -199,14 +200,14 @@ bool InverseDynamics::output(const BlockInformation* blockInfo) InputSignalPtr baseAccelerationSignal = blockInfo->getInputPortSignal(InputIndex::BaseAcceleration); if (!baseAccelerationSignal) { - wbtError << "Base Acceleration signal not valid."; + bfError << "Base Acceleration signal not valid."; return false; } const double* bufBaseAcc = baseAccelerationSignal->getBuffer(); for (unsigned i = 0; i < baseAccelerationSignal->getWidth(); ++i) { if (!pImpl->baseAcceleration.setVal(i, bufBaseAcc[i])) { - wbtError << "Failed to fill base accelerations class member."; + bfError << "Failed to fill base accelerations class member."; return false; } } @@ -217,14 +218,14 @@ bool InverseDynamics::output(const BlockInformation* blockInfo) InputSignalPtr jointsAccelerationSignal = blockInfo->getInputPortSignal(InputIndex::JointAcceleration); if (!jointsAccelerationSignal) { - wbtError << "Joints Acceleration signal not valid."; + bfError << "Joints Acceleration signal not valid."; return false; } const double* bufJointsAcc = jointsAccelerationSignal->getBuffer(); for (unsigned i = 0; i < jointsAccelerationSignal->getWidth(); ++i) { if (!pImpl->jointsAcceleration.setVal(i, bufJointsAcc[i])) { - wbtError << "Failed to fill joint accelerations class member."; + bfError << "Failed to fill joint accelerations class member."; return false; } } @@ -239,14 +240,14 @@ bool InverseDynamics::output(const BlockInformation* blockInfo) pImpl->torques); if (!ok) { - wbtError << "iDynTree failed to compute inverse dynamics."; + bfError << "iDynTree failed to compute inverse dynamics."; return false; } // Get the output signal OutputSignalPtr output = blockInfo->getOutputPortSignal(OutputIndex::Torques); if (!output) { - wbtError << "Output signal not valid."; + bfError << "Output signal not valid."; return false; } double* outputBuffer = output->getBuffer(); diff --git a/toolbox/library/src/Jacobian.cpp b/toolbox/library/src/Jacobian.cpp index 198522fe6..4f179fcd4 100644 --- a/toolbox/library/src/Jacobian.cpp +++ b/toolbox/library/src/Jacobian.cpp @@ -9,12 +9,12 @@ #include "Jacobian.h" #include "Base/Configuration.h" #include "Base/RobotInterface.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" -#include "Core/Signal.h" +#include +#include +#include +#include +#include #include #include #include @@ -27,6 +27,7 @@ #include using namespace wbt; +using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT // =================================== @@ -82,7 +83,7 @@ bool Jacobian::parseParameters(BlockInformation* blockInfo) bool ok = blockInfo->addParameterMetadata(frameMetadata); if (!ok) { - wbtError << "Failed to store parameters metadata."; + bfError << "Failed to store parameters metadata."; return false; } @@ -125,7 +126,7 @@ bool Jacobian::configureSizeAndPorts(BlockInformation* blockInfo) }); if (!ok) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -142,13 +143,13 @@ bool Jacobian::initialize(BlockInformation* blockInfo) // ========== if (!Jacobian::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } std::string frame; if (!m_parameters.getParameter("Frame", frame)) { - wbtError << "Cannot retrieve string from frame parameter."; + bfError << "Cannot retrieve string from frame parameter."; return false; } @@ -160,14 +161,14 @@ bool Jacobian::initialize(BlockInformation* blockInfo) auto kinDyn = getKinDynComputations(); if (!kinDyn) { - wbtError << "Cannot retrieve handle to KinDynComputations."; + bfError << "Cannot retrieve handle to KinDynComputations."; return false; } if (frame != "com") { pImpl->frameIndex = kinDyn->getFrameIndex(frame); if (pImpl->frameIndex == iDynTree::FRAME_INVALID_INDEX) { - wbtError << "Cannot find " + frame + " in the frame list."; + bfError << "Cannot find " + frame + " in the frame list."; return false; } } @@ -206,7 +207,7 @@ bool Jacobian::output(const BlockInformation* blockInfo) // Get the KinDynComputations object auto kinDyn = getKinDynComputations(); if (!kinDyn) { - wbtError << "Failed to retrieve the KinDynComputations object."; + bfError << "Failed to retrieve the KinDynComputations object."; return false; } @@ -217,14 +218,14 @@ bool Jacobian::output(const BlockInformation* blockInfo) InputSignalPtr jointsPosSig = blockInfo->getInputPortSignal(InputIndex::JointConfiguration); if (!basePoseSig || !jointsPosSig) { - wbtError << "Input signals not valid."; + bfError << "Input signals not valid."; return false; } bool ok = setRobotState(basePoseSig, jointsPosSig, nullptr, nullptr, kinDyn.get()); if (!ok) { - wbtError << "Failed to set the robot state."; + bfError << "Failed to set the robot state."; return false; } @@ -248,14 +249,14 @@ bool Jacobian::output(const BlockInformation* blockInfo) } if (!ok) { - wbtError << "Failed to get the Jacobian."; + bfError << "Failed to get the Jacobian."; return false; } // Get the output signal memory location OutputSignalPtr output = blockInfo->getOutputPortSignal(OutputIndex::Jacobian); if (!output) { - wbtError << "Output signal not valid."; + bfError << "Output signal not valid."; return false; } diff --git a/toolbox/library/src/MassMatrix.cpp b/toolbox/library/src/MassMatrix.cpp index 2fda886f9..06bc2296d 100644 --- a/toolbox/library/src/MassMatrix.cpp +++ b/toolbox/library/src/MassMatrix.cpp @@ -9,10 +9,10 @@ #include "MassMatrix.h" #include "Base/Configuration.h" #include "Base/RobotInterface.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Signal.h" +#include +#include +#include #include #include #include @@ -22,6 +22,7 @@ #include using namespace wbt; +using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT // =================================== @@ -91,7 +92,7 @@ bool MassMatrix::configureSizeAndPorts(BlockInformation* blockInfo) }); if (!ok) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -134,12 +135,12 @@ bool MassMatrix::output(const BlockInformation* blockInfo) // Get the KinDynComputations object auto kinDyn = getKinDynComputations(); if (!kinDyn) { - wbtError << "Failed to retrieve the KinDynComputations object."; + bfError << "Failed to retrieve the KinDynComputations object."; return false; } if (!kinDyn) { - wbtError << "Failed to retrieve the KinDynComputations object."; + bfError << "Failed to retrieve the KinDynComputations object."; return false; } @@ -150,14 +151,14 @@ bool MassMatrix::output(const BlockInformation* blockInfo) InputSignalPtr jointsPosSig = blockInfo->getInputPortSignal(InputIndex::JointConfiguration); if (!basePoseSig || !jointsPosSig) { - wbtError << "Input signals not valid."; + bfError << "Input signals not valid."; return false; } bool ok = setRobotState(basePoseSig, jointsPosSig, nullptr, nullptr, kinDyn.get()); if (!ok) { - wbtError << "Failed to set the robot state."; + bfError << "Failed to set the robot state."; return false; } @@ -170,7 +171,7 @@ bool MassMatrix::output(const BlockInformation* blockInfo) // Get the output signal memory location OutputSignalPtr output = blockInfo->getOutputPortSignal(OutputIndex::MassMatrix); if (!output) { - wbtError << "Output signal not valid."; + bfError << "Output signal not valid."; return false; } diff --git a/toolbox/library/src/MinimumJerkTrajectoryGenerator.cpp b/toolbox/library/src/MinimumJerkTrajectoryGenerator.cpp index 75cfc3cf2..5b70ed55f 100644 --- a/toolbox/library/src/MinimumJerkTrajectoryGenerator.cpp +++ b/toolbox/library/src/MinimumJerkTrajectoryGenerator.cpp @@ -7,12 +7,12 @@ */ #include "MinimumJerkTrajectoryGenerator.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" -#include "Core/Signal.h" +#include +#include +#include +#include +#include #include #include @@ -21,6 +21,7 @@ #include using namespace wbt; +using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT // =================================== @@ -102,7 +103,7 @@ bool MinimumJerkTrajectoryGenerator::parseParameters(BlockInformation* blockInfo for (const auto& md : metadata) { if (!blockInfo->addParameterMetadata(md)) { - wbtError << "Failed to store parameter metadata"; + bfError << "Failed to store parameter metadata"; return false; } } @@ -116,7 +117,7 @@ bool MinimumJerkTrajectoryGenerator::configureSizeAndPorts(BlockInformation* blo // ========== if (!MinimumJerkTrajectoryGenerator::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } @@ -132,7 +133,7 @@ bool MinimumJerkTrajectoryGenerator::configureSizeAndPorts(BlockInformation* blo ok = ok && m_parameters.getParameter("ReadExternalSettlingTime", readExternalSettlingTime); if (!ok) { - wbtError << "Failed to get parameters after their parsing."; + bfError << "Failed to get parameters after their parsing."; return false; } @@ -193,7 +194,7 @@ bool MinimumJerkTrajectoryGenerator::configureSizeAndPorts(BlockInformation* blo } if (!blockInfo->setIOPortsData(ioData)) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -210,7 +211,7 @@ bool MinimumJerkTrajectoryGenerator::initialize(BlockInformation* blockInfo) // ========== if (!MinimumJerkTrajectoryGenerator::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } @@ -230,7 +231,7 @@ bool MinimumJerkTrajectoryGenerator::initialize(BlockInformation* blockInfo) && m_parameters.getParameter("ResetOnSettlingTimeChange", pImpl->resetOnSettlingTimeChange); if (!ok) { - wbtError << "Failed to get parameters after their parsing."; + bfError << "Failed to get parameters after their parsing."; return false; } @@ -256,7 +257,7 @@ bool MinimumJerkTrajectoryGenerator::output(const BlockInformation* blockInfo) InputSignalPtr externalTimeSignal = blockInfo->getInputPortSignal(InputIndex_ExtSettlingTime); if (!externalTimeSignal) { - wbtError << "Input signal not valid."; + bfError << "Input signal not valid."; return false; } @@ -277,7 +278,7 @@ bool MinimumJerkTrajectoryGenerator::output(const BlockInformation* blockInfo) InputSignalPtr initialValuesSignal = blockInfo->getInputPortSignal(InputIndex_InitialValue); if (!initialValuesSignal) { - wbtError << "Input signal not valid."; + bfError << "Input signal not valid."; return false; } @@ -292,7 +293,7 @@ bool MinimumJerkTrajectoryGenerator::output(const BlockInformation* blockInfo) InputSignalPtr referencesSignal = blockInfo->getInputPortSignal(InputIndex::InputSignal); if (!referencesSignal) { - wbtError << "Input signal not valid."; + bfError << "Input signal not valid."; return false; } @@ -309,12 +310,12 @@ bool MinimumJerkTrajectoryGenerator::output(const BlockInformation* blockInfo) OutputSignalPtr outputSignal = blockInfo->getOutputPortSignal(OutputIndex::FilteredSignal); if (!outputSignal) { - wbtError << "Output signal not valid."; + bfError << "Output signal not valid."; return false; } if (!outputSignal->setBuffer(signal.data(), signal.size())) { - wbtError << "Failed to set output buffer."; + bfError << "Failed to set output buffer."; return false; } @@ -326,13 +327,13 @@ bool MinimumJerkTrajectoryGenerator::output(const BlockInformation* blockInfo) OutputSignalPtr firstDerivativeSignal = blockInfo->getOutputPortSignal(OutputIndex_FirstDer); if (!firstDerivativeSignal) { - wbtError << "Output signal not valid."; + bfError << "Output signal not valid."; return false; } if (!firstDerivativeSignal->setBuffer(derivative.data(), firstDerivativeSignal->getWidth())) { - wbtError << "Failed to set output buffer."; + bfError << "Failed to set output buffer."; return false; } } @@ -345,13 +346,13 @@ bool MinimumJerkTrajectoryGenerator::output(const BlockInformation* blockInfo) OutputSignalPtr secondDerivativeSignal = blockInfo->getOutputPortSignal(OutputIndex_SecondDer); if (!secondDerivativeSignal) { - wbtError << "Output signal not valid."; + bfError << "Output signal not valid."; return false; } if (!secondDerivativeSignal->setBuffer(derivative.data(), secondDerivativeSignal->getWidth())) { - wbtError << "Failed to set output buffer."; + bfError << "Failed to set output buffer."; return false; } } diff --git a/toolbox/library/src/QpOases.cpp b/toolbox/library/src/QpOases.cpp index 902f4a1cd..6981ceaf2 100644 --- a/toolbox/library/src/QpOases.cpp +++ b/toolbox/library/src/QpOases.cpp @@ -7,12 +7,12 @@ */ #include "QpOases.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" -#include "Core/Signal.h" +#include +#include +#include +#include +#include #include #include @@ -20,6 +20,7 @@ #include using namespace wbt; +using namespace blockfactory::core; const unsigned MaxIterations = 100; @@ -105,7 +106,7 @@ bool QpOases::parseParameters(BlockInformation* blockInfo) for (const auto& md : metadata) { if (!blockInfo->addParameterMetadata(md)) { - wbtError << "Failed to store parameter metadata"; + bfError << "Failed to store parameter metadata"; return false; } } @@ -119,7 +120,7 @@ bool QpOases::configureSizeAndPorts(BlockInformation* blockInfo) // ========== if (!QpOases::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } @@ -137,7 +138,7 @@ bool QpOases::configureSizeAndPorts(BlockInformation* blockInfo) ok = ok && m_parameters.getParameter("ComputeObjVal", computeObjVal); if (!ok) { - wbtError << "Failed to get parameters after their parsing."; + bfError << "Failed to get parameters after their parsing."; return false; } @@ -208,7 +209,7 @@ bool QpOases::configureSizeAndPorts(BlockInformation* blockInfo) } if (!blockInfo->setIOPortsData(ioData)) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -225,7 +226,7 @@ bool QpOases::initialize(BlockInformation* blockInfo) // ========== if (!QpOases::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } @@ -238,7 +239,7 @@ bool QpOases::initialize(BlockInformation* blockInfo) ok = ok && m_parameters.getParameter("StopWhenFails", pImpl->stopWhenFails); if (!ok) { - wbtError << "Failed to get parameters after their parsing."; + bfError << "Failed to get parameters after their parsing."; return false; } @@ -249,14 +250,14 @@ bool QpOases::initialize(BlockInformation* blockInfo) const auto size_H = blockInfo->getInputPortMatrixSize(InputIndex::Hessian); const auto numberOfVariables = size_H.first; if (size_H.first != size_H.second) { - wbtError << "The Hessian matrix should be square."; + bfError << "The Hessian matrix should be square."; return false; } // Check the gradient size const auto size_g = blockInfo->getInputPortWidth(InputIndex::Gradient); if (size_g != numberOfVariables) { - wbtError << "The gradient size does not match with the Hessian size."; + bfError << "The gradient size does not match with the Hessian size."; return false; } @@ -269,7 +270,7 @@ bool QpOases::initialize(BlockInformation* blockInfo) ok = ok && (blockInfo->getInputPortWidth(InputIndex_ub) == numberOfVariables); } if (!ok) { - wbtError << "Sizes of bounds do not match with the number of variables."; + bfError << "Sizes of bounds do not match with the number of variables."; return false; } @@ -280,8 +281,8 @@ bool QpOases::initialize(BlockInformation* blockInfo) const auto size_c = blockInfo->getInputPortMatrixSize(InputIndex_constraints); numberOfConstraints = size_c.first; if (size_c.second != numberOfVariables) { - wbtError << "The column size of the constraints matrix does not match with " - << "the Hessian size"; + bfError << "The column size of the constraints matrix does not match with " + << "the Hessian size"; return false; } @@ -297,7 +298,7 @@ bool QpOases::initialize(BlockInformation* blockInfo) ok = ok && (blockInfo->getInputPortWidth(InputIndex_ubA) == numberOfConstraints); } if (!ok) { - wbtError << "Sizes of constraints' bounds do not match with the number of constraints."; + bfError << "Sizes of constraints' bounds do not match with the number of constraints."; return false; } } @@ -309,7 +310,7 @@ bool QpOases::initialize(BlockInformation* blockInfo) new qpOASES::SQProblem(numberOfVariables, numberOfConstraints)); if (!pImpl->sqProblem) { - wbtError << "Failed to allocate the QProblem or SQProblem object."; + bfError << "Failed to allocate the QProblem or SQProblem object."; return false; } @@ -344,7 +345,7 @@ bool QpOases::output(const BlockInformation* blockInfo) InputSignalPtr gradientSignal = blockInfo->getInputPortSignal(InputIndex::Gradient); if (!hessianSignal || !gradientSignal) { - wbtError << "Input signals not valid."; + bfError << "Input signals not valid."; return false; } @@ -360,7 +361,7 @@ bool QpOases::output(const BlockInformation* blockInfo) if (pImpl->useLbA || pImpl->useUbA) { InputSignalPtr constraintsSignal = blockInfo->getInputPortSignal(InputIndex_constraints); if (!constraintsSignal) { - wbtError << "Signal for lbA is not valid."; + bfError << "Signal for lbA is not valid."; return false; } @@ -381,7 +382,7 @@ bool QpOases::output(const BlockInformation* blockInfo) InputSignalPtr lbASignal = blockInfo->getInputPortSignal(InputIndex_lbA); lbA = lbASignal->getBuffer(); if (!lbASignal) { - wbtError << "Signal for lbA is not valid."; + bfError << "Signal for lbA is not valid."; return false; } } @@ -390,7 +391,7 @@ bool QpOases::output(const BlockInformation* blockInfo) InputSignalPtr ubASignal = blockInfo->getInputPortSignal(InputIndex_ubA); ubA = ubASignal->getBuffer(); if (!ubASignal) { - wbtError << "Signal for ubA is not valid."; + bfError << "Signal for ubA is not valid."; return false; } } @@ -400,7 +401,7 @@ bool QpOases::output(const BlockInformation* blockInfo) InputSignalPtr lbSignal = blockInfo->getInputPortSignal(InputIndex_lb); lb = lbSignal->getBuffer(); if (!lbSignal) { - wbtError << "Signal for lb is not valid."; + bfError << "Signal for lb is not valid."; return false; } } @@ -409,7 +410,7 @@ bool QpOases::output(const BlockInformation* blockInfo) InputSignalPtr ubSignal = blockInfo->getInputPortSignal(InputIndex_ub); ub = ubSignal->getBuffer(); if (!ubSignal) { - wbtError << "Signal for ub is not valid."; + bfError << "Signal for ub is not valid."; return false; } } @@ -419,13 +420,13 @@ bool QpOases::output(const BlockInformation* blockInfo) OutputSignalPtr solutionSignal = blockInfo->getOutputPortSignal(OutputIndex::PrimalSolution); if (!solutionSignal) { - wbtError << "Output signal not valid."; + bfError << "Output signal not valid."; return false; } OutputSignalPtr statusSignal = blockInfo->getOutputPortSignal(OutputIndex::Status); if (!statusSignal) { - wbtError << "Status signal not valid."; + bfError << "Status signal not valid."; return false; } @@ -444,7 +445,7 @@ bool QpOases::output(const BlockInformation* blockInfo) nWSR, nullptr); if (pImpl->stopWhenFails && status != qpOASES::SUCCESSFUL_RETURN) { - wbtError << "qpOASES: init() failed."; + bfError << "qpOASES: init() failed."; return false; } } @@ -462,8 +463,8 @@ bool QpOases::output(const BlockInformation* blockInfo) // Handle possible errors if ((status != qpOASES::SUCCESSFUL_RETURN) && (status != qpOASES::RET_MAX_NWSR_REACHED)) { - wbtWarning << "Internal qpOASES error. Trying to solve the problem with the remaining " - << "number of iterations."; + bfWarning << "Internal qpOASES error. Trying to solve the problem with the remaining " + << "number of iterations."; pImpl->sqProblem->reset(); nWSR = MaxIterations - nWSR; @@ -479,7 +480,7 @@ bool QpOases::output(const BlockInformation* blockInfo) } if (pImpl->stopWhenFails && status != qpOASES::SUCCESSFUL_RETURN) { - wbtError << "qpOASES: hotstart() failed."; + bfError << "qpOASES: hotstart() failed."; return false; } } @@ -488,12 +489,12 @@ bool QpOases::output(const BlockInformation* blockInfo) pImpl->sqProblem->getPrimalSolution(solutionSignal->getBuffer()); if (pImpl->stopWhenFails && statusSol != qpOASES::SUCCESSFUL_RETURN) { - wbtError << "qpOASES: getPrimalSolution() failed."; + bfError << "qpOASES: getPrimalSolution() failed."; return false; } if (!statusSignal->set(0, qpOASES::getSimpleStatus(status))) { - wbtError << "Failed to set status signal."; + bfError << "Failed to set status signal."; return false; } @@ -505,12 +506,12 @@ bool QpOases::output(const BlockInformation* blockInfo) OutputSignalPtr objValSignal = blockInfo->getOutputPortSignal(OutputIndex_objVal); if (!objValSignal) { - wbtError << "Object Value signal not valid."; + bfError << "Object Value signal not valid."; return false; } if (!objValSignal->set(0, objVal)) { - wbtError << "Failed to set object value signal."; + bfError << "Failed to set object value signal."; return false; } } diff --git a/toolbox/library/src/RealTimeSynchronizer.cpp b/toolbox/library/src/RealTimeSynchronizer.cpp index 30c4a1cc2..bf418b90d 100644 --- a/toolbox/library/src/RealTimeSynchronizer.cpp +++ b/toolbox/library/src/RealTimeSynchronizer.cpp @@ -7,11 +7,11 @@ */ #include "RealTimeSynchronizer.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" +#include +#include +#include +#include #include #include @@ -19,6 +19,7 @@ #include using namespace wbt; +using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT // =================================== @@ -60,7 +61,7 @@ bool RealTimeSynchronizer::parseParameters(BlockInformation* blockInfo) ParameterType::DOUBLE, ParamIndex::Period, 1, 1, "Period"); if (!blockInfo->addParameterMetadata(periodMetadata)) { - wbtError << "Failed to store parameters metadata."; + bfError << "Failed to store parameters metadata."; return false; } @@ -83,7 +84,7 @@ bool RealTimeSynchronizer::configureSizeAndPorts(BlockInformation* blockInfo) const bool ok = blockInfo->setIOPortsData({{}, {}}); if (!ok) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -100,17 +101,17 @@ bool RealTimeSynchronizer::initialize(BlockInformation* blockInfo) // ========== if (!RealTimeSynchronizer::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } if (!m_parameters.getParameter("Period", pImpl->period)) { - wbtError << "Failed to get parameter 'period' after its parsing."; + bfError << "Failed to get parameter 'period' after its parsing."; return false; } if (pImpl->period <= 0) { - wbtError << "Period must be greater than 0."; + bfError << "Period must be greater than 0."; return false; } @@ -119,7 +120,7 @@ bool RealTimeSynchronizer::initialize(BlockInformation* blockInfo) yarp::os::Network::init(); if (!yarp::os::Network::initialized() || !yarp::os::Network::checkNetwork(5.0)) { - wbtError << "YARP server wasn't found active!!"; + bfError << "YARP server wasn't found active!!"; return false; } diff --git a/toolbox/library/src/RelativeTransform.cpp b/toolbox/library/src/RelativeTransform.cpp index d6a855f03..5423cd6fe 100644 --- a/toolbox/library/src/RelativeTransform.cpp +++ b/toolbox/library/src/RelativeTransform.cpp @@ -9,12 +9,12 @@ #include "RelativeTransform.h" #include "Base/Configuration.h" #include "Base/RobotInterface.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" -#include "Core/Signal.h" +#include +#include +#include +#include +#include #include #include #include @@ -24,6 +24,7 @@ #include using namespace wbt; +using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT // =================================== @@ -78,7 +79,7 @@ bool RelativeTransform::parseParameters(BlockInformation* blockInfo) for (const auto& md : metadata) { if (!blockInfo->addParameterMetadata(md)) { - wbtError << "Failed to store parameter metadata"; + bfError << "Failed to store parameter metadata"; return false; } } @@ -119,7 +120,7 @@ bool RelativeTransform::configureSizeAndPorts(BlockInformation* blockInfo) }); if (!ok) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -136,7 +137,7 @@ bool RelativeTransform::initialize(BlockInformation* blockInfo) // ========== if (!parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } @@ -148,7 +149,7 @@ bool RelativeTransform::initialize(BlockInformation* blockInfo) ok = ok && m_parameters.getParameter("Frame2", frame2); if (!ok) { - wbtError << "Failed to get parameters after their parsing."; + bfError << "Failed to get parameters after their parsing."; return false; } @@ -160,21 +161,21 @@ bool RelativeTransform::initialize(BlockInformation* blockInfo) const auto kinDyn = getKinDynComputations(); if (!kinDyn) { - wbtError << "Cannot retrieve handle to KinDynComputations."; + bfError << "Cannot retrieve handle to KinDynComputations."; return false; } // Frame 1 pImpl->frame1Index = kinDyn->getFrameIndex(frame1); if (pImpl->frame1Index == iDynTree::FRAME_INVALID_INDEX) { - wbtError << "Cannot find " + frame1 + " in the frame list."; + bfError << "Cannot find " + frame1 + " in the frame list."; return false; } // Frame 2 pImpl->frame2Index = kinDyn->getFrameIndex(frame2); if (pImpl->frame2Index == iDynTree::FRAME_INVALID_INDEX) { - wbtError << "Cannot find " + frame2 + " in the frame list."; + bfError << "Cannot find " + frame2 + " in the frame list."; return false; } @@ -199,7 +200,7 @@ bool RelativeTransform::output(const BlockInformation* blockInfo) // Get the KinDynComputations object auto kinDyn = getKinDynComputations(); if (!kinDyn) { - wbtError << "Failed to retrieve the KinDynComputations object."; + bfError << "Failed to retrieve the KinDynComputations object."; return false; } @@ -209,7 +210,7 @@ bool RelativeTransform::output(const BlockInformation* blockInfo) InputSignalPtr jointsPosSig = blockInfo->getInputPortSignal(InputIndex::JointConfiguration); if (!jointsPosSig) { - wbtError << "Input signals not valid."; + bfError << "Input signals not valid."; return false; } @@ -230,7 +231,7 @@ bool RelativeTransform::output(const BlockInformation* blockInfo) // Get the output signal memory location OutputSignalPtr output = blockInfo->getOutputPortSignal(OutputIndex::Transform); if (!output) { - wbtError << "Output signal not valid."; + bfError << "Output signal not valid."; return false; } diff --git a/toolbox/library/src/RobotInterface.cpp b/toolbox/library/src/RobotInterface.cpp index 61710353a..9f5bfae81 100644 --- a/toolbox/library/src/RobotInterface.cpp +++ b/toolbox/library/src/RobotInterface.cpp @@ -8,8 +8,8 @@ #include "Base/RobotInterface.h" #include "Base/Configuration.h" -#include "Core/Log.h" +#include #include #include #include @@ -81,7 +81,7 @@ class RobotInterface::impl while (!getMeasurement(buffer.data())) { if (++counter == maxIter) { - wbtError << "Failed to get a measurement during the interface initialization."; + bfError << "Failed to get a measurement during the interface initialization."; return false; } // Sleep for some while @@ -119,7 +119,7 @@ class RobotInterface::impl // Fail if the file is not found if (urdf_file_path.empty()) { - wbtError << "ResourceFinder couldn't find urdf file " + urdf_file + "."; + bfError << "ResourceFinder couldn't find urdf file " + urdf_file + "."; return false; } @@ -132,9 +132,9 @@ class RobotInterface::impl // Use ModelLoader to load the reduced model iDynTree::ModelLoader mdlLoader; if (!mdlLoader.loadReducedModelFromFile(urdf_file_path, controlledJoints)) { - wbtError << "Impossible to load " + urdf_file + "." << std::endl - << "Possible causes: file not found, or the joint " - << "list contains an entry not present in the urdf model."; + bfError << "Impossible to load " + urdf_file + "." << std::endl + << "Possible causes: file not found, or the joint " + << "list contains an entry not present in the urdf model."; return false; } @@ -147,7 +147,7 @@ class RobotInterface::impl // Initialize the network yarp::os::Network::init(); if (!yarp::os::Network::initialized() || !yarp::os::Network::checkNetwork(5.0)) { - wbtError << "YARP server wasn't found active."; + bfError << "YARP server wasn't found active."; return false; } @@ -187,7 +187,7 @@ class RobotInterface::impl robotDevice = std::unique_ptr(new yarp::dev::PolyDriver()); if (!robotDevice) { - wbtError << "Failed to instantiante an empty PolyDriver class."; + bfError << "Failed to instantiante an empty PolyDriver class."; return false; } @@ -195,7 +195,7 @@ class RobotInterface::impl if (!robotDevice->open(options) && !robotDevice->isValid()) { // Remove garbage if the opening fails robotDevice.reset(); - wbtError << "Failed to open the RemoteControlBoardRemapper with the options passed."; + bfError << "Failed to open the RemoteControlBoardRemapper with the options passed."; return false; } @@ -240,7 +240,7 @@ const std::shared_ptr RobotInterface::getKinDynCom // Otherwise, initialize a new object if (!pImpl->initializeModel()) { - wbtError << "Failed to initialize the KinDynComputations object."; + bfError << "Failed to initialize the KinDynComputations object."; // Return an empty shared_ptr (implicitly initialized) return nullptr; } @@ -260,13 +260,13 @@ T* RobotInterface::impl::getInterfaceLazyEval( // Lazy-initialize the RemoteControlBoardRemapper device if (!cbRemapper) { if (!initializeRemoteControlBoardRemapper()) { - wbtError << "Failed to initialize the RemoteControlBoardRemapper."; + bfError << "Failed to initialize the RemoteControlBoardRemapper."; return nullptr; } } // Ask the interface from the device if (!robotDevice->view(interface)) { - wbtError << "Failed to view the interface."; + bfError << "Failed to view the interface."; return nullptr; } } diff --git a/toolbox/library/src/SetMotorParameters.cpp b/toolbox/library/src/SetMotorParameters.cpp index d2575cb28..115303583 100644 --- a/toolbox/library/src/SetMotorParameters.cpp +++ b/toolbox/library/src/SetMotorParameters.cpp @@ -9,12 +9,12 @@ #include "Block/SetMotorParameters.h" #include "Base/Configuration.h" #include "Base/RobotInterface.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" -#include "Core/Signal.h" +#include +#include +#include +#include +#include #include #include #include @@ -27,6 +27,7 @@ #include using namespace wbt; +using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT // =================================== @@ -99,7 +100,7 @@ bool SetMotorParameters::parseParameters(BlockInformation* blockInfo) for (const auto& md : metadata) { if (!blockInfo->addParameterMetadata(md)) { - wbtError << "Failed to store parameter metadata"; + bfError << "Failed to store parameter metadata"; return false; } } @@ -117,7 +118,7 @@ bool SetMotorParameters::configureSizeAndPorts(BlockInformation* blockInfo) // ========== if (!SetMotorParameters::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } @@ -131,7 +132,7 @@ bool SetMotorParameters::configureSizeAndPorts(BlockInformation* blockInfo) ok = ok && m_parameters.getParameter("SetD", setD); if (!ok) { - wbtError << "Failed to get parameters after their parsing."; + bfError << "Failed to get parameters after their parsing."; return false; } @@ -170,12 +171,12 @@ bool SetMotorParameters::configureSizeAndPorts(BlockInformation* blockInfo) } if (!blockInfo->setIOPortsData(ioData)) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } if (!ok) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -192,7 +193,7 @@ bool SetMotorParameters::initialize(BlockInformation* blockInfo) // ================ if (!SetMotorParameters::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } @@ -211,7 +212,7 @@ bool SetMotorParameters::initialize(BlockInformation* blockInfo) ok = ok && m_parameters.getParameter("Bemf", bemfVector); if (!ok) { - wbtError << "Failed to get parameters after their parsing."; + bfError << "Failed to get parameters after their parsing."; return false; } @@ -223,12 +224,12 @@ bool SetMotorParameters::initialize(BlockInformation* blockInfo) const auto dofs = getRobotInterface()->getConfiguration().getNumberOfDoFs(); if (pImpl->setKTau && (kTauVector.size() != dofs)) { - wbtError << "KTau vector doesn't have a width equal to " << dofs << "."; + bfError << "KTau vector doesn't have a width equal to " << dofs << "."; return false; } if (pImpl->setBemf && (bemfVector.size() != dofs)) { - wbtError << "Back EMF vector doesn't have a width equal to " << dofs << "."; + bfError << "Back EMF vector doesn't have a width equal to " << dofs << "."; return false; } @@ -242,7 +243,7 @@ bool SetMotorParameters::initialize(BlockInformation* blockInfo) pImpl->controlType = yarp::dev::VOCAB_PIDTYPE_TORQUE; } else { - wbtError << "Control type not recognized."; + bfError << "Control type not recognized."; return false; } @@ -252,13 +253,13 @@ bool SetMotorParameters::initialize(BlockInformation* blockInfo) // Get the interface yarp::dev::IPidControl* iPidControl = nullptr; if (!robotInterface->getInterface(iPidControl) || !iPidControl) { - wbtError << "Failed to get IPidControl interface."; + bfError << "Failed to get IPidControl interface."; return false; } // Store the default gains if (!iPidControl->getPids(pImpl->controlType, pImpl->pidValuesDefault.data())) { - wbtError << "Failed to get default data from IPidControl."; + bfError << "Failed to get default data from IPidControl."; return false; } @@ -271,7 +272,7 @@ bool SetMotorParameters::initialize(BlockInformation* blockInfo) // Get the interface yarp::dev::ITorqueControl* iTorqueControl = nullptr; if (!getRobotInterface()->getInterface(iTorqueControl) || !iTorqueControl) { - wbtError << "Failed to get ITorqueControl interface."; + bfError << "Failed to get ITorqueControl interface."; return false; } @@ -282,7 +283,7 @@ bool SetMotorParameters::initialize(BlockInformation* blockInfo) // Get the default values for (unsigned m = 0; m < dofs; ++m) { if (!iTorqueControl->getMotorTorqueParams(m, &pImpl->motorParamsDefault[m])) { - wbtError << "Failed to get motor torque parameters."; + bfError << "Failed to get motor torque parameters."; return false; } } @@ -306,7 +307,7 @@ bool SetMotorParameters::initialize(BlockInformation* blockInfo) if ((pImpl->setP && (blockInfo->getInputPortWidth(InputIndex_PGains) != dofs)) || (pImpl->setI && (blockInfo->getInputPortWidth(InputIndex_IGains) != dofs)) || (pImpl->setD && (blockInfo->getInputPortWidth(InputIndex_DGains) != dofs))) { - wbtError << "Input ports must have a size equal to " << dofs << "."; + bfError << "Input ports must have a size equal to " << dofs << "."; return false; } @@ -322,27 +323,27 @@ bool SetMotorParameters::terminate(const BlockInformation* blockInfo) // Get the IPidControl interface yarp::dev::IPidControl* iPidControl = nullptr; if (!robotInterface->getInterface(iPidControl) || !iPidControl) { - wbtError << "Failed to get IPidControl interface."; + bfError << "Failed to get IPidControl interface."; return false; } // Reset default PID gains if (!iPidControl->setPids(pImpl->controlType, pImpl->pidValuesDefault.data())) { - wbtError << "Failed to reset PIDs to the default values."; + bfError << "Failed to reset PIDs to the default values."; return false; } // Get the ITorqueControl interface yarp::dev::ITorqueControl* interface = nullptr; if (!robotInterface->getInterface(interface) || !interface) { - wbtError << "Failed to get ITorqueControl interface."; + bfError << "Failed to get ITorqueControl interface."; return false; } // Restore default motor torque parameters for (unsigned m = 0; m < dofs; ++m) { if (!interface->setMotorTorqueParams(m, pImpl->motorParamsDefault[m])) { - wbtError << "Failed to restore default motor torque parameters."; + bfError << "Failed to restore default motor torque parameters."; break; } } @@ -365,15 +366,15 @@ bool SetMotorParameters::output(const BlockInformation* blockInfo) // Get the interface yarp::dev::ITorqueControl* interface = nullptr; if (!robotInterface->getInterface(interface) || !interface) { - wbtError << "Failed to get ITorqueControl interface."; + bfError << "Failed to get ITorqueControl interface."; return false; } // Apply the motor parameters for (unsigned m = 0; m < dofs; ++m) { if (!interface->setMotorTorqueParams(m, pImpl->motorParamsApplied[m])) { - wbtError << "Failed to set motor torque parameters for joint " - << controlledJoints[m] << "."; + bfError << "Failed to set motor torque parameters for joint " << controlledJoints[m] + << "."; break; } } @@ -385,7 +386,7 @@ bool SetMotorParameters::output(const BlockInformation* blockInfo) InputSignalPtr pGainsSignal = blockInfo->getInputPortSignal(InputIndex_PGains); if (!pGainsSignal) { - wbtError << "Failed to get signal containing proportional gains."; + bfError << "Failed to get signal containing proportional gains."; } for (unsigned i = 0; i < pImpl->pidValuesApplied.size(); ++i) { @@ -401,7 +402,7 @@ bool SetMotorParameters::output(const BlockInformation* blockInfo) InputSignalPtr iGainsSignal = blockInfo->getInputPortSignal(InputIndex_IGains); if (!iGainsSignal) { - wbtError << "Failed to get signal containing integral gains."; + bfError << "Failed to get signal containing integral gains."; } for (unsigned i = 0; i < pImpl->pidValuesApplied.size(); ++i) { @@ -417,7 +418,7 @@ bool SetMotorParameters::output(const BlockInformation* blockInfo) InputSignalPtr dGainsSignal = blockInfo->getInputPortSignal(InputIndex_DGains); if (!dGainsSignal) { - wbtError << "Failed to get signal containing derivative gains."; + bfError << "Failed to get signal containing derivative gains."; } for (unsigned i = 0; i < pImpl->pidValuesApplied.size(); ++i) { @@ -433,13 +434,13 @@ bool SetMotorParameters::output(const BlockInformation* blockInfo) // Get the interface yarp::dev::IPidControl* iPidControl = nullptr; if (!robotInterface->getInterface(iPidControl) || !iPidControl) { - wbtError << "Failed to get IPidControl interface."; + bfError << "Failed to get IPidControl interface."; return false; } // Apply the new pid gains if (!iPidControl->setPids(pImpl->controlType, pImpl->pidValuesApplied.data())) { - wbtError << "Failed to set PID values."; + bfError << "Failed to set PID values."; return false; } } diff --git a/toolbox/library/src/SetReferences.cpp b/toolbox/library/src/SetReferences.cpp index e2ef656ad..eb70b8ff5 100644 --- a/toolbox/library/src/SetReferences.cpp +++ b/toolbox/library/src/SetReferences.cpp @@ -9,12 +9,12 @@ #include "SetReferences.h" #include "Base/Configuration.h" #include "Base/RobotInterface.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" -#include "Core/Signal.h" +#include +#include +#include +#include +#include #include #include #include @@ -30,6 +30,7 @@ #include using namespace wbt; +using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT // =================================== @@ -94,7 +95,7 @@ bool SetReferences::parseParameters(BlockInformation* blockInfo) for (const auto& md : metadata) { if (!blockInfo->addParameterMetadata(md)) { - wbtError << "Failed to store parameter metadata"; + bfError << "Failed to store parameter metadata"; return false; } } @@ -133,7 +134,7 @@ bool SetReferences::configureSizeAndPorts(BlockInformation* blockInfo) }); if (!ok) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -153,18 +154,18 @@ bool SetReferences::initialize(BlockInformation* blockInfo) // ========== if (!SetReferences::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } std::string controlType; if (!m_parameters.getParameter("CtrlType", controlType)) { - wbtError << "Could not read control type parameter."; + bfError << "Could not read control type parameter."; return false; } if (!m_parameters.getParameter("TrajectoryReference", pImpl->trajectoryReference)) { - wbtError << "Could not read reference speed / acceleration parameter."; + bfError << "Could not read reference speed / acceleration parameter."; return false; } @@ -197,7 +198,7 @@ bool SetReferences::initialize(BlockInformation* blockInfo) pImpl->controlModes.assign(dofs, VOCAB_CM_CURRENT); } else { - wbtError << "Control Mode not supported."; + bfError << "Control Mode not supported."; return false; } @@ -212,21 +213,21 @@ bool SetReferences::initialize(BlockInformation* blockInfo) // Get the interface yarp::dev::IPositionControl* interface = nullptr; if (!getRobotInterface()->getInterface(interface) || !interface) { - wbtError << "Failed to get IPositionControl interface."; + bfError << "Failed to get IPositionControl interface."; return false; } // Store the default reference speeds pImpl->defaultTrajectoryReference.resize(dofs); if (!interface->getRefSpeeds(pImpl->defaultTrajectoryReference.data())) { - wbtError << "Failed to get default reference speed."; + bfError << "Failed to get default reference speed."; return false; } // Set the new reference speeds std::vector speedInitalization(dofs, pImpl->trajectoryReference); if (!interface->setRefSpeeds(speedInitalization.data())) { - wbtError << "Failed to initialize reference speed."; + bfError << "Failed to initialize reference speed."; return false; } @@ -246,21 +247,21 @@ bool SetReferences::initialize(BlockInformation* blockInfo) // Get the interface yarp::dev::IVelocityControl* interface = nullptr; if (!getRobotInterface()->getInterface(interface) || !interface) { - wbtError << "Failed to get IVelocityControl interface."; + bfError << "Failed to get IVelocityControl interface."; return false; } // Store the default reference accelerations pImpl->defaultTrajectoryReference.resize(dofs); if (!interface->getRefAccelerations(pImpl->defaultTrajectoryReference.data())) { - wbtError << "Failed to get default reference acceleration."; + bfError << "Failed to get default reference acceleration."; return false; } // Set the new reference accelerations std::vector speedInitalization(dofs, pImpl->trajectoryReference); if (!interface->setRefAccelerations(speedInitalization.data())) { - wbtError << "Failed to initialize reference acceleration."; + bfError << "Failed to initialize reference acceleration."; return false; } @@ -286,7 +287,7 @@ bool SetReferences::terminate(const BlockInformation* blockInfo) IControlMode* icmd = nullptr; ok = robotInterface->getInterface(icmd); if (!ok || !icmd) { - wbtError << "Failed to get the IControlMode interface."; + bfError << "Failed to get the IControlMode interface."; return false; } @@ -296,14 +297,14 @@ bool SetReferences::terminate(const BlockInformation* blockInfo) yarp::dev::IPositionControl* interface = nullptr; ok = robotInterface->getInterface(interface); if (!ok || !interface) { - wbtError << "Failed to get IPositionControl interface."; + bfError << "Failed to get IPositionControl interface."; return false; } // Restore default reference speeds if (interface) { ok = interface->setRefSpeeds(pImpl->defaultTrajectoryReference.data()); if (!ok) { - wbtError << "Failed to restore default reference speed."; + bfError << "Failed to restore default reference speed."; return false; } } @@ -315,14 +316,14 @@ bool SetReferences::terminate(const BlockInformation* blockInfo) yarp::dev::IVelocityControl* interface = nullptr; ok = robotInterface->getInterface(interface); if (!ok || !interface) { - wbtError << "Failed to get IVelocityControl interface."; + bfError << "Failed to get IVelocityControl interface."; return false; } // Restore default reference accelerations if (interface) { ok = interface->setRefAccelerations(pImpl->defaultTrajectoryReference.data()); if (!ok) { - wbtError << "Failed to restore default reference acceleration."; + bfError << "Failed to restore default reference acceleration."; return false; } } @@ -334,7 +335,7 @@ bool SetReferences::terminate(const BlockInformation* blockInfo) ok = icmd->setControlModes(pImpl->controlModes.data()); if (!ok) { - wbtError << "Failed to set control mode."; + bfError << "Failed to set control mode."; return false; } } @@ -372,12 +373,12 @@ bool SetReferences::output(const BlockInformation* blockInfo) // Get the interface IControlMode* icmd = nullptr; if (!robotInterface->getInterface(icmd) || !icmd) { - wbtError << "Failed to get the IControlMode2 interface."; + bfError << "Failed to get the IControlMode2 interface."; return false; } // Set the control mode to all the controlledJoints if (!icmd->setControlModes(pImpl->controlModes.data())) { - wbtError << "Failed to set control mode."; + bfError << "Failed to set control mode."; return false; } } @@ -385,7 +386,7 @@ bool SetReferences::output(const BlockInformation* blockInfo) // Get the signal InputSignalPtr references = blockInfo->getInputPortSignal(InputIndex::References); if (!references) { - wbtError << "Input signal not valid."; + bfError << "Input signal not valid."; return false; } @@ -393,7 +394,7 @@ bool SetReferences::output(const BlockInformation* blockInfo) const double* bufferReferences = references->getBuffer(); if (!bufferReferences) { - wbtError << "Failed to get the buffer containing references."; + bfError << "Failed to get the buffer containing references."; return false; } @@ -401,7 +402,7 @@ bool SetReferences::output(const BlockInformation* blockInfo) // TODO: here only the first element is checked switch (pImpl->controlModes.front()) { case VOCAB_CM_UNKNOWN: - wbtError << "Control mode has not been successfully set."; + bfError << "Control mode has not been successfully set."; return false; case VOCAB_CM_POSITION: { // Do not update the position reference if it didn't change. @@ -417,7 +418,7 @@ bool SetReferences::output(const BlockInformation* blockInfo) // Get the interface IPositionControl* interface = nullptr; if (!robotInterface->getInterface(interface) || !interface) { - wbtError << "Failed to get IPositionControl interface."; + bfError << "Failed to get IPositionControl interface."; return false; } // Convert from rad to deg @@ -430,7 +431,7 @@ bool SetReferences::output(const BlockInformation* blockInfo) // Get the interface IPositionDirect* interface = nullptr; if (!robotInterface->getInterface(interface) || !interface) { - wbtError << "Failed to get IPositionDirect interface."; + bfError << "Failed to get IPositionDirect interface."; return false; } // Convert from rad to deg @@ -443,7 +444,7 @@ bool SetReferences::output(const BlockInformation* blockInfo) // Get the interface IVelocityControl* interface = nullptr; if (!robotInterface->getInterface(interface) || !interface) { - wbtError << "Failed to get IVelocityControl interface."; + bfError << "Failed to get IVelocityControl interface."; return false; } // Convert from rad to deg @@ -456,7 +457,7 @@ bool SetReferences::output(const BlockInformation* blockInfo) // Get the interface ITorqueControl* interface = nullptr; if (!robotInterface->getInterface(interface) || !interface) { - wbtError << "Failed to get ITorqueControl interface."; + bfError << "Failed to get ITorqueControl interface."; return false; } // Set the references @@ -467,7 +468,7 @@ bool SetReferences::output(const BlockInformation* blockInfo) // Get the interface IPWMControl* interface = nullptr; if (!robotInterface->getInterface(interface) || !interface) { - wbtError << "Failed to get IPWMControl interface."; + bfError << "Failed to get IPWMControl interface."; return false; } // Set the references @@ -478,7 +479,7 @@ bool SetReferences::output(const BlockInformation* blockInfo) // Get the interface ICurrentControl* interface = nullptr; if (!robotInterface->getInterface(interface) || !interface) { - wbtError << "Failed to get ICurrentControl interface."; + bfError << "Failed to get ICurrentControl interface."; return false; } // Set the references @@ -488,7 +489,7 @@ bool SetReferences::output(const BlockInformation* blockInfo) } if (!ok) { - wbtError << "Failed to set references."; + bfError << "Failed to set references."; return false; } diff --git a/toolbox/library/src/SimulatorSynchronizer.cpp b/toolbox/library/src/SimulatorSynchronizer.cpp index cf62e621a..0dace278a 100644 --- a/toolbox/library/src/SimulatorSynchronizer.cpp +++ b/toolbox/library/src/SimulatorSynchronizer.cpp @@ -8,11 +8,11 @@ #include "SimulatorSynchronizer.h" #include "ClockServer.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" +#include +#include +#include +#include #include #include #include @@ -20,6 +20,7 @@ #include using namespace wbt; +using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT // =================================== @@ -72,7 +73,7 @@ unsigned SimulatorSynchronizer::numberOfParameters() std::vector SimulatorSynchronizer::additionalBlockOptions() { - return std::vector(1, wbt::BlockOptionPrioritizeOrder); + return std::vector(1, blockfactory::core::BlockOptionPrioritizeOrder); } bool SimulatorSynchronizer::parseParameters(BlockInformation* blockInfo) @@ -84,7 +85,7 @@ bool SimulatorSynchronizer::parseParameters(BlockInformation* blockInfo) for (const auto& md : metadata) { if (!blockInfo->addParameterMetadata(md)) { - wbtError << "Failed to store parameter metadata"; + bfError << "Failed to store parameter metadata"; return false; } } @@ -108,7 +109,7 @@ bool SimulatorSynchronizer::configureSizeAndPorts(BlockInformation* blockInfo) const bool ok = blockInfo->setIOPortsData({{}, {}}); if (!ok) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -125,7 +126,7 @@ bool SimulatorSynchronizer::initialize(BlockInformation* blockInfo) // ========== if (!SimulatorSynchronizer::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } @@ -138,7 +139,7 @@ bool SimulatorSynchronizer::initialize(BlockInformation* blockInfo) ok = ok && m_parameters.getParameter("RpcPort", clientPortName); if (!ok) { - wbtError << "Error reading RPC parameters."; + bfError << "Error reading RPC parameters."; return false; } @@ -147,7 +148,7 @@ bool SimulatorSynchronizer::initialize(BlockInformation* blockInfo) yarp::os::Network::init(); if (!yarp::os::Network::initialized() || !yarp::os::Network::checkNetwork()) { - wbtError << "Error initializing Yarp network."; + bfError << "Error initializing Yarp network."; return false; } @@ -165,7 +166,7 @@ bool SimulatorSynchronizer::terminate(const BlockInformation* /*blockInfo*/) pImpl->rpcData.clockServer.continueSimulation(); if (!yarp::os::Network::disconnect(pImpl->rpcData.configuration.clientPortName, pImpl->rpcData.configuration.serverPortName)) { - wbtError << "Error disconnecting from simulator clock server."; + bfError << "Error disconnecting from simulator clock server."; } pImpl->rpcData.clientPort.close(); } @@ -182,7 +183,7 @@ bool SimulatorSynchronizer::output(const BlockInformation* /*blockInfo*/) if (!pImpl->rpcData.clientPort.open(pImpl->rpcData.configuration.clientPortName) || !yarp::os::Network::connect(pImpl->rpcData.configuration.clientPortName, pImpl->rpcData.configuration.serverPortName)) { - wbtError << "Error connecting to simulator clock server."; + bfError << "Error connecting to simulator clock server."; return false; } diff --git a/toolbox/library/src/WBBlock.cpp b/toolbox/library/src/WBBlock.cpp index 48d26c596..6b8f0563c 100644 --- a/toolbox/library/src/WBBlock.cpp +++ b/toolbox/library/src/WBBlock.cpp @@ -10,11 +10,11 @@ #include "Base/Configuration.h" #include "Base/RobotInterface.h" #include "Base/WholeBodySingleton.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Signal.h" +#include +#include +#include +#include #include #include #include @@ -30,6 +30,7 @@ #include using namespace wbt; +using namespace blockfactory::core; enum ParamIndex { @@ -86,7 +87,7 @@ bool WBBlock::setRobotState(wbt::InputSignalPtr basePose, using Matrix4dSimulink = Matrix; if (!m_robotState) { - wbtError << "Failed to access iDynTreeRobotState object."; + bfError << "Failed to access iDynTreeRobotState object."; return false; } @@ -97,7 +98,7 @@ bool WBBlock::setRobotState(wbt::InputSignalPtr basePose, // Get the buffer const double* buffer = basePose->getBuffer(); if (!buffer) { - wbtError << "Failed to read the base pose from input port."; + bfError << "Failed to read the base pose from input port."; return false; } // Fill the data @@ -111,7 +112,7 @@ bool WBBlock::setRobotState(wbt::InputSignalPtr basePose, // Get the buffer const double* buffer = jointsPos->getBuffer(); if (!buffer) { - wbtError << "Failed to read joints positions from input port."; + bfError << "Failed to read joints positions from input port."; return false; } // Fill the data @@ -127,7 +128,7 @@ bool WBBlock::setRobotState(wbt::InputSignalPtr basePose, // Get the buffer const double* buffer = baseVelocity->getBuffer(); if (!buffer) { - wbtError << "Failed to read the base velocity from input port."; + bfError << "Failed to read the base velocity from input port."; return false; } // Fill the data @@ -141,7 +142,7 @@ bool WBBlock::setRobotState(wbt::InputSignalPtr basePose, // Get the buffer const double* buffer = jointsVelocity->getBuffer(); if (!buffer) { - wbtError << "Failed to read joints velocities from input port."; + bfError << "Failed to read joints velocities from input port."; return false; } // Fill the data @@ -154,7 +155,7 @@ bool WBBlock::setRobotState(wbt::InputSignalPtr basePose, // ============================================= if (!kinDyn) { - wbtError << "Failed to access the KinDynComputations object."; + bfError << "Failed to access the KinDynComputations object."; return false; } @@ -165,7 +166,7 @@ bool WBBlock::setRobotState(wbt::InputSignalPtr basePose, m_robotState->gravity); if (!ok) { - wbtError << "Failed to set the iDynTree robot state."; + bfError << "Failed to set the iDynTree robot state."; return false; } @@ -198,7 +199,7 @@ bool WBBlock::parseParameters(BlockInformation* blockInfo) for (const auto& md : metadata) { if (!blockInfo->addParameterMetadata(md)) { - wbtError << "Failed to store parameter metadata"; + bfError << "Failed to store parameter metadata"; return false; } } @@ -214,7 +215,7 @@ bool WBBlock::configureSizeAndPorts(BlockInformation* blockInfo) // Parse the parameters if (!WBBlock::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } @@ -228,13 +229,13 @@ bool WBBlock::configureSizeAndPorts(BlockInformation* blockInfo) m_robotInterface = WholeBodySingleton::sharedInstance().storeConfiguration(m_parameters); if (!m_robotInterface) { - wbtError << "Failed to get the RobotInterface object from the WholeBodySingleton."; + bfError << "Failed to get the RobotInterface object from the WholeBodySingleton."; return false; } // Check if the DoFs are positive if (m_robotInterface->getConfiguration().getNumberOfDoFs() < 1) { - wbtError << "Failed to configure WBBlock. Read 0 DoFs."; + bfError << "Failed to configure WBBlock. Read 0 DoFs."; return false; } @@ -249,7 +250,7 @@ bool WBBlock::initialize(BlockInformation* blockInfo) // Parse the parameters if (!WBBlock::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } @@ -259,14 +260,14 @@ bool WBBlock::initialize(BlockInformation* blockInfo) m_robotInterface = WholeBodySingleton::sharedInstance().storeConfiguration(m_parameters); if (!m_robotInterface) { - wbtError << "Failed to get the RobotInterface object from the WholeBodySingleton."; + bfError << "Failed to get the RobotInterface object from the WholeBodySingleton."; return false; } // Check if the DoFs are positive const auto dofs = m_robotInterface->getConfiguration().getNumberOfDoFs(); if (dofs < 1) { - wbtError << "Failed to configure WBBlock. Read 0 DoFs."; + bfError << "Failed to configure WBBlock. Read 0 DoFs."; return false; } @@ -275,7 +276,7 @@ bool WBBlock::initialize(BlockInformation* blockInfo) new iDynTreeRobotState(dofs, m_robotInterface->getConfiguration().getGravityVector())); if (!m_robotState) { - wbtError << "Failed to initialize the iDynTreeRobotState object"; + bfError << "Failed to initialize the iDynTreeRobotState object"; return false; } diff --git a/toolbox/library/src/WholeBodySingleton.cpp b/toolbox/library/src/WholeBodySingleton.cpp index c21893631..4471f6d7f 100644 --- a/toolbox/library/src/WholeBodySingleton.cpp +++ b/toolbox/library/src/WholeBodySingleton.cpp @@ -9,8 +9,9 @@ #include "Base/WholeBodySingleton.h" #include "Base/Configuration.h" #include "Base/RobotInterface.h" -#include "Core/Log.h" -#include "Core/Parameters.h" + +#include +#include #include #include @@ -19,9 +20,10 @@ #include using namespace wbt; +using namespace blockfactory::core; bool fillConfiguration(std::shared_ptr& configurationPtr, - const wbt::Parameters& parameters); + const Parameters& parameters); // CONSTRUCTOR / DESTRUCTOR // ======================== @@ -44,14 +46,13 @@ int WholeBodySingleton::numberOfDoFs(const std::string& confKey) const bool WholeBodySingleton::isKeyValid(const std::string& confKey) const { if (m_interfaces.find(confKey) == m_interfaces.end()) { - wbtError << "Failed to find entry in the ToolboxSingleton related to " << confKey - << " key."; + bfError << "Failed to find entry in the ToolboxSingleton related to " << confKey << " key."; return false; } if (!m_interfaces.at(confKey).lock()) { - wbtError << "Failed to get the RobotInterface object from its weak pointer stored in " - << "TolboxSingleton."; + bfError << "Failed to get the RobotInterface object from its weak pointer stored in " + << "TolboxSingleton."; return false; } @@ -99,7 +100,7 @@ std::shared_ptr WholeBodySingleton::createRobotInterface(const Configuration& config) { if (!config.isValid()) { - wbtError << "The passed configuration object does not contain valid data."; + bfError << "The passed configuration object does not contain valid data."; return {}; } @@ -126,9 +127,9 @@ WholeBodySingleton::createRobotInterface(const Configuration& config) // previously by another block that points to the same Configuration block. Just to be sure, // check if the Configuration objects match: if (!(m_interfaces[confKey].lock()->getConfiguration() == config)) { - wbtError << "A RobotInterface pointing to " << confKey - << " Configuration block already exists, but contains a different " - << "wbt::Configuration object."; + bfError << "A RobotInterface pointing to " << confKey + << " Configuration block already exists, but contains a different " + << "wbt::Configuration object."; return {}; } @@ -138,7 +139,7 @@ WholeBodySingleton::createRobotInterface(const Configuration& config) } bool fillConfiguration(std::shared_ptr& configurationPtr, - const wbt::Parameters& parameters) + const Parameters& parameters) { bool ok = true; @@ -159,8 +160,8 @@ bool fillConfiguration(std::shared_ptr& configurationPtr, ok = ok && parameters.getParameter("ConfBlockName", confBlockName); if (!ok) { - wbtError << "The parameters passed do not contain all the required information to create a " - << "Configuration object."; + bfError << "The parameters passed do not contain all the required information to create a " + << "Configuration object."; return false; } @@ -183,20 +184,19 @@ bool fillConfiguration(std::shared_ptr& configurationPtr, return true; } -std::shared_ptr -WholeBodySingleton::storeConfiguration(const wbt::Parameters& parameters) +std::shared_ptr WholeBodySingleton::storeConfiguration(const Parameters& parameters) { std::shared_ptr configurationPtr = nullptr; // Create the Configuration object. This checks if parameters contain all the required // parameters. if (!fillConfiguration(configurationPtr, parameters)) { - wbtError << "Failed to fill the configuration with input parameters."; + bfError << "Failed to fill the configuration with input parameters."; return {}; } if (!configurationPtr || !configurationPtr->isValid()) { - wbtError << "The parsed Configuration object is not valid."; + bfError << "The parsed Configuration object is not valid."; return {}; } @@ -205,7 +205,7 @@ WholeBodySingleton::storeConfiguration(const wbt::Parameters& parameters) auto robotInterface = createRobotInterface(*configurationPtr); if (!robotInterface) { - wbtError << "Failed to get the RobotInterface object."; + bfError << "Failed to get the RobotInterface object."; return {}; } diff --git a/toolbox/library/src/YarpClock.cpp b/toolbox/library/src/YarpClock.cpp index 5a2e0b30c..3f1b74657 100644 --- a/toolbox/library/src/YarpClock.cpp +++ b/toolbox/library/src/YarpClock.cpp @@ -7,10 +7,10 @@ */ #include "YarpClock.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Signal.h" +#include +#include +#include #include #include @@ -18,6 +18,7 @@ #include using namespace wbt; +using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT // =================================== @@ -60,7 +61,7 @@ bool YarpClock::configureSizeAndPorts(BlockInformation* blockInfo) }); if (!ok) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -79,7 +80,7 @@ bool YarpClock::initialize(BlockInformation* blockInfo) yarp::os::Network::init(); if (!yarp::os::Network::initialized() || !yarp::os::Network::checkNetwork(5.0)) { - wbtError << "YARP server wasn't found active."; + bfError << "YARP server wasn't found active."; return false; } @@ -96,12 +97,12 @@ bool YarpClock::output(const BlockInformation* blockInfo) { OutputSignalPtr outputSignal = blockInfo->getOutputPortSignal(OutputIndex::Clock); if (!outputSignal) { - wbtError << "Output signal not valid."; + bfError << "Output signal not valid."; return false; } if (!outputSignal->set(0, yarp::os::Time::now())) { - wbtError << "Failed to write data to the output signal."; + bfError << "Failed to write data to the output signal."; return false; } return true; diff --git a/toolbox/library/src/YarpRead.cpp b/toolbox/library/src/YarpRead.cpp index 0f48a433f..498ad3f63 100644 --- a/toolbox/library/src/YarpRead.cpp +++ b/toolbox/library/src/YarpRead.cpp @@ -7,12 +7,12 @@ */ #include "YarpRead.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" -#include "Core/Signal.h" +#include +#include +#include +#include +#include #include #include #include @@ -27,6 +27,7 @@ #include using namespace wbt; +using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT // =================================== @@ -97,7 +98,7 @@ bool YarpRead::parseParameters(BlockInformation* blockInfo) for (const auto& md : metadata) { if (!blockInfo->addParameterMetadata(md)) { - wbtError << "Failed to store parameter metadata"; + bfError << "Failed to store parameter metadata"; return false; } } @@ -111,7 +112,7 @@ bool YarpRead::configureSizeAndPorts(BlockInformation* blockInfo) // ========== if (!YarpRead::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } @@ -125,12 +126,12 @@ bool YarpRead::configureSizeAndPorts(BlockInformation* blockInfo) ok = ok && m_parameters.getParameter("SignalSize", signalSize); if (!ok) { - wbtError << "Failed to read input parameters."; + bfError << "Failed to read input parameters."; return false; } if (signalSize <= 0) { - wbtError << "Signal size must be non negative."; + bfError << "Signal size must be non negative."; return false; } @@ -168,7 +169,7 @@ bool YarpRead::configureSizeAndPorts(BlockInformation* blockInfo) } if (!blockInfo->setIOPortsData(ioData)) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -188,7 +189,7 @@ bool YarpRead::initialize(BlockInformation* blockInfo) // ========== if (!YarpRead::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } @@ -203,7 +204,7 @@ bool YarpRead::initialize(BlockInformation* blockInfo) ok = ok && m_parameters.getParameter("Timeout", pImpl->timeout); if (!ok) { - wbtError << "Failed to read input parameters."; + bfError << "Failed to read input parameters."; return false; } @@ -213,7 +214,7 @@ bool YarpRead::initialize(BlockInformation* blockInfo) Network::init(); if (!Network::initialized() || !Network::checkNetwork(5.0)) { - wbtError << "YARP server wasn't found active."; + bfError << "YARP server wasn't found active."; return false; } @@ -232,20 +233,20 @@ bool YarpRead::initialize(BlockInformation* blockInfo) } if (!pImpl->port.open(destinationPortName)) { - wbtError << "Error while opening yarp port."; + bfError << "Error while opening yarp port."; return false; } if (pImpl->autoconnect) { if (!Network::connect(pImpl->sourcePortName, pImpl->port.getName())) { if (pImpl->errorOnMissingPort) { - wbtError << "Failed to connect " + pImpl->sourcePortName + " to " - + pImpl->port.getName() + "."; + bfError << "Failed to connect " + pImpl->sourcePortName + " to " + + pImpl->port.getName() + "."; return false; } else { - wbtWarning << "Failed to connect " + pImpl->sourcePortName + " to " - + pImpl->port.getName() + "."; + bfWarning << "Failed to connect " + pImpl->sourcePortName + " to " + + pImpl->port.getName() + "."; } } } @@ -282,8 +283,8 @@ bool YarpRead::output(const BlockInformation* blockInfo) yarp::os::Time::delay(0.0005); const double now = yarp::os::SystemClock::nowSystem(); if ((now - t0) > pImpl->timeout) { - wbtError << "The port didn't receive any data for longer " - << "than the configured timeout."; + bfError << "The port didn't receive any data for longer " + << "than the configured timeout."; return false; } } @@ -297,14 +298,14 @@ bool YarpRead::output(const BlockInformation* blockInfo) if (pImpl->shouldReadTimestamp) { yarp::os::Stamp timestamp; if (!pImpl->port.getEnvelope(timestamp)) { - wbtError << "Failed to read port envelope (timestamp). Be sure" - << " that the input port actually writes this data."; + bfError << "Failed to read port envelope (timestamp). Be sure" + << " that the input port actually writes this data."; return false; } OutputSignalPtr timestampSignal = blockInfo->getOutputPortSignal(OutputIndex_Timestamp); if (!timestampSignal) { - wbtError << "Output signal not valid."; + bfError << "Output signal not valid."; return false; } @@ -315,19 +316,19 @@ bool YarpRead::output(const BlockInformation* blockInfo) OutputSignalPtr signal = blockInfo->getOutputPortSignal(OutputIndex::Signal); if (!signal) { - wbtError << "Output signal not valid."; + bfError << "Output signal not valid."; return false; } if (vectorBuffer->size() != signal->getWidth()) { - wbtError << "Size of received data from " << pImpl->port.getName() << " (" - << vectorBuffer->size() << ")" - << " does not match with output signal width (" << signal->getWidth() << ")."; + bfError << "Size of received data from " << pImpl->port.getName() << " (" + << vectorBuffer->size() << ")" + << " does not match with output signal width (" << signal->getWidth() << ")."; return false; } if (!signal->setBuffer(vectorBuffer->data(), vectorBuffer->size())) { - wbtError << "Failed to set the output buffer."; + bfError << "Failed to set the output buffer."; return false; } @@ -339,12 +340,12 @@ bool YarpRead::output(const BlockInformation* blockInfo) OutputSignalPtr statusPort = blockInfo->getOutputPortSignal(OutputIndex_IsConnected); if (!statusPort) { - wbtError << "Output signal not valid."; + bfError << "Output signal not valid."; return false; } if (!statusPort->set(0, 1)) { - wbtError << "Failed to write data to output buffer."; + bfError << "Failed to write data to output buffer."; return false; } } diff --git a/toolbox/library/src/YarpWrite.cpp b/toolbox/library/src/YarpWrite.cpp index 54c003177..965815da8 100644 --- a/toolbox/library/src/YarpWrite.cpp +++ b/toolbox/library/src/YarpWrite.cpp @@ -7,12 +7,12 @@ */ #include "YarpWrite.h" -#include "Core/BlockInformation.h" -#include "Core/Log.h" -#include "Core/Parameter.h" -#include "Core/Parameters.h" -#include "Core/Signal.h" +#include +#include +#include +#include +#include #include #include #include @@ -22,6 +22,7 @@ #include using namespace wbt; +using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT // =================================== @@ -75,7 +76,7 @@ bool YarpWrite::parseParameters(BlockInformation* blockInfo) for (const auto& md : metadata) { if (!blockInfo->addParameterMetadata(md)) { - wbtError << "Failed to store parameter metadata"; + bfError << "Failed to store parameter metadata"; return false; } } @@ -108,7 +109,7 @@ bool YarpWrite::configureSizeAndPorts(BlockInformation* blockInfo) }); if (!ok) { - wbtError << "Failed to configure input / output ports."; + bfError << "Failed to configure input / output ports."; return false; } @@ -128,7 +129,7 @@ bool YarpWrite::initialize(BlockInformation* blockInfo) // ========== if (!YarpWrite::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; + bfError << "Failed to parse parameters."; return false; } @@ -140,7 +141,7 @@ bool YarpWrite::initialize(BlockInformation* blockInfo) ok = ok && m_parameters.getParameter("ErrorOnMissingPort", pImpl->errorOnMissingPort); if (!ok) { - wbtError << "Failed to read input parameters."; + bfError << "Failed to read input parameters."; return false; } @@ -150,7 +151,7 @@ bool YarpWrite::initialize(BlockInformation* blockInfo) Network::init(); if (!Network::initialized() || !Network::checkNetwork(5.0)) { - wbtError << "YARP server wasn't found active."; + bfError << "YARP server wasn't found active."; return false; } @@ -169,20 +170,20 @@ bool YarpWrite::initialize(BlockInformation* blockInfo) } if (!pImpl->port.open(sourcePortName)) { - wbtError << "Error while opening yarp port."; + bfError << "Error while opening yarp port."; return false; } if (pImpl->autoconnect) { if (!Network::connect(pImpl->port.getName(), pImpl->destinationPortName)) { if (pImpl->errorOnMissingPort) { - wbtError << "Failed to connect " << pImpl->port.getName() << " to " - << pImpl->destinationPortName << "."; + bfError << "Failed to connect " << pImpl->port.getName() << " to " + << pImpl->destinationPortName << "."; return false; } else { - wbtWarning << "Failed to connect " << pImpl->port.getName() << " to " - << pImpl->destinationPortName << "."; + bfWarning << "Failed to connect " << pImpl->port.getName() << " to " + << pImpl->destinationPortName << "."; } } } @@ -208,7 +209,7 @@ bool YarpWrite::output(const BlockInformation* blockInfo) InputSignalPtr signal = blockInfo->getInputPortSignal(InputIndex::Signal); if (!signal) { - wbtError << "Input signal not valid."; + bfError << "Input signal not valid."; return false; } From 514af29a2f36ed6b5c8071b0c1cdb2d9ca183ae7 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Wed, 5 Dec 2018 15:43:30 +0100 Subject: [PATCH 04/37] Updated the Simulink Library for using the new external S-Function --- .../library/WBToolboxLibrary_repository.mdl | 8768 ++++++++--------- matlab/library/exported/WBToolboxLibrary.slx | Bin 545949 -> 545199 bytes 2 files changed, 4384 insertions(+), 4384 deletions(-) diff --git a/matlab/library/WBToolboxLibrary_repository.mdl b/matlab/library/WBToolboxLibrary_repository.mdl index 45de2976b..b7e115929 100644 --- a/matlab/library/WBToolboxLibrary_repository.mdl +++ b/matlab/library/WBToolboxLibrary_repository.mdl @@ -27,7 +27,7 @@ Library { $ObjectID 2 $ClassName "Simulink.WindowInfo" IsActive [1] - Location [832.0, 225.0, 2868.0, 1689.0] + Location [0.0, 27.0, 1920.0, 1053.0] Object { $PropName "ModelBrowserInfo" $ObjectID 3 @@ -50,10 +50,10 @@ Library { $ClassName "Simulink.EditorInfo" IsActive [1] ViewObjType "SimulinkSubsys" - LoadSaveID "224" - Extents [2830.0, 1534.0] - ZoomFactor [10.0] - Offset [557.365625, 208.45] + LoadSaveID "192" + Extents [1882.0, 849.0] + ZoomFactor [2.1893333333333334] + Offset [-79.803440925700272, -12.394640682095002] } Object { $PropName "DockComponentsInfo" @@ -73,7 +73,7 @@ Library { "AAAAAAA+wAAABYARABvAGMAawBXAGkAZABnAGUAdAA0AAAAAAD/////AAAAAAAAAAD7AAAAUgBHAEwAVQBFADIAIAB0AHIAZQBlACAAYwBvAG0Ac" "ABvAG4AZQBuAHQALwBHAEwAVQBFADIAIAB0AHIAZQBlACAAYwBvAG0AcABvAG4AZQBuAHQAAAAANQAAAooAAAB4AP///wAAAAEAAAAAAAAAAPwCA" "AAAAfsAAABUAEcATABVAEUAMgA6AFAAcgBvAHAAZQByAHQAeQBJAG4AcwBwAGUAYwB0AG8AcgAvAFAAcgBvAHAAZQByAHQAeQAgAEkAbgBzAHAAZ" - "QBjAHQAbwByAAAAAAD/////AAAAMQD///8AAAs0AAAGRAAAAAEAAAACAAAAAQAAAAL8AAAAAQAAAAIAAAAP/////wAAAAAA/////wAAAAAAAAAA/" + "QBjAHQAbwByAAAAAAD/////AAAAMQD///8AAAeAAAADlwAAAAEAAAACAAAAAQAAAAL8AAAAAQAAAAIAAAAP/////wAAAAAA/////wAAAAAAAAAA/" "////wEAAAAA/////wAAAAAAAAAA/////wAAAAAA/////wAAAAAAAAAA/////wAAAAAA/////wAAAAAAAAAA/////wAAAAAA/////wAAAAAAAAAA/" "////wEAAACG/////wAAAAAAAAAA/////wEAAADu/////wAAAAAAAAAA/////wAAAAAA/////wAAAAAAAAAA/////wAAAAAA/////wAAAAAAAAAA/" "////wAAAAAA/////wAAAAAAAAAA/////wAAAAAA/////wAAAAAAAAAA/////wAAAAAA/////wAAAAAAAAAA/////wEAAAFE/////wAAAAAAAAAA/" @@ -87,9 +87,9 @@ Library { ModifiedByFormat "%" LastModifiedBy "dferigo" ModifiedDateFormat "%" - LastModifiedDate "Tue Aug 21 13:59:32 2018" - RTWModifiedTimeStamp 456760771 - ModelVersionFormat "1.%" + LastModifiedDate "Wed Dec 05 14:25:23 2018" + RTWModifiedTimeStamp 465920717 + ModelVersionFormat "1.%" SampleTimeColors off SampleTimeAnnotations off LibraryLinkDisplay "all" @@ -1105,7 +1105,7 @@ Library { } System { Name "WBToolboxLibrary_repository" - Location [832, 225, 3700, 1914] + Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off SetDomainSpec off @@ -1120,16 +1120,16 @@ Library { TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] TiledPageScale 1 ShowPageBoundaries off - ZoomFactor "626" + ZoomFactor "416" ReportName "simulink-default.rpt" SIDHighWatermark "1847" Block { BlockType SubSystem - Name "Utilities" - SID "192" + Name "Actuators" + SID "224" Ports [] - Position [364, 17, 462, 114] - ZOrder -1 + Position [250, 16, 348, 113] + ZOrder -17 ForegroundColor "white" DropShadow on RequestExecContextInheritance off @@ -1137,11 +1137,11 @@ Library { $PropName "MaskObject" $ObjectID 20 $ClassName "Simulink.Mask" - Display "image(imread('utilities.png'))" + Display "image(imread('wholeBodyActuators.png'),'center')" } System { - Name "Utilities" - Location [832, 225, 3700, 1914] + Name "Actuators" + Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off SetDomainSpec off @@ -1156,25 +1156,39 @@ Library { TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] TiledPageScale 1 ShowPageBoundaries off - ZoomFactor "381" + ZoomFactor "562" Block { - BlockType SubSystem - Name "Configuration" - SID "1774" - Ports [] - Position [295, 310, 370, 340] - ZOrder 95 - InitFcn "source = get_param(gcb,'ConfigSource');\n\nif strcmp(source, 'Workspace')\n object = get_param(gcb,'" - "ConfigObject');\n WBToolbox.ConfigurationToMask(gcb, object);\nend\n\nWBToolbox.MaskToConfiguration(gcb);\n\ncle" - "ar object source" - RequestExecContextInheritance off + BlockType S-Function + Name "Set Motor Parameters" + SID "1847" + Ports [1, 1] + Position [645, 290, 755, 340] + ZOrder 106 + BackgroundColor "[0.513700, 0.851000, 0.670600]" + FunctionName "BlockFactory" + Parameters "'SetMotorParameters','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,readP,readI,readD,pid" + "Type,setKTau,kTau,setBemf,bemf" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off Object { $PropName "MaskObject" $ObjectID 21 $ClassName "Simulink.Mask" - SelfModifiable "on" - Display "disp('Config')" - RunInitForIconRedraw "off" + Type "Set Motor Parameters" + Description "This block allows to set motor PIDs and constants such as the motor constant and the back EMF.\n" + "\nThe motor constant and the back EMF are set in the block's mask, and their values are applied during the first " + "simulation loop. The PIDs values are instead set from the input ports.\n\nAll these vectors should have a size eq" + "ual to the number of controlled joints specified in the referred Configuration block.\n\nAt the end of the simula" + "tion, the default values are restored." + Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig" + "] = WBToolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n " + " clear WBTConfig;\ncatch\nend\n\n% The booleans of the checkboxes always create problems\nreadP = uint8(readP);" + "\nreadI = uint8(readI);\nreadD = uint8(readD);" + Display "fprintf('Motor Parameters\\n(%s)',pidType);\n\nnumPorts = 0;\n\nif readP\n numPorts = numPorts +" + " 1;\n port_label('input',numPorts,'P')\nend\n\nif readI\n numPorts = numPorts + 1;\n port_label('input'," + "numPorts,'I')\nend\n\nif readD\n numPorts = numPorts + 1;\n port_label('input',numPorts,'D')\nend\n" + RunInitForIconRedraw "on" Array { Type "Simulink.MaskParameter" Dimension 8 @@ -1184,80 +1198,75 @@ Library { Array { Type "Cell" Dimension 2 - Cell "Workspace" - Cell "Mask" + Cell "Position" + Cell "Torque" PropName "TypeOptions" } - Name "ConfigSource" - Prompt "Configuration from" - Value "Mask" - Callback "% Get the Workspace/Mask menu\nh = Simulink.Mask.get(gcb);\ncurrentConfigSource = get_param(gcb,'ConfigSo" - "urce');\n\nif strcmp(currentConfigSource,'Workspace')\n % Switch the visibility of the GUI elements\n set_para" - "m(gcb,'MaskVisibilities',{'on';'on';'on';'on';'on';'on';'on';'on';});\n h.Parameters(3).ReadOnly = 'on';\n h.P" - "arameters(4).ReadOnly = 'on';\n h.Parameters(5).ReadOnly = 'on';\n h.Parameters(6).ReadOnly = 'on';\n h.Par" - "ameters(7).ReadOnly = 'on';\n h.Parameters(8).ReadOnly = 'on';\n \n % Parse the object inserted in the Conf" - "igObject field\n currentConfigObject = get_param(gcb,'ConfigObject');\n WBToolbox.ConfigurationToMask(gcb,curr" - "entConfigObject);\n clear currentConfigObject;\nelseif strcmp(currentConfigSource,'Mask')\n % Switch the visib" - "ility of the GUI elements\n set_param(gcb,'MaskVisibilities',{'on';'off';'on';'on';'on';'on';'on';'on';});\n h" - ".Parameters(3).ReadOnly = 'off';\n h.Parameters(4).ReadOnly = 'off';\n h.Parameters(5).ReadOnly = 'off';\n " - "h.Parameters(6).ReadOnly = 'off';\n h.Parameters(7).ReadOnly = 'off';\n h.Parameters(8).ReadOnly = 'off';\n " - " h.Parameters(3).Enabled = 'on';\n h.Parameters(4).Enabled = 'on';\n h.Parameters(5).Enabled = 'on';\n h.Pa" - "rameters(6).Enabled = 'on';\n h.Parameters(7).Enabled = 'on';\n h.Parameters(8).Enabled = 'on';\nend\n\nclear " - "h currentConfigSource" + Name "pidType" + Prompt "PID Type" + Value "Position" + Evaluate "off" + Callback "% Get the mask parameter values. This is a cell\n% array of strings.\nmaskStr = get_param(gcb,'pidType'" + ");\n\nswitch maskStr\n case 'Position'\n set_param(gcb,'BackgroundColor', '[0.5137, 0.8510, 0.6706, 1.0]')" + ";\n case 'Position Direct'\n set_param(gcb,'BackgroundColor', '[0.3922, 0.7882, 0.3451, 1.0]');\n case " + "'Velocity'\n set_param(gcb,'BackgroundColor', '[0.5137, 0.6745, 1.0000, 1.0]');\n case 'Torque'\n s" + "et_param(gcb,'BackgroundColor', '[0.8275, 0.5765, 0.6039, 1.0]');\n otherwise\n error('PID Type not recogn" + "ized');\nend\n\nclear maskStr" } Object { $ObjectID 23 - Type "edit" - Name "ConfigObject" - Prompt "Name of the object" - Value "'WBTConfigRobot'" - Tunable "off" - Visible "off" - Callback "% This code get called whatsoever\nif strcmp(char(get_param(gcb,'ConfigSource')),'Mask')\n return\nend" - "\n\n% Parse the object inserted in the ConfigObject field\ncurrentConfigObject = get_param(gcb,'ConfigObject');\nWBT" - "oolbox.ConfigurationToMask(gcb,currentConfigObject);\n\nclear currentConfigObject;" + Type "checkbox" + Name "readP" + Prompt "Enable P gains input signal" + Value "on" } Object { $ObjectID 24 - Type "edit" - Name "RobotName" - Prompt "Robot Name" - Value "'icubSim'" + Type "checkbox" + Name "readI" + Prompt "Enable I gains input signal" + Value "off" } Object { $ObjectID 25 - Type "edit" - Name "UrdfFile" - Prompt "Urdf File" - Value "'model.urdf'" + Type "checkbox" + Name "readD" + Prompt "Enable D gains input signal" + Value "off" } Object { $ObjectID 26 - Type "edit" - Name "ControlledJoints" - Prompt "Controlled Joints" - Value "{'l_elbow','l_shoulder_pitch','torso_roll'}" + Type "checkbox" + Name "setKTau" + Prompt "Set motor constant KTau" + Value "off" + Callback "h = Simulink.Mask.get(gcb);\nsetKTauValue = get_param(gcb,'setKTau');\n\nif ~strcmp(setKTauValue,'on')\n " + " h.Parameters(6).Enabled = 'off';\nelse\n h.Parameters(6).Enabled = 'on';\nend\n\nclear h setKTauValue" } Object { $ObjectID 27 Type "edit" - Name "ControlBoardsNames" - Prompt "Control Boards Names" - Value "{'left_arm','right_arm','torso'}" + Name "kTau" + Prompt "kTau" + Value "[0]" + Enabled "off" } Object { $ObjectID 28 - Type "edit" - Name "LocalName" - Prompt "Local Name" - Value "'WBT'" + Type "checkbox" + Name "setBemf" + Prompt "Set motor back EMF constant" + Value "off" + Callback "h = Simulink.Mask.get(gcb);\nsetBemfValue = get_param(gcb,'setBemf');\n\nif ~strcmp(setBemfValue,'on')\n " + " h.Parameters(8).Enabled = 'off';\nelse\n h.Parameters(8).Enabled = 'on';\nend\n\nclear h setBemfValue" } Object { $ObjectID 29 Type "edit" - Name "GravityVector" - Prompt "Gravity Vector" - Value "[0,0,-9.81]" + Name "bemf" + Prompt "bemf" + Value "[0]" + Enabled "off" } PropName "Parameters" } @@ -1279,153 +1288,190 @@ Library { Object { $ObjectID 32 Prompt "Simulink:studio:ToolBarParametersMenu" - Object { - $PropName "DialogControls" - $ObjectID 33 - $ClassName "Simulink.dialog.TabContainer" - Array { - Type "Simulink.dialog.Tab" - Dimension 2 - Object { - $ObjectID 34 - Prompt "From" + Array { + Type "Simulink.dialog.Group" + Dimension 3 + Object { + $ObjectID 33 + Prompt "Gains" Array { Type "Simulink.dialog.parameter.Control" - Dimension 2 + Dimension 4 Object { - $ObjectID 35 + $ObjectID 34 $ClassName "Simulink.dialog.parameter.Popup" - Name "ConfigSource" + Name "pidType" } Object { - $ObjectID 36 - $ClassName "Simulink.dialog.parameter.Edit" - PromptLocation "left" - Name "ConfigObject" - } - PropName "DialogControls" + $ObjectID 35 + $ClassName "Simulink.dialog.parameter.CheckBox" + Name "readP" } - Name "TabFrom" + Object { + $ObjectID 36 + $ClassName "Simulink.dialog.parameter.CheckBox" + Name "readI" } Object { $ObjectID 37 - Prompt "Data" - Array { - Type "Simulink.dialog.parameter.Edit" - Dimension 6 - Object { - $ObjectID 38 - PromptLocation "left" - Name "RobotName" + $ClassName "Simulink.dialog.parameter.CheckBox" + Name "readD" + } + PropName "DialogControls" } + Name "Container3" + } + Object { + $ObjectID 38 + Prompt "Motor Torque Parameters" + Array { + Type "Simulink.dialog.parameter.Control" + Dimension 4 Object { $ObjectID 39 - PromptLocation "left" - Name "UrdfFile" + $ClassName "Simulink.dialog.parameter.CheckBox" + Name "setKTau" } Object { $ObjectID 40 + $ClassName "Simulink.dialog.parameter.Edit" PromptLocation "left" - Name "ControlledJoints" + Name "kTau" } Object { $ObjectID 41 - PromptLocation "left" - Name "ControlBoardsNames" + $ClassName "Simulink.dialog.parameter.CheckBox" + Name "setBemf" } Object { $ObjectID 42 + $ClassName "Simulink.dialog.parameter.Edit" PromptLocation "left" - Name "LocalName" - } - Object { - $ObjectID 43 - PromptLocation "left" - Name "GravityVector" + Name "bemf" } PropName "DialogControls" } - Name "TabData" + Name "Container4" + } + Object { + $ObjectID 43 + Object { + $PropName "DialogControls" + $ObjectID 44 + $ClassName "Simulink.dialog.Button" + Prompt "Toggle Config Block Highlighting" + Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" + "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" + "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" + "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" + Name "Control2" } - PropName "DialogControls" + Name "ToggleButtonContainer" } - Name "TabContainer" + PropName "DialogControls" } Name "ParameterGroupVar" } PropName "DialogControls" } } - System { - Name "Configuration" - Location [550, 86, 1677, 725] - Open off - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "600" - SIDHighWatermark "70" - Block { - BlockType Constant - Name "ImConfig" - SID "1774:67" - Position [20, 20, 50, 50] - ZOrder 81 - Value "0" - } - Block { - BlockType Terminator - Name "Terminator" - SID "1774:68" - Position [95, 25, 115, 45] - ZOrder 80 - } - Line { - ZOrder 1 - SrcBlock "ImConfig" - SrcPort 1 - DstBlock "Terminator" - DstPort 1 - } - } } Block { BlockType SubSystem - Name "DampPinv" - SID "104" - Ports [2, 1] - Position [495, 198, 565, 242] - ZOrder -1 - BackgroundColor "[0.848000, 0.128048, 0.320035]" + Name "Set Motor References" + SID "1791" + Ports [1] + Position [710, 210, 785, 260] + ZOrder 44 + BackgroundColor "[0.960000, 0.770000, 0.460000]" RequestExecContextInheritance off Object { $PropName "MaskObject" - $ObjectID 44 + $ObjectID 45 $ClassName "Simulink.Mask" + Type "Set Motor References" + Description "This block sets motor references. The type of control mode is specified as a parameter in the b" + "lock.\n\nAssuming N as the number of motors (usually equal to internal DoFs):\n\nInput:\n - References: Vector o" + "f size N, representing the references to be sent to the robot controlled motors.\n\nParameters:\n - Control Mode" + ": The control mode. Choose one of the supplied mode.\n\nUnit of measurement:\n - PWM [-100, 100]% Duty cycle\n " + " - Current [A]\n - Back EMF\n - Torque Constant" + Initialization "refSpeed = 0;\n\n% WBBlock Initialization\n% ======================\n\ntry\n [configBlockA" + "bsName, WBTConfig] = WBToolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimul" + "inkParameters;\n clear WBTConfig;\ncatch\nend" + Display "disp(get_param(gcb,'controlType'))\n%port_label('input',1,'References')" RunInitForIconRedraw "off" Object { $PropName "Parameters" - $ObjectID 45 + $ObjectID 46 $ClassName "Simulink.MaskParameter" - Type "edit" - Name "tol" - Prompt "Tolerance" - Value "1e-4" + Type "popup" + Array { + Type "Cell" + Dimension 4 + Cell "PWM" + Cell "Current" + Cell "Back EMF" + Cell "Torque Constant" + PropName "TypeOptions" + } + Name "controlType" + Prompt "Control Mode" + Value "Current" + Evaluate "off" + Callback "% Get the mask parameter values. This is a cell\n% array of strings.\n\nmaskStr = get_param(" + "gcb,'controlType');\n\nswitch maskStr\n case 'PWM'\n set_param(gcb,'BackgroundColor', '[1, 1, 1, 1.0]" + "');\n case 'Current'\n set_param(gcb,'BackgroundColor', '[0.96, 0.77, 0.46, 1.0]');\n case 'Back E" + "MF'\n set_param(gcb,'BackgroundColor', '[0.8, 0.4, 1.0, 1.0]');\n case 'Torque Constant'\n set" + "_param(gcb,'BackgroundColor', '[0.8, 1.0, 0.4, 1.0]');\n otherwise\n error('Control Type not recogniz" + "ed.')\nend\n\nclear maskStr" + } + Array { + Type "Simulink.dialog.Group" + Dimension 3 + Object { + $ObjectID 47 + Prompt "%" + Object { + $PropName "DialogControls" + $ObjectID 48 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" + } + Name "DescGroupVar" + } + Object { + $ObjectID 49 + Prompt "Simulink:studio:ToolBarParametersMenu" + Object { + $PropName "DialogControls" + $ObjectID 50 + $ClassName "Simulink.dialog.parameter.Popup" + Name "controlType" + } + Name "ParameterGroupVar" + } + Object { + $ObjectID 51 + Object { + $PropName "DialogControls" + $ObjectID 52 + $ClassName "Simulink.dialog.Button" + Prompt "Toggle Config Block Highlighting" + Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(configBl" + "ock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system(confi" + "gBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block name: %s'" + ",gcb,configBlock);\nend\n\nclear configBlock" + Name "toggleHighlighting" + } + Name "ToggleButtonContainer" + } + PropName "DialogControls" } } System { - Name "DampPinv" - Location [0, 29, 1280, 744] + Name "Set Motor References" + Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off SetDomainSpec off @@ -1440,316 +1486,119 @@ Library { TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] TiledPageScale 1 ShowPageBoundaries off - ZoomFactor "100" + ZoomFactor "1000" Block { BlockType Inport - Name "mat" - SID "105" - Position [50, 53, 80, 67] - ZOrder -1 + Name "References" + SID "1794" + Position [55, 48, 85, 62] + ZOrder 24 IconDisplay "Port number" } Block { - BlockType Inport - Name "sigma" - SID "106" - Position [50, 93, 80, 107] - ZOrder -2 - Port "2" - IconDisplay "Port number" + BlockType S-Function + Name "S-Function" + SID "1795" + Ports [1] + Position [125, 39, 185, 71] + ZOrder 19 + FunctionName "BlockFactory" + Parameters "'SetReferences','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,controlType,refSpeed" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off } - Block { - BlockType SubSystem - Name "Damped Pseudo Inverse" - SID "107" - Ports [2, 1] - Position [105, 39, 200, 121] - ZOrder -4 - LibraryVersion "1.32" - ErrorFcn "Stateflow.Translate.translate" - PermitHierarchicalResolution "ExplicitOnly" - TreatAsAtomicUnit on - RequestExecContextInheritance off - SFBlockType "MATLAB Function" - System { - Name "Damped Pseudo Inverse" - Location [12, 45, 1279, 3773] - Open off - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "100" - SIDHighWatermark "1628" - Block { - BlockType Inport - Name "mat" - SID "107::1" - Position [20, 101, 40, 119] - ZOrder -1 - IconDisplay "Port number" - } - Block { - BlockType Inport - Name "sigma" - SID "107::25" - Position [20, 136, 40, 154] - ZOrder 11 - Port "2" - IconDisplay "Port number" - } - Block { - BlockType Demux - Name " Demux " - SID "107::1627" - Ports [1, 1] - Position [270, 230, 320, 270] - ZOrder 107 - Outputs "1" + Line { + ZOrder 1 + SrcBlock "References" + SrcPort 1 + DstBlock "S-Function" + DstPort 1 + } + } + } + Block { + BlockType SubSystem + Name "Set References" + SID "1767" + Ports [1] + Position [605, 210, 680, 260] + ZOrder 43 + BackgroundColor "[0.513700, 0.851000, 0.670600]" + RequestExecContextInheritance off + Object { + $PropName "MaskObject" + $ObjectID 53 + $ClassName "Simulink.Mask" + Type "Set References" + Description "This block sets the references for the robot actuators.\nThe type of control mode is specified " + "as a parameter in the block.\n\nAssuming DoFs is the number of internal degrees of freedom configured in the asso" + "ciated Config block:\n\nInput:\n - References: Vector of size DoFs, representing the references to be sent to th" + "e robot controlled joints.\n - Reference Speed (Position): Set the reference speed in rad/s used by the trajecto" + "ry generator of the IPositionControl interface\n - Reference Acceleration (Velocity): Set the reference speed in" + " rad/s/s used by the trajectory generator of the IVelocityControl interface\n\nParameters:\n - Control Mode: The" + " control mode. Choose one of the supplied mode.\n\nUnit of measurement:\n- Position [rad]\n- Velocity [rad/s]\n- " + "Acceleration [rad/s/s]\n- Torque [Nm]" + Initialization "if (strcmp(controlType,'Position'))\n refTrajectory = refSpeed;\nelseif (strcmp(controlTyp" + "e,'Velocity'))\n refTrajectory = refAcceleration;\nelse\n refTrajectory = 0;\nend\n\n% WBBlock Initializati" + "on\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WBToolbox.BlockInitialization(gcb, gcs" + ");\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear WBTConfig;\ncatch\nend" + Display "disp(get_param(gcb,'controlType'))\n%port_label('input',1,'References')" + RunInitForIconRedraw "off" + Array { + Type "Simulink.MaskParameter" + Dimension 3 + Object { + $ObjectID 54 + Type "popup" + Array { + Type "Cell" + Dimension 4 + Cell "Position" + Cell "Position Direct" + Cell "Velocity" + Cell "Torque" + PropName "TypeOptions" } - Block { - BlockType S-Function - Name " SFunction " - SID "107::1626" - Tag "Stateflow S-Function WBToolboxLibrary_repository 6" - Ports [2, 2] - Position [180, 100, 230, 160] - ZOrder 106 - FunctionName "sf_sfun" - PortCounts "[2 2]" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - Port { - PortNumber 2 - Name "DPinv" - } - } - Block { - BlockType Terminator - Name " Terminator " - SID "107::1628" - Position [460, 241, 480, 259] - ZOrder 108 - } - Block { - BlockType Outport - Name "DPinv" - SID "107::5" - Position [460, 101, 480, 119] - ZOrder -6 - IconDisplay "Port number" - } - Line { - ZOrder 76 - SrcBlock "mat" - SrcPort 1 - Points [120, 0] - DstBlock " SFunction " - DstPort 1 - } - Line { - ZOrder 77 - SrcBlock "sigma" - SrcPort 1 - DstBlock " SFunction " - DstPort 2 - } - Line { - Name "DPinv" - ZOrder 78 - Labels [0, 0] - SrcBlock " SFunction " - SrcPort 2 - DstBlock "DPinv" - DstPort 1 - } - Line { - ZOrder 79 - SrcBlock " Demux " - SrcPort 1 - DstBlock " Terminator " - DstPort 1 - } - Line { - ZOrder 80 - SrcBlock " SFunction " - SrcPort 1 - DstBlock " Demux " - DstPort 1 - } - } - } - Block { - BlockType Outport - Name "DPinv" - SID "108" - Position [225, 73, 255, 87] - ZOrder -5 - IconDisplay "Port number" - } - Line { - ZOrder 1 - SrcBlock "sigma" - SrcPort 1 - DstBlock "Damped Pseudo Inverse" - DstPort 2 - } - Line { - ZOrder 2 - SrcBlock "Damped Pseudo Inverse" - SrcPort 1 - DstBlock "DPinv" - DstPort 1 - } - Line { - ZOrder 3 - SrcBlock "mat" - SrcPort 1 - DstBlock "Damped Pseudo Inverse" - DstPort 1 - } - } - } - Block { - BlockType S-Function - Name "DiscreteFilter" - SID "1790" - Ports [1, 1] - Position [165, 310, 235, 340] - ZOrder 103 - BackgroundColor "yellow" - FunctionName "WBToolbox" - Parameters "'DiscreteFilter','WBToolboxLibrary',filterDataStruct" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - Object { - $PropName "MaskObject" - $ObjectID 46 - $ClassName "Simulink.Mask" - Type "Discrete Filter" - Description "This block wraps the Filter, FirstOrderLowPassFilter, and MedianFilter from iCub::ctrl." - Initialization "filterDataStruct = struct;\nfilterDataStruct.Fc = Fc;\nfilterDataStruct.Ts = Ts;\nfilterDataS" - "truct.MedianOrder = orderMedianFilter;\nfilterDataStruct.FilterType = filterType;\nfilterDataStruct.NumCoeffs = n" - "umCoeffs;\nfilterDataStruct.DenCoeffs = denCoeffs;\nfilterDataStruct.y0 = y0;\nfilterDataStruct.u0 = u0;\nfilterD" - "ataStruct.InitStatus = uint8(initStatus);" - Display "disp('Filter')" - RunInitForIconRedraw "off" - Array { - Type "Simulink.MaskParameter" - Dimension 9 - Object { - $ObjectID 47 - Type "popup" - Array { - Type "Cell" - Dimension 3 - Cell "Generic" - Cell "FirstOrderLowPassFilter" - Cell "MedianFilter" - PropName "TypeOptions" - } - Name "filterType" - Prompt "Type of the filter" - Value "Generic" + Name "controlType" + Prompt "Control Mode" + Value "Position" Evaluate "off" - Callback "% From: https://it.mathworks.com/help/simulink/slref/simulink.mask-class.html\nfilterType = get_param(gcb" - ", 'filterType');\ninitStatus = get_param(gcb, 'initStatus');\np = Simulink.Mask.get(gcbh);\nhowToCoeffs = p.getDialo" - "gControl('howToCoeffs');\n\n%set_param(gcb, 'initStatus','off');\nif (strcmp(initStatus,'on'))\n vis_init = 'on';" - "\nelse\n vis_init = 'off';\nend\n\nif(strcmp(filterType, 'Generic'))\n set_param(gcb, 'MaskVisibilities',{'on'" - ",'on','on','off','off','off','on',vis_init,vis_init});\n howToCoeffs.Visible = 'on';\nelseif(strcmp(filterType, '" - "FirstOrderLowPassFilter'))\n set_param(gcb, 'MaskVisibilities',{'on','off','off','on','on','off','on',vis_init,'o" - "ff'});\n howToCoeffs.Visible = 'off';\nelseif(strcmp(filterType, 'MedianFilter'))\n set_param(gcb, 'MaskVisibi" - "lities',{'on','off','off','off','off','on','on',vis_init,'off'});\n howToCoeffs.Visible = 'off';\nend\n\nclear fi" - "lterType initStatus p howToCoeffs vis_init;" - } - Object { - $ObjectID 48 - Type "edit" - Name "numCoeffs" - Prompt "Numerator Coefficients*" - Value "[0]" - } - Object { - $ObjectID 49 - Type "edit" - Name "denCoeffs" - Prompt "Denominator Coefficients*" - Value "[0]" - } - Object { - $ObjectID 50 - Type "edit" - Name "Fc" - Prompt "Cut Frequency (Hz)" - Value "0" - Visible "off" - } - Object { - $ObjectID 51 - Type "edit" - Name "Ts" - Prompt "Sampling time (s)" - Value "0" - Visible "off" - } - Object { - $ObjectID 52 - Type "edit" - Name "orderMedianFilter" - Prompt "Order" - Value "0" - Visible "off" - } - Object { - $ObjectID 53 - Type "checkbox" - Name "initStatus" - Prompt "Define initial conditions" - Value "off" - Callback "initStatus = get_param(gcb, 'initStatus');\nvisibilities = get_param(gcb, 'MaskVisibilities');\nfilterT" - "ype = get_param(gcb, 'filterType');\n\nif (strcmp(initStatus,'off'))\n visibilities{8} = 'off';\n visibiliti" - "es{9} = 'off';\nelseif (strcmp(initStatus,'on'))\n visibilities{8} = 'on';\n if (strcmp(filterType,'Generic'))" - "\n visibilities{9} = 'on';\n end\nend\n\nset_param(gcb, 'MaskVisibilities', visibilities);\n\nclear initSt" - "atus visibilities filterType;" + Callback "% Get the mask parameter values. This is a cell\n% array of strings.\n\nmaskStr = get_param(gcb,'contro" + "lType');\n\nswitch maskStr\n case 'Position'\n set_param(gcb,'BackgroundColor', '[0.5137, 0.8510, 0.6706, " + "1.0]');\n set_param(gcb,'MaskVisibilities', {'on';'on';'off'});\n case 'Position Direct'\n set_para" + "m(gcb,'BackgroundColor', '[0.3922, 0.7882, 0.3451, 1.0]');\n set_param(gcb,'MaskVisibilities', {'on';'off';'o" + "ff'});\n case 'Velocity'\n set_param(gcb,'BackgroundColor', '[0.5137, 0.6745, 1.0000, 1.0]');\n set" + "_param(gcb,'MaskVisibilities', {'on';'off';'on'});\n case 'Torque'\n set_param(gcb,'BackgroundColor', '[0." + "8275, 0.5765, 0.6039, 1.0]');\n set_param(gcb,'MaskVisibilities', {'on';'off';'off'});\n otherwise\n " + " error('Control Type not recognized.')\nend\n\nclear maskStr" } Object { - $ObjectID 54 + $ObjectID 55 Type "edit" - Name "y0" - Prompt "Output y0" - Value "[0]" - Visible "off" + Name "refSpeed" + Prompt "Reference Speed" + Value "10*(pi/180)" } Object { - $ObjectID 55 + $ObjectID 56 Type "edit" - Name "u0" - Prompt "Input u0" - Value "[0]" + Name "refAcceleration" + Prompt "Reference Velocity" + Value "1000000*(pi/180)" Visible "off" } PropName "Parameters" } Array { Type "Simulink.dialog.Group" - Dimension 2 + Dimension 3 Object { - $ObjectID 56 + $ObjectID 57 Prompt "%" Object { $PropName "DialogControls" - $ObjectID 57 + $ObjectID 58 $ClassName "Simulink.dialog.Text" Prompt "%" Name "DescTextVar" @@ -1757,107 +1606,53 @@ Library { Name "DescGroupVar" } Object { - $ObjectID 58 + $ObjectID 59 Prompt "Simulink:studio:ToolBarParametersMenu" Array { - Type "Simulink.dialog.Control" - Dimension 8 - Object { - $ObjectID 59 - $ClassName "Simulink.dialog.parameter.Popup" - Name "filterType" - } + Type "Simulink.dialog.parameter.Control" + Dimension 3 Object { $ObjectID 60 - $ClassName "Simulink.dialog.parameter.Edit" - Name "numCoeffs" + $ClassName "Simulink.dialog.parameter.Popup" + Name "controlType" } Object { $ObjectID 61 $ClassName "Simulink.dialog.parameter.Edit" - Name "denCoeffs" - } - Object { - $ObjectID 62 - $ClassName "Simulink.dialog.Text" - Prompt "* The coefficients are ordered in increasing power of z^-1" - Name "howToCoeffs" - } - Object { - $ObjectID 63 - $ClassName "Simulink.dialog.parameter.Edit" - PromptLocation "left" - Name "Fc" - } - Object { - $ObjectID 64 - $ClassName "Simulink.dialog.parameter.Edit" PromptLocation "left" - Name "Ts" + Name "refSpeed" } Object { - $ObjectID 65 + $ObjectID 62 $ClassName "Simulink.dialog.parameter.Edit" PromptLocation "left" - Name "orderMedianFilter" - } - Object { - $ObjectID 66 - $ClassName "Simulink.dialog.Group" - Array { - Type "Simulink.dialog.parameter.Control" - Dimension 3 - Object { - $ObjectID 67 - $ClassName "Simulink.dialog.parameter.CheckBox" - Name "initStatus" - } - Object { - $ObjectID 68 - $ClassName "Simulink.dialog.parameter.Edit" - Name "y0" - } - Object { - $ObjectID 69 - $ClassName "Simulink.dialog.parameter.Edit" - Name "u0" - } - PropName "DialogControls" - } - Name "Container3" + Name "refAcceleration" } PropName "DialogControls" } Name "ParameterGroupVar" } + Object { + $ObjectID 63 + Object { + $PropName "DialogControls" + $ObjectID 64 + $ClassName "Simulink.dialog.Button" + Prompt "Toggle Config Block Highlighting" + Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(configBl" + "ock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system(confi" + "gBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block name: %s'" + ",gcb,configBlock);\nend\n\nclear configBlock" + Name "toggleHighlighting" + } + Name "ToggleButtonContainer" + } PropName "DialogControls" } } - } - Block { - BlockType SubSystem - Name "Match Signal Sizes" - SID "1818" - Ports [2, 1] - Position [440, 297, 525, 353] - ZOrder 251 - RequestExecContextInheritance off - Object { - $PropName "MaskObject" - $ObjectID 70 - $ClassName "Simulink.Mask" - Type "Match Signal Sizes" - Description "It can happen on particular cases that the Simulink engine cannot propagate the right sizes fro" - "m blocks of the toolbox. If you encounter such problems you can try using this blocks which introducing a minimal" - " overhead assigns to input Signal the same size of input Reference and outputs Signal.\n\nCurrently it supports o" - "nly 1D vectors." - Display "port_label('input', 1, 'Reference')\nport_label('input', 2, 'Signal')\nport_label('output', 1, 'Sig" - "nal')" - RunInitForIconRedraw "off" - } System { - Name "Match Signal Sizes" - Location [548, 183, 3416, 1872] + Name "Set References" + Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off SetDomainSpec off @@ -1875,578 +1670,548 @@ Library { ZoomFactor "1000" Block { BlockType Inport - Name "Reference" - SID "1819" - Position [315, 178, 345, 192] - ZOrder 240 - NamePlacement "alternate" - IconDisplay "Port number" - } - Block { - BlockType Inport - Name "Signal" - SID "1820" - Position [315, 198, 345, 212] - ZOrder 241 - Port "2" + Name "References" + SID "1768" + Position [55, 48, 85, 62] + ZOrder 24 IconDisplay "Port number" } Block { - BlockType DotProduct - Name "Dot Product" - SID "1836" - Position [410, 177, 445, 213] - ZOrder 252 - OutDataTypeStr "Inherit: Inherit via internal rule" - } - Block { - BlockType Terminator - Name "Terminator" - SID "1822" - Position [485, 185, 505, 205] - ZOrder 245 - } - Block { - BlockType Outport - Name "Output" - SID "1823" - Position [410, 243, 440, 257] - ZOrder 244 - IconDisplay "Port number" - } - Line { - ZOrder 27 - SrcBlock "Dot Product" - SrcPort 1 - DstBlock "Terminator" - DstPort 1 - } - Line { - ZOrder 2 - SrcBlock "Signal" - SrcPort 1 - Points [17, 0] - Branch { - ZOrder 28 - Points [0, 45] - DstBlock "Output" - DstPort 1 - } - Branch { - ZOrder 26 - DstBlock "Dot Product" - DstPort 2 - } + BlockType S-Function + Name "S-Function" + SID "1769" + Ports [1] + Position [125, 39, 185, 71] + ZOrder 19 + FunctionName "BlockFactory" + Parameters "'SetReferences','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,controlType,refTraj" + "ectory" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off } Line { - ZOrder 24 - SrcBlock "Reference" + ZOrder 1 + SrcBlock "References" SrcPort 1 - DstBlock "Dot Product" + DstBlock "S-Function" DstPort 1 } } } + } + } + Block { + BlockType SubSystem + Name "Model" + SID "209" + Ports [] + Position [133, 16, 231, 113] + ZOrder -3 + ForegroundColor "white" + DropShadow on + RequestExecContextInheritance off + Object { + $PropName "MaskObject" + $ObjectID 65 + $ClassName "Simulink.Mask" + Display "image(imread('wholeBodyModel.png'),'center')" + } + System { + Name "Model" + Location [0, 27, 1920, 1080] + Open off + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "462" Block { - BlockType S-Function - Name "Minimum Jerk Trajectory Generator" - SID "1747" - Ports [1, 3] - Position [470, 93, 625, 147] - ZOrder 78 - FunctionName "WBToolbox" - Parameters "'MinimumJerkTrajectoryGenerator','WBToolboxLibrary',sampleTime,settlingTime,firstDerivatives,secondD" - "erivatives,explicitInitialValue,externalSettlingTime,resetOnSettlingTime" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off + BlockType SubSystem + Name "Dynamics" + SID "369" + Ports [] + Position [364, 21, 471, 128] + ZOrder -1 + DropShadow on + RequestExecContextInheritance off Object { $PropName "MaskObject" - $ObjectID 71 + $ObjectID 66 $ClassName "Simulink.Mask" - Type "Minimum Jerk Trajectory Generator" - Description "This block wraps the minJerkTrajGen class from iCub::ctrl::minJerkTrajGen.\n\nThe Minimum Jerk " - "Trajectory Generator is approximated using a 3rd order LTI dynamical system (for more details see [1]).\n\nPositi" - "on, velocity and acceleration trajectories are computed.\n\nThe main advantage with respect to the standard polyn" - "omial form is that if the reference value yd changes there is no need to recompute the filter coefficients.\n\n[1" - "]\nPattacini, U.; Nori, F.; Natale, L.; Metta, G.; Sandini, G.\n\"An experimental evaluation of a novel minimum-j" - "erk cartesian controller for humanoid robots\"\nIntelligent Robots and Systems (IROS), 2010\nIEEE/RSJ Internation" - "al Conference on , vol., no., pp.1668-1674, 18-22 Oct. 2010\ndoi: 10.1109/IROS.2010.5650851\nURL: http://ieeexplo" - "re.ieee.org/stamp/stamp.jsp?tp=&arnumber=5650851&isnumber=5648787" - Display "firstDer = get_param(gcb, 'firstDerivatives');\nsecondDer = get_param(gcb, 'secondDerivatives');\ni" - "nitialValues = get_param(gcb, 'explicitInitialValue');\nexternalSettlingTimeParam = get_param(gcb, 'externalSettl" - "ingTime');\n\n%Inputs\nportIndex = 2;\nport_label('input', 1, 'Reference')\nif(strcmp(initialValues, 'on'))\n " - "port_label('input', portIndex, 'Initial Value')\n portIndex = portIndex + 1;\nend\n\nif(strcmp(externalSettlin" - "gTimeParam, 'on'))\n port_label('input', portIndex, 'Settling Time')\n portIndex = portIndex + 1;\nend\n\n%" - "Outputs\nport_label('output', 1, 'Signal')\nsecondDerPortIndex = 2;\nif(strcmp(firstDer, 'on'))\n port_label('" - "output', 2, 'First Derivative')\n secondDerPortIndex = secondDerPortIndex + 1;\nend\nif(strcmp(secondDer, 'on'" - "))\n port_label('output', secondDerPortIndex, 'Second Derivative')\nend\n\n\n" - RunInitForIconRedraw "on" - Array { - Type "Simulink.MaskParameter" - Dimension 7 - Object { - $ObjectID 72 - Type "checkbox" - Name "externalSettlingTime" - Prompt "External Settling Time" - Value "off" - Callback "externalSettlingTime = get_param(gcb, 'externalSettlingTime');\nvisibility = get_param(gcb, 'MaskVisibili" - "ties');\nif(strcmp(externalSettlingTime, 'on'))\n visibility{2} = 'off';\n visibility{4} = 'on';\nelse\n vi" - "sibility{2} = 'on';\n visibility{4} = 'off';\nend\nset_param(gcb, 'MaskVisibilities',visibility);\nclear external" - "SettlingTime" - } - Object { - $ObjectID 73 - Type "edit" - Name "settlingTime" - Prompt "Settling Time" - Value "3" - } - Object { - $ObjectID 74 - Type "edit" - Name "sampleTime" - Prompt "Sample Time" - Value "0.01" - } + Display "image(imread('Dynamics.png'))" + } + System { + Name "Dynamics" + Location [0, 27, 1920, 1080] + Open off + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "330" + Block { + BlockType SubSystem + Name "Centroidal Momentum" + SID "1694" + Ports [4, 1] + Position [475, 101, 660, 164] + ZOrder 72 + RequestExecContextInheritance off Object { - $ObjectID 75 - Type "checkbox" - Name "resetOnSettlingTime" - Prompt "Reset on Settling Time Changes" - Value "off" - Visible "off" - } - Object { - $ObjectID 76 - Type "checkbox" - Name "firstDerivatives" - Prompt "Output First Derivative" - Value "on" - } - Object { - $ObjectID 77 - Type "checkbox" - Name "secondDerivatives" - Prompt "Output Second Derivative" - Value "on" - } - Object { - $ObjectID 78 - Type "checkbox" - Name "explicitInitialValue" - Prompt "Explicit Initial Value" - Value "off" - Visible "off" - } - PropName "Parameters" - } - Array { - Type "Simulink.dialog.Group" - Dimension 2 - Object { - $ObjectID 79 - Prompt "%" + $PropName "MaskObject" + $ObjectID 67 + $ClassName "Simulink.Mask" + Type "Centroidal Momentum" + Description "This block computed the 6 element centroidal momentum, as defined in:\n\n\"Centroidal dynamics of a hu" + "manoid robot\" - DE Orin, A Goswami, SH Lee\nAutonomous Robots 35 (2-3), 161-176\n\nAssuming DoFs is the number of i" + "nternal degrees of freedom of the robot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transforma" + "tion between the base frame and the world frame.\n - Joint configuration: Vector of size DoFs, representing the con" + "figuration of the joints.\n - Base velocity: Vector of size 6 representing the linear and angular velocity of the b" + "ase frame.\n - Joints velocity: Vector of size DoFs, representing the velocity of the joints.\n\nOutput:\n - Centr" + "oidal Momentum: 6-element vector containg the centroidal momentum (3 value for linear momentum and 3 for angular mom" + "entum)." + Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" + "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " + "WBTConfig;\ncatch\nend" + RunInitForIconRedraw "off" Object { $PropName "DialogControls" - $ObjectID 80 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" + $ObjectID 68 + $ClassName "Simulink.dialog.Group" + Prompt "%" + Array { + Type "Simulink.dialog.Control" + Dimension 2 + Object { + $ObjectID 69 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" + } + Object { + $ObjectID 70 + $ClassName "Simulink.dialog.Group" + Object { + $PropName "DialogControls" + $ObjectID 71 + $ClassName "Simulink.dialog.Button" + Prompt "Toggle Config Block Highlighting" + Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" + "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" + "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" + "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" + Name "toggleHighlighting" + } + Name "ToggleButtonContainer" + } + PropName "DialogControls" + } + Name "DescGroupVar" + } + } + System { + Name "Centroidal Momentum" + Location [0, 27, 1920, 1080] + Open off + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "480" + Block { + BlockType Inport + Name "Base Pose" + SID "1695" + Position [20, 18, 50, 32] + ZOrder 22 + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "Joint configuration" + SID "1696" + Position [20, 53, 50, 67] + ZOrder 24 + Port "2" + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "Base velocity" + SID "1697" + Position [20, 88, 50, 102] + ZOrder 26 + Port "3" + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "Joints velocity" + SID "1698" + Position [20, 123, 50, 137] + ZOrder 27 + Port "4" + IconDisplay "Port number" + } + Block { + BlockType S-Function + Name "S-Function" + SID "1699" + Ports [4, 1] + Position [180, 11, 255, 144] + ZOrder 19 + FunctionName "BlockFactory" + Parameters "'CentroidalMomentum','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off + } + Block { + BlockType Outport + Name "Centroidal Momentum" + SID "1700" + Position [315, 73, 345, 87] + ZOrder 25 + IconDisplay "Port number" + } + Line { + ZOrder 1 + SrcBlock "S-Function" + SrcPort 1 + DstBlock "Centroidal Momentum" + DstPort 1 + } + Line { + ZOrder 2 + SrcBlock "Base Pose" + SrcPort 1 + DstBlock "S-Function" + DstPort 1 + } + Line { + ZOrder 3 + SrcBlock "Joint configuration" + SrcPort 1 + DstBlock "S-Function" + DstPort 2 + } + Line { + ZOrder 4 + SrcBlock "Base velocity" + SrcPort 1 + DstBlock "S-Function" + DstPort 3 + } + Line { + ZOrder 5 + SrcBlock "Joints velocity" + SrcPort 1 + DstBlock "S-Function" + DstPort 4 } - Name "DescGroupVar" } + } + Block { + BlockType SubSystem + Name "Get Bias Forces" + SID "1724" + Ports [4, 1] + Position [400, 212, 540, 313] + ZOrder 73 + RequestExecContextInheritance off Object { - $ObjectID 81 - Prompt "Simulink:studio:ToolBarParametersMenu" + $PropName "MaskObject" + $ObjectID 72 + $ClassName "Simulink.Mask" + Type "Get Generalized Bias Forces" + Description "This block retrieves the generalied bias forces of the robot.\n\nAssuming DoFs is the number of intern" + "al degrees of freedom of the robot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transformation " + "between the base frame and the world frame.\n - Joint configuration: Vector of size DoFs, representing the configur" + "ation of the joints.\n - Base velocity: Vector of size 6 representing the linear and angular velocity of the base f" + "rame.\n - Joints velocity: Vector of size DoFs, representing the velocity of the joints.\n\nOutput:\n - Bias Force" + "s: a Dofs + 6 vector representing the generalized bias forces of the robot." + Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" + "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " + "WBTConfig;\ncatch\nend" + RunInitForIconRedraw "off" Object { $PropName "DialogControls" - $ObjectID 82 - $ClassName "Simulink.dialog.TabContainer" + $ObjectID 73 + $ClassName "Simulink.dialog.Group" + Prompt "%" Array { - Type "Simulink.dialog.Tab" + Type "Simulink.dialog.Control" Dimension 2 Object { - $ObjectID 83 - Prompt "Trajectory Parameters" - Array { - Type "Simulink.dialog.parameter.Control" - Dimension 4 - Object { - $ObjectID 84 - $ClassName "Simulink.dialog.parameter.CheckBox" - Name "externalSettlingTime" + $ObjectID 74 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" } Object { - $ObjectID 85 - $ClassName "Simulink.dialog.parameter.Edit" - Name "settlingTime" - } + $ObjectID 75 + $ClassName "Simulink.dialog.Group" Object { - $ObjectID 86 - $ClassName "Simulink.dialog.parameter.Edit" - Name "sampleTime" + $PropName "DialogControls" + $ObjectID 76 + $ClassName "Simulink.dialog.Button" + Prompt "Toggle Config Block Highlighting" + Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" + "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" + "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" + "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" + Name "toggleHighlighting" } - Object { - $ObjectID 87 - $ClassName "Simulink.dialog.parameter.CheckBox" - Name "resetOnSettlingTime" + Name "ToggleButtonContainer" } PropName "DialogControls" - } - Name "Tab1" - } - Object { - $ObjectID 88 - Prompt "Input/Output" - Array { - Type "Simulink.dialog.parameter.CheckBox" - Dimension 3 - Object { - $ObjectID 89 - Name "firstDerivatives" - } - Object { - $ObjectID 90 - Name "secondDerivatives" - } + } + Name "DescGroupVar" + } + } + System { + Name "Get Bias Forces" + Location [0, 27, 1920, 1080] + Open off + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "395" + Block { + BlockType Inport + Name "Base Pose" + SID "1776" + Position [10, 38, 40, 52] + ZOrder 22 + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "Joint configuration" + SID "1777" + Position [10, 68, 40, 82] + ZOrder 24 + Port "2" + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "Base velocity" + SID "1778" + Position [10, 98, 40, 112] + ZOrder 26 + Port "3" + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "Joints velocity" + SID "1779" + Position [10, 128, 40, 142] + ZOrder 27 + Port "4" + IconDisplay "Port number" + } + Block { + BlockType Constant + Name "Constant" + SID "1780" + Position [-5, 157, 50, 173] + ZOrder 30 + ShowName off + Value "zeros(6,1)" + } + Block { + BlockType Gain + Name "Gain" + SID "1781" + Position [110, 180, 140, 210] + ZOrder 31 + ShowName off + Gain "0" + ParamDataTypeStr "Inherit: Inherit via internal rule" + OutDataTypeStr "Inherit: Inherit via internal rule" + SaturateOnIntegerOverflow off + } + Block { + BlockType S-Function + Name "S-Function" + SID "1782" + Ports [6, 1] + Position [180, 24, 240, 216] + ZOrder 19 + FunctionName "BlockFactory" + Parameters "'InverseDynamics','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off + } + Block { + BlockType Outport + Name "Bias Forces" + SID "1783" + Position [300, 113, 330, 127] + ZOrder 25 + IconDisplay "Port number" + } + Line { + ZOrder 1 + SrcBlock "S-Function" + SrcPort 1 + DstBlock "Bias Forces" + DstPort 1 + } + Line { + ZOrder 2 + SrcBlock "Base Pose" + SrcPort 1 + DstBlock "S-Function" + DstPort 1 + } + Line { + ZOrder 3 + SrcBlock "Joint configuration" + SrcPort 1 + DstBlock "S-Function" + DstPort 2 + } + Line { + ZOrder 4 + SrcBlock "Base velocity" + SrcPort 1 + DstBlock "S-Function" + DstPort 3 + } + Line { + ZOrder 5 + SrcBlock "Joints velocity" + SrcPort 1 + Points [44, 0] + Branch { + ZOrder 11 + Points [0, 60] + DstBlock "Gain" + DstPort 1 + } + Branch { + ZOrder 10 + DstBlock "S-Function" + DstPort 4 + } + } + Line { + ZOrder 8 + SrcBlock "Constant" + SrcPort 1 + DstBlock "S-Function" + DstPort 5 + } + Line { + ZOrder 9 + SrcBlock "Gain" + SrcPort 1 + DstBlock "S-Function" + DstPort 6 + } + } + } + Block { + BlockType SubSystem + Name "Get Gravity Forces" + SID "1733" + Ports [2, 1] + Position [600, 210, 740, 310] + ZOrder 74 + RequestExecContextInheritance off + Object { + $PropName "MaskObject" + $ObjectID 77 + $ClassName "Simulink.Mask" + Type "Gravity bias" + Description "This block compute the generalized bias forces due to the gravity\n\nAssuming DoFs is the number of in" + "ternal degrees of freedom of the robot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transformat" + "ion between the base frame and the world frame.\n - Joint configuration: Vector of size DoFs, representing the conf" + "iguration of the joints.\n\nOutput:\n - Gravity: a DoFs + 6 vector representing the torques due to the gravity." + Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" + "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " + "WBTConfig;\ncatch\nend" + RunInitForIconRedraw "off" + Object { + $PropName "DialogControls" + $ObjectID 78 + $ClassName "Simulink.dialog.Group" + Prompt "%" + Array { + Type "Simulink.dialog.Control" + Dimension 2 Object { - $ObjectID 91 - Name "explicitInitialValue" + $ObjectID 79 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" } - PropName "DialogControls" + Object { + $ObjectID 80 + $ClassName "Simulink.dialog.Group" + Object { + $PropName "DialogControls" + $ObjectID 81 + $ClassName "Simulink.dialog.Button" + Prompt "Toggle Config Block Highlighting" + Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" + "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" + "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" + "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" + Name "toggleHighlighting" } - Name "Tab2" + Name "ToggleButtonContainer" } PropName "DialogControls" } - Name "Container3" + Name "DescGroupVar" } - Name "ParameterGroupVar" - } - PropName "DialogControls" - } - } - } - Block { - BlockType S-Function - Name "QP" - SID "1807" - Ports [4, 2] - Position [405, -6, 595, 66] - ZOrder 104 - FunctionName "WBToolbox" - Parameters "'QpOases','WBToolboxLibrary',lbA,ubA,lb,ub,computeObjVal,stopIfFails" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - Object { - $PropName "MaskObject" - $ObjectID 92 - $ClassName "Simulink.Mask" - Type "QP" - Description "This block solves a QP problem using the qpOASES library:\n\nx = argmin 0.5 * x' * H * x + c' *" - " x\n\ns.t.\n\nlbA <= Ax <= ubA\nlb <= x <= ub \n" - Display "disp('QP')\n\nport_label('output', 1, 'PrimalSolution')\nport_label('output', 2, 'Status')\n\nif (c" - "omputeObjVal)\n port_label('output', 3, 'Obj func value')\nend\n\nport_label('input', 1, 'H');\nport_label('in" - "put', 2, 'g');\n\ninputPortNumber = 2;\n\nif (lbA || ubA)\n inputPortNumber = 3;\n port_label('input', 3, '" - "A');\nend\n\nif (lbA)\n inputPortNumber = inputPortNumber + 1;\n port_label('input', inputPortNumber, 'lbA'" - ");\nend\nif (ubA)\n inputPortNumber = inputPortNumber + 1;\n port_label('input', inputPortNumber, 'ubA');\n" - "end\nif (lb)\n inputPortNumber = inputPortNumber + 1;\n port_label('input', inputPortNumber, 'lb');\nend\ni" - "f (ub)\n inputPortNumber = inputPortNumber + 1;\n port_label('input', inputPortNumber, 'ub');\nend" - RunInitForIconRedraw "on" - Array { - Type "Simulink.MaskParameter" - Dimension 6 - Object { - $ObjectID 93 - Type "checkbox" - Name "lbA" - Prompt "Accept constraints lower bound input (lbA)" - Value "off" - } - Object { - $ObjectID 94 - Type "checkbox" - Name "ubA" - Prompt "Accept constraints upper bound input (ubA)" - Value "on" } - Object { - $ObjectID 95 - Type "checkbox" - Name "lb" - Prompt "Accept lower bound input (lb)" - Value "off" - } - Object { - $ObjectID 96 - Type "checkbox" - Name "ub" - Prompt "Accept upper bound input (ub)" - Value "off" - } - Object { - $ObjectID 97 - Type "checkbox" - Name "computeObjVal" - Prompt "Output the value of the objective function" - Value "off" - } - Object { - $ObjectID 98 - Type "checkbox" - Name "stopIfFails" - Prompt "Stop the simulation if the solver fails" - Value "off" - } - PropName "Parameters" - } - Array { - Type "Simulink.dialog.Group" - Dimension 2 - Object { - $ObjectID 99 - Prompt "%" - Object { - $PropName "DialogControls" - $ObjectID 100 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" - } - Name "DescGroupVar" - } - Object { - $ObjectID 101 - Prompt "Simulink:studio:ToolBarParametersMenu" - Array { - Type "Simulink.dialog.Group" - Dimension 3 - Object { - $ObjectID 102 - Prompt "Constraints bounds" - Array { - Type "Simulink.dialog.parameter.CheckBox" - Dimension 2 - Object { - $ObjectID 103 - Name "lbA" - } - Object { - $ObjectID 104 - Name "ubA" - } - PropName "DialogControls" - } - Name "constraintsBoundsBox" - } - Object { - $ObjectID 105 - Prompt "Simple bounds" - Array { - Type "Simulink.dialog.parameter.CheckBox" - Dimension 2 - Object { - $ObjectID 106 - Name "lb" - } - Object { - $ObjectID 107 - Name "ub" - } - PropName "DialogControls" - } - Name "simpleBoundsBox" - } - Object { - $ObjectID 108 - Prompt "Other" - Array { - Type "Simulink.dialog.parameter.CheckBox" - Dimension 2 - Object { - $ObjectID 109 - Name "computeObjVal" - } - Object { - $ObjectID 110 - Name "stopIfFails" - } - PropName "DialogControls" - } - Name "otherBox" - } - PropName "DialogControls" - } - Name "ParameterGroupVar" - } - PropName "DialogControls" - } - } - } - Block { - BlockType S-Function - Name "Real Time Synchronizer" - SID "1657" - Ports [] - Position [70, 4, 195, 41] - ZOrder 23 - ForegroundColor "[0.917647, 0.917647, 0.917647]" - BackgroundColor "gray" - ShowName off - FunctionName "WBToolbox" - Parameters "'RealTimeSynchronizer','WBToolboxLibrary',period" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - Object { - $PropName "MaskObject" - $ObjectID 111 - $ClassName "Simulink.Mask" - Type "Real Time Synchronizer" - Description "This block slows down the simulation trying to match the period specified \nas parameter (in se" - "conds).\nThe bigger the period the more probable \nis that Simulink can remain synched with it.\n" - Display "disp('Real Time Synchronizer')" - RunInitForIconRedraw "off" - Object { - $PropName "Parameters" - $ObjectID 112 - $ClassName "Simulink.MaskParameter" - Type "edit" - Name "period" - Prompt "Controller Period (in seconds)" - Value "0.01" - } - } - } - Block { - BlockType S-Function - Name "Simulator Synchronizer" - SID "1658" - Ports [] - Position [230, 4, 360, 41] - ZOrder 24 - ForegroundColor "[0.490196, 0.000000, 0.000000]" - ShowName off - FunctionName "WBToolbox" - Parameters "'SimulatorSynchronizer','WBToolboxLibrary',period, serverPortName, clientPortName" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - Object { - $PropName "MaskObject" - $ObjectID 113 - $ClassName "Simulink.Mask" - Type "Simulator Synchronizer" - Description "This block synchronizes with the external simulation on a simulator \n(only Gazebo is supported" - " at the moment).\n\n" - Display "disp('Simulator Synchronizer')" - RunInitForIconRedraw "off" - Array { - Type "Simulink.MaskParameter" - Dimension 3 - Object { - $ObjectID 114 - Type "edit" - Name "period" - Prompt "Controller Period (in seconds)" - Value "0.01" - } - Object { - $ObjectID 115 - Type "edit" - Name "serverPortName" - Prompt "Server Port Name" - Value "'/clock/rpc'" - } - Object { - $ObjectID 116 - Type "edit" - Name "clientPortName" - Prompt "Client Port Name" - Value "'/WBT_synchronizer/rpc:o'" - } - PropName "Parameters" - } - } - } - Block { - BlockType SubSystem - Name "TruncPinv" - SID "109" - Ports [2, 1] - Position [375, 198, 445, 242] - ZOrder -3 - BackgroundColor "[0.534601, 0.470279, 1.000000]" - RequestExecContextInheritance off - Object { - $PropName "MaskObject" - $ObjectID 117 - $ClassName "Simulink.Mask" - RunInitForIconRedraw "off" - Object { - $PropName "Parameters" - $ObjectID 118 - $ClassName "Simulink.MaskParameter" - Type "edit" - Name "tol" - Prompt "Tolerance" - Value "1e-4" - } - } - System { - Name "TruncPinv" - Location [0, 29, 1280, 744] - Open off - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "100" - Block { - BlockType Inport - Name "S" - SID "110" - Position [50, 53, 80, 67] - ZOrder -1 - IconDisplay "Port number" - } - Block { - BlockType Inport - Name "tol" - SID "111" - Position [50, 93, 80, 107] - ZOrder -2 - Port "2" - IconDisplay "Port number" - } - Block { - BlockType SubSystem - Name "Truncated PseudoInverse" - SID "112" - Ports [2, 1] - Position [105, 39, 200, 121] - ZOrder -4 - LibraryVersion "1.32" - ErrorFcn "Stateflow.Translate.translate" - PermitHierarchicalResolution "ExplicitOnly" - TreatAsAtomicUnit on - RequestExecContextInheritance off - SFBlockType "MATLAB Function" System { - Name "Truncated PseudoInverse" - Location [12, 45, 1279, 3773] + Name "Get Gravity Forces" + Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off SetDomainSpec off @@ -2461,341 +2226,358 @@ Library { TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] TiledPageScale 1 ShowPageBoundaries off - ZoomFactor "100" - SIDHighWatermark "1619" + ZoomFactor "395" Block { BlockType Inport - Name "mat" - SID "112::1" - Position [20, 101, 40, 119] - ZOrder -1 + Name "Base Pose" + SID "1784" + Position [10, 38, 40, 52] + ZOrder 22 IconDisplay "Port number" } Block { BlockType Inport - Name "tol" - SID "112::25" - Position [20, 136, 40, 154] - ZOrder 11 + Name "Joint configuration" + SID "1785" + Position [10, 68, 40, 82] + ZOrder 24 Port "2" IconDisplay "Port number" } Block { - BlockType Demux - Name " Demux " - SID "112::1618" - Ports [1, 1] - Position [270, 230, 320, 270] - ZOrder 107 - Outputs "1" + BlockType Constant + Name "Constant" + SID "1786" + Position [0, 97, 55, 113] + ZOrder 32 + ShowName off + Value "zeros(6,1)" + } + Block { + BlockType Gain + Name "Gain" + SID "1787" + Position [100, 120, 130, 150] + ZOrder 33 + ShowName off + Gain "0" + ParamDataTypeStr "Inherit: Inherit via internal rule" + OutDataTypeStr "Inherit: Inherit via internal rule" + SaturateOnIntegerOverflow off } Block { BlockType S-Function - Name " SFunction " - SID "112::1617" - Tag "Stateflow S-Function WBToolboxLibrary_repository 7" - Ports [2, 2] - Position [180, 100, 230, 160] - ZOrder 106 - FunctionName "sf_sfun" - PortCounts "[2 2]" + Name "S-Function" + SID "1788" + Ports [6, 1] + Position [180, 24, 240, 216] + ZOrder 19 + FunctionName "BlockFactory" + Parameters "'InverseDynamics','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off - Port { - PortNumber 2 - Name "TPinv" - } - } - Block { - BlockType Terminator - Name " Terminator " - SID "112::1619" - Position [460, 241, 480, 259] - ZOrder 108 } Block { BlockType Outport - Name "TPinv" - SID "112::5" - Position [460, 101, 480, 119] - ZOrder -6 + Name "Gravity Torques" + SID "1789" + Position [300, 113, 330, 127] + ZOrder 25 IconDisplay "Port number" } Line { - ZOrder 76 - SrcBlock "mat" + ZOrder 1 + SrcBlock "S-Function" SrcPort 1 - Points [120, 0] - DstBlock " SFunction " + DstBlock "Gravity Torques" DstPort 1 } Line { - ZOrder 77 - SrcBlock "tol" + ZOrder 2 + SrcBlock "Base Pose" SrcPort 1 - DstBlock " SFunction " - DstPort 2 + DstBlock "S-Function" + DstPort 1 } Line { - Name "TPinv" - ZOrder 78 - Labels [0, 0] - SrcBlock " SFunction " - SrcPort 2 - DstBlock "TPinv" - DstPort 1 + ZOrder 3 + SrcBlock "Joint configuration" + SrcPort 1 + Points [41, 0] + Branch { + ZOrder 12 + Points [0, 60] + DstBlock "Gain" + DstPort 1 + } + Branch { + ZOrder 11 + DstBlock "S-Function" + DstPort 2 + } } Line { - ZOrder 79 - SrcBlock " Demux " + ZOrder 8 + SrcBlock "Constant" SrcPort 1 - DstBlock " Terminator " - DstPort 1 + Points [4, 0] + Branch { + ZOrder 10 + Points [0, 60] + DstBlock "S-Function" + DstPort 5 + } + Branch { + ZOrder 9 + DstBlock "S-Function" + DstPort 3 + } } Line { - ZOrder 80 - SrcBlock " SFunction " + ZOrder 13 + SrcBlock "Gain" SrcPort 1 - DstBlock " Demux " - DstPort 1 + Points [13, 0] + Branch { + ZOrder 15 + Points [0, 60] + DstBlock "S-Function" + DstPort 6 + } + Branch { + ZOrder 14 + DstBlock "S-Function" + DstPort 4 + } } } } Block { - BlockType Outport - Name "Tpinv" - SID "113" - Position [225, 73, 255, 87] - ZOrder -5 - IconDisplay "Port number" - } - Line { - ZOrder 1 - SrcBlock "S" - SrcPort 1 - DstBlock "Truncated PseudoInverse" - DstPort 1 - } - Line { - ZOrder 2 - SrcBlock "Truncated PseudoInverse" - SrcPort 1 - DstBlock "Tpinv" - DstPort 1 - } - Line { - ZOrder 3 - SrcBlock "tol" - SrcPort 1 - DstBlock "Truncated PseudoInverse" - DstPort 2 - } - } - } - Block { - BlockType S-Function - Name "Yarp Clock" - SID "1773" - Ports [0, 1] - Position [335, 96, 405, 144] - ZOrder 85 - ForegroundColor "[0.490196, 0.000000, 0.000000]" - FunctionName "WBToolbox" - Parameters "'YarpClock','WBToolboxLibrary'" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - Object { - $PropName "MaskObject" - $ObjectID 119 - $ClassName "Simulink.Mask" - Type "YARP Clock" - Description "This block outputs the current YARP Time.\nIn a nutshell, this block outputs the equivalent of " - "the C++ function call yarp::os::Time::now()" - SelfModifiable "on" - Display "disp('YARP Time')\n" - RunInitForIconRedraw "off" - } - } - Block { - BlockType S-Function - Name "Yarp Read" - SID "1632" - Ports [0, 2] - Position [90, 94, 150, 141] - ZOrder 22 - ForegroundColor "[0.490196, 0.000000, 0.000000]" - FunctionName "WBToolbox" - Parameters "'YarpRead','WBToolboxLibrary',portName,signalSize,blocking,timestamp,autoconnect,errorOnConnection,t" - "imeout" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - Object { - $PropName "MaskObject" - $ObjectID 120 - $ClassName "Simulink.Mask" - Type "YARP Read" - Description "This block behaves as the command 'yarp read'. \n\nBy default it has the option 'Autoconnect' a" - "ctive, which means that the user can only specify the name of the port ('Source Port Name') from which readings a" - "re desired, along with the size of the expected data (e.g. 3 when reading the torso state).\n\nWhen the user unch" - "ecks 'Autoconnect', 'Opened Port Name' field shows up and it corresponds to the name of the port the block will c" - "reate. No autoconnection is performed, and the output will be always zero until the user connects it to some othe" - "r port from command line using 'yarp connect [from] [dest]'.\n\nWhen 'Autoconnect' is off, an additional output c" - "alled 'signal' is added to the block. It outputs 1 if the port has received at least one sample, or 0 otherwise.\n" - Initialization "% Solve error in string parsing. Force the type.\nportName = char(portName);" - SelfModifiable "on" - Display "port_label('output', 1, 'signal');\nportNumber = 1;\nif (timestamp)\n portNumber = portNumber + " - "1;\n port_label('output', portNumber, 'timestamp');\nend\n\nif (~autoconnect)\n portNumber = portNumber + 1" - ";\n port_label('output', portNumber, 'status');\nend\n\n" - RunInitForIconRedraw "on" - Array { - Type "Simulink.MaskParameter" - Dimension 7 - Object { - $ObjectID 121 - Type "edit" - Name "portName" - Prompt "Source Port Name" - Value "'/portname'" - } - Object { - $ObjectID 122 - Type "edit" - Name "signalSize" - Prompt "Port Size" - Value "1" - } + BlockType S-Function + Name "Inverse Dynamics" + SID "1748" + Ports [6, 1] + Position [190, 199, 355, 331] + ZOrder 75 + FunctionName "BlockFactory" + Parameters "'InverseDynamics','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off Object { - $ObjectID 123 - Type "edit" - Name "timeout" - Prompt "Timeout" - Value "0.5" - Visible "off" - } - Object { - $ObjectID 124 - Type "checkbox" - Name "blocking" - Prompt "Blocking Read" - Value "off" - Callback "blocking_val = get_param(gcb, 'blocking');\nmask_visibility = get_param(gcb, 'MaskVisibilities');\n\nif(s" - "trcmp(blocking_val, 'on'))\n mask_visibility{3} = 'on';\n set_param(gcb, 'MaskVisibilities', mask_visibility);" - "\nelse\n mask_visibility{3} = 'off';\n set_param(gcb, 'MaskVisibilities', mask_visibility);\nend\n\nclear bloc" - "king_val mask_visibility" - } - Object { - $ObjectID 125 - Type "checkbox" - Name "timestamp" - Prompt "Read Timestamp" - Value "on" + $PropName "MaskObject" + $ObjectID 82 + $ClassName "Simulink.Mask" + Type "Inverse Dynamics" + Description "This block compute the inverse dynamics of the robot.\n\nAssuming DoFs is the number of internal degre" + "es of freedom of the robot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transformation between " + "the base frame and the world frame.\n - Joint configuration: Vector of size DoFs, representing the configuration of" + " the joints.\n - Base velocity: Vector of size 6 representing the linear and angular velocity of the base frame.\n " + " - Joints velocity: Vector of size DoFs, representing the velocity of the joints.\n - Base acceleration: Vector of " + "size 6 representing the linear and angular acceleration of the base frame.\n - Joints acceleration: Vector of size " + "DoFs, representing the acceleration of the joints.\n\nOutput:\n - Torques: a Dofs + 6 vector representing the corre" + "sponding torques required to achive the desired accelerations given the robot state." + Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" + "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " + "WBTConfig;\ncatch\nend" + Display "port_label('output', 1, 'Torques')\n\nport_label('input', 1, 'Base pose')\nport_label('input', 2, 'Joints" + " configuration')\nport_label('input', 3, 'Base velocity')\nport_label('input', 4, 'Joints velocity')\nport_label('in" + "put', 5, 'Base acceleration')\nport_label('input', 6, 'Joints acceleration')\n" + RunInitForIconRedraw "off" + Object { + $PropName "DialogControls" + $ObjectID 83 + $ClassName "Simulink.dialog.Group" + Prompt "%" + Array { + Type "Simulink.dialog.Control" + Dimension 2 + Object { + $ObjectID 84 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" + } + Object { + $ObjectID 85 + $ClassName "Simulink.dialog.Group" + Object { + $PropName "DialogControls" + $ObjectID 86 + $ClassName "Simulink.dialog.Button" + Prompt "Toggle Config Block Highlighting" + Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" + "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" + "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" + "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" + Name "toggleHighlighting" + } + Name "ToggleButtonContainer" + } + PropName "DialogControls" + } + Name "DescGroupVar" + } } + } + Block { + BlockType SubSystem + Name "Mass Matrix" + SID "1633" + Ports [2, 1] + Position [250, 104, 390, 171] + ZOrder 32 + RequestExecContextInheritance off Object { - $ObjectID 126 - Type "checkbox" - Name "autoconnect" - Prompt "Autoconnect" - Value "on" - Callback "autoconnect_val = get_param(gcb, 'Autoconnect');\nprompt_string = get_param(gcb, 'MaskPrompts');\nmask_vi" - "sibilities = get_param(gcb, 'MaskVisibilities');\n\nif(strcmp(autoconnect_val, 'on'))\n prompt_string{1} = 'Sourc" - "e Port Name';\n mask_visibilities{7} = 'on';\n set_param(gcb, 'MaskVisibilities',mask_visibilities);\nelse\n " - " prompt_string{1} = 'Opened Port Name';\n mask_visibilities{7} = 'off';\n set_param(gcb, 'MaskVisibilities',m" - "ask_visibilities);\nend\nset_param(gcb, 'MaskPrompts', prompt_string);\nclear autoconnect_val prompt_string mask_vis" - "ibilities" + $PropName "MaskObject" + $ObjectID 87 + $ClassName "Simulink.Mask" + Type "Mass Matrix" + Description "This block retrieves the robot mass matrix.\n\nAssuming DoFs is the number of internal degrees of free" + "dom of the robot,\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transformation between the base f" + "rame and the world frame.\n - Joint configuration: Vector of size DoFs, representing the configuration of the joint" + "s.\n\nOutput:\n - Mass Matrix: a (DoFs + 6) x (DoFs + 6) matrix representing the mass matrix of the robot." + Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" + "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " + "WBTConfig;\ncatch\nend" + RunInitForIconRedraw "off" + Object { + $PropName "DialogControls" + $ObjectID 88 + $ClassName "Simulink.dialog.Group" + Prompt "%" + Array { + Type "Simulink.dialog.Control" + Dimension 2 + Object { + $ObjectID 89 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" + } + Object { + $ObjectID 90 + $ClassName "Simulink.dialog.Group" + Object { + $PropName "DialogControls" + $ObjectID 91 + $ClassName "Simulink.dialog.Button" + Prompt "Toggle Config Block Highlighting" + Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" + "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" + "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" + "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" + Name "toggleHighlighting" + } + Name "ToggleButtonContainer" + } + PropName "DialogControls" + } + Name "DescGroupVar" + } } - Object { - $ObjectID 127 - Type "checkbox" - Name "errorOnConnection" - Prompt "Error on missing connection" - Value "on" + System { + Name "Mass Matrix" + Location [0, 27, 1920, 1080] + Open off + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "630" + Block { + BlockType Inport + Name "Base Pose" + SID "1634" + Position [20, 23, 50, 37] + ZOrder 22 + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "Joint configuration" + SID "1635" + Position [20, 63, 50, 77] + ZOrder 24 + Port "2" + IconDisplay "Port number" + } + Block { + BlockType S-Function + Name "S-Function" + SID "1636" + Ports [2, 1] + Position [125, 37, 185, 68] + ZOrder 19 + FunctionName "BlockFactory" + Parameters "'MassMatrix','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off + } + Block { + BlockType Outport + Name "Mass Matrix" + SID "1637" + Position [245, 48, 275, 62] + ZOrder 25 + IconDisplay "Port number" + } + Line { + ZOrder 1 + SrcBlock "S-Function" + SrcPort 1 + DstBlock "Mass Matrix" + DstPort 1 + } + Line { + ZOrder 2 + SrcBlock "Base Pose" + SrcPort 1 + Points [36, 0; 0, 15] + DstBlock "S-Function" + DstPort 1 + } + Line { + ZOrder 3 + SrcBlock "Joint configuration" + SrcPort 1 + Points [33, 0; 0, -10] + DstBlock "S-Function" + DstPort 2 + } } - PropName "Parameters" } } } Block { - BlockType S-Function - Name "Yarp Write" - SID "1659" - Ports [1] - Position [230, 96, 290, 144] - ZOrder 27 - ForegroundColor "[0.490196, 0.000000, 0.000000]" - FunctionName "WBToolbox" - Parameters "'YarpWrite','WBToolboxLibrary',portName,autoconnect,errorOnConnection" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off + BlockType SubSystem + Name "Jacobians" + SID "202" + Ports [] + Position [217, 20, 324, 127] + ZOrder -3 + DropShadow on + RequestExecContextInheritance off Object { $PropName "MaskObject" - $ObjectID 128 + $ObjectID 92 $ClassName "Simulink.Mask" - Type "YARP Write" - Description "This block behaves as the command 'yarp write'. \n\nBy default this block opens a port names as" - " the \"Opened Port Name\" parameter\nand stream the input signal to that port.\nIf the option \"Autoconnect\" is " - "specified, the first parameter become the\nname of the target port to which the data will be stramed, \ne.g. like" - " \"yarp write ... /destinationPort\"\n" - SelfModifiable "on" - Display "disp('Yarp Write')" - RunInitForIconRedraw "off" - Array { - Type "Simulink.MaskParameter" - Dimension 3 - Object { - $ObjectID 129 - Type "edit" - Name "portName" - Prompt "Opened Port Name" - Value "'/portname'" - } - Object { - $ObjectID 130 - Type "checkbox" - Name "autoconnect" - Prompt "Autoconnect" - Value "off" - Callback "autoconnect_val = get_param(gcb, 'Autoconnect');\nprompt_string = get_param(gcb, 'MaskPrompts');\nif(strc" - "mp(autoconnect_val, 'on'))\n prompt_string{1} = 'Destination Port Name';\n set_param(gcb, 'MaskVisibilities',{" - "'on';'on';'on'});\nelse\n prompt_string{1} = 'Opened Port Name';\n set_param(gcb, 'MaskVisibilities',{'on';'on" - "';'off'});\nend\nset_param(gcb, 'MaskPrompts', prompt_string);\nclear autoconnect_val prompt_string" - } - Object { - $ObjectID 131 - Type "checkbox" - Name "errorOnConnection" - Prompt "Error on missing connection" - Value "on" - Visible "off" - } - PropName "Parameters" - } - } - } - Block { - BlockType SubSystem - Name "errors" - SID "714" - Ports [2, 2] - Position [245, 198, 305, 242] - ZOrder -9 - BackgroundColor "[0.300000, 0.580000, 1.000000]" - RequestExecContextInheritance off - Object { - $PropName "MaskObject" - $ObjectID 132 - $ClassName "Simulink.Mask" - Type "Errors" - Description "Computes two kinds of errors. The first is just the difference between x\nand y while the secon" - "d is the ratio (x-y)/y." - RunInitForIconRedraw "off" + Display "image(imread('jacobian.png'))" } System { - Name "errors" - Location [0, 29, 1280, 744] + Name "Jacobians" + Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off SetDomainSpec off @@ -2810,137 +2592,390 @@ Library { TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] TiledPageScale 1 ShowPageBoundaries off - ZoomFactor "100" - Block { - BlockType Inport - Name "x" - SID "715" - Position [30, 28, 60, 42] - ZOrder -1 - IconDisplay "Port number" - } + ZoomFactor "480" Block { - BlockType Inport - Name "y" - SID "716" - Position [25, 103, 55, 117] - ZOrder -2 - Port "2" - IconDisplay "Port number" + BlockType SubSystem + Name "DotJ Nu" + SID "1683" + Ports [4, 1] + Position [590, 170, 755, 265] + ZOrder 67 + RequestExecContextInheritance off + Object { + $PropName "MaskObject" + $ObjectID 93 + $ClassName "Simulink.Mask" + Type "DotJ Nu" + Description "This block computes the product between the time derivative of the Jacobian of the specified frame and" + " the state (base and joints) velocity vector.\n\nAssuming DoFs is the number of internal degrees of freedom of the r" + "obot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transformation between the the base frame and" + " the world frame.\n - Joint configuration: Vector of size DoFs, representing the configuration of the joints.\n - " + "Base velocity: Vector of size 6 representing the linear and angular velocity of the base frame.\n - Joints velocity" + ": Vector of size DoFs, representing the velocity of the joints.\n\nOutput:\n - dotJ nu: a 6D vector representing th" + "e product between the time derivative of the Jacobian of the specified frame and the state velocity vector\n\nParame" + "ters:\n - Frame name: the name of the frame. It should be specified in the URDF model." + Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" + "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " + "WBTConfig;\ncatch\nend" + Display "escapedFrameName = strrep(frameName, '_', '\\_');\nport_label('output', 1, strcat('dot J_{',escapedFrameN" + "ame,'} \\nu'), 'texmode','on')\n\nport_label('input', 1, '{}^{world} H_{base}', 'texmode','on')\nport_label('input'," + " 2, 'Joint configuration')\nport_label('input', 3, 'Base velocity')\nport_label('input', 4, 'Joint velocity')\n\ncle" + "ar escapedFrameName;" + RunInitForIconRedraw "on" + Object { + $PropName "Parameters" + $ObjectID 94 + $ClassName "Simulink.MaskParameter" + Type "edit" + Name "frameName" + Prompt "Frame name" + Value "'frame'" + } + Array { + Type "Simulink.dialog.Group" + Dimension 2 + Object { + $ObjectID 95 + Prompt "%" + Object { + $PropName "DialogControls" + $ObjectID 96 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" + } + Name "DescGroupVar" + } + Object { + $ObjectID 97 + Prompt "Simulink:studio:ToolBarParametersMenu" + Array { + Type "Simulink.dialog.Control" + Dimension 2 + Object { + $ObjectID 98 + $ClassName "Simulink.dialog.parameter.Edit" + Name "frameName" + } + Object { + $ObjectID 99 + $ClassName "Simulink.dialog.Group" + Object { + $PropName "DialogControls" + $ObjectID 100 + $ClassName "Simulink.dialog.Button" + Prompt "Toggle Config Block Highlighting" + Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" + "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" + "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" + "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" + Name "toggleHighlighting" + } + Name "ToggleButtonContainer" + } + PropName "DialogControls" + } + Name "ParameterGroupVar" + } + PropName "DialogControls" + } + } + System { + Name "DotJ Nu" + Location [0, 27, 1920, 1080] + Open off + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "595" + Block { + BlockType Inport + Name "Base Pose" + SID "1684" + Position [20, 13, 50, 27] + ZOrder 22 + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "Joint configuration" + SID "1685" + Position [20, 43, 50, 57] + ZOrder 24 + Port "2" + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "Base velocity" + SID "1686" + Position [20, 73, 50, 87] + ZOrder 26 + Port "3" + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "Joints velocity" + SID "1687" + Position [20, 103, 50, 117] + ZOrder 27 + Port "4" + IconDisplay "Port number" + } + Block { + BlockType S-Function + Name "S-Function" + SID "1688" + Ports [4, 1] + Position [125, 4, 190, 126] + ZOrder 19 + FunctionName "BlockFactory" + Parameters "'DotJNu','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,frameName" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off + } + Block { + BlockType Outport + Name "dotJ dotnu" + SID "1689" + Position [245, 58, 275, 72] + ZOrder 25 + IconDisplay "Port number" + } + Line { + ZOrder 1 + SrcBlock "Joint configuration" + SrcPort 1 + DstBlock "S-Function" + DstPort 2 + } + Line { + ZOrder 2 + SrcBlock "Base Pose" + SrcPort 1 + DstBlock "S-Function" + DstPort 1 + } + Line { + ZOrder 3 + SrcBlock "S-Function" + SrcPort 1 + DstBlock "dotJ dotnu" + DstPort 1 + } + Line { + ZOrder 4 + SrcBlock "Base velocity" + SrcPort 1 + DstBlock "S-Function" + DstPort 3 + } + Line { + ZOrder 5 + SrcBlock "Joints velocity" + SrcPort 1 + DstBlock "S-Function" + DstPort 4 + } + } } Block { - BlockType Sum - Name "Add" - SID "717" + BlockType SubSystem + Name "Jacobian" + SID "1663" Ports [2, 1] - Position [95, 27, 125, 58] - ZOrder -3 - Inputs "+-" - InputSameDT off - OutDataTypeStr "Inherit: Inherit via internal rule" - SaturateOnIntegerOverflow off - } - Block { - BlockType Product - Name "Divide" - SID "718" - Ports [2, 1] - Position [165, 37, 195, 68] - ZOrder -4 - Inputs "*/" - InputSameDT off - OutDataTypeStr "Inherit: Inherit via internal rule" - RndMeth "Floor" - SaturateOnIntegerOverflow off - } - Block { - BlockType Outport - Name "x-y" - SID "719" - Position [225, 13, 255, 27] - ZOrder -5 - IconDisplay "Port number" - } - Block { - BlockType Outport - Name "(x-y)./y" - SID "720" - Position [220, 48, 250, 62] - ZOrder -6 - Port "2" - IconDisplay "Port number" - } - Line { - ZOrder 1 - SrcBlock "Add" - SrcPort 1 - Points [10, 0] - Branch { - ZOrder 2 - DstBlock "Divide" - DstPort 1 - } - Branch { - ZOrder 3 - Points [0, -25] - DstBlock "x-y" - DstPort 1 - } - } - Line { - ZOrder 4 - SrcBlock "x" - SrcPort 1 - DstBlock "Add" - DstPort 1 - } - Line { - ZOrder 5 - SrcBlock "y" - SrcPort 1 - Points [15, 0] - Branch { - ZOrder 6 - Points [0, -60] - DstBlock "Add" - DstPort 2 + Position [380, 190, 540, 245] + ZOrder 39 + RequestExecContextInheritance off + Object { + $PropName "MaskObject" + $ObjectID 101 + $ClassName "Simulink.Mask" + Type "Jacobian" + Description "This block retrieves the Jacobian of the specified frame.\n\nAssuming DoFs is the number of internal d" + "egrees of freedom of the robot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transformation betw" + "een the the base frame and the world frame.\n - Joint configuration: Vector of size DoFs, representing the configur" + "ation of the joints.\n\nOutput:\n - Jacobian: a 6x6+dofs matrix representing the Jacobian of the specified frame wr" + "itten in the world frame.\n\nParameters:\n - Frame name: the name of the frame. It should be specified in the URDF " + "model." + Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" + "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " + "WBTConfig;\ncatch\nend" + Display "escapedFrameName = strrep(frameName, '_', '\\_');\nport_label('output', 1, strcat('{}^{world} J_{',escape" + "dFrameName,'}'), 'texmode','on')\n\nport_label('input', 1, '{}^{world} H_{base}', 'texmode','on')\nport_label('input" + "', 2, 'Joint configuration')\n\nclear escapedFrameName;" + RunInitForIconRedraw "on" + Object { + $PropName "Parameters" + $ObjectID 102 + $ClassName "Simulink.MaskParameter" + Type "edit" + Name "frameName" + Prompt "Frame name" + Value "'frame'" + } + Array { + Type "Simulink.dialog.Group" + Dimension 2 + Object { + $ObjectID 103 + Prompt "%" + Object { + $PropName "DialogControls" + $ObjectID 104 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" + } + Name "DescGroupVar" + } + Object { + $ObjectID 105 + Prompt "Simulink:studio:ToolBarParametersMenu" + Array { + Type "Simulink.dialog.Control" + Dimension 2 + Object { + $ObjectID 106 + $ClassName "Simulink.dialog.parameter.Edit" + Name "frameName" + } + Object { + $ObjectID 107 + $ClassName "Simulink.dialog.Group" + Object { + $PropName "DialogControls" + $ObjectID 108 + $ClassName "Simulink.dialog.Button" + Prompt "Toggle Config Block Highlighting" + Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" + "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" + "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" + "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" + Name "toggleHighlighting" + } + Name "ToggleButtonContainer" + } + PropName "DialogControls" + } + Name "ParameterGroupVar" + } + PropName "DialogControls" + } } - Branch { - ZOrder 7 - Points [60, 0; 0, -50] - DstBlock "Divide" - DstPort 2 + System { + Name "Jacobian" + Location [0, 27, 1920, 1080] + Open off + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "595" + Block { + BlockType Inport + Name "Base Pose" + SID "1664" + Position [20, 23, 50, 37] + ZOrder 22 + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "Joint configuration" + SID "1665" + Position [20, 63, 50, 77] + ZOrder 24 + Port "2" + IconDisplay "Port number" + } + Block { + BlockType S-Function + Name "S-Function" + SID "1666" + Ports [2, 1] + Position [125, 37, 185, 68] + ZOrder 19 + FunctionName "BlockFactory" + Parameters "'Jacobian','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,frameName" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off + } + Block { + BlockType Outport + Name "Forward Kinematics" + SID "1667" + Position [245, 48, 275, 62] + ZOrder 25 + IconDisplay "Port number" + } + Line { + ZOrder 1 + SrcBlock "S-Function" + SrcPort 1 + DstBlock "Forward Kinematics" + DstPort 1 + } + Line { + ZOrder 2 + SrcBlock "Base Pose" + SrcPort 1 + Points [36, 0; 0, 15] + DstBlock "S-Function" + DstPort 1 + } + Line { + ZOrder 3 + SrcBlock "Joint configuration" + SrcPort 1 + Points [33, 0; 0, -10] + DstBlock "S-Function" + DstPort 2 + } } } - Line { - ZOrder 8 - SrcBlock "Divide" - SrcPort 1 - DstBlock "(x-y)./y" - DstPort 1 - } } } Block { BlockType SubSystem - Name "holder\n" - SID "1296" - Ports [1, 1] - Position [115, 197, 175, 243] - ZOrder 14 - BackgroundColor "[0.537255, 0.721569, 1.000000]" + Name "Kinematics" + SID "176" + Ports [] + Position [70, 20, 177, 127] + ZOrder -17 + DropShadow on RequestExecContextInheritance off Object { $PropName "MaskObject" - $ObjectID 133 + $ObjectID 109 $ClassName "Simulink.Mask" - Type "Holder" - Description "This block holds the first input value during the simulation." - RunInitForIconRedraw "off" + Display "image(imread('forwardKinematics.png'))" } System { - Name "holder\n" - Location [12, 45, 1340, 980] + Name "Kinematics" + Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off SetDomainSpec off @@ -2955,56 +2990,94 @@ Library { TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] TiledPageScale 1 ShowPageBoundaries off - ZoomFactor "100" - Block { - BlockType Inport - Name "s" - SID "1297" - Position [145, 43, 175, 57] - ZOrder 13 - IconDisplay "Port number" - } - Block { - BlockType Clock - Name "Clock" - SID "1298" - Position [45, 65, 65, 85] - ZOrder 11 - } - Block { - BlockType Reference - Name "Compare\nTo Constant" - SID "1299" - Ports [1, 1] - Position [90, 60, 120, 90] - ZOrder 10 - LibraryVersion "1.441" - SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Constant" - SourceType "Compare To Constant" - SourceProductName "Simulink" - SourceProductBaseCode "SL" - ContentPreviewEnabled off - relop "==" - const "0" - OutDataTypeStr "boolean" - ZeroCross on - } + ZoomFactor "469" Block { BlockType SubSystem - Name "MATLAB Function" - SID "1300" + Name "Forward Kinematics" + SID "1647" Ports [2, 1] - Position [235, 37, 305, 88] - ZOrder 15 - LibraryVersion "1.32" - ErrorFcn "Stateflow.Translate.translate" - PermitHierarchicalResolution "ExplicitOnly" - TreatAsAtomicUnit on + Position [360, 103, 510, 167] + ZOrder 34 RequestExecContextInheritance off - SFBlockType "MATLAB Function" + Object { + $PropName "MaskObject" + $ObjectID 110 + $ClassName "Simulink.Mask" + Type "Forward Kinematics" + Description "This block retrieves the forward kinematics of the specified frame.\n\nAssuming DoFs is the number of " + "internal degrees of freedom of the robot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transform" + "ation between the the base frame and the world frame.\n - Joint configuration: Vector of size DoFs, representing th" + "e configuration of the joints.\n\nOutput:\n - Forward Kinematics: a 4x4 matrix representing the homogenous transfor" + "mation between the specified frame and the world frame.\n\nParameters:\n - Frame name: the name of the frame. It sh" + "ould be specified in the URDF model." + Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" + "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " + "WBTConfig;\ncatch\nend" + Display "escapedFrameName = strrep(frameName, '_', '\\_');\n% port_label('output', 1, strcat('{}^{world} H_{',esca" + "pedFrameName,'}'), 'texmode','on')\n\nport_label('input', 1, '{}^{world} H_{base}', 'texmode','on')\nport_label('inp" + "ut', 2, 'Joint configuration')\n\nclear escapedFrameName;" + RunInitForIconRedraw "on" + Object { + $PropName "Parameters" + $ObjectID 111 + $ClassName "Simulink.MaskParameter" + Type "edit" + Name "frameName" + Prompt "Frame name" + Value "'frame'" + } + Array { + Type "Simulink.dialog.Group" + Dimension 2 + Object { + $ObjectID 112 + Prompt "%" + Object { + $PropName "DialogControls" + $ObjectID 113 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" + } + Name "DescGroupVar" + } + Object { + $ObjectID 114 + Prompt "Simulink:studio:ToolBarParametersMenu" + Array { + Type "Simulink.dialog.Control" + Dimension 2 + Object { + $ObjectID 115 + $ClassName "Simulink.dialog.parameter.Edit" + Name "frameName" + } + Object { + $ObjectID 116 + $ClassName "Simulink.dialog.Group" + Object { + $PropName "DialogControls" + $ObjectID 117 + $ClassName "Simulink.dialog.Button" + Prompt "Toggle Config Block Highlighting" + Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" + "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" + "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" + "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" + Name "toggleHighlighting" + } + Name "ToggleButtonContainer" + } + PropName "DialogControls" + } + Name "ParameterGroupVar" + } + PropName "DialogControls" + } + } System { - Name "MATLAB Function" - Location [12, 45, 1135, 3068] + Name "Forward Kinematics" + Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off SetDomainSpec off @@ -3019,720 +3092,735 @@ Library { TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] TiledPageScale 1 ShowPageBoundaries off - ZoomFactor "100" - SIDHighWatermark "1625" + ZoomFactor "595" Block { BlockType Inport - Name "s" - SID "1300::24" - Position [20, 101, 40, 119] - ZOrder 10 + Name "Base Pose" + SID "1648" + Position [20, 23, 50, 37] + ZOrder 22 IconDisplay "Port number" } Block { BlockType Inport - Name "unused" - SID "1300::26" - Position [20, 136, 40, 154] - ZOrder 12 + Name "Joint configuration" + SID "1649" + Position [20, 63, 50, 77] + ZOrder 24 Port "2" IconDisplay "Port number" } - Block { - BlockType Demux - Name " Demux " - SID "1300::1624" - Ports [1, 1] - Position [270, 230, 320, 270] - ZOrder 95 - Outputs "1" - } Block { BlockType S-Function - Name " SFunction " - SID "1300::1623" - Tag "Stateflow S-Function WBToolboxLibrary_repository 1" - Ports [2, 2] - Position [180, 100, 230, 160] - ZOrder 94 - FunctionName "sf_sfun" - PortCounts "[2 2]" + Name "S-Function" + SID "1650" + Ports [2, 1] + Position [125, 37, 185, 68] + ZOrder 19 + FunctionName "BlockFactory" + Parameters "'ForwardKinematics','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,frameName" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off - Port { - PortNumber 2 - Name "s0" - } - } - Block { - BlockType Terminator - Name " Terminator " - SID "1300::1625" - Position [460, 241, 480, 259] - ZOrder 96 } Block { BlockType Outport - Name "s0" - SID "1300::25" - Position [460, 101, 480, 119] - ZOrder 11 + Name "Forward Kinematics" + SID "1651" + Position [245, 48, 275, 62] + ZOrder 25 IconDisplay "Port number" } Line { - ZOrder 76 - SrcBlock "s" - SrcPort 1 - Points [120, 0] - DstBlock " SFunction " - DstPort 1 - } - Line { - ZOrder 77 - SrcBlock "unused" + ZOrder 1 + SrcBlock "S-Function" SrcPort 1 - DstBlock " SFunction " - DstPort 2 - } - Line { - Name "s0" - ZOrder 78 - Labels [0, 0] - SrcBlock " SFunction " - SrcPort 2 - DstBlock "s0" + DstBlock "Forward Kinematics" DstPort 1 } Line { - ZOrder 79 - SrcBlock " Demux " + ZOrder 2 + SrcBlock "Base Pose" SrcPort 1 - DstBlock " Terminator " + Points [36, 0; 0, 15] + DstBlock "S-Function" DstPort 1 } Line { - ZOrder 80 - SrcBlock " SFunction " + ZOrder 3 + SrcBlock "Joint configuration" SrcPort 1 - DstBlock " Demux " - DstPort 1 + Points [33, 0; 0, -10] + DstBlock "S-Function" + DstPort 2 } } } Block { - BlockType Outport - Name "s(0)" - SID "1301" - Position [330, 58, 360, 72] - ZOrder 14 - IconDisplay "Port number" - } - Line { - ZOrder 1 - SrcBlock "Clock" - SrcPort 1 - DstBlock "Compare\nTo Constant" - DstPort 1 - } - Line { - ZOrder 2 - SrcBlock "MATLAB Function" - SrcPort 1 - DstBlock "s(0)" - DstPort 1 - } - Line { - ZOrder 3 - SrcBlock "s" - SrcPort 1 - DstBlock "MATLAB Function" - DstPort 1 - } - Line { - ZOrder 4 - SrcBlock "Compare\nTo Constant" - SrcPort 1 - DstBlock "MATLAB Function" - DstPort 2 - } - } - } - } - } - Block { - BlockType SubSystem - Name "wholeBodyActuators" - SID "224" - Ports [] - Position [250, 16, 348, 113] - ZOrder -17 - ForegroundColor "white" - DropShadow on - RequestExecContextInheritance off - Object { - $PropName "MaskObject" - $ObjectID 134 - $ClassName "Simulink.Mask" - Display "image(imread('wholeBodyActuators.png'),'center')" - } - System { - Name "wholeBodyActuators" - Location [832, 225, 3700, 1914] - Open on - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "1000" - Block { - BlockType S-Function - Name "Set Motor Parameters" - SID "1847" - Ports [1, 1] - Position [645, 290, 755, 340] - ZOrder 106 - BackgroundColor "[0.513700, 0.851000, 0.670600]" - FunctionName "WBToolbox" - Parameters "'SetMotorParameters','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,readP,readI,readD,pid" - "Type,setKTau,kTau,setBemf,bemf" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - Object { - $PropName "MaskObject" - $ObjectID 135 - $ClassName "Simulink.Mask" - Type "Set Motor Parameters" - Description "This block allows to set motor PIDs and constants such as the motor constant and the back EMF.\n" - "\nThe motor constant and the back EMF are set in the block's mask, and their values are applied during the first " - "simulation loop. The PIDs values are instead set from the input ports.\n\nAll these vectors should have a size eq" - "ual to the number of controlled joints specified in the referred Configuration block.\n\nAt the end of the simula" - "tion, the default values are restored." - Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig" - "] = WBToolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n " - " clear WBTConfig;\ncatch\nend\n\n% The booleans of the checkboxes always create problems\nreadP = uint8(readP);" - "\nreadI = uint8(readI);\nreadD = uint8(readD);" - Display "fprintf('Motor Parameters\\n(%s)',pidType);\n\nnumPorts = 0;\n\nif readP\n numPorts = numPorts +" - " 1;\n port_label('input',numPorts,'P')\nend\n\nif readI\n numPorts = numPorts + 1;\n port_label('input'," - "numPorts,'I')\nend\n\nif readD\n numPorts = numPorts + 1;\n port_label('input',numPorts,'D')\nend\n" - RunInitForIconRedraw "on" - Array { - Type "Simulink.MaskParameter" - Dimension 8 + BlockType SubSystem + Name "Inverse Kinematics" + SID "1754" + Ports [3, 2] + Position [350, 198, 525, 262] + ZOrder 35 + Commented "on" + InitFcn "if ~exist('WBT_robotName','var')\n WBT_robotName = '';\nend\nif ~exist('WBT_modelName','var'" + ")\n WBT_modelName = 'WBT_simulink';\nend\nif ~exist('WBT_wbiFilename','var')\n WBT_wbiFilename = 'yarpWho" + "leBodyInterface.ini';\nend\nif ~exist('WBT_wbiList','var')\n WBT_wbiList = 'ROBOT_TORQUE_CONTROL_JOINTS';\ne" + "nd" + RequestExecContextInheritance off Object { - $ObjectID 136 - Type "popup" + $PropName "MaskObject" + $ObjectID 118 + $ClassName "Simulink.Mask" + Type "Forward Kinematics" + Description "This block retrieves the forward kinematics of the specified frame.\n\nAssuming DoFs is the number of " + "internal degrees of freedom of the robot,\nInput:\n- Base pose: 4x4 matrix representing the homogenous transformatio" + "n between\n the the base frame and the world frame.\n- Joint configuration: Vector of size DoFs, represe" + "nting the configuration \n of the joints.\n\nOutput:\n- Forward Kinematics: a 4x4 matrix repre" + "senting the homogenous transformation between\n the specified frame and the world frame.\n\nParameters:\n" + "- Frame name: the name of the frame. It should be specified in the URDF model.\n\n- Robot Port Name: Name of the por" + "ts opened by the robot. (e.g. icub).\n Set an empty string ('') to use the name specified in the \n" + " Whole Body Interface configuration file.\n- Model Name: Prefix name of the ports opened by the un" + "derlying Whole Body Interface.\n- WBI filename: name of the file containing the configuration of the Whole Body Inte" + "rface\n- WBI List Name: name of the list of joints used to configure the Whole Body Interface\n" + Display "escapedBaseFrameName = strrep(baseFrame, '_', '\\_');\nescapedEndEffFrameName = strrep(endEffFrame, '_', " + "'\\_');\n\n%port_label('output', 1, strcat('{}^{world} H_{',escapedFrameName,'}'), 'texmode','on')\n\n%port_label('i" + "nput', 1, '{}^{world} H_{base}', 'texmode','on')\n%port_label('input', 2, 'Joint configuration')\n\n%clear escapedFr" + "ameName;\n\n\n% if strcmp(robotPart, 'left')\n% prefix = 'l';\n% else\n% prefix = 'r';\n% end\n% \nport_labe" + "l('input', 1, strcat('{}^{',escapedBaseFrameName,'} H_{',escapedEndEffFrameName,'}^d'), 'texmode','on');\n\nport_lab" + "el('input', 2, '{}^{world} H_{base}', 'texmode','on')\nport_label('input', 3, 'q_j', 'texmode','on');\n% \n% \nport_" + "label('output', 1, '{}^{world} H_{base}^d', 'texmode','on')\nport_label('output', 2, 'q_j^d', 'texmode','on');\n\n" + RunInitForIconRedraw "on" Array { - Type "Cell" - Dimension 2 - Cell "Position" - Cell "Torque" - PropName "TypeOptions" - } - Name "pidType" - Prompt "PID Type" - Value "Position" - Evaluate "off" - Callback "% Get the mask parameter values. This is a cell\n% array of strings.\nmaskStr = get_param(gcb,'pidType'" - ");\n\nswitch maskStr\n case 'Position'\n set_param(gcb,'BackgroundColor', '[0.5137, 0.8510, 0.6706, 1.0]')" - ";\n case 'Position Direct'\n set_param(gcb,'BackgroundColor', '[0.3922, 0.7882, 0.3451, 1.0]');\n case " - "'Velocity'\n set_param(gcb,'BackgroundColor', '[0.5137, 0.6745, 1.0000, 1.0]');\n case 'Torque'\n s" - "et_param(gcb,'BackgroundColor', '[0.8275, 0.5765, 0.6039, 1.0]');\n otherwise\n error('PID Type not recogn" - "ized');\nend\n\nclear maskStr" - } - Object { - $ObjectID 137 - Type "checkbox" - Name "readP" - Prompt "Enable P gains input signal" - Value "on" - } - Object { - $ObjectID 138 - Type "checkbox" - Name "readI" - Prompt "Enable I gains input signal" - Value "off" - } - Object { - $ObjectID 139 - Type "checkbox" - Name "readD" - Prompt "Enable D gains input signal" - Value "off" - } - Object { - $ObjectID 140 - Type "checkbox" - Name "setKTau" - Prompt "Set motor constant KTau" - Value "off" - Callback "h = Simulink.Mask.get(gcb);\nsetKTauValue = get_param(gcb,'setKTau');\n\nif ~strcmp(setKTauValue,'on')\n " - " h.Parameters(6).Enabled = 'off';\nelse\n h.Parameters(6).Enabled = 'on';\nend\n\nclear h setKTauValue" - } - Object { - $ObjectID 141 - Type "edit" - Name "kTau" - Prompt "kTau" - Value "[0]" - Enabled "off" - } - Object { - $ObjectID 142 - Type "checkbox" - Name "setBemf" - Prompt "Set motor back EMF constant" - Value "off" - Callback "h = Simulink.Mask.get(gcb);\nsetBemfValue = get_param(gcb,'setBemf');\n\nif ~strcmp(setBemfValue,'on')\n " - " h.Parameters(8).Enabled = 'off';\nelse\n h.Parameters(8).Enabled = 'on';\nend\n\nclear h setBemfValue" - } - Object { - $ObjectID 143 - Type "edit" - Name "bemf" - Prompt "bemf" - Value "[0]" - Enabled "off" - } - PropName "Parameters" - } - Array { - Type "Simulink.dialog.Group" - Dimension 2 - Object { - $ObjectID 144 - Prompt "%" - Object { - $PropName "DialogControls" - $ObjectID 145 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" + Type "Simulink.MaskParameter" + Dimension 7 + Object { + $ObjectID 119 + Type "edit" + Name "baseFrame" + Prompt "Base Frame" + Value "'root_link'" + } + Object { + $ObjectID 120 + Type "edit" + Name "endEffFrame" + Prompt "End Effector frame" + Value "'l_sole'" + } + Object { + $ObjectID 121 + Type "popup" + Array { + Type "Cell" + Dimension 2 + Cell "Full Constraint (Position and Orientation)" + Cell "Position only constraint" + PropName "TypeOptions" + } + Name "optOption" + Prompt "Optimization Option" + Value "Full Constraint (Position and Orientation)" + } + Object { + $ObjectID 122 + Type "edit" + Name "robotName" + Prompt "Robot Port Name" + Value "WBT_robotName" + Tunable "off" + } + Object { + $ObjectID 123 + Type "edit" + Name "localName" + Prompt "Model Name" + Value "WBT_modelName" + Tunable "off" + } + Object { + $ObjectID 124 + Type "edit" + Name "wbiFile" + Prompt "WBI filename" + Value "WBT_wbiFilename" + Tunable "off" + } + Object { + $ObjectID 125 + Type "edit" + Name "wbiList" + Prompt "WBI list name" + Value "WBT_wbiList" + Tunable "off" + } + PropName "Parameters" } - Name "DescGroupVar" - } - Object { - $ObjectID 146 - Prompt "Simulink:studio:ToolBarParametersMenu" Array { Type "Simulink.dialog.Group" - Dimension 3 + Dimension 2 Object { - $ObjectID 147 - Prompt "Gains" + $ObjectID 126 + Prompt "%" + Object { + $PropName "DialogControls" + $ObjectID 127 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" + } + Name "DescGroupVar" + } + Object { + $ObjectID 128 + Prompt "Simulink:studio:ToolBarParametersMenu" + Object { + $PropName "DialogControls" + $ObjectID 129 + $ClassName "Simulink.dialog.TabContainer" + Array { + Type "Simulink.dialog.Tab" + Dimension 2 + Object { + $ObjectID 130 + Prompt "Block parameters" Array { Type "Simulink.dialog.parameter.Control" - Dimension 4 + Dimension 3 Object { - $ObjectID 148 - $ClassName "Simulink.dialog.parameter.Popup" - Name "pidType" + $ObjectID 131 + $ClassName "Simulink.dialog.parameter.Edit" + PromptLocation "left" + Name "baseFrame" } Object { - $ObjectID 149 - $ClassName "Simulink.dialog.parameter.CheckBox" - Name "readP" - } - Object { - $ObjectID 150 - $ClassName "Simulink.dialog.parameter.CheckBox" - Name "readI" + $ObjectID 132 + $ClassName "Simulink.dialog.parameter.Edit" + Name "endEffFrame" } Object { - $ObjectID 151 - $ClassName "Simulink.dialog.parameter.CheckBox" - Name "readD" + $ObjectID 133 + $ClassName "Simulink.dialog.parameter.Popup" + Name "optOption" } PropName "DialogControls" } - Name "Container3" - } - Object { - $ObjectID 152 - Prompt "Motor Torque Parameters" + Name "Container8" + } + Object { + $ObjectID 134 + Prompt "WBI parameters" Array { - Type "Simulink.dialog.parameter.Control" + Type "Simulink.dialog.parameter.Edit" Dimension 4 Object { - $ObjectID 153 - $ClassName "Simulink.dialog.parameter.CheckBox" - Name "setKTau" + $ObjectID 135 + Name "robotName" } Object { - $ObjectID 154 - $ClassName "Simulink.dialog.parameter.Edit" - PromptLocation "left" - Name "kTau" + $ObjectID 136 + Name "localName" } Object { - $ObjectID 155 - $ClassName "Simulink.dialog.parameter.CheckBox" - Name "setBemf" + $ObjectID 137 + Name "wbiFile" } Object { - $ObjectID 156 - $ClassName "Simulink.dialog.parameter.Edit" - PromptLocation "left" - Name "bemf" + $ObjectID 138 + Name "wbiList" + } + PropName "DialogControls" + } + Name "Container5" } PropName "DialogControls" } Name "Container4" + } + Name "ParameterGroupVar" + } + PropName "DialogControls" + } + } + System { + Name "Inverse Kinematics" + Location [0, 23, 1280, 744] + Open off + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "312" + Block { + BlockType Inport + Name "Desired frame pose" + SID "1759" + Position [10, 13, 40, 27] + ZOrder 26 + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "Current Base Pose" + SID "1755" + Position [10, 43, 40, 57] + ZOrder 22 + Port "2" + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "Current Joint configuration" + SID "1756" + Position [10, 73, 40, 87] + ZOrder 24 + Port "3" + IconDisplay "Port number" + } + Block { + BlockType S-Function + Name "S-Function" + SID "1757" + Ports [3, 2] + Position [145, 4, 225, 96] + ZOrder 19 + FunctionName "WBToolbox" + Parameters "'InverseKinematics',robotName,localName,wbiFile,wbiList,baseFrame, endEffFrame,optOption" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off + } + Block { + BlockType Outport + Name "Desired Base Pose" + SID "1758" + Position [280, 23, 310, 37] + ZOrder 25 + IconDisplay "Port number" + } + Block { + BlockType Outport + Name "Desired Joint Configuration" + SID "1760" + Position [280, 68, 310, 82] + ZOrder 27 + Port "2" + IconDisplay "Port number" + } + Line { + ZOrder 1 + SrcBlock "S-Function" + SrcPort 1 + DstBlock "Desired Base Pose" + DstPort 1 + } + Line { + ZOrder 5 + SrcBlock "Current Base Pose" + SrcPort 1 + DstBlock "S-Function" + DstPort 2 + } + Line { + ZOrder 4 + SrcBlock "Current Joint configuration" + SrcPort 1 + DstBlock "S-Function" + DstPort 3 + } + Line { + ZOrder 7 + SrcBlock "Desired frame pose" + SrcPort 1 + DstBlock "S-Function" + DstPort 1 + } + Line { + ZOrder 8 + SrcBlock "S-Function" + SrcPort 2 + DstBlock "Desired Joint Configuration" + DstPort 1 + } + } + } + Block { + BlockType SubSystem + Name "Relative Transform" + SID "1799" + Ports [1, 1] + Position [565, 198, 715, 262] + ZOrder 67 + RequestExecContextInheritance off + Object { + $PropName "MaskObject" + $ObjectID 139 + $ClassName "Simulink.Mask" + Type "Relative Transform" + Description "This block calculates the relative transform between two frames.\n\nAssuming DoFs is the number of int" + "ernal degrees of freedom of the robot:\n\nInput:\n - Joint configuration: Vector of size DoFs, representing the con" + "figuration of the joints.\n\nOutput:\n - Transform: a 4x4 matrix representing the homogenous transformation between" + " frame1 and frame2.\n\nParameters:\n - Frame1 name: the name of the first frame. It should be part of the URDF mode" + "l.\n - Frame2 name: the name of the second frame. It should be part of the URDF model." + Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" + "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " + "WBTConfig;\ncatch\nend" + Display "port_label('input', 1, 'Joint configuration')\nport_label('output', 1, strcat('{}^{', frame1, '}', 'H_{'," + " frame2, '}'), 'texmode','on')" + RunInitForIconRedraw "on" + Array { + Type "Simulink.MaskParameter" + Dimension 2 + Object { + $ObjectID 140 + Type "edit" + Name "frame1" + Prompt "Frame1 name" + Value "'frame1'" } Object { - $ObjectID 157 + $ObjectID 141 + Type "edit" + Name "frame2" + Prompt "Frame2 name" + Value "'frame2'" + } + PropName "Parameters" + } + Array { + Type "Simulink.dialog.Group" + Dimension 2 + Object { + $ObjectID 142 + Prompt "%" Object { $PropName "DialogControls" - $ObjectID 158 + $ObjectID 143 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" + } + Name "DescGroupVar" + } + Object { + $ObjectID 144 + Prompt "Simulink:studio:ToolBarParametersMenu" + Array { + Type "Simulink.dialog.Control" + Dimension 3 + Object { + $ObjectID 145 + $ClassName "Simulink.dialog.parameter.Edit" + Name "frame1" + } + Object { + $ObjectID 146 + $ClassName "Simulink.dialog.parameter.Edit" + Name "frame2" + } + Object { + $ObjectID 147 + $ClassName "Simulink.dialog.Group" + Object { + $PropName "DialogControls" + $ObjectID 148 $ClassName "Simulink.dialog.Button" Prompt "Toggle Config Block Highlighting" Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" - Name "Control2" + Name "toggleHighlighting" } Name "ToggleButtonContainer" + } + PropName "DialogControls" + } + Name "ParameterGroupVar" } PropName "DialogControls" } - Name "ParameterGroupVar" } - PropName "DialogControls" - } - } - } - Block { - BlockType SubSystem - Name "Set Motor References" - SID "1791" - Ports [1] - Position [710, 210, 785, 260] - ZOrder 44 - BackgroundColor "[0.960000, 0.770000, 0.460000]" - RequestExecContextInheritance off - Object { - $PropName "MaskObject" - $ObjectID 159 - $ClassName "Simulink.Mask" - Type "Set Motor References" - Description "This block sets motor references. The type of control mode is specified as a parameter in the b" - "lock.\n\nAssuming N as the number of motors (usually equal to internal DoFs):\n\nInput:\n - References: Vector o" - "f size N, representing the references to be sent to the robot controlled motors.\n\nParameters:\n - Control Mode" - ": The control mode. Choose one of the supplied mode.\n\nUnit of measurement:\n - PWM [-100, 100]% Duty cycle\n " - " - Current [A]\n - Back EMF\n - Torque Constant" - Initialization "refSpeed = 0;\n\n% WBBlock Initialization\n% ======================\n\ntry\n [configBlockA" - "bsName, WBTConfig] = WBToolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimul" - "inkParameters;\n clear WBTConfig;\ncatch\nend" - Display "disp(get_param(gcb,'controlType'))\n%port_label('input',1,'References')" - RunInitForIconRedraw "off" - Object { - $PropName "Parameters" - $ObjectID 160 - $ClassName "Simulink.MaskParameter" - Type "popup" - Array { - Type "Cell" - Dimension 4 - Cell "PWM" - Cell "Current" - Cell "Back EMF" - Cell "Torque Constant" - PropName "TypeOptions" - } - Name "controlType" - Prompt "Control Mode" - Value "Current" - Evaluate "off" - Callback "% Get the mask parameter values. This is a cell\n% array of strings.\n\nmaskStr = get_param(" - "gcb,'controlType');\n\nswitch maskStr\n case 'PWM'\n set_param(gcb,'BackgroundColor', '[1, 1, 1, 1.0]" - "');\n case 'Current'\n set_param(gcb,'BackgroundColor', '[0.96, 0.77, 0.46, 1.0]');\n case 'Back E" - "MF'\n set_param(gcb,'BackgroundColor', '[0.8, 0.4, 1.0, 1.0]');\n case 'Torque Constant'\n set" - "_param(gcb,'BackgroundColor', '[0.8, 1.0, 0.4, 1.0]');\n otherwise\n error('Control Type not recogniz" - "ed.')\nend\n\nclear maskStr" - } - Array { - Type "Simulink.dialog.Group" - Dimension 3 - Object { - $ObjectID 161 - Prompt "%" - Object { - $PropName "DialogControls" - $ObjectID 162 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" + System { + Name "Relative Transform" + Location [0, 27, 1920, 1080] + Open off + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "834" + Block { + BlockType Inport + Name "Joint configuration" + SID "1800" + Position [45, 48, 75, 62] + ZOrder 22 + IconDisplay "Port number" } - Name "DescGroupVar" - } - Object { - $ObjectID 163 - Prompt "Simulink:studio:ToolBarParametersMenu" - Object { - $PropName "DialogControls" - $ObjectID 164 - $ClassName "Simulink.dialog.parameter.Popup" - Name "controlType" + Block { + BlockType S-Function + Name "S-Function" + SID "1806" + Ports [1, 1] + Position [120, 40, 180, 70] + ZOrder 27 + FunctionName "BlockFactory" + Parameters "'RelativeTransform','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,frame1, frame2" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off } - Name "ParameterGroupVar" - } - Object { - $ObjectID 165 - Object { - $PropName "DialogControls" - $ObjectID 166 - $ClassName "Simulink.dialog.Button" - Prompt "Toggle Config Block Highlighting" - Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(configBl" - "ock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system(confi" - "gBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block name: %s'" - ",gcb,configBlock);\nend\n\nclear configBlock" - Name "toggleHighlighting" + Block { + BlockType Outport + Name "Relative Transform" + SID "1803" + Position [225, 48, 255, 62] + ZOrder 25 + IconDisplay "Port number" + } + Line { + ZOrder 4 + SrcBlock "S-Function" + SrcPort 1 + DstBlock "Relative Transform" + DstPort 1 + } + Line { + ZOrder 3 + SrcBlock "Joint configuration" + SrcPort 1 + DstBlock "S-Function" + DstPort 1 } - Name "ToggleButtonContainer" } - PropName "DialogControls" - } - } - System { - Name "Set Motor References" - Location [832, 225, 3700, 1914] - Open off - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "1000" - Block { - BlockType Inport - Name "References" - SID "1794" - Position [55, 48, 85, 62] - ZOrder 24 - IconDisplay "Port number" } Block { - BlockType S-Function - Name "S-Function" - SID "1795" - Ports [1] - Position [125, 39, 185, 71] - ZOrder 19 - FunctionName "WBToolbox" - Parameters "'SetReferences','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,controlType,refSpeed" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - } - Line { - ZOrder 1 - SrcBlock "References" - SrcPort 1 - DstBlock "S-Function" - DstPort 1 - } - } - } - Block { - BlockType SubSystem - Name "Set References" - SID "1767" - Ports [1] - Position [605, 210, 680, 260] - ZOrder 43 - BackgroundColor "[0.513700, 0.851000, 0.670600]" - RequestExecContextInheritance off - Object { - $PropName "MaskObject" - $ObjectID 167 - $ClassName "Simulink.Mask" - Type "Set References" - Description "This block sets the references for the robot actuators.\nThe type of control mode is specified " - "as a parameter in the block.\n\nAssuming DoFs is the number of internal degrees of freedom configured in the asso" - "ciated Config block:\n\nInput:\n - References: Vector of size DoFs, representing the references to be sent to th" - "e robot controlled joints.\n - Reference Speed (Position): Set the reference speed in rad/s used by the trajecto" - "ry generator of the IPositionControl interface\n - Reference Acceleration (Velocity): Set the reference speed in" - " rad/s/s used by the trajectory generator of the IVelocityControl interface\n\nParameters:\n - Control Mode: The" - " control mode. Choose one of the supplied mode.\n\nUnit of measurement:\n- Position [rad]\n- Velocity [rad/s]\n- " - "Acceleration [rad/s/s]\n- Torque [Nm]" - Initialization "if (strcmp(controlType,'Position'))\n refTrajectory = refSpeed;\nelseif (strcmp(controlTyp" - "e,'Velocity'))\n refTrajectory = refAcceleration;\nelse\n refTrajectory = 0;\nend\n\n% WBBlock Initializati" - "on\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WBToolbox.BlockInitialization(gcb, gcs" - ");\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear WBTConfig;\ncatch\nend" - Display "disp(get_param(gcb,'controlType'))\n%port_label('input',1,'References')" - RunInitForIconRedraw "off" - Array { - Type "Simulink.MaskParameter" - Dimension 3 + BlockType SubSystem + Name "Remote Inverse Kinematics" + SID "1761" + Ports [2, 1] + Position [560, 105, 720, 165] + ZOrder 66 + Commented "on" + InitFcn "if ~exist('WBT_robotName','var')\n WBT_robotName = '';\nend\nif ~exist('WBT_modelName','var'" + ")\n WBT_modelName = 'WBT_simulink';\nend\nif ~exist('WBT_wbiFilename','var')\n WBT_wbiFilename = 'yarpWho" + "leBodyInterface.ini';\nend\nif ~exist('WBT_wbiList','var')\n WBT_wbiList = 'ROBOT_TORQUE_CONTROL_JOINTS';\ne" + "nd" + RequestExecContextInheritance off Object { - $ObjectID 168 - Type "popup" + $PropName "MaskObject" + $ObjectID 149 + $ClassName "Simulink.Mask" + Type "Forward Kinematics" + Description "This block retrieves the forward kinematics of the specified frame.\n\nAssuming DoFs is the number of " + "internal degrees of freedom of the robot,\nInput:\n- Base pose: 4x4 matrix representing the homogenous transformatio" + "n between\n the the base frame and the world frame.\n- Joint configuration: Vector of size DoFs, represe" + "nting the configuration \n of the joints.\n\nOutput:\n- Forward Kinematics: a 4x4 matrix repre" + "senting the homogenous transformation between\n the specified frame and the world frame.\n\nParameters:\n" + "- Frame name: the name of the frame. It should be specified in the URDF model.\n\n- Robot Port Name: Name of the por" + "ts opened by the robot. (e.g. icub).\n Set an empty string ('') to use the name specified in the \n" + " Whole Body Interface configuration file.\n- Model Name: Prefix name of the ports opened by the un" + "derlying Whole Body Interface.\n- WBI filename: name of the file containing the configuration of the Whole Body Inte" + "rface\n- WBI List Name: name of the list of joints used to configure the Whole Body Interface\n" + Display "disp(solverName)\n\n\n\n% escapedBaseFrameName = strrep(baseFrame, '_', '\\_');\n% escapedEndEffFrameName" + " = strrep(endEffFrame, '_', '\\_');\n% \n% %port_label('output', 1, strcat('{}^{world} H_{',escapedFrameName,'}'), '" + "texmode','on')\n% \n% %port_label('input', 1, '{}^{world} H_{base}', 'texmode','on')\n% %port_label('input', 2, 'Joi" + "nt configuration')\n% \n% %clear escapedFrameName;\n% \n% \n% % if strcmp(robotPart, 'left')\n% % prefix = 'l';\n" + "% % else\n% % prefix = 'r';\n% % end\n% % \n\nport_label('input', 1, 'H^d', 'texmode','on');\n% port_label('inpu" + "t', 1, strcat('{}^{',escapedBaseFrameName,'} H_{',escapedEndEffFrameName,'}^d'), 'texmode','on');\n% \n% port_label(" + "'input', 2, '{}^{world} H_{base}', 'texmode','on')\nport_label('input', 2, 'q_j(0)', 'texmode','on');\n% % \n% % \n%" + " port_label('output', 1, '{}^{world} H_{base}^d', 'texmode','on')\nport_label('output', 1, 'q_j^d', 'texmode','on');" + "\n\n" + RunInitForIconRedraw "on" Array { - Type "Cell" - Dimension 4 - Cell "Position" - Cell "Position Direct" - Cell "Velocity" - Cell "Torque" - PropName "TypeOptions" - } - Name "controlType" - Prompt "Control Mode" - Value "Position" - Evaluate "off" - Callback "% Get the mask parameter values. This is a cell\n% array of strings.\n\nmaskStr = get_param(gcb,'contro" - "lType');\n\nswitch maskStr\n case 'Position'\n set_param(gcb,'BackgroundColor', '[0.5137, 0.8510, 0.6706, " - "1.0]');\n set_param(gcb,'MaskVisibilities', {'on';'on';'off'});\n case 'Position Direct'\n set_para" - "m(gcb,'BackgroundColor', '[0.3922, 0.7882, 0.3451, 1.0]');\n set_param(gcb,'MaskVisibilities', {'on';'off';'o" - "ff'});\n case 'Velocity'\n set_param(gcb,'BackgroundColor', '[0.5137, 0.6745, 1.0000, 1.0]');\n set" - "_param(gcb,'MaskVisibilities', {'on';'off';'on'});\n case 'Torque'\n set_param(gcb,'BackgroundColor', '[0." - "8275, 0.5765, 0.6039, 1.0]');\n set_param(gcb,'MaskVisibilities', {'on';'off';'off'});\n otherwise\n " - " error('Control Type not recognized.')\nend\n\nclear maskStr" - } - Object { - $ObjectID 169 - Type "edit" - Name "refSpeed" - Prompt "Reference Speed" - Value "10*(pi/180)" - } - Object { - $ObjectID 170 - Type "edit" - Name "refAcceleration" - Prompt "Reference Velocity" - Value "1000000*(pi/180)" - Visible "off" - } - PropName "Parameters" - } - Array { - Type "Simulink.dialog.Group" - Dimension 3 - Object { - $ObjectID 171 - Prompt "%" - Object { - $PropName "DialogControls" - $ObjectID 172 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" - } - Name "DescGroupVar" - } - Object { - $ObjectID 173 - Prompt "Simulink:studio:ToolBarParametersMenu" - Array { - Type "Simulink.dialog.parameter.Control" + Type "Simulink.MaskParameter" Dimension 3 Object { - $ObjectID 174 - $ClassName "Simulink.dialog.parameter.Popup" - Name "controlType" + $ObjectID 150 + Type "edit" + Name "solverName" + Prompt "Solver Name" + Value "'/cartesianSolver'" } Object { - $ObjectID 175 - $ClassName "Simulink.dialog.parameter.Edit" - PromptLocation "left" - Name "refSpeed" + $ObjectID 151 + Type "edit" + Name "dofs" + Prompt "#Dofs" + Value "12" + Tunable "off" + } + Object { + $ObjectID 152 + Type "popup" + Array { + Type "Cell" + Dimension 2 + Cell "Full Constraint (Position and Orientation)" + Cell "Position only constraint" + PropName "TypeOptions" + } + Name "optOption" + Prompt "Optimization Option" + Value "Full Constraint (Position and Orientation)" + } + PropName "Parameters" + } + Array { + Type "Simulink.dialog.Group" + Dimension 2 + Object { + $ObjectID 153 + Prompt "%" + Object { + $PropName "DialogControls" + $ObjectID 154 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" + } + Name "DescGroupVar" } Object { - $ObjectID 176 + $ObjectID 155 + Prompt "Simulink:studio:ToolBarParametersMenu" + Object { + $PropName "DialogControls" + $ObjectID 156 + $ClassName "Simulink.dialog.TabContainer" + Object { + $PropName "DialogControls" + $ObjectID 157 + $ClassName "Simulink.dialog.Tab" + Prompt "Block parameters" + Array { + Type "Simulink.dialog.parameter.Control" + Dimension 3 + Object { + $ObjectID 158 $ClassName "Simulink.dialog.parameter.Edit" PromptLocation "left" - Name "refAcceleration" + Name "solverName" + } + Object { + $ObjectID 159 + $ClassName "Simulink.dialog.parameter.Edit" + Name "dofs" + } + Object { + $ObjectID 160 + $ClassName "Simulink.dialog.parameter.Popup" + Name "optOption" + } + PropName "DialogControls" + } + Name "Container8" + } + Name "Container4" + } + Name "ParameterGroupVar" } PropName "DialogControls" } - Name "ParameterGroupVar" } - Object { - $ObjectID 177 - Object { - $PropName "DialogControls" - $ObjectID 178 - $ClassName "Simulink.dialog.Button" - Prompt "Toggle Config Block Highlighting" - Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(configBl" - "ock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system(confi" - "gBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block name: %s'" - ",gcb,configBlock);\nend\n\nclear configBlock" - Name "toggleHighlighting" + System { + Name "Remote Inverse Kinematics" + Location [0, 27, 1920, 1080] + Open off + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "469" + Block { + BlockType Inport + Name "Desired frame pose" + SID "1762" + Position [10, 23, 40, 37] + ZOrder 26 + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "Current Joint configuration" + SID "1763" + Position [10, 68, 40, 82] + ZOrder 24 + Port "2" + IconDisplay "Port number" + } + Block { + BlockType S-Function + Name "S-Function" + SID "1764" + Ports [2, 1] + Position [145, 6, 225, 99] + ZOrder 19 + FunctionName "WBToolbox" + Parameters "'RemoteInverseKinematics',solverName, dofs, optOption" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off + } + Block { + BlockType Outport + Name "Desired Joint Configuration" + SID "1765" + Position [285, 48, 315, 62] + ZOrder 27 + IconDisplay "Port number" + } + Line { + ZOrder 1 + SrcBlock "S-Function" + SrcPort 1 + DstBlock "Desired Joint Configuration" + DstPort 1 + } + Line { + ZOrder 2 + SrcBlock "Desired frame pose" + SrcPort 1 + DstBlock "S-Function" + DstPort 1 + } + Line { + ZOrder 3 + SrcBlock "Current Joint configuration" + SrcPort 1 + DstBlock "S-Function" + DstPort 2 } - Name "ToggleButtonContainer" } - PropName "DialogControls" - } - } - System { - Name "Set References" - Location [832, 225, 3700, 1914] - Open off - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "1000" - Block { - BlockType Inport - Name "References" - SID "1768" - Position [55, 48, 85, 62] - ZOrder 24 - IconDisplay "Port number" - } - Block { - BlockType S-Function - Name "S-Function" - SID "1769" - Ports [1] - Position [125, 39, 185, 71] - ZOrder 19 - FunctionName "WBToolbox" - Parameters "'SetReferences','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,controlType,refTraj" - "ectory" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - } - Line { - ZOrder 1 - SrcBlock "References" - SrcPort 1 - DstBlock "S-Function" - DstPort 1 } } } @@ -3740,23 +3828,23 @@ Library { } Block { BlockType SubSystem - Name "wholeBodyModel" - SID "209" + Name "States" + SID "206" Ports [] - Position [133, 16, 231, 113] - ZOrder -3 + Position [16, 17, 114, 114] + ZOrder -4 ForegroundColor "white" DropShadow on RequestExecContextInheritance off Object { $PropName "MaskObject" - $ObjectID 179 + $ObjectID 161 $ClassName "Simulink.Mask" - Display "image(imread('wholeBodyModel.png'),'center')" + Display "image(imread('wholeBodyStates.png'),'center');" } System { - Name "wholeBodyModel" - Location [832, 225, 3700, 1914] + Name "States" + Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off SetDomainSpec off @@ -3771,25 +3859,138 @@ Library { TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] TiledPageScale 1 ShowPageBoundaries off - ZoomFactor "551" + ZoomFactor "696" Block { BlockType SubSystem - Name "Dynamics" - SID "369" - Ports [] - Position [364, 21, 471, 128] - ZOrder -1 - DropShadow on + Name "Get Limits" + SID "1690" + Ports [0, 2] + Position [345, 225, 460, 260] + ZOrder 68 + BackgroundColor "[0.513700, 0.851000, 0.670600]" RequestExecContextInheritance off Object { $PropName "MaskObject" - $ObjectID 180 + $ObjectID 162 $ClassName "Simulink.Mask" - Display "image(imread('Dynamics.png'))" + Type "Get Limits" + Description "This block provides the joint limits gathering data from either the Robot's Control Board or UR" + "DF model.\n\nOutput:\n - Max: 1xDoFs vector containing the maximum limit\n - Min: 1xDoFs vector containing the" + " maximum limit\n\nUnit of measurement:\n - Position: rad\n - Velocity: rad/sec" + Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig" + "] = WBToolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n " + " clear WBTConfig;\ncatch\nend\n\n% GetLimits Initialization\n% =========================\n\nsourceLimit = get_p" + "aram(gcb,'limitsSource');\ntypeLimit = get_param(gcb,'limitsType');\nnotifyError = false;\n\nswitch sourceLimit\n" + " case 'ControlBoard'\n switch typeLimit\n case 'Position'\n limitsType = 'Con" + "trolBoardPosition';\n case 'Velocity'\n limitsType = 'ControlBoardVelocity';\n " + " otherwise\n notifyError = true;\n end\n case 'URDF'\n switch typeLimit\n " + " case 'Position'\n limitsType = 'ModelPosition';\n otherwise\n noti" + "fyError = true;\n end\nend\n\nif notifyError\n error('Limit Type not recognized');\nend\n\nclear source" + "Limit typeLimit notifyError" + SelfModifiable "on" + Display "fprintf('%s\\n(%s)',get_param(gcb,'limitsType'),get_param(gcb,'limitsSource'))\n\nport_label('outpu" + "t',1,'Min')\nport_label('output',2,'Max')" + RunInitForIconRedraw "off" + Array { + Type "Simulink.MaskParameter" + Dimension 2 + Object { + $ObjectID 163 + Type "popup" + Array { + Type "Cell" + Dimension 2 + Cell "ControlBoard" + Cell "URDF" + PropName "TypeOptions" + } + Name "limitsSource" + Prompt "Limits Source" + Value "ControlBoard" + Evaluate "off" + Callback "sourceLimit = get_param(gcb,'limitsSource');\nblockParameters = Simulink.Mask.get(gcb).Parameters;\nlimit" + "sTypeBlockParam = blockParameters(2);\n\nswitch sourceLimit\n case 'ControlBoard'\n limitsTypeBlockParam.T" + "ypeOptions = {'Position','Velocity'};\n %limitsTypeBlockParam.Value = limitsTypeBlockParam.TypeOptions{1};\n " + " case 'URDF'\n limitsTypeBlockParam.TypeOptions = {'Position'};\n %limitsTypeBlockParam.Value = limi" + "tsTypeBlockParam.TypeOptions{1};\n otherwise\n error('Limit Source not recognized');\nend\n\nclear sourceL" + "imit blockParameters limitsTypeBlockParam" + } + Object { + $ObjectID 164 + Type "popup" + Array { + Type "Cell" + Dimension 2 + Cell "Position" + Cell "Velocity" + PropName "TypeOptions" + } + Name "limitsType" + Prompt "Limits Type" + Value "Position" + Evaluate "off" + Callback "% Get the mask parameter values. This is a cell array of strings.\n% \nmaskStr = get_param(gcb,'limitsT" + "ype');\nif strcmp(maskStr, 'Position')\n set_param(gcb,'BackgroundColor', '[0.5137, 0.8510, 0.6706, 1.0]');\nelse" + "if strcmp(maskStr, 'Velocity')\n set_param(gcb,'BackgroundColor', '[0.5137, 0.6745, 1.0000, 1.0]');\nelseif strcm" + "p(maskStr, 'Acceleration')\n set_param(gcb,'BackgroundColor', '[0.9255, 0.8706, 0.1333, 1.0]');\nelseif strcmp(ma" + "skStr, 'Torque')\n set_param(gcb,'BackgroundColor', '[0.8275, 0.5765, 0.6039, 1.0]');\nend\nclear maskStr" + } + PropName "Parameters" + } + Array { + Type "Simulink.dialog.Group" + Dimension 3 + Object { + $ObjectID 165 + Prompt "%" + Object { + $PropName "DialogControls" + $ObjectID 166 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" + } + Name "DescGroupVar" + } + Object { + $ObjectID 167 + Prompt "Simulink:studio:ToolBarParametersMenu" + Array { + Type "Simulink.dialog.parameter.Popup" + Dimension 2 + Object { + $ObjectID 168 + Name "limitsSource" + } + Object { + $ObjectID 169 + Name "limitsType" + } + PropName "DialogControls" + } + Name "ParameterGroupVar" + } + Object { + $ObjectID 170 + Object { + $PropName "DialogControls" + $ObjectID 171 + $ClassName "Simulink.dialog.Button" + Prompt "Toggle Config Block Highlighting" + Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(configBl" + "ock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system(confi" + "gBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block name: %s'" + ",gcb,configBlock);\nend\n\nclear configBlock" + Name "toggleHighlighting" + } + Name "ToggleButtonContainer" + } + PropName "DialogControls" + } } System { - Name "Dynamics" - Location [832, 225, 3700, 1914] + Name "Get Limits" + Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off SetDomainSpec off @@ -3804,1117 +4005,692 @@ Library { TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] TiledPageScale 1 ShowPageBoundaries off - ZoomFactor "500" + ZoomFactor "966" + SIDHighWatermark "1773" Block { - BlockType SubSystem - Name "Centroidal Momentum" - SID "1694" - Ports [4, 1] - Position [475, 101, 660, 164] - ZOrder 72 - RequestExecContextInheritance off + BlockType S-Function + Name "S-Function" + SID "1690:1691" + Ports [0, 2] + Position [115, 33, 175, 102] + ZOrder 19 + FunctionName "BlockFactory" + Parameters "'GetLimits','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,limitsType" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off + } + Block { + BlockType Outport + Name "Min" + SID "1690:1692" + Position [220, 43, 250, 57] + ZOrder 25 + IconDisplay "Port number" + } + Block { + BlockType Outport + Name "Max" + SID "1690:1693" + Position [220, 78, 250, 92] + ZOrder 26 + Port "2" + IconDisplay "Port number" + } + Line { + ZOrder 1 + SrcBlock "S-Function" + SrcPort 1 + DstBlock "Min" + DstPort 1 + } + Line { + ZOrder 2 + SrcBlock "S-Function" + SrcPort 2 + DstBlock "Max" + DstPort 1 + } + } + } + Block { + BlockType SubSystem + Name "Get Measurement" + SID "1671" + Ports [0, 1] + Position [290, 158, 385, 192] + ZOrder 53 + BackgroundColor "[0.513700, 0.851000, 0.670600]" + RequestExecContextInheritance off + Object { + $PropName "MaskObject" + $ObjectID 172 + $ClassName "Simulink.Mask" + Type "Get Measurement" + Description "This block gathers the measurement of the specified type.\n\nAssuming DoFs is the number of deg" + "rees of freedom of the robot,\n\nOutput:\n - References: Vector of size DoFs, representing the requested measure" + "ment.\n\nParameters:\n - Control Mode: The control mode. Choose one of the supplied mode.\n\nUnit of measurement" + ":\n - Position: rad\n - Velocity: rad/sec\n - Acceleration: rad/sec/sec\n - Torque: Nm\n" + Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig" + "] = WBToolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n " + " clear WBTConfig;\ncatch\nend" + Display "port_label('output', 1, get_param(gcb,'measuredType'))" + RunInitForIconRedraw "off" + Object { + $PropName "Parameters" + $ObjectID 173 + $ClassName "Simulink.MaskParameter" + Type "popup" + Array { + Type "Cell" + Dimension 4 + Cell "Joints Position" + Cell "Joints Velocity" + Cell "Joints Acceleration" + Cell "Joints Torque" + PropName "TypeOptions" + } + Name "measuredType" + Prompt "Estimate Type" + Value "Joints Position" + Evaluate "off" + Callback "% Get the mask parameter values. This is a cell\n% array of strings.\n\nmaskStr = get_param(" + "gcb,'measuredType');\nif strcmp(maskStr, 'Joints Position')\n set_param(gcb,'BackgroundColor', '[0.5137, 0.8" + "510, 0.6706, 1.0]');\nelseif strcmp(maskStr, 'Joints Velocity')\n set_param(gcb,'BackgroundColor', '[0.5137," + " 0.6745, 1.0000, 1.0]');\nelseif strcmp(maskStr, 'Joints Acceleration')\n set_param(gcb,'BackgroundColor', '" + "[0.9255, 0.8706, 0.1333, 1.0]');\nelseif strcmp(maskStr, 'Joints Torque')\n set_param(gcb,'BackgroundColor'," + " '[0.8275, 0.5765, 0.6039, 1.0]');\nend\nclear maskStr" + } + Array { + Type "Simulink.dialog.Group" + Dimension 3 Object { - $PropName "MaskObject" - $ObjectID 181 - $ClassName "Simulink.Mask" - Type "Centroidal Momentum" - Description "This block computed the 6 element centroidal momentum, as defined in:\n\n\"Centroidal dynamics of a hu" - "manoid robot\" - DE Orin, A Goswami, SH Lee\nAutonomous Robots 35 (2-3), 161-176\n\nAssuming DoFs is the number of i" - "nternal degrees of freedom of the robot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transforma" - "tion between the base frame and the world frame.\n - Joint configuration: Vector of size DoFs, representing the con" - "figuration of the joints.\n - Base velocity: Vector of size 6 representing the linear and angular velocity of the b" - "ase frame.\n - Joints velocity: Vector of size DoFs, representing the velocity of the joints.\n\nOutput:\n - Centr" - "oidal Momentum: 6-element vector containg the centroidal momentum (3 value for linear momentum and 3 for angular mom" - "entum)." - Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" - "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " - "WBTConfig;\ncatch\nend" - RunInitForIconRedraw "off" + $ObjectID 174 + Prompt "%" Object { $PropName "DialogControls" - $ObjectID 182 - $ClassName "Simulink.dialog.Group" - Prompt "%" - Array { - Type "Simulink.dialog.Control" - Dimension 2 - Object { - $ObjectID 183 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" - } - Object { - $ObjectID 184 - $ClassName "Simulink.dialog.Group" - Object { - $PropName "DialogControls" - $ObjectID 185 - $ClassName "Simulink.dialog.Button" - Prompt "Toggle Config Block Highlighting" - Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" - "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" - "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" - "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" - Name "toggleHighlighting" - } - Name "ToggleButtonContainer" - } - PropName "DialogControls" - } - Name "DescGroupVar" + $ObjectID 175 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" } + Name "DescGroupVar" } - System { - Name "Centroidal Momentum" - Location [832, 225, 3700, 1914] - Open off - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "725" - Block { - BlockType Inport - Name "Base Pose" - SID "1695" - Position [20, 18, 50, 32] - ZOrder 22 - IconDisplay "Port number" - } - Block { - BlockType Inport - Name "Joint configuration" - SID "1696" - Position [20, 53, 50, 67] - ZOrder 24 - Port "2" - IconDisplay "Port number" - } - Block { - BlockType Inport - Name "Base velocity" - SID "1697" - Position [20, 88, 50, 102] - ZOrder 26 - Port "3" - IconDisplay "Port number" - } - Block { - BlockType Inport - Name "Joints velocity" - SID "1698" - Position [20, 123, 50, 137] - ZOrder 27 - Port "4" - IconDisplay "Port number" - } - Block { - BlockType S-Function - Name "S-Function" - SID "1699" - Ports [4, 1] - Position [180, 11, 255, 144] - ZOrder 19 - FunctionName "WBToolbox" - Parameters "'CentroidalMomentum','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - } - Block { - BlockType Outport - Name "Centroidal Momentum" - SID "1700" - Position [315, 73, 345, 87] - ZOrder 25 - IconDisplay "Port number" - } - Line { - ZOrder 1 - SrcBlock "S-Function" - SrcPort 1 - DstBlock "Centroidal Momentum" - DstPort 1 - } - Line { - ZOrder 2 - SrcBlock "Base Pose" - SrcPort 1 - DstBlock "S-Function" - DstPort 1 - } - Line { - ZOrder 3 - SrcBlock "Joint configuration" - SrcPort 1 - DstBlock "S-Function" - DstPort 2 - } - Line { - ZOrder 4 - SrcBlock "Base velocity" - SrcPort 1 - DstBlock "S-Function" - DstPort 3 - } - Line { - ZOrder 5 - SrcBlock "Joints velocity" - SrcPort 1 - DstBlock "S-Function" - DstPort 4 + Object { + $ObjectID 176 + Prompt "Simulink:studio:ToolBarParametersMenu" + Object { + $PropName "DialogControls" + $ObjectID 177 + $ClassName "Simulink.dialog.parameter.Popup" + Name "measuredType" } + Name "ParameterGroupVar" } - } - Block { - BlockType SubSystem - Name "Get Bias Forces" - SID "1724" - Ports [4, 1] - Position [400, 212, 540, 313] - ZOrder 73 - RequestExecContextInheritance off Object { - $PropName "MaskObject" - $ObjectID 186 - $ClassName "Simulink.Mask" - Type "Get Generalized Bias Forces" - Description "This block retrieves the generalied bias forces of the robot.\n\nAssuming DoFs is the number of intern" - "al degrees of freedom of the robot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transformation " - "between the base frame and the world frame.\n - Joint configuration: Vector of size DoFs, representing the configur" - "ation of the joints.\n - Base velocity: Vector of size 6 representing the linear and angular velocity of the base f" - "rame.\n - Joints velocity: Vector of size DoFs, representing the velocity of the joints.\n\nOutput:\n - Bias Force" - "s: a Dofs + 6 vector representing the generalized bias forces of the robot." - Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" - "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " - "WBTConfig;\ncatch\nend" - RunInitForIconRedraw "off" + $ObjectID 178 Object { $PropName "DialogControls" - $ObjectID 187 - $ClassName "Simulink.dialog.Group" - Prompt "%" - Array { - Type "Simulink.dialog.Control" - Dimension 2 - Object { - $ObjectID 188 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" - } - Object { - $ObjectID 189 - $ClassName "Simulink.dialog.Group" - Object { - $PropName "DialogControls" - $ObjectID 190 - $ClassName "Simulink.dialog.Button" - Prompt "Toggle Config Block Highlighting" - Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" - "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" - "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" - "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" - Name "toggleHighlighting" - } - Name "ToggleButtonContainer" - } - PropName "DialogControls" - } - Name "DescGroupVar" - } - } - System { - Name "Get Bias Forces" - Location [832, 225, 3700, 1914] - Open off - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "715" - Block { - BlockType Inport - Name "Base Pose" - SID "1776" - Position [10, 38, 40, 52] - ZOrder 22 - IconDisplay "Port number" - } - Block { - BlockType Inport - Name "Joint configuration" - SID "1777" - Position [10, 68, 40, 82] - ZOrder 24 - Port "2" - IconDisplay "Port number" - } - Block { - BlockType Inport - Name "Base velocity" - SID "1778" - Position [10, 98, 40, 112] - ZOrder 26 - Port "3" - IconDisplay "Port number" - } - Block { - BlockType Inport - Name "Joints velocity" - SID "1779" - Position [10, 128, 40, 142] - ZOrder 27 - Port "4" - IconDisplay "Port number" - } - Block { - BlockType Constant - Name "Constant" - SID "1780" - Position [-5, 157, 50, 173] - ZOrder 30 - ShowName off - Value "zeros(6,1)" - } - Block { - BlockType Gain - Name "Gain" - SID "1781" - Position [110, 180, 140, 210] - ZOrder 31 - ShowName off - Gain "0" - ParamDataTypeStr "Inherit: Inherit via internal rule" - OutDataTypeStr "Inherit: Inherit via internal rule" - SaturateOnIntegerOverflow off - } - Block { - BlockType S-Function - Name "S-Function" - SID "1782" - Ports [6, 1] - Position [180, 24, 240, 216] - ZOrder 19 - FunctionName "WBToolbox" - Parameters "'InverseDynamics','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - } - Block { - BlockType Outport - Name "Bias Forces" - SID "1783" - Position [300, 113, 330, 127] - ZOrder 25 - IconDisplay "Port number" - } - Line { - ZOrder 1 - SrcBlock "S-Function" - SrcPort 1 - DstBlock "Bias Forces" - DstPort 1 - } - Line { - ZOrder 2 - SrcBlock "Base Pose" - SrcPort 1 - DstBlock "S-Function" - DstPort 1 - } - Line { - ZOrder 3 - SrcBlock "Joint configuration" - SrcPort 1 - DstBlock "S-Function" - DstPort 2 - } - Line { - ZOrder 4 - SrcBlock "Base velocity" - SrcPort 1 - DstBlock "S-Function" - DstPort 3 - } - Line { - ZOrder 5 - SrcBlock "Joints velocity" - SrcPort 1 - Points [44, 0] - Branch { - ZOrder 11 - Points [0, 60] - DstBlock "Gain" - DstPort 1 - } - Branch { - ZOrder 10 - DstBlock "S-Function" - DstPort 4 - } - } - Line { - ZOrder 8 - SrcBlock "Constant" - SrcPort 1 - DstBlock "S-Function" - DstPort 5 - } - Line { - ZOrder 9 - SrcBlock "Gain" - SrcPort 1 - DstBlock "S-Function" - DstPort 6 + $ObjectID 179 + $ClassName "Simulink.dialog.Button" + Prompt "Toggle Config Block Highlighting" + Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(configBl" + "ock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system(confi" + "gBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block name: %s'" + ",gcb,configBlock);\nend\n\nclear configBlock" + Name "toggleHighlighting" } + Name "Container8" } + PropName "DialogControls" + } + } + System { + Name "Get Measurement" + Location [0, 27, 1920, 1080] + Open off + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "1000" + Block { + BlockType S-Function + Name "S-Function" + SID "1672" + Ports [0, 1] + Position [125, 39, 185, 71] + ZOrder 19 + FunctionName "BlockFactory" + Parameters "'GetMeasurement','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,measuredType" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off } Block { - BlockType SubSystem - Name "Get Gravity Forces" - SID "1733" - Ports [2, 1] - Position [600, 210, 740, 310] - ZOrder 74 - RequestExecContextInheritance off + BlockType Outport + Name "Estimate" + SID "1673" + Position [210, 48, 240, 62] + ZOrder 25 + IconDisplay "Port number" + } + Line { + ZOrder 1 + SrcBlock "S-Function" + SrcPort 1 + DstBlock "Estimate" + DstPort 1 + } + } + } + Block { + BlockType SubSystem + Name "Get Motor Measurement" + SID "1796" + Ports [0, 1] + Position [410, 158, 505, 192] + ZOrder 69 + BackgroundColor "[0.960000, 0.770000, 0.460000]" + RequestExecContextInheritance off + Object { + $PropName "MaskObject" + $ObjectID 180 + $ClassName "Simulink.Mask" + Type "Get Measurement" + Description "This block gathers the measurement of the specified type.\n\nAssuming DoFs is the number of deg" + "rees of freedom of the robot,\n\nOutput:\n - References: Vector of size DoFs, representing the requested measure" + "ment.\n\nParameters:\n - Control Mode: The control mode. Choose one of the supplied mode.\n\nUnit of measurement" + ":\n - PWM: duty cycle expressed as percentage [-100, 100]%\n - Current: values in Ampere\n" + Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig" + "] = WBToolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n " + " clear WBTConfig;\ncatch\nend" + Display "port_label('output', 1, get_param(gcb,'measuredType'))" + RunInitForIconRedraw "off" + Object { + $PropName "Parameters" + $ObjectID 181 + $ClassName "Simulink.MaskParameter" + Type "popup" + Array { + Type "Cell" + Dimension 7 + Cell "Motor Position" + Cell "Motor Velocity" + Cell "Motor Acceleration" + Cell "Motor PWM" + Cell "Motor Current" + Cell "Motor Back EMF" + Cell "Motor Torque Constant" + PropName "TypeOptions" + } + Name "measuredType" + Prompt "Estimate Type" + Value "Motor Current" + Evaluate "off" + Callback "maskStr = get_param(gcb,'measuredType');\n\nswitch maskStr\n case 'Motor Position'\n " + " set_param(gcb,'BackgroundColor', '[0.5137, 0.8510, 0.6706, 1.0]');\n case 'Motor Velocity'\n set_par" + "am(gcb,'BackgroundColor', '[0.5137, 0.6745, 1.0000, 1.0]');\n case 'Motor Acceleration'\n set_param(g" + "cb,'BackgroundColor', '[0.9255, 0.8706, 0.1333, 1.0]');\n case 'Motor PWM'\n set_param(gcb,'Backgroun" + "dColor', '[1, 1, 1, 1.0]');\n case 'Motor Current'\n set_param(gcb,'BackgroundColor', '[0.96, 0.77, 0" + ".46, 1.0]');\n case 'Motor Back EMF'\n set_param(gcb,'BackgroundColor', '[0.8, 0.4, 1.0, 1.0]');\n " + " case 'Motor Torque Constant'\n set_param(gcb,'BackgroundColor', '[0.8, 1.0, 0.4, 1.0]');\n otherwise" + "\n error('Control Type not recognized.')\nend\n\nclear maskStr" + } + Array { + Type "Simulink.dialog.Group" + Dimension 3 Object { - $PropName "MaskObject" - $ObjectID 191 - $ClassName "Simulink.Mask" - Type "Gravity bias" - Description "This block compute the generalized bias forces due to the gravity\n\nAssuming DoFs is the number of in" - "ternal degrees of freedom of the robot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transformat" - "ion between the base frame and the world frame.\n - Joint configuration: Vector of size DoFs, representing the conf" - "iguration of the joints.\n\nOutput:\n - Gravity: a DoFs + 6 vector representing the torques due to the gravity." - Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" - "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " - "WBTConfig;\ncatch\nend" - RunInitForIconRedraw "off" + $ObjectID 182 + Prompt "%" Object { $PropName "DialogControls" - $ObjectID 192 - $ClassName "Simulink.dialog.Group" - Prompt "%" - Array { - Type "Simulink.dialog.Control" - Dimension 2 - Object { - $ObjectID 193 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" - } - Object { - $ObjectID 194 - $ClassName "Simulink.dialog.Group" - Object { - $PropName "DialogControls" - $ObjectID 195 - $ClassName "Simulink.dialog.Button" - Prompt "Toggle Config Block Highlighting" - Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" - "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" - "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" - "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" - Name "toggleHighlighting" - } - Name "ToggleButtonContainer" - } - PropName "DialogControls" - } - Name "DescGroupVar" + $ObjectID 183 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" } + Name "DescGroupVar" } - System { - Name "Get Gravity Forces" - Location [832, 225, 3700, 1914] - Open off - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "715" - Block { - BlockType Inport - Name "Base Pose" - SID "1784" - Position [10, 38, 40, 52] - ZOrder 22 - IconDisplay "Port number" - } - Block { - BlockType Inport - Name "Joint configuration" - SID "1785" - Position [10, 68, 40, 82] - ZOrder 24 - Port "2" - IconDisplay "Port number" - } - Block { - BlockType Constant - Name "Constant" - SID "1786" - Position [0, 97, 55, 113] - ZOrder 32 - ShowName off - Value "zeros(6,1)" - } - Block { - BlockType Gain - Name "Gain" - SID "1787" - Position [100, 120, 130, 150] - ZOrder 33 - ShowName off - Gain "0" - ParamDataTypeStr "Inherit: Inherit via internal rule" - OutDataTypeStr "Inherit: Inherit via internal rule" - SaturateOnIntegerOverflow off - } - Block { - BlockType S-Function - Name "S-Function" - SID "1788" - Ports [6, 1] - Position [180, 24, 240, 216] - ZOrder 19 - FunctionName "WBToolbox" - Parameters "'InverseDynamics','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - } - Block { - BlockType Outport - Name "Gravity Torques" - SID "1789" - Position [300, 113, 330, 127] - ZOrder 25 - IconDisplay "Port number" - } - Line { - ZOrder 1 - SrcBlock "S-Function" - SrcPort 1 - DstBlock "Gravity Torques" - DstPort 1 - } - Line { - ZOrder 2 - SrcBlock "Base Pose" - SrcPort 1 - DstBlock "S-Function" - DstPort 1 - } - Line { - ZOrder 3 - SrcBlock "Joint configuration" - SrcPort 1 - Points [41, 0] - Branch { - ZOrder 12 - Points [0, 60] - DstBlock "Gain" - DstPort 1 - } - Branch { - ZOrder 11 - DstBlock "S-Function" - DstPort 2 - } - } - Line { - ZOrder 8 - SrcBlock "Constant" - SrcPort 1 - Points [4, 0] - Branch { - ZOrder 10 - Points [0, 60] - DstBlock "S-Function" - DstPort 5 - } - Branch { - ZOrder 9 - DstBlock "S-Function" - DstPort 3 - } + Object { + $ObjectID 184 + Prompt "Simulink:studio:ToolBarParametersMenu" + Object { + $PropName "DialogControls" + $ObjectID 185 + $ClassName "Simulink.dialog.parameter.Popup" + Name "measuredType" } - Line { - ZOrder 13 - SrcBlock "Gain" - SrcPort 1 - Points [13, 0] - Branch { - ZOrder 15 - Points [0, 60] - DstBlock "S-Function" - DstPort 6 - } - Branch { - ZOrder 14 - DstBlock "S-Function" - DstPort 4 - } + Name "ParameterGroupVar" + } + Object { + $ObjectID 186 + Object { + $PropName "DialogControls" + $ObjectID 187 + $ClassName "Simulink.dialog.Button" + Prompt "Toggle Config Block Highlighting" + Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(configBl" + "ock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system(confi" + "gBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block name: %s'" + ",gcb,configBlock);\nend\n\nclear configBlock" + Name "toggleHighlighting" } + Name "Container8" } + PropName "DialogControls" } + } + System { + Name "Get Motor Measurement" + Location [0, 27, 1920, 1080] + Open off + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "1000" Block { BlockType S-Function - Name "Inverse Dynamics" - SID "1748" - Ports [6, 1] - Position [190, 199, 355, 331] - ZOrder 75 - FunctionName "WBToolbox" - Parameters "'InverseDynamics','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName" + Name "S-Function" + SID "1797" + Ports [0, 1] + Position [125, 39, 185, 71] + ZOrder 19 + FunctionName "BlockFactory" + Parameters "'GetMeasurement','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,measuredType" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off - Object { - $PropName "MaskObject" - $ObjectID 196 - $ClassName "Simulink.Mask" - Type "Inverse Dynamics" - Description "This block compute the inverse dynamics of the robot.\n\nAssuming DoFs is the number of internal degre" - "es of freedom of the robot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transformation between " - "the base frame and the world frame.\n - Joint configuration: Vector of size DoFs, representing the configuration of" - " the joints.\n - Base velocity: Vector of size 6 representing the linear and angular velocity of the base frame.\n " - " - Joints velocity: Vector of size DoFs, representing the velocity of the joints.\n - Base acceleration: Vector of " - "size 6 representing the linear and angular acceleration of the base frame.\n - Joints acceleration: Vector of size " - "DoFs, representing the acceleration of the joints.\n\nOutput:\n - Torques: a Dofs + 6 vector representing the corre" - "sponding torques required to achive the desired accelerations given the robot state." - Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" - "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " - "WBTConfig;\ncatch\nend" - Display "port_label('output', 1, 'Torques')\n\nport_label('input', 1, 'Base pose')\nport_label('input', 2, 'Joints" - " configuration')\nport_label('input', 3, 'Base velocity')\nport_label('input', 4, 'Joints velocity')\nport_label('in" - "put', 5, 'Base acceleration')\nport_label('input', 6, 'Joints acceleration')\n" - RunInitForIconRedraw "off" - Object { - $PropName "DialogControls" - $ObjectID 197 - $ClassName "Simulink.dialog.Group" - Prompt "%" - Array { - Type "Simulink.dialog.Control" - Dimension 2 - Object { - $ObjectID 198 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" - } - Object { - $ObjectID 199 - $ClassName "Simulink.dialog.Group" - Object { - $PropName "DialogControls" - $ObjectID 200 - $ClassName "Simulink.dialog.Button" - Prompt "Toggle Config Block Highlighting" - Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" - "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" - "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" - "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" - Name "toggleHighlighting" - } - Name "ToggleButtonContainer" - } - PropName "DialogControls" - } - Name "DescGroupVar" - } - } } Block { - BlockType SubSystem - Name "Mass Matrix" - SID "1633" - Ports [2, 1] - Position [250, 104, 390, 171] - ZOrder 32 - RequestExecContextInheritance off - Object { - $PropName "MaskObject" - $ObjectID 201 - $ClassName "Simulink.Mask" - Type "Mass Matrix" - Description "This block retrieves the robot mass matrix.\n\nAssuming DoFs is the number of internal degrees of free" - "dom of the robot,\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transformation between the base f" - "rame and the world frame.\n - Joint configuration: Vector of size DoFs, representing the configuration of the joint" - "s.\n\nOutput:\n - Mass Matrix: a (DoFs + 6) x (DoFs + 6) matrix representing the mass matrix of the robot." - Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" - "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " - "WBTConfig;\ncatch\nend" - RunInitForIconRedraw "off" - Object { - $PropName "DialogControls" - $ObjectID 202 - $ClassName "Simulink.dialog.Group" - Prompt "%" - Array { - Type "Simulink.dialog.Control" - Dimension 2 - Object { - $ObjectID 203 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" - } - Object { - $ObjectID 204 - $ClassName "Simulink.dialog.Group" - Object { - $PropName "DialogControls" - $ObjectID 205 - $ClassName "Simulink.dialog.Button" - Prompt "Toggle Config Block Highlighting" - Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" - "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" - "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" - "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" - Name "toggleHighlighting" - } - Name "ToggleButtonContainer" - } - PropName "DialogControls" - } - Name "DescGroupVar" - } - } - System { - Name "Mass Matrix" - Location [832, 225, 3700, 1914] - Open off - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "952" - Block { - BlockType Inport - Name "Base Pose" - SID "1634" - Position [20, 23, 50, 37] - ZOrder 22 - IconDisplay "Port number" - } - Block { - BlockType Inport - Name "Joint configuration" - SID "1635" - Position [20, 63, 50, 77] - ZOrder 24 - Port "2" - IconDisplay "Port number" - } - Block { - BlockType S-Function - Name "S-Function" - SID "1636" - Ports [2, 1] - Position [125, 37, 185, 68] - ZOrder 19 - FunctionName "WBToolbox" - Parameters "'MassMatrix','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - } - Block { - BlockType Outport - Name "Mass Matrix" - SID "1637" - Position [245, 48, 275, 62] - ZOrder 25 - IconDisplay "Port number" - } - Line { - ZOrder 1 - SrcBlock "S-Function" - SrcPort 1 - DstBlock "Mass Matrix" - DstPort 1 - } - Line { - ZOrder 2 - SrcBlock "Base Pose" - SrcPort 1 - Points [36, 0; 0, 15] - DstBlock "S-Function" - DstPort 1 - } - Line { - ZOrder 3 - SrcBlock "Joint configuration" - SrcPort 1 - Points [33, 0; 0, -10] - DstBlock "S-Function" - DstPort 2 - } - } + BlockType Outport + Name "Estimate" + SID "1798" + Position [210, 48, 240, 62] + ZOrder 25 + IconDisplay "Port number" + } + Line { + ZOrder 1 + SrcBlock "S-Function" + SrcPort 1 + DstBlock "Estimate" + DstPort 1 } } } + } + } + Block { + BlockType SubSystem + Name "Utilities" + SID "192" + Ports [] + Position [364, 17, 462, 114] + ZOrder -1 + ForegroundColor "white" + DropShadow on + RequestExecContextInheritance off + Object { + $PropName "MaskObject" + $ObjectID 188 + $ClassName "Simulink.Mask" + Display "image(imread('utilities.png'))" + } + System { + Name "Utilities" + Location [0, 27, 1920, 1080] + Open on + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "219" Block { BlockType SubSystem - Name "Jacobians" - SID "202" + Name "Configuration" + SID "1774" Ports [] - Position [217, 20, 324, 127] - ZOrder -3 - DropShadow on + Position [295, 310, 370, 340] + ZOrder 95 + InitFcn "source = get_param(gcb,'ConfigSource');\n\nif strcmp(source, 'Workspace')\n object = get_param(gcb,'" + "ConfigObject');\n WBToolbox.ConfigurationToMask(gcb, object);\nend\n\nWBToolbox.MaskToConfiguration(gcb);\n\ncle" + "ar object source" RequestExecContextInheritance off Object { $PropName "MaskObject" - $ObjectID 206 + $ObjectID 189 $ClassName "Simulink.Mask" - Display "image(imread('jacobian.png'))" - } - System { - Name "Jacobians" - Location [832, 225, 3700, 1914] - Open off - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "728" - Block { - BlockType SubSystem - Name "DotJ Nu" - SID "1683" - Ports [4, 1] - Position [590, 170, 755, 265] - ZOrder 67 - RequestExecContextInheritance off + SelfModifiable "on" + Display "disp('Config')" + RunInitForIconRedraw "off" + Array { + Type "Simulink.MaskParameter" + Dimension 8 Object { - $PropName "MaskObject" - $ObjectID 207 - $ClassName "Simulink.Mask" - Type "DotJ Nu" - Description "This block computes the product between the time derivative of the Jacobian of the specified frame and" - " the state (base and joints) velocity vector.\n\nAssuming DoFs is the number of internal degrees of freedom of the r" - "obot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transformation between the the base frame and" - " the world frame.\n - Joint configuration: Vector of size DoFs, representing the configuration of the joints.\n - " - "Base velocity: Vector of size 6 representing the linear and angular velocity of the base frame.\n - Joints velocity" - ": Vector of size DoFs, representing the velocity of the joints.\n\nOutput:\n - dotJ nu: a 6D vector representing th" - "e product between the time derivative of the Jacobian of the specified frame and the state velocity vector\n\nParame" - "ters:\n - Frame name: the name of the frame. It should be specified in the URDF model." - Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" - "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " - "WBTConfig;\ncatch\nend" - Display "escapedFrameName = strrep(frameName, '_', '\\_');\nport_label('output', 1, strcat('dot J_{',escapedFrameN" - "ame,'} \\nu'), 'texmode','on')\n\nport_label('input', 1, '{}^{world} H_{base}', 'texmode','on')\nport_label('input'," - " 2, 'Joint configuration')\nport_label('input', 3, 'Base velocity')\nport_label('input', 4, 'Joint velocity')\n\ncle" - "ar escapedFrameName;" - RunInitForIconRedraw "on" - Object { - $PropName "Parameters" - $ObjectID 208 - $ClassName "Simulink.MaskParameter" - Type "edit" - Name "frameName" - Prompt "Frame name" - Value "'frame'" - } + $ObjectID 190 + Type "popup" Array { - Type "Simulink.dialog.Group" + Type "Cell" Dimension 2 - Object { - $ObjectID 209 - Prompt "%" - Object { - $PropName "DialogControls" - $ObjectID 210 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" - } - Name "DescGroupVar" - } - Object { - $ObjectID 211 - Prompt "Simulink:studio:ToolBarParametersMenu" - Array { - Type "Simulink.dialog.Control" - Dimension 2 - Object { - $ObjectID 212 - $ClassName "Simulink.dialog.parameter.Edit" - Name "frameName" - } - Object { - $ObjectID 213 - $ClassName "Simulink.dialog.Group" - Object { - $PropName "DialogControls" - $ObjectID 214 - $ClassName "Simulink.dialog.Button" - Prompt "Toggle Config Block Highlighting" - Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" - "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" - "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" - "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" - Name "toggleHighlighting" - } - Name "ToggleButtonContainer" - } - PropName "DialogControls" - } - Name "ParameterGroupVar" - } - PropName "DialogControls" + Cell "Workspace" + Cell "Mask" + PropName "TypeOptions" } + Name "ConfigSource" + Prompt "Configuration from" + Value "Mask" + Callback "% Get the Workspace/Mask menu\nh = Simulink.Mask.get(gcb);\ncurrentConfigSource = get_param(gcb,'ConfigSo" + "urce');\n\nif strcmp(currentConfigSource,'Workspace')\n % Switch the visibility of the GUI elements\n set_para" + "m(gcb,'MaskVisibilities',{'on';'on';'on';'on';'on';'on';'on';'on';});\n h.Parameters(3).ReadOnly = 'on';\n h.P" + "arameters(4).ReadOnly = 'on';\n h.Parameters(5).ReadOnly = 'on';\n h.Parameters(6).ReadOnly = 'on';\n h.Par" + "ameters(7).ReadOnly = 'on';\n h.Parameters(8).ReadOnly = 'on';\n \n % Parse the object inserted in the Conf" + "igObject field\n currentConfigObject = get_param(gcb,'ConfigObject');\n WBToolbox.ConfigurationToMask(gcb,curr" + "entConfigObject);\n clear currentConfigObject;\nelseif strcmp(currentConfigSource,'Mask')\n % Switch the visib" + "ility of the GUI elements\n set_param(gcb,'MaskVisibilities',{'on';'off';'on';'on';'on';'on';'on';'on';});\n h" + ".Parameters(3).ReadOnly = 'off';\n h.Parameters(4).ReadOnly = 'off';\n h.Parameters(5).ReadOnly = 'off';\n " + "h.Parameters(6).ReadOnly = 'off';\n h.Parameters(7).ReadOnly = 'off';\n h.Parameters(8).ReadOnly = 'off';\n " + " h.Parameters(3).Enabled = 'on';\n h.Parameters(4).Enabled = 'on';\n h.Parameters(5).Enabled = 'on';\n h.Pa" + "rameters(6).Enabled = 'on';\n h.Parameters(7).Enabled = 'on';\n h.Parameters(8).Enabled = 'on';\nend\n\nclear " + "h currentConfigSource" } - System { - Name "DotJ Nu" - Location [832, 225, 3700, 1914] - Open off - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "964" - Block { - BlockType Inport - Name "Base Pose" - SID "1684" - Position [20, 13, 50, 27] - ZOrder 22 - IconDisplay "Port number" - } - Block { - BlockType Inport - Name "Joint configuration" - SID "1685" - Position [20, 43, 50, 57] - ZOrder 24 - Port "2" - IconDisplay "Port number" - } - Block { - BlockType Inport - Name "Base velocity" - SID "1686" - Position [20, 73, 50, 87] - ZOrder 26 - Port "3" - IconDisplay "Port number" - } - Block { - BlockType Inport - Name "Joints velocity" - SID "1687" - Position [20, 103, 50, 117] - ZOrder 27 - Port "4" - IconDisplay "Port number" - } - Block { - BlockType S-Function - Name "S-Function" - SID "1688" - Ports [4, 1] - Position [125, 4, 190, 126] - ZOrder 19 - FunctionName "WBToolbox" - Parameters "'DotJNu','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,frameName" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - } - Block { - BlockType Outport - Name "dotJ dotnu" - SID "1689" - Position [245, 58, 275, 72] - ZOrder 25 - IconDisplay "Port number" - } - Line { - ZOrder 1 - SrcBlock "Joint configuration" - SrcPort 1 - DstBlock "S-Function" - DstPort 2 - } - Line { - ZOrder 2 - SrcBlock "Base Pose" - SrcPort 1 - DstBlock "S-Function" - DstPort 1 - } - Line { - ZOrder 3 - SrcBlock "S-Function" - SrcPort 1 - DstBlock "dotJ dotnu" - DstPort 1 - } - Line { - ZOrder 4 - SrcBlock "Base velocity" - SrcPort 1 - DstBlock "S-Function" - DstPort 3 - } - Line { - ZOrder 5 - SrcBlock "Joints velocity" - SrcPort 1 - DstBlock "S-Function" - DstPort 4 - } + Object { + $ObjectID 191 + Type "edit" + Name "ConfigObject" + Prompt "Name of the object" + Value "'WBTConfigRobot'" + Tunable "off" + Visible "off" + Callback "% This code get called whatsoever\nif strcmp(char(get_param(gcb,'ConfigSource')),'Mask')\n return\nend" + "\n\n% Parse the object inserted in the ConfigObject field\ncurrentConfigObject = get_param(gcb,'ConfigObject');\nWBT" + "oolbox.ConfigurationToMask(gcb,currentConfigObject);\n\nclear currentConfigObject;" + } + Object { + $ObjectID 192 + Type "edit" + Name "RobotName" + Prompt "Robot Name" + Value "'icubSim'" + } + Object { + $ObjectID 193 + Type "edit" + Name "UrdfFile" + Prompt "Urdf File" + Value "'model.urdf'" + } + Object { + $ObjectID 194 + Type "edit" + Name "ControlledJoints" + Prompt "Controlled Joints" + Value "{'l_elbow','l_shoulder_pitch','torso_roll'}" + } + Object { + $ObjectID 195 + Type "edit" + Name "ControlBoardsNames" + Prompt "Control Boards Names" + Value "{'left_arm','right_arm','torso'}" + } + Object { + $ObjectID 196 + Type "edit" + Name "LocalName" + Prompt "Local Name" + Value "'WBT'" } + Object { + $ObjectID 197 + Type "edit" + Name "GravityVector" + Prompt "Gravity Vector" + Value "[0,0,-9.81]" + } + PropName "Parameters" } - Block { - BlockType SubSystem - Name "Jacobian" - SID "1663" - Ports [2, 1] - Position [380, 190, 540, 245] - ZOrder 39 - RequestExecContextInheritance off + Array { + Type "Simulink.dialog.Group" + Dimension 2 Object { - $PropName "MaskObject" - $ObjectID 215 - $ClassName "Simulink.Mask" - Type "Jacobian" - Description "This block retrieves the Jacobian of the specified frame.\n\nAssuming DoFs is the number of internal d" - "egrees of freedom of the robot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transformation betw" - "een the the base frame and the world frame.\n - Joint configuration: Vector of size DoFs, representing the configur" - "ation of the joints.\n\nOutput:\n - Jacobian: a 6x6+dofs matrix representing the Jacobian of the specified frame wr" - "itten in the world frame.\n\nParameters:\n - Frame name: the name of the frame. It should be specified in the URDF " - "model." - Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" - "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " - "WBTConfig;\ncatch\nend" - Display "escapedFrameName = strrep(frameName, '_', '\\_');\nport_label('output', 1, strcat('{}^{world} J_{',escape" - "dFrameName,'}'), 'texmode','on')\n\nport_label('input', 1, '{}^{world} H_{base}', 'texmode','on')\nport_label('input" - "', 2, 'Joint configuration')\n\nclear escapedFrameName;" - RunInitForIconRedraw "on" + $ObjectID 198 + Prompt "%" Object { - $PropName "Parameters" - $ObjectID 216 - $ClassName "Simulink.MaskParameter" - Type "edit" - Name "frameName" - Prompt "Frame name" - Value "'frame'" + $PropName "DialogControls" + $ObjectID 199 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" } - Array { - Type "Simulink.dialog.Group" - Dimension 2 - Object { - $ObjectID 217 - Prompt "%" + Name "DescGroupVar" + } + Object { + $ObjectID 200 + Prompt "Simulink:studio:ToolBarParametersMenu" + Object { + $PropName "DialogControls" + $ObjectID 201 + $ClassName "Simulink.dialog.TabContainer" + Array { + Type "Simulink.dialog.Tab" + Dimension 2 Object { - $PropName "DialogControls" - $ObjectID 218 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" - } - Name "DescGroupVar" - } - Object { - $ObjectID 219 - Prompt "Simulink:studio:ToolBarParametersMenu" + $ObjectID 202 + Prompt "From" Array { - Type "Simulink.dialog.Control" + Type "Simulink.dialog.parameter.Control" Dimension 2 Object { - $ObjectID 220 - $ClassName "Simulink.dialog.parameter.Edit" - Name "frameName" + $ObjectID 203 + $ClassName "Simulink.dialog.parameter.Popup" + Name "ConfigSource" } Object { - $ObjectID 221 - $ClassName "Simulink.dialog.Group" - Object { - $PropName "DialogControls" - $ObjectID 222 - $ClassName "Simulink.dialog.Button" - Prompt "Toggle Config Block Highlighting" - Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" - "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" - "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" - "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" - Name "toggleHighlighting" + $ObjectID 204 + $ClassName "Simulink.dialog.parameter.Edit" + PromptLocation "left" + Name "ConfigObject" } - Name "ToggleButtonContainer" + PropName "DialogControls" + } + Name "TabFrom" + } + Object { + $ObjectID 205 + Prompt "Data" + Array { + Type "Simulink.dialog.parameter.Edit" + Dimension 6 + Object { + $ObjectID 206 + PromptLocation "left" + Name "RobotName" + } + Object { + $ObjectID 207 + PromptLocation "left" + Name "UrdfFile" + } + Object { + $ObjectID 208 + PromptLocation "left" + Name "ControlledJoints" + } + Object { + $ObjectID 209 + PromptLocation "left" + Name "ControlBoardsNames" + } + Object { + $ObjectID 210 + PromptLocation "left" + Name "LocalName" + } + Object { + $ObjectID 211 + PromptLocation "left" + Name "GravityVector" } PropName "DialogControls" } - Name "ParameterGroupVar" + Name "TabData" + } + PropName "DialogControls" } - PropName "DialogControls" + Name "TabContainer" } + Name "ParameterGroupVar" } + PropName "DialogControls" + } + } + System { + Name "Configuration" + Location [550, 86, 1677, 725] + Open off + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "600" + SIDHighWatermark "70" + Block { + BlockType Constant + Name "ImConfig" + SID "1774:67" + Position [20, 20, 50, 50] + ZOrder 81 + Value "0" + } + Block { + BlockType Terminator + Name "Terminator" + SID "1774:68" + Position [95, 25, 115, 45] + ZOrder 80 + } + Line { + ZOrder 1 + SrcBlock "ImConfig" + SrcPort 1 + DstBlock "Terminator" + DstPort 1 + } + } + } + Block { + BlockType SubSystem + Name "DampPinv" + SID "104" + Ports [2, 1] + Position [495, 198, 565, 242] + ZOrder -1 + BackgroundColor "[0.848000, 0.128048, 0.320035]" + RequestExecContextInheritance off + Object { + $PropName "MaskObject" + $ObjectID 212 + $ClassName "Simulink.Mask" + RunInitForIconRedraw "off" + Object { + $PropName "Parameters" + $ObjectID 213 + $ClassName "Simulink.MaskParameter" + Type "edit" + Name "tol" + Prompt "Tolerance" + Value "1e-4" + } + } + System { + Name "DampPinv" + Location [0, 29, 1280, 744] + Open off + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + Block { + BlockType Inport + Name "mat" + SID "105" + Position [50, 53, 80, 67] + ZOrder -1 + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "sigma" + SID "106" + Position [50, 93, 80, 107] + ZOrder -2 + Port "2" + IconDisplay "Port number" + } + Block { + BlockType SubSystem + Name "Damped Pseudo Inverse" + SID "107" + Ports [2, 1] + Position [105, 39, 200, 121] + ZOrder -4 + LibraryVersion "1.32" + ErrorFcn "Stateflow.Translate.translate" + PermitHierarchicalResolution "ExplicitOnly" + TreatAsAtomicUnit on + RequestExecContextInheritance off + SFBlockType "MATLAB Function" System { - Name "Jacobian" - Location [832, 225, 3700, 1914] + Name "Damped Pseudo Inverse" + Location [12, 45, 1279, 3773] Open off PortBlocksUseCompactNotation off SetDomainSpec off @@ -4929,860 +4705,965 @@ Library { TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] TiledPageScale 1 ShowPageBoundaries off - ZoomFactor "899" + ZoomFactor "100" + SIDHighWatermark "1628" Block { BlockType Inport - Name "Base Pose" - SID "1664" - Position [20, 23, 50, 37] - ZOrder 22 + Name "mat" + SID "107::1" + Position [20, 101, 40, 119] + ZOrder -1 IconDisplay "Port number" } Block { BlockType Inport - Name "Joint configuration" - SID "1665" - Position [20, 63, 50, 77] - ZOrder 24 + Name "sigma" + SID "107::25" + Position [20, 136, 40, 154] + ZOrder 11 Port "2" IconDisplay "Port number" } + Block { + BlockType Demux + Name " Demux " + SID "107::1627" + Ports [1, 1] + Position [270, 230, 320, 270] + ZOrder 107 + Outputs "1" + } Block { BlockType S-Function - Name "S-Function" - SID "1666" - Ports [2, 1] - Position [125, 37, 185, 68] - ZOrder 19 - FunctionName "WBToolbox" - Parameters "'Jacobian','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,frameName" + Name " SFunction " + SID "107::1626" + Tag "Stateflow S-Function WBToolboxLibrary_repository 6" + Ports [2, 2] + Position [180, 100, 230, 160] + ZOrder 106 + FunctionName "sf_sfun" + PortCounts "[2 2]" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off + Port { + PortNumber 2 + Name "DPinv" + } + } + Block { + BlockType Terminator + Name " Terminator " + SID "107::1628" + Position [460, 241, 480, 259] + ZOrder 108 } Block { BlockType Outport - Name "Forward Kinematics" - SID "1667" - Position [245, 48, 275, 62] - ZOrder 25 + Name "DPinv" + SID "107::5" + Position [460, 101, 480, 119] + ZOrder -6 IconDisplay "Port number" } Line { - ZOrder 1 - SrcBlock "S-Function" + ZOrder 76 + SrcBlock "mat" SrcPort 1 - DstBlock "Forward Kinematics" + Points [120, 0] + DstBlock " SFunction " DstPort 1 } Line { - ZOrder 2 - SrcBlock "Base Pose" + ZOrder 77 + SrcBlock "sigma" SrcPort 1 - Points [36, 0; 0, 15] - DstBlock "S-Function" - DstPort 1 + DstBlock " SFunction " + DstPort 2 } Line { - ZOrder 3 - SrcBlock "Joint configuration" - SrcPort 1 - Points [33, 0; 0, -10] - DstBlock "S-Function" - DstPort 2 + Name "DPinv" + ZOrder 78 + Labels [0, 0] + SrcBlock " SFunction " + SrcPort 2 + DstBlock "DPinv" + DstPort 1 + } + Line { + ZOrder 79 + SrcBlock " Demux " + SrcPort 1 + DstBlock " Terminator " + DstPort 1 + } + Line { + ZOrder 80 + SrcBlock " SFunction " + SrcPort 1 + DstBlock " Demux " + DstPort 1 } } } + Block { + BlockType Outport + Name "DPinv" + SID "108" + Position [225, 73, 255, 87] + ZOrder -5 + IconDisplay "Port number" + } + Line { + ZOrder 1 + SrcBlock "sigma" + SrcPort 1 + DstBlock "Damped Pseudo Inverse" + DstPort 2 + } + Line { + ZOrder 2 + SrcBlock "Damped Pseudo Inverse" + SrcPort 1 + DstBlock "DPinv" + DstPort 1 + } + Line { + ZOrder 3 + SrcBlock "mat" + SrcPort 1 + DstBlock "Damped Pseudo Inverse" + DstPort 1 + } } } Block { - BlockType SubSystem - Name "Kinematics" - SID "176" - Ports [] - Position [70, 20, 177, 127] - ZOrder -17 - DropShadow on - RequestExecContextInheritance off + BlockType S-Function + Name "DiscreteFilter" + SID "1790" + Ports [1, 1] + Position [165, 310, 235, 340] + ZOrder 103 + BackgroundColor "yellow" + FunctionName "BlockFactory" + Parameters "'DiscreteFilter','WBToolboxLibrary',filterDataStruct" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off Object { $PropName "MaskObject" - $ObjectID 223 + $ObjectID 214 $ClassName "Simulink.Mask" - Display "image(imread('forwardKinematics.png'))" - } - System { - Name "Kinematics" - Location [832, 225, 3700, 1914] - Open off - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "600" - Block { - BlockType SubSystem - Name "Forward Kinematics" - SID "1647" - Ports [2, 1] - Position [360, 103, 510, 167] - ZOrder 34 - RequestExecContextInheritance off + Type "Discrete Filter" + Description "This block wraps the Filter, FirstOrderLowPassFilter, and MedianFilter from iCub::ctrl." + Initialization "filterDataStruct = struct;\nfilterDataStruct.Fc = Fc;\nfilterDataStruct.Ts = Ts;\nfilterDataS" + "truct.MedianOrder = orderMedianFilter;\nfilterDataStruct.FilterType = filterType;\nfilterDataStruct.NumCoeffs = n" + "umCoeffs;\nfilterDataStruct.DenCoeffs = denCoeffs;\nfilterDataStruct.y0 = y0;\nfilterDataStruct.u0 = u0;\nfilterD" + "ataStruct.InitStatus = uint8(initStatus);" + Display "disp('Filter')" + RunInitForIconRedraw "off" + Array { + Type "Simulink.MaskParameter" + Dimension 9 + Object { + $ObjectID 215 + Type "popup" + Array { + Type "Cell" + Dimension 3 + Cell "Generic" + Cell "FirstOrderLowPassFilter" + Cell "MedianFilter" + PropName "TypeOptions" + } + Name "filterType" + Prompt "Type of the filter" + Value "Generic" + Evaluate "off" + Callback "% From: https://it.mathworks.com/help/simulink/slref/simulink.mask-class.html\nfilterType = get_param(gcb" + ", 'filterType');\ninitStatus = get_param(gcb, 'initStatus');\np = Simulink.Mask.get(gcbh);\nhowToCoeffs = p.getDialo" + "gControl('howToCoeffs');\n\n%set_param(gcb, 'initStatus','off');\nif (strcmp(initStatus,'on'))\n vis_init = 'on';" + "\nelse\n vis_init = 'off';\nend\n\nif(strcmp(filterType, 'Generic'))\n set_param(gcb, 'MaskVisibilities',{'on'" + ",'on','on','off','off','off','on',vis_init,vis_init});\n howToCoeffs.Visible = 'on';\nelseif(strcmp(filterType, '" + "FirstOrderLowPassFilter'))\n set_param(gcb, 'MaskVisibilities',{'on','off','off','on','on','off','on',vis_init,'o" + "ff'});\n howToCoeffs.Visible = 'off';\nelseif(strcmp(filterType, 'MedianFilter'))\n set_param(gcb, 'MaskVisibi" + "lities',{'on','off','off','off','off','on','on',vis_init,'off'});\n howToCoeffs.Visible = 'off';\nend\n\nclear fi" + "lterType initStatus p howToCoeffs vis_init;" + } + Object { + $ObjectID 216 + Type "edit" + Name "numCoeffs" + Prompt "Numerator Coefficients*" + Value "[0]" + } + Object { + $ObjectID 217 + Type "edit" + Name "denCoeffs" + Prompt "Denominator Coefficients*" + Value "[0]" + } + Object { + $ObjectID 218 + Type "edit" + Name "Fc" + Prompt "Cut Frequency (Hz)" + Value "0" + Visible "off" + } + Object { + $ObjectID 219 + Type "edit" + Name "Ts" + Prompt "Sampling time (s)" + Value "0" + Visible "off" + } + Object { + $ObjectID 220 + Type "edit" + Name "orderMedianFilter" + Prompt "Order" + Value "0" + Visible "off" + } + Object { + $ObjectID 221 + Type "checkbox" + Name "initStatus" + Prompt "Define initial conditions" + Value "off" + Callback "initStatus = get_param(gcb, 'initStatus');\nvisibilities = get_param(gcb, 'MaskVisibilities');\nfilterT" + "ype = get_param(gcb, 'filterType');\n\nif (strcmp(initStatus,'off'))\n visibilities{8} = 'off';\n visibiliti" + "es{9} = 'off';\nelseif (strcmp(initStatus,'on'))\n visibilities{8} = 'on';\n if (strcmp(filterType,'Generic'))" + "\n visibilities{9} = 'on';\n end\nend\n\nset_param(gcb, 'MaskVisibilities', visibilities);\n\nclear initSt" + "atus visibilities filterType;" + } + Object { + $ObjectID 222 + Type "edit" + Name "y0" + Prompt "Output y0" + Value "[0]" + Visible "off" + } + Object { + $ObjectID 223 + Type "edit" + Name "u0" + Prompt "Input u0" + Value "[0]" + Visible "off" + } + PropName "Parameters" + } + Array { + Type "Simulink.dialog.Group" + Dimension 2 Object { - $PropName "MaskObject" $ObjectID 224 - $ClassName "Simulink.Mask" - Type "Forward Kinematics" - Description "This block retrieves the forward kinematics of the specified frame.\n\nAssuming DoFs is the number of " - "internal degrees of freedom of the robot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transform" - "ation between the the base frame and the world frame.\n - Joint configuration: Vector of size DoFs, representing th" - "e configuration of the joints.\n\nOutput:\n - Forward Kinematics: a 4x4 matrix representing the homogenous transfor" - "mation between the specified frame and the world frame.\n\nParameters:\n - Frame name: the name of the frame. It sh" - "ould be specified in the URDF model." - Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" - "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " - "WBTConfig;\ncatch\nend" - Display "escapedFrameName = strrep(frameName, '_', '\\_');\n% port_label('output', 1, strcat('{}^{world} H_{',esca" - "pedFrameName,'}'), 'texmode','on')\n\nport_label('input', 1, '{}^{world} H_{base}', 'texmode','on')\nport_label('inp" - "ut', 2, 'Joint configuration')\n\nclear escapedFrameName;" - RunInitForIconRedraw "on" + Prompt "%" Object { - $PropName "Parameters" + $PropName "DialogControls" $ObjectID 225 - $ClassName "Simulink.MaskParameter" - Type "edit" - Name "frameName" - Prompt "Frame name" - Value "'frame'" + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" } + Name "DescGroupVar" + } + Object { + $ObjectID 226 + Prompt "Simulink:studio:ToolBarParametersMenu" Array { - Type "Simulink.dialog.Group" - Dimension 2 + Type "Simulink.dialog.Control" + Dimension 8 Object { - $ObjectID 226 - Prompt "%" - Object { - $PropName "DialogControls" $ObjectID 227 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" - } - Name "DescGroupVar" + $ClassName "Simulink.dialog.parameter.Popup" + Name "filterType" } Object { $ObjectID 228 - Prompt "Simulink:studio:ToolBarParametersMenu" - Array { - Type "Simulink.dialog.Control" - Dimension 2 - Object { + $ClassName "Simulink.dialog.parameter.Edit" + Name "numCoeffs" + } + Object { $ObjectID 229 $ClassName "Simulink.dialog.parameter.Edit" - Name "frameName" - } - Object { - $ObjectID 230 - $ClassName "Simulink.dialog.Group" - Object { - $PropName "DialogControls" - $ObjectID 231 - $ClassName "Simulink.dialog.Button" - Prompt "Toggle Config Block Highlighting" - Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" - "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" - "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" - "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" - Name "toggleHighlighting" - } - Name "ToggleButtonContainer" - } - PropName "DialogControls" - } - Name "ParameterGroupVar" - } - PropName "DialogControls" - } - } - System { - Name "Forward Kinematics" - Location [832, 225, 3700, 1914] - Open off - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "709" - Block { - BlockType Inport - Name "Base Pose" - SID "1648" - Position [20, 23, 50, 37] - ZOrder 22 - IconDisplay "Port number" - } - Block { - BlockType Inport - Name "Joint configuration" - SID "1649" - Position [20, 63, 50, 77] - ZOrder 24 - Port "2" - IconDisplay "Port number" - } - Block { - BlockType S-Function - Name "S-Function" - SID "1650" - Ports [2, 1] - Position [125, 37, 185, 68] - ZOrder 19 - FunctionName "WBToolbox" - Parameters "'ForwardKinematics','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,frameName" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - } - Block { - BlockType Outport - Name "Forward Kinematics" - SID "1651" - Position [245, 48, 275, 62] - ZOrder 25 - IconDisplay "Port number" - } - Line { - ZOrder 1 - SrcBlock "S-Function" - SrcPort 1 - DstBlock "Forward Kinematics" - DstPort 1 - } - Line { - ZOrder 2 - SrcBlock "Base Pose" - SrcPort 1 - Points [36, 0; 0, 15] - DstBlock "S-Function" - DstPort 1 - } - Line { - ZOrder 3 - SrcBlock "Joint configuration" - SrcPort 1 - Points [33, 0; 0, -10] - DstBlock "S-Function" - DstPort 2 - } - } - } - Block { - BlockType SubSystem - Name "Inverse Kinematics" - SID "1754" - Ports [3, 2] - Position [350, 198, 525, 262] - ZOrder 35 - Commented "on" - InitFcn "if ~exist('WBT_robotName','var')\n WBT_robotName = '';\nend\nif ~exist('WBT_modelName','var'" - ")\n WBT_modelName = 'WBT_simulink';\nend\nif ~exist('WBT_wbiFilename','var')\n WBT_wbiFilename = 'yarpWho" - "leBodyInterface.ini';\nend\nif ~exist('WBT_wbiList','var')\n WBT_wbiList = 'ROBOT_TORQUE_CONTROL_JOINTS';\ne" - "nd" - RequestExecContextInheritance off - Object { - $PropName "MaskObject" - $ObjectID 232 - $ClassName "Simulink.Mask" - Type "Forward Kinematics" - Description "This block retrieves the forward kinematics of the specified frame.\n\nAssuming DoFs is the number of " - "internal degrees of freedom of the robot,\nInput:\n- Base pose: 4x4 matrix representing the homogenous transformatio" - "n between\n the the base frame and the world frame.\n- Joint configuration: Vector of size DoFs, represe" - "nting the configuration \n of the joints.\n\nOutput:\n- Forward Kinematics: a 4x4 matrix repre" - "senting the homogenous transformation between\n the specified frame and the world frame.\n\nParameters:\n" - "- Frame name: the name of the frame. It should be specified in the URDF model.\n\n- Robot Port Name: Name of the por" - "ts opened by the robot. (e.g. icub).\n Set an empty string ('') to use the name specified in the \n" - " Whole Body Interface configuration file.\n- Model Name: Prefix name of the ports opened by the un" - "derlying Whole Body Interface.\n- WBI filename: name of the file containing the configuration of the Whole Body Inte" - "rface\n- WBI List Name: name of the list of joints used to configure the Whole Body Interface\n" - Display "escapedBaseFrameName = strrep(baseFrame, '_', '\\_');\nescapedEndEffFrameName = strrep(endEffFrame, '_', " - "'\\_');\n\n%port_label('output', 1, strcat('{}^{world} H_{',escapedFrameName,'}'), 'texmode','on')\n\n%port_label('i" - "nput', 1, '{}^{world} H_{base}', 'texmode','on')\n%port_label('input', 2, 'Joint configuration')\n\n%clear escapedFr" - "ameName;\n\n\n% if strcmp(robotPart, 'left')\n% prefix = 'l';\n% else\n% prefix = 'r';\n% end\n% \nport_labe" - "l('input', 1, strcat('{}^{',escapedBaseFrameName,'} H_{',escapedEndEffFrameName,'}^d'), 'texmode','on');\n\nport_lab" - "el('input', 2, '{}^{world} H_{base}', 'texmode','on')\nport_label('input', 3, 'q_j', 'texmode','on');\n% \n% \nport_" - "label('output', 1, '{}^{world} H_{base}^d', 'texmode','on')\nport_label('output', 2, 'q_j^d', 'texmode','on');\n\n" - RunInitForIconRedraw "on" - Array { - Type "Simulink.MaskParameter" - Dimension 7 - Object { - $ObjectID 233 - Type "edit" - Name "baseFrame" - Prompt "Base Frame" - Value "'root_link'" - } - Object { - $ObjectID 234 - Type "edit" - Name "endEffFrame" - Prompt "End Effector frame" - Value "'l_sole'" - } - Object { - $ObjectID 235 - Type "popup" - Array { - Type "Cell" - Dimension 2 - Cell "Full Constraint (Position and Orientation)" - Cell "Position only constraint" - PropName "TypeOptions" - } - Name "optOption" - Prompt "Optimization Option" - Value "Full Constraint (Position and Orientation)" - } - Object { - $ObjectID 236 - Type "edit" - Name "robotName" - Prompt "Robot Port Name" - Value "WBT_robotName" - Tunable "off" + Name "denCoeffs" } Object { - $ObjectID 237 - Type "edit" - Name "localName" - Prompt "Model Name" - Value "WBT_modelName" - Tunable "off" + $ObjectID 230 + $ClassName "Simulink.dialog.Text" + Prompt "* The coefficients are ordered in increasing power of z^-1" + Name "howToCoeffs" } Object { - $ObjectID 238 - Type "edit" - Name "wbiFile" - Prompt "WBI filename" - Value "WBT_wbiFilename" - Tunable "off" + $ObjectID 231 + $ClassName "Simulink.dialog.parameter.Edit" + PromptLocation "left" + Name "Fc" } Object { - $ObjectID 239 - Type "edit" - Name "wbiList" - Prompt "WBI list name" - Value "WBT_wbiList" - Tunable "off" + $ObjectID 232 + $ClassName "Simulink.dialog.parameter.Edit" + PromptLocation "left" + Name "Ts" } - PropName "Parameters" - } - Array { - Type "Simulink.dialog.Group" - Dimension 2 Object { - $ObjectID 240 - Prompt "%" - Object { - $PropName "DialogControls" - $ObjectID 241 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" - } - Name "DescGroupVar" + $ObjectID 233 + $ClassName "Simulink.dialog.parameter.Edit" + PromptLocation "left" + Name "orderMedianFilter" } Object { - $ObjectID 242 - Prompt "Simulink:studio:ToolBarParametersMenu" - Object { - $PropName "DialogControls" - $ObjectID 243 - $ClassName "Simulink.dialog.TabContainer" - Array { - Type "Simulink.dialog.Tab" - Dimension 2 - Object { - $ObjectID 244 - Prompt "Block parameters" + $ObjectID 234 + $ClassName "Simulink.dialog.Group" Array { Type "Simulink.dialog.parameter.Control" Dimension 3 Object { - $ObjectID 245 - $ClassName "Simulink.dialog.parameter.Edit" - PromptLocation "left" - Name "baseFrame" + $ObjectID 235 + $ClassName "Simulink.dialog.parameter.CheckBox" + Name "initStatus" } Object { - $ObjectID 246 + $ObjectID 236 $ClassName "Simulink.dialog.parameter.Edit" - Name "endEffFrame" + Name "y0" } Object { - $ObjectID 247 - $ClassName "Simulink.dialog.parameter.Popup" - Name "optOption" + $ObjectID 237 + $ClassName "Simulink.dialog.parameter.Edit" + Name "u0" } PropName "DialogControls" } - Name "Container8" - } - Object { - $ObjectID 248 - Prompt "WBI parameters" - Array { - Type "Simulink.dialog.parameter.Edit" - Dimension 4 - Object { - $ObjectID 249 - Name "robotName" - } - Object { - $ObjectID 250 - Name "localName" - } - Object { - $ObjectID 251 - Name "wbiFile" - } - Object { - $ObjectID 252 - Name "wbiList" - } - PropName "DialogControls" - } - Name "Container5" - } - PropName "DialogControls" - } - Name "Container4" - } - Name "ParameterGroupVar" + Name "Container3" } PropName "DialogControls" } + Name "ParameterGroupVar" } - System { - Name "Inverse Kinematics" - Location [0, 23, 1280, 744] - Open off - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "312" - Block { - BlockType Inport - Name "Desired frame pose" - SID "1759" - Position [10, 13, 40, 27] - ZOrder 26 - IconDisplay "Port number" - } - Block { - BlockType Inport - Name "Current Base Pose" - SID "1755" - Position [10, 43, 40, 57] - ZOrder 22 - Port "2" - IconDisplay "Port number" - } - Block { - BlockType Inport - Name "Current Joint configuration" - SID "1756" - Position [10, 73, 40, 87] - ZOrder 24 - Port "3" - IconDisplay "Port number" - } - Block { - BlockType S-Function - Name "S-Function" - SID "1757" - Ports [3, 2] - Position [145, 4, 225, 96] - ZOrder 19 - FunctionName "WBToolbox" - Parameters "'InverseKinematics',robotName,localName,wbiFile,wbiList,baseFrame, endEffFrame,optOption" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - } - Block { - BlockType Outport - Name "Desired Base Pose" - SID "1758" - Position [280, 23, 310, 37] - ZOrder 25 - IconDisplay "Port number" - } - Block { - BlockType Outport - Name "Desired Joint Configuration" - SID "1760" - Position [280, 68, 310, 82] - ZOrder 27 - Port "2" - IconDisplay "Port number" - } - Line { - ZOrder 1 - SrcBlock "S-Function" - SrcPort 1 - DstBlock "Desired Base Pose" - DstPort 1 - } - Line { - ZOrder 5 - SrcBlock "Current Base Pose" - SrcPort 1 - DstBlock "S-Function" - DstPort 2 - } - Line { - ZOrder 4 - SrcBlock "Current Joint configuration" - SrcPort 1 - DstBlock "S-Function" - DstPort 3 - } - Line { - ZOrder 7 - SrcBlock "Desired frame pose" - SrcPort 1 - DstBlock "S-Function" - DstPort 1 - } - Line { - ZOrder 8 - SrcBlock "S-Function" - SrcPort 2 - DstBlock "Desired Joint Configuration" - DstPort 1 - } - } + PropName "DialogControls" } + } + } + Block { + BlockType SubSystem + Name "Match Signal Sizes" + SID "1818" + Ports [2, 1] + Position [440, 297, 525, 353] + ZOrder 251 + RequestExecContextInheritance off + Object { + $PropName "MaskObject" + $ObjectID 238 + $ClassName "Simulink.Mask" + Type "Match Signal Sizes" + Description "It can happen on particular cases that the Simulink engine cannot propagate the right sizes fro" + "m blocks of the toolbox. If you encounter such problems you can try using this blocks which introducing a minimal" + " overhead assigns to input Signal the same size of input Reference and outputs Signal.\n\nCurrently it supports o" + "nly 1D vectors." + Display "port_label('input', 1, 'Reference')\nport_label('input', 2, 'Signal')\nport_label('output', 1, 'Sig" + "nal')" + RunInitForIconRedraw "off" + } + System { + Name "Match Signal Sizes" + Location [548, 183, 3416, 1872] + Open off + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "1000" Block { - BlockType SubSystem - Name "Relative Transform" - SID "1799" - Ports [1, 1] - Position [565, 198, 715, 262] - ZOrder 67 - RequestExecContextInheritance off + BlockType Inport + Name "Reference" + SID "1819" + Position [315, 178, 345, 192] + ZOrder 240 + NamePlacement "alternate" + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "Signal" + SID "1820" + Position [315, 198, 345, 212] + ZOrder 241 + Port "2" + IconDisplay "Port number" + } + Block { + BlockType DotProduct + Name "Dot Product" + SID "1836" + Position [410, 177, 445, 213] + ZOrder 252 + OutDataTypeStr "Inherit: Inherit via internal rule" + } + Block { + BlockType Terminator + Name "Terminator" + SID "1822" + Position [485, 185, 505, 205] + ZOrder 245 + } + Block { + BlockType Outport + Name "Output" + SID "1823" + Position [410, 243, 440, 257] + ZOrder 244 + IconDisplay "Port number" + } + Line { + ZOrder 27 + SrcBlock "Dot Product" + SrcPort 1 + DstBlock "Terminator" + DstPort 1 + } + Line { + ZOrder 2 + SrcBlock "Signal" + SrcPort 1 + Points [17, 0] + Branch { + ZOrder 28 + Points [0, 45] + DstBlock "Output" + DstPort 1 + } + Branch { + ZOrder 26 + DstBlock "Dot Product" + DstPort 2 + } + } + Line { + ZOrder 24 + SrcBlock "Reference" + SrcPort 1 + DstBlock "Dot Product" + DstPort 1 + } + } + } + Block { + BlockType S-Function + Name "Minimum Jerk Trajectory Generator" + SID "1747" + Ports [1, 3] + Position [470, 93, 625, 147] + ZOrder 78 + FunctionName "BlockFactory" + Parameters "'MinimumJerkTrajectoryGenerator','WBToolboxLibrary',sampleTime,settlingTime,firstDerivatives,secondD" + "erivatives,explicitInitialValue,externalSettlingTime,resetOnSettlingTime" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off + Object { + $PropName "MaskObject" + $ObjectID 239 + $ClassName "Simulink.Mask" + Type "Minimum Jerk Trajectory Generator" + Description "This block wraps the minJerkTrajGen class from iCub::ctrl::minJerkTrajGen.\n\nThe Minimum Jerk " + "Trajectory Generator is approximated using a 3rd order LTI dynamical system (for more details see [1]).\n\nPositi" + "on, velocity and acceleration trajectories are computed.\n\nThe main advantage with respect to the standard polyn" + "omial form is that if the reference value yd changes there is no need to recompute the filter coefficients.\n\n[1" + "]\nPattacini, U.; Nori, F.; Natale, L.; Metta, G.; Sandini, G.\n\"An experimental evaluation of a novel minimum-j" + "erk cartesian controller for humanoid robots\"\nIntelligent Robots and Systems (IROS), 2010\nIEEE/RSJ Internation" + "al Conference on , vol., no., pp.1668-1674, 18-22 Oct. 2010\ndoi: 10.1109/IROS.2010.5650851\nURL: http://ieeexplo" + "re.ieee.org/stamp/stamp.jsp?tp=&arnumber=5650851&isnumber=5648787" + Display "firstDer = get_param(gcb, 'firstDerivatives');\nsecondDer = get_param(gcb, 'secondDerivatives');\ni" + "nitialValues = get_param(gcb, 'explicitInitialValue');\nexternalSettlingTimeParam = get_param(gcb, 'externalSettl" + "ingTime');\n\n%Inputs\nportIndex = 2;\nport_label('input', 1, 'Reference')\nif(strcmp(initialValues, 'on'))\n " + "port_label('input', portIndex, 'Initial Value')\n portIndex = portIndex + 1;\nend\n\nif(strcmp(externalSettlin" + "gTimeParam, 'on'))\n port_label('input', portIndex, 'Settling Time')\n portIndex = portIndex + 1;\nend\n\n%" + "Outputs\nport_label('output', 1, 'Signal')\nsecondDerPortIndex = 2;\nif(strcmp(firstDer, 'on'))\n port_label('" + "output', 2, 'First Derivative')\n secondDerPortIndex = secondDerPortIndex + 1;\nend\nif(strcmp(secondDer, 'on'" + "))\n port_label('output', secondDerPortIndex, 'Second Derivative')\nend\n\n\n" + RunInitForIconRedraw "on" + Array { + Type "Simulink.MaskParameter" + Dimension 7 Object { - $PropName "MaskObject" - $ObjectID 253 - $ClassName "Simulink.Mask" - Type "Relative Transform" - Description "This block calculates the relative transform between two frames.\n\nAssuming DoFs is the number of int" - "ernal degrees of freedom of the robot:\n\nInput:\n - Joint configuration: Vector of size DoFs, representing the con" - "figuration of the joints.\n\nOutput:\n - Transform: a 4x4 matrix representing the homogenous transformation between" - " frame1 and frame2.\n\nParameters:\n - Frame1 name: the name of the first frame. It should be part of the URDF mode" - "l.\n - Frame2 name: the name of the second frame. It should be part of the URDF model." - Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" - "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " - "WBTConfig;\ncatch\nend" - Display "port_label('input', 1, 'Joint configuration')\nport_label('output', 1, strcat('{}^{', frame1, '}', 'H_{'," - " frame2, '}'), 'texmode','on')" - RunInitForIconRedraw "on" - Array { - Type "Simulink.MaskParameter" - Dimension 2 - Object { - $ObjectID 254 - Type "edit" - Name "frame1" - Prompt "Frame1 name" - Value "'frame1'" - } - Object { - $ObjectID 255 - Type "edit" - Name "frame2" - Prompt "Frame2 name" - Value "'frame2'" - } - PropName "Parameters" + $ObjectID 240 + Type "checkbox" + Name "externalSettlingTime" + Prompt "External Settling Time" + Value "off" + Callback "externalSettlingTime = get_param(gcb, 'externalSettlingTime');\nvisibility = get_param(gcb, 'MaskVisibili" + "ties');\nif(strcmp(externalSettlingTime, 'on'))\n visibility{2} = 'off';\n visibility{4} = 'on';\nelse\n vi" + "sibility{2} = 'on';\n visibility{4} = 'off';\nend\nset_param(gcb, 'MaskVisibilities',visibility);\nclear external" + "SettlingTime" + } + Object { + $ObjectID 241 + Type "edit" + Name "settlingTime" + Prompt "Settling Time" + Value "3" + } + Object { + $ObjectID 242 + Type "edit" + Name "sampleTime" + Prompt "Sample Time" + Value "0.01" + } + Object { + $ObjectID 243 + Type "checkbox" + Name "resetOnSettlingTime" + Prompt "Reset on Settling Time Changes" + Value "off" + Visible "off" + } + Object { + $ObjectID 244 + Type "checkbox" + Name "firstDerivatives" + Prompt "Output First Derivative" + Value "on" + } + Object { + $ObjectID 245 + Type "checkbox" + Name "secondDerivatives" + Prompt "Output Second Derivative" + Value "on" + } + Object { + $ObjectID 246 + Type "checkbox" + Name "explicitInitialValue" + Prompt "Explicit Initial Value" + Value "off" + Visible "off" + } + PropName "Parameters" + } + Array { + Type "Simulink.dialog.Group" + Dimension 2 + Object { + $ObjectID 247 + Prompt "%" + Object { + $PropName "DialogControls" + $ObjectID 248 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" } - Array { - Type "Simulink.dialog.Group" - Dimension 2 - Object { - $ObjectID 256 - Prompt "%" + Name "DescGroupVar" + } + Object { + $ObjectID 249 + Prompt "Simulink:studio:ToolBarParametersMenu" + Object { + $PropName "DialogControls" + $ObjectID 250 + $ClassName "Simulink.dialog.TabContainer" + Array { + Type "Simulink.dialog.Tab" + Dimension 2 Object { - $PropName "DialogControls" - $ObjectID 257 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" - } - Name "DescGroupVar" - } - Object { - $ObjectID 258 - Prompt "Simulink:studio:ToolBarParametersMenu" + $ObjectID 251 + Prompt "Trajectory Parameters" Array { - Type "Simulink.dialog.Control" - Dimension 3 + Type "Simulink.dialog.parameter.Control" + Dimension 4 Object { - $ObjectID 259 + $ObjectID 252 + $ClassName "Simulink.dialog.parameter.CheckBox" + Name "externalSettlingTime" + } + Object { + $ObjectID 253 $ClassName "Simulink.dialog.parameter.Edit" - Name "frame1" + Name "settlingTime" } Object { - $ObjectID 260 + $ObjectID 254 $ClassName "Simulink.dialog.parameter.Edit" - Name "frame2" + Name "sampleTime" } Object { - $ObjectID 261 - $ClassName "Simulink.dialog.Group" + $ObjectID 255 + $ClassName "Simulink.dialog.parameter.CheckBox" + Name "resetOnSettlingTime" + } + PropName "DialogControls" + } + Name "Tab1" + } Object { - $PropName "DialogControls" - $ObjectID 262 - $ClassName "Simulink.dialog.Button" - Prompt "Toggle Config Block Highlighting" - Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(conf" - "igBlock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system" - "(configBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block n" - "ame: %s',gcb,configBlock);\nend\n\nclear configBlock" - Name "toggleHighlighting" + $ObjectID 256 + Prompt "Input/Output" + Array { + Type "Simulink.dialog.parameter.CheckBox" + Dimension 3 + Object { + $ObjectID 257 + Name "firstDerivatives" } - Name "ToggleButtonContainer" + Object { + $ObjectID 258 + Name "secondDerivatives" + } + Object { + $ObjectID 259 + Name "explicitInitialValue" } PropName "DialogControls" } - Name "ParameterGroupVar" + Name "Tab2" + } + PropName "DialogControls" } - PropName "DialogControls" + Name "Container3" } + Name "ParameterGroupVar" } - System { - Name "Relative Transform" - Location [832, 225, 3700, 1914] - Open off - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "834" - Block { - BlockType Inport - Name "Joint configuration" - SID "1800" - Position [45, 48, 75, 62] - ZOrder 22 - IconDisplay "Port number" - } - Block { - BlockType S-Function - Name "S-Function" - SID "1806" - Ports [1, 1] - Position [120, 40, 180, 70] - ZOrder 27 - FunctionName "WBToolbox" - Parameters "'RelativeTransform','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,frame1, frame2" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - } - Block { - BlockType Outport - Name "Relative Transform" - SID "1803" - Position [225, 48, 255, 62] - ZOrder 25 - IconDisplay "Port number" - } - Line { - ZOrder 4 - SrcBlock "S-Function" - SrcPort 1 - DstBlock "Relative Transform" - DstPort 1 - } - Line { - ZOrder 3 - SrcBlock "Joint configuration" - SrcPort 1 - DstBlock "S-Function" - DstPort 1 + PropName "DialogControls" + } + } + } + Block { + BlockType S-Function + Name "QP" + SID "1807" + Ports [4, 2] + Position [405, -6, 595, 66] + ZOrder 104 + FunctionName "BlockFactory" + Parameters "'QpOases','WBToolboxLibrary',lbA,ubA,lb,ub,computeObjVal,stopIfFails" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off + Object { + $PropName "MaskObject" + $ObjectID 260 + $ClassName "Simulink.Mask" + Type "QP" + Description "This block solves a QP problem using the qpOASES library:\n\nx = argmin 0.5 * x' * H * x + c' *" + " x\n\ns.t.\n\nlbA <= Ax <= ubA\nlb <= x <= ub \n" + Display "disp('QP')\n\nport_label('output', 1, 'PrimalSolution')\nport_label('output', 2, 'Status')\n\nif (c" + "omputeObjVal)\n port_label('output', 3, 'Obj func value')\nend\n\nport_label('input', 1, 'H');\nport_label('in" + "put', 2, 'g');\n\ninputPortNumber = 2;\n\nif (lbA || ubA)\n inputPortNumber = 3;\n port_label('input', 3, '" + "A');\nend\n\nif (lbA)\n inputPortNumber = inputPortNumber + 1;\n port_label('input', inputPortNumber, 'lbA'" + ");\nend\nif (ubA)\n inputPortNumber = inputPortNumber + 1;\n port_label('input', inputPortNumber, 'ubA');\n" + "end\nif (lb)\n inputPortNumber = inputPortNumber + 1;\n port_label('input', inputPortNumber, 'lb');\nend\ni" + "f (ub)\n inputPortNumber = inputPortNumber + 1;\n port_label('input', inputPortNumber, 'ub');\nend" + RunInitForIconRedraw "on" + Array { + Type "Simulink.MaskParameter" + Dimension 6 + Object { + $ObjectID 261 + Type "checkbox" + Name "lbA" + Prompt "Accept constraints lower bound input (lbA)" + Value "off" + } + Object { + $ObjectID 262 + Type "checkbox" + Name "ubA" + Prompt "Accept constraints upper bound input (ubA)" + Value "on" + } + Object { + $ObjectID 263 + Type "checkbox" + Name "lb" + Prompt "Accept lower bound input (lb)" + Value "off" + } + Object { + $ObjectID 264 + Type "checkbox" + Name "ub" + Prompt "Accept upper bound input (ub)" + Value "off" + } + Object { + $ObjectID 265 + Type "checkbox" + Name "computeObjVal" + Prompt "Output the value of the objective function" + Value "off" + } + Object { + $ObjectID 266 + Type "checkbox" + Name "stopIfFails" + Prompt "Stop the simulation if the solver fails" + Value "off" + } + PropName "Parameters" + } + Array { + Type "Simulink.dialog.Group" + Dimension 2 + Object { + $ObjectID 267 + Prompt "%" + Object { + $PropName "DialogControls" + $ObjectID 268 + $ClassName "Simulink.dialog.Text" + Prompt "%" + Name "DescTextVar" } + Name "DescGroupVar" } - } - Block { - BlockType SubSystem - Name "Remote Inverse Kinematics" - SID "1761" - Ports [2, 1] - Position [560, 105, 720, 165] - ZOrder 66 - Commented "on" - InitFcn "if ~exist('WBT_robotName','var')\n WBT_robotName = '';\nend\nif ~exist('WBT_modelName','var'" - ")\n WBT_modelName = 'WBT_simulink';\nend\nif ~exist('WBT_wbiFilename','var')\n WBT_wbiFilename = 'yarpWho" - "leBodyInterface.ini';\nend\nif ~exist('WBT_wbiList','var')\n WBT_wbiList = 'ROBOT_TORQUE_CONTROL_JOINTS';\ne" - "nd" - RequestExecContextInheritance off Object { - $PropName "MaskObject" - $ObjectID 263 - $ClassName "Simulink.Mask" - Type "Forward Kinematics" - Description "This block retrieves the forward kinematics of the specified frame.\n\nAssuming DoFs is the number of " - "internal degrees of freedom of the robot,\nInput:\n- Base pose: 4x4 matrix representing the homogenous transformatio" - "n between\n the the base frame and the world frame.\n- Joint configuration: Vector of size DoFs, represe" - "nting the configuration \n of the joints.\n\nOutput:\n- Forward Kinematics: a 4x4 matrix repre" - "senting the homogenous transformation between\n the specified frame and the world frame.\n\nParameters:\n" - "- Frame name: the name of the frame. It should be specified in the URDF model.\n\n- Robot Port Name: Name of the por" - "ts opened by the robot. (e.g. icub).\n Set an empty string ('') to use the name specified in the \n" - " Whole Body Interface configuration file.\n- Model Name: Prefix name of the ports opened by the un" - "derlying Whole Body Interface.\n- WBI filename: name of the file containing the configuration of the Whole Body Inte" - "rface\n- WBI List Name: name of the list of joints used to configure the Whole Body Interface\n" - Display "disp(solverName)\n\n\n\n% escapedBaseFrameName = strrep(baseFrame, '_', '\\_');\n% escapedEndEffFrameName" - " = strrep(endEffFrame, '_', '\\_');\n% \n% %port_label('output', 1, strcat('{}^{world} H_{',escapedFrameName,'}'), '" - "texmode','on')\n% \n% %port_label('input', 1, '{}^{world} H_{base}', 'texmode','on')\n% %port_label('input', 2, 'Joi" - "nt configuration')\n% \n% %clear escapedFrameName;\n% \n% \n% % if strcmp(robotPart, 'left')\n% % prefix = 'l';\n" - "% % else\n% % prefix = 'r';\n% % end\n% % \n\nport_label('input', 1, 'H^d', 'texmode','on');\n% port_label('inpu" - "t', 1, strcat('{}^{',escapedBaseFrameName,'} H_{',escapedEndEffFrameName,'}^d'), 'texmode','on');\n% \n% port_label(" - "'input', 2, '{}^{world} H_{base}', 'texmode','on')\nport_label('input', 2, 'q_j(0)', 'texmode','on');\n% % \n% % \n%" - " port_label('output', 1, '{}^{world} H_{base}^d', 'texmode','on')\nport_label('output', 1, 'q_j^d', 'texmode','on');" - "\n\n" - RunInitForIconRedraw "on" + $ObjectID 269 + Prompt "Simulink:studio:ToolBarParametersMenu" Array { - Type "Simulink.MaskParameter" + Type "Simulink.dialog.Group" Dimension 3 Object { - $ObjectID 264 - Type "edit" - Name "solverName" - Prompt "Solver Name" - Value "'/cartesianSolver'" - } - Object { - $ObjectID 265 - Type "edit" - Name "dofs" - Prompt "#Dofs" - Value "12" - Tunable "off" - } - Object { - $ObjectID 266 - Type "popup" + $ObjectID 270 + Prompt "Constraints bounds" Array { - Type "Cell" + Type "Simulink.dialog.parameter.CheckBox" Dimension 2 - Cell "Full Constraint (Position and Orientation)" - Cell "Position only constraint" - PropName "TypeOptions" + Object { + $ObjectID 271 + Name "lbA" } - Name "optOption" - Prompt "Optimization Option" - Value "Full Constraint (Position and Orientation)" - } - PropName "Parameters" - } - Array { - Type "Simulink.dialog.Group" - Dimension 2 - Object { - $ObjectID 267 - Prompt "%" Object { - $PropName "DialogControls" - $ObjectID 268 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" + $ObjectID 272 + Name "ubA" } - Name "DescGroupVar" + PropName "DialogControls" + } + Name "constraintsBoundsBox" } Object { - $ObjectID 269 - Prompt "Simulink:studio:ToolBarParametersMenu" - Object { - $PropName "DialogControls" - $ObjectID 270 - $ClassName "Simulink.dialog.TabContainer" - Object { - $PropName "DialogControls" - $ObjectID 271 - $ClassName "Simulink.dialog.Tab" - Prompt "Block parameters" + $ObjectID 273 + Prompt "Simple bounds" Array { - Type "Simulink.dialog.parameter.Control" - Dimension 3 - Object { - $ObjectID 272 - $ClassName "Simulink.dialog.parameter.Edit" - PromptLocation "left" - Name "solverName" - } + Type "Simulink.dialog.parameter.CheckBox" + Dimension 2 Object { - $ObjectID 273 - $ClassName "Simulink.dialog.parameter.Edit" - Name "dofs" + $ObjectID 274 + Name "lb" } Object { - $ObjectID 274 - $ClassName "Simulink.dialog.parameter.Popup" - Name "optOption" + $ObjectID 275 + Name "ub" } PropName "DialogControls" } - Name "Container8" + Name "simpleBoundsBox" + } + Object { + $ObjectID 276 + Prompt "Other" + Array { + Type "Simulink.dialog.parameter.CheckBox" + Dimension 2 + Object { + $ObjectID 277 + Name "computeObjVal" } - Name "Container4" + Object { + $ObjectID 278 + Name "stopIfFails" } - Name "ParameterGroupVar" + PropName "DialogControls" + } + Name "otherBox" } PropName "DialogControls" } + Name "ParameterGroupVar" + } + PropName "DialogControls" + } + } + } + Block { + BlockType S-Function + Name "Real Time Synchronizer" + SID "1657" + Ports [] + Position [70, 4, 195, 41] + ZOrder 23 + ForegroundColor "[0.917647, 0.917647, 0.917647]" + BackgroundColor "gray" + ShowName off + FunctionName "BlockFactory" + Parameters "'RealTimeSynchronizer','WBToolboxLibrary',period" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off + Object { + $PropName "MaskObject" + $ObjectID 279 + $ClassName "Simulink.Mask" + Type "Real Time Synchronizer" + Description "This block slows down the simulation trying to match the period specified \nas parameter (in se" + "conds).\nThe bigger the period the more probable \nis that Simulink can remain synched with it.\n" + Display "disp('Real Time Synchronizer')" + RunInitForIconRedraw "off" + Object { + $PropName "Parameters" + $ObjectID 280 + $ClassName "Simulink.MaskParameter" + Type "edit" + Name "period" + Prompt "Controller Period (in seconds)" + Value "0.01" + } + } + } + Block { + BlockType S-Function + Name "Simulator Synchronizer" + SID "1658" + Ports [] + Position [230, 4, 360, 41] + ZOrder 24 + ForegroundColor "[0.490196, 0.000000, 0.000000]" + ShowName off + FunctionName "BlockFactory" + Parameters "'SimulatorSynchronizer','WBToolboxLibrary',period, serverPortName, clientPortName" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off + Object { + $PropName "MaskObject" + $ObjectID 281 + $ClassName "Simulink.Mask" + Type "Simulator Synchronizer" + Description "This block synchronizes with the external simulation on a simulator \n(only Gazebo is supported" + " at the moment).\n\n" + Display "disp('Simulator Synchronizer')" + RunInitForIconRedraw "off" + Array { + Type "Simulink.MaskParameter" + Dimension 3 + Object { + $ObjectID 282 + Type "edit" + Name "period" + Prompt "Controller Period (in seconds)" + Value "0.01" + } + Object { + $ObjectID 283 + Type "edit" + Name "serverPortName" + Prompt "Server Port Name" + Value "'/clock/rpc'" + } + Object { + $ObjectID 284 + Type "edit" + Name "clientPortName" + Prompt "Client Port Name" + Value "'/WBT_synchronizer/rpc:o'" } + PropName "Parameters" + } + } + } + Block { + BlockType SubSystem + Name "TruncPinv" + SID "109" + Ports [2, 1] + Position [375, 198, 445, 242] + ZOrder -3 + BackgroundColor "[0.534601, 0.470279, 1.000000]" + RequestExecContextInheritance off + Object { + $PropName "MaskObject" + $ObjectID 285 + $ClassName "Simulink.Mask" + RunInitForIconRedraw "off" + Object { + $PropName "Parameters" + $ObjectID 286 + $ClassName "Simulink.MaskParameter" + Type "edit" + Name "tol" + Prompt "Tolerance" + Value "1e-4" + } + } + System { + Name "TruncPinv" + Location [0, 29, 1280, 744] + Open off + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + Block { + BlockType Inport + Name "S" + SID "110" + Position [50, 53, 80, 67] + ZOrder -1 + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "tol" + SID "111" + Position [50, 93, 80, 107] + ZOrder -2 + Port "2" + IconDisplay "Port number" + } + Block { + BlockType SubSystem + Name "Truncated PseudoInverse" + SID "112" + Ports [2, 1] + Position [105, 39, 200, 121] + ZOrder -4 + LibraryVersion "1.32" + ErrorFcn "Stateflow.Translate.translate" + PermitHierarchicalResolution "ExplicitOnly" + TreatAsAtomicUnit on + RequestExecContextInheritance off + SFBlockType "MATLAB Function" System { - Name "Remote Inverse Kinematics" - Location [853, 51, 2214, 1013] + Name "Truncated PseudoInverse" + Location [12, 45, 1279, 3773] Open off PortBlocksUseCompactNotation off SetDomainSpec off @@ -5797,394 +5678,341 @@ Library { TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] TiledPageScale 1 ShowPageBoundaries off - ZoomFactor "375" + ZoomFactor "100" + SIDHighWatermark "1619" Block { BlockType Inport - Name "Desired frame pose" - SID "1762" - Position [10, 23, 40, 37] - ZOrder 26 + Name "mat" + SID "112::1" + Position [20, 101, 40, 119] + ZOrder -1 IconDisplay "Port number" } Block { BlockType Inport - Name "Current Joint configuration" - SID "1763" - Position [10, 68, 40, 82] - ZOrder 24 + Name "tol" + SID "112::25" + Position [20, 136, 40, 154] + ZOrder 11 Port "2" IconDisplay "Port number" } + Block { + BlockType Demux + Name " Demux " + SID "112::1618" + Ports [1, 1] + Position [270, 230, 320, 270] + ZOrder 107 + Outputs "1" + } Block { BlockType S-Function - Name "S-Function" - SID "1764" - Ports [2, 1] - Position [145, 6, 225, 99] - ZOrder 19 - FunctionName "WBToolbox" - Parameters "'RemoteInverseKinematics',solverName, dofs, optOption" + Name " SFunction " + SID "112::1617" + Tag "Stateflow S-Function WBToolboxLibrary_repository 7" + Ports [2, 2] + Position [180, 100, 230, 160] + ZOrder 106 + FunctionName "sf_sfun" + PortCounts "[2 2]" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off + Port { + PortNumber 2 + Name "TPinv" + } + } + Block { + BlockType Terminator + Name " Terminator " + SID "112::1619" + Position [460, 241, 480, 259] + ZOrder 108 } Block { BlockType Outport - Name "Desired Joint Configuration" - SID "1765" - Position [285, 48, 315, 62] - ZOrder 27 + Name "TPinv" + SID "112::5" + Position [460, 101, 480, 119] + ZOrder -6 IconDisplay "Port number" } Line { - ZOrder 1 - SrcBlock "S-Function" - SrcPort 1 - DstBlock "Desired Joint Configuration" - DstPort 1 - } - Line { - ZOrder 2 - SrcBlock "Desired frame pose" + ZOrder 76 + SrcBlock "mat" SrcPort 1 - DstBlock "S-Function" + Points [120, 0] + DstBlock " SFunction " DstPort 1 } Line { - ZOrder 3 - SrcBlock "Current Joint configuration" + ZOrder 77 + SrcBlock "tol" SrcPort 1 - DstBlock "S-Function" + DstBlock " SFunction " DstPort 2 } - } - } - } - } - } - } - Block { - BlockType SubSystem - Name "wholeBodyStates" - SID "206" - Ports [] - Position [16, 17, 114, 114] - ZOrder -4 - ForegroundColor "white" - DropShadow on - RequestExecContextInheritance off - Object { - $PropName "MaskObject" - $ObjectID 275 - $ClassName "Simulink.Mask" - Display "image(imread('wholeBodyStates.png'),'center');" - } - System { - Name "wholeBodyStates" - Location [832, 225, 3700, 1914] - Open off - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "1000" - Block { - BlockType SubSystem - Name "Get Limits" - SID "1690" - Ports [0, 2] - Position [345, 225, 460, 260] - ZOrder 68 - BackgroundColor "[0.513700, 0.851000, 0.670600]" - RequestExecContextInheritance off - Object { - $PropName "MaskObject" - $ObjectID 276 - $ClassName "Simulink.Mask" - Type "Get Limits" - Description "This block provides the joint limits gathering data from either the Robot's Control Board or UR" - "DF model.\n\nOutput:\n - Max: 1xDoFs vector containing the maximum limit\n - Min: 1xDoFs vector containing the" - " maximum limit\n\nUnit of measurement:\n - Position: rad\n - Velocity: rad/sec" - Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig" - "] = WBToolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n " - " clear WBTConfig;\ncatch\nend\n\n% GetLimits Initialization\n% =========================\n\nsourceLimit = get_p" - "aram(gcb,'limitsSource');\ntypeLimit = get_param(gcb,'limitsType');\nnotifyError = false;\n\nswitch sourceLimit\n" - " case 'ControlBoard'\n switch typeLimit\n case 'Position'\n limitsType = 'Con" - "trolBoardPosition';\n case 'Velocity'\n limitsType = 'ControlBoardVelocity';\n " - " otherwise\n notifyError = true;\n end\n case 'URDF'\n switch typeLimit\n " - " case 'Position'\n limitsType = 'ModelPosition';\n otherwise\n noti" - "fyError = true;\n end\nend\n\nif notifyError\n error('Limit Type not recognized');\nend\n\nclear source" - "Limit typeLimit notifyError" - SelfModifiable "on" - Display "fprintf('%s\\n(%s)',get_param(gcb,'limitsType'),get_param(gcb,'limitsSource'))\n\nport_label('outpu" - "t',1,'Min')\nport_label('output',2,'Max')" - RunInitForIconRedraw "off" - Array { - Type "Simulink.MaskParameter" - Dimension 2 - Object { - $ObjectID 277 - Type "popup" - Array { - Type "Cell" - Dimension 2 - Cell "ControlBoard" - Cell "URDF" - PropName "TypeOptions" - } - Name "limitsSource" - Prompt "Limits Source" - Value "ControlBoard" - Evaluate "off" - Callback "sourceLimit = get_param(gcb,'limitsSource');\nblockParameters = Simulink.Mask.get(gcb).Parameters;\nlimit" - "sTypeBlockParam = blockParameters(2);\n\nswitch sourceLimit\n case 'ControlBoard'\n limitsTypeBlockParam.T" - "ypeOptions = {'Position','Velocity'};\n %limitsTypeBlockParam.Value = limitsTypeBlockParam.TypeOptions{1};\n " - " case 'URDF'\n limitsTypeBlockParam.TypeOptions = {'Position'};\n %limitsTypeBlockParam.Value = limi" - "tsTypeBlockParam.TypeOptions{1};\n otherwise\n error('Limit Source not recognized');\nend\n\nclear sourceL" - "imit blockParameters limitsTypeBlockParam" - } - Object { - $ObjectID 278 - Type "popup" - Array { - Type "Cell" - Dimension 2 - Cell "Position" - Cell "Velocity" - PropName "TypeOptions" - } - Name "limitsType" - Prompt "Limits Type" - Value "Position" - Evaluate "off" - Callback "% Get the mask parameter values. This is a cell array of strings.\n% \nmaskStr = get_param(gcb,'limitsT" - "ype');\nif strcmp(maskStr, 'Position')\n set_param(gcb,'BackgroundColor', '[0.5137, 0.8510, 0.6706, 1.0]');\nelse" - "if strcmp(maskStr, 'Velocity')\n set_param(gcb,'BackgroundColor', '[0.5137, 0.6745, 1.0000, 1.0]');\nelseif strcm" - "p(maskStr, 'Acceleration')\n set_param(gcb,'BackgroundColor', '[0.9255, 0.8706, 0.1333, 1.0]');\nelseif strcmp(ma" - "skStr, 'Torque')\n set_param(gcb,'BackgroundColor', '[0.8275, 0.5765, 0.6039, 1.0]');\nend\nclear maskStr" - } - PropName "Parameters" - } - Array { - Type "Simulink.dialog.Group" - Dimension 3 - Object { - $ObjectID 279 - Prompt "%" - Object { - $PropName "DialogControls" - $ObjectID 280 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" - } - Name "DescGroupVar" - } - Object { - $ObjectID 281 - Prompt "Simulink:studio:ToolBarParametersMenu" - Array { - Type "Simulink.dialog.parameter.Popup" - Dimension 2 - Object { - $ObjectID 282 - Name "limitsSource" - } - Object { - $ObjectID 283 - Name "limitsType" - } - PropName "DialogControls" - } - Name "ParameterGroupVar" - } - Object { - $ObjectID 284 - Object { - $PropName "DialogControls" - $ObjectID 285 - $ClassName "Simulink.dialog.Button" - Prompt "Toggle Config Block Highlighting" - Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(configBl" - "ock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system(confi" - "gBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block name: %s'" - ",gcb,configBlock);\nend\n\nclear configBlock" - Name "toggleHighlighting" + Line { + Name "TPinv" + ZOrder 78 + Labels [0, 0] + SrcBlock " SFunction " + SrcPort 2 + DstBlock "TPinv" + DstPort 1 + } + Line { + ZOrder 79 + SrcBlock " Demux " + SrcPort 1 + DstBlock " Terminator " + DstPort 1 + } + Line { + ZOrder 80 + SrcBlock " SFunction " + SrcPort 1 + DstBlock " Demux " + DstPort 1 } - Name "ToggleButtonContainer" } - PropName "DialogControls" - } - } - System { - Name "Get Limits" - Location [832, 225, 3700, 1914] - Open off - PortBlocksUseCompactNotation off - SetDomainSpec off - DomainSpecType "Deduce" - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "1000" - SIDHighWatermark "1773" - Block { - BlockType S-Function - Name "S-Function" - SID "1690:1691" - Ports [0, 2] - Position [115, 33, 175, 102] - ZOrder 19 - FunctionName "WBToolbox" - Parameters "'GetLimits','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,limitsType" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off - } - Block { - BlockType Outport - Name "Min" - SID "1690:1692" - Position [220, 43, 250, 57] - ZOrder 25 - IconDisplay "Port number" } Block { BlockType Outport - Name "Max" - SID "1690:1693" - Position [220, 78, 250, 92] - ZOrder 26 - Port "2" + Name "Tpinv" + SID "113" + Position [225, 73, 255, 87] + ZOrder -5 IconDisplay "Port number" } Line { ZOrder 1 - SrcBlock "S-Function" + SrcBlock "S" SrcPort 1 - DstBlock "Min" + DstBlock "Truncated PseudoInverse" DstPort 1 } Line { ZOrder 2 - SrcBlock "S-Function" - SrcPort 2 - DstBlock "Max" + SrcBlock "Truncated PseudoInverse" + SrcPort 1 + DstBlock "Tpinv" DstPort 1 } + Line { + ZOrder 3 + SrcBlock "tol" + SrcPort 1 + DstBlock "Truncated PseudoInverse" + DstPort 2 + } } } Block { - BlockType SubSystem - Name "Get Measurement" - SID "1671" + BlockType S-Function + Name "Yarp Clock" + SID "1773" Ports [0, 1] - Position [290, 158, 385, 192] - ZOrder 53 - BackgroundColor "[0.513700, 0.851000, 0.670600]" - RequestExecContextInheritance off + Position [335, 96, 405, 144] + ZOrder 85 + ForegroundColor "[0.490196, 0.000000, 0.000000]" + FunctionName "BlockFactory" + Parameters "'YarpClock','WBToolboxLibrary'" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off Object { $PropName "MaskObject" - $ObjectID 286 + $ObjectID 287 $ClassName "Simulink.Mask" - Type "Get Measurement" - Description "This block gathers the measurement of the specified type.\n\nAssuming DoFs is the number of deg" - "rees of freedom of the robot,\n\nOutput:\n - References: Vector of size DoFs, representing the requested measure" - "ment.\n\nParameters:\n - Control Mode: The control mode. Choose one of the supplied mode.\n\nUnit of measurement" - ":\n - Position: rad\n - Velocity: rad/sec\n - Acceleration: rad/sec/sec\n - Torque: Nm\n" - Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig" - "] = WBToolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n " - " clear WBTConfig;\ncatch\nend" - Display "port_label('output', 1, get_param(gcb,'measuredType'))" + Type "YARP Clock" + Description "This block outputs the current YARP Time.\nIn a nutshell, this block outputs the equivalent of " + "the C++ function call yarp::os::Time::now()" + SelfModifiable "on" + Display "disp('YARP Time')\n" RunInitForIconRedraw "off" - Object { - $PropName "Parameters" - $ObjectID 287 - $ClassName "Simulink.MaskParameter" - Type "popup" - Array { - Type "Cell" - Dimension 4 - Cell "Joints Position" - Cell "Joints Velocity" - Cell "Joints Acceleration" - Cell "Joints Torque" - PropName "TypeOptions" + } + } + Block { + BlockType S-Function + Name "Yarp Read" + SID "1632" + Ports [0, 2] + Position [90, 94, 150, 141] + ZOrder 22 + ForegroundColor "[0.490196, 0.000000, 0.000000]" + FunctionName "BlockFactory" + Parameters "'YarpRead','WBToolboxLibrary',portName,signalSize,blocking,timestamp,autoconnect,errorOnConnection,t" + "imeout" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off + Object { + $PropName "MaskObject" + $ObjectID 288 + $ClassName "Simulink.Mask" + Type "YARP Read" + Description "This block behaves as the command 'yarp read'. \n\nBy default it has the option 'Autoconnect' a" + "ctive, which means that the user can only specify the name of the port ('Source Port Name') from which readings a" + "re desired, along with the size of the expected data (e.g. 3 when reading the torso state).\n\nWhen the user unch" + "ecks 'Autoconnect', 'Opened Port Name' field shows up and it corresponds to the name of the port the block will c" + "reate. No autoconnection is performed, and the output will be always zero until the user connects it to some othe" + "r port from command line using 'yarp connect [from] [dest]'.\n\nWhen 'Autoconnect' is off, an additional output c" + "alled 'signal' is added to the block. It outputs 1 if the port has received at least one sample, or 0 otherwise.\n" + Initialization "% Solve error in string parsing. Force the type.\nportName = char(portName);" + SelfModifiable "on" + Display "port_label('output', 1, 'signal');\nportNumber = 1;\nif (timestamp)\n portNumber = portNumber + " + "1;\n port_label('output', portNumber, 'timestamp');\nend\n\nif (~autoconnect)\n portNumber = portNumber + 1" + ";\n port_label('output', portNumber, 'status');\nend\n\n" + RunInitForIconRedraw "on" + Array { + Type "Simulink.MaskParameter" + Dimension 7 + Object { + $ObjectID 289 + Type "edit" + Name "portName" + Prompt "Source Port Name" + Value "'/portname'" } - Name "measuredType" - Prompt "Estimate Type" - Value "Joints Position" - Evaluate "off" - Callback "% Get the mask parameter values. This is a cell\n% array of strings.\n\nmaskStr = get_param(" - "gcb,'measuredType');\nif strcmp(maskStr, 'Joints Position')\n set_param(gcb,'BackgroundColor', '[0.5137, 0.8" - "510, 0.6706, 1.0]');\nelseif strcmp(maskStr, 'Joints Velocity')\n set_param(gcb,'BackgroundColor', '[0.5137," - " 0.6745, 1.0000, 1.0]');\nelseif strcmp(maskStr, 'Joints Acceleration')\n set_param(gcb,'BackgroundColor', '" - "[0.9255, 0.8706, 0.1333, 1.0]');\nelseif strcmp(maskStr, 'Joints Torque')\n set_param(gcb,'BackgroundColor'," - " '[0.8275, 0.5765, 0.6039, 1.0]');\nend\nclear maskStr" + Object { + $ObjectID 290 + Type "edit" + Name "signalSize" + Prompt "Port Size" + Value "1" + } + Object { + $ObjectID 291 + Type "edit" + Name "timeout" + Prompt "Timeout" + Value "0.5" + Visible "off" + } + Object { + $ObjectID 292 + Type "checkbox" + Name "blocking" + Prompt "Blocking Read" + Value "off" + Callback "blocking_val = get_param(gcb, 'blocking');\nmask_visibility = get_param(gcb, 'MaskVisibilities');\n\nif(s" + "trcmp(blocking_val, 'on'))\n mask_visibility{3} = 'on';\n set_param(gcb, 'MaskVisibilities', mask_visibility);" + "\nelse\n mask_visibility{3} = 'off';\n set_param(gcb, 'MaskVisibilities', mask_visibility);\nend\n\nclear bloc" + "king_val mask_visibility" + } + Object { + $ObjectID 293 + Type "checkbox" + Name "timestamp" + Prompt "Read Timestamp" + Value "on" + } + Object { + $ObjectID 294 + Type "checkbox" + Name "autoconnect" + Prompt "Autoconnect" + Value "on" + Callback "autoconnect_val = get_param(gcb, 'Autoconnect');\nprompt_string = get_param(gcb, 'MaskPrompts');\nmask_vi" + "sibilities = get_param(gcb, 'MaskVisibilities');\n\nif(strcmp(autoconnect_val, 'on'))\n prompt_string{1} = 'Sourc" + "e Port Name';\n mask_visibilities{7} = 'on';\n set_param(gcb, 'MaskVisibilities',mask_visibilities);\nelse\n " + " prompt_string{1} = 'Opened Port Name';\n mask_visibilities{7} = 'off';\n set_param(gcb, 'MaskVisibilities',m" + "ask_visibilities);\nend\nset_param(gcb, 'MaskPrompts', prompt_string);\nclear autoconnect_val prompt_string mask_vis" + "ibilities" + } + Object { + $ObjectID 295 + Type "checkbox" + Name "errorOnConnection" + Prompt "Error on missing connection" + Value "on" + } + PropName "Parameters" } + } + } + Block { + BlockType S-Function + Name "Yarp Write" + SID "1659" + Ports [1] + Position [230, 96, 290, 144] + ZOrder 27 + ForegroundColor "[0.490196, 0.000000, 0.000000]" + FunctionName "BlockFactory" + Parameters "'YarpWrite','WBToolboxLibrary',portName,autoconnect,errorOnConnection" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off + Object { + $PropName "MaskObject" + $ObjectID 296 + $ClassName "Simulink.Mask" + Type "YARP Write" + Description "This block behaves as the command 'yarp write'. \n\nBy default this block opens a port names as" + " the \"Opened Port Name\" parameter\nand stream the input signal to that port.\nIf the option \"Autoconnect\" is " + "specified, the first parameter become the\nname of the target port to which the data will be stramed, \ne.g. like" + " \"yarp write ... /destinationPort\"\n" + SelfModifiable "on" + Display "disp('Yarp Write')" + RunInitForIconRedraw "off" Array { - Type "Simulink.dialog.Group" + Type "Simulink.MaskParameter" Dimension 3 Object { - $ObjectID 288 - Prompt "%" - Object { - $PropName "DialogControls" - $ObjectID 289 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" - } - Name "DescGroupVar" + $ObjectID 297 + Type "edit" + Name "portName" + Prompt "Opened Port Name" + Value "'/portname'" } Object { - $ObjectID 290 - Prompt "Simulink:studio:ToolBarParametersMenu" - Object { - $PropName "DialogControls" - $ObjectID 291 - $ClassName "Simulink.dialog.parameter.Popup" - Name "measuredType" - } - Name "ParameterGroupVar" + $ObjectID 298 + Type "checkbox" + Name "autoconnect" + Prompt "Autoconnect" + Value "off" + Callback "autoconnect_val = get_param(gcb, 'Autoconnect');\nprompt_string = get_param(gcb, 'MaskPrompts');\nif(strc" + "mp(autoconnect_val, 'on'))\n prompt_string{1} = 'Destination Port Name';\n set_param(gcb, 'MaskVisibilities',{" + "'on';'on';'on'});\nelse\n prompt_string{1} = 'Opened Port Name';\n set_param(gcb, 'MaskVisibilities',{'on';'on" + "';'off'});\nend\nset_param(gcb, 'MaskPrompts', prompt_string);\nclear autoconnect_val prompt_string" } Object { - $ObjectID 292 - Object { - $PropName "DialogControls" - $ObjectID 293 - $ClassName "Simulink.dialog.Button" - Prompt "Toggle Config Block Highlighting" - Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(configBl" - "ock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system(confi" - "gBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block name: %s'" - ",gcb,configBlock);\nend\n\nclear configBlock" - Name "toggleHighlighting" - } - Name "Container8" + $ObjectID 299 + Type "checkbox" + Name "errorOnConnection" + Prompt "Error on missing connection" + Value "on" + Visible "off" } - PropName "DialogControls" + PropName "Parameters" } } + } + Block { + BlockType SubSystem + Name "errors" + SID "714" + Ports [2, 2] + Position [245, 198, 305, 242] + ZOrder -9 + BackgroundColor "[0.300000, 0.580000, 1.000000]" + RequestExecContextInheritance off + Object { + $PropName "MaskObject" + $ObjectID 300 + $ClassName "Simulink.Mask" + Type "Errors" + Description "Computes two kinds of errors. The first is just the difference between x\nand y while the secon" + "d is the ratio (x-y)/y." + RunInitForIconRedraw "off" + } System { - Name "Get Measurement" - Location [832, 225, 3700, 1914] + Name "errors" + Location [0, 29, 1280, 744] Open off PortBlocksUseCompactNotation off SetDomainSpec off @@ -6199,137 +6027,137 @@ Library { TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] TiledPageScale 1 ShowPageBoundaries off - ZoomFactor "1000" + ZoomFactor "100" Block { - BlockType S-Function - Name "S-Function" - SID "1672" - Ports [0, 1] - Position [125, 39, 185, 71] - ZOrder 19 - FunctionName "WBToolbox" - Parameters "'GetMeasurement','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,measuredType" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off + BlockType Inport + Name "x" + SID "715" + Position [30, 28, 60, 42] + ZOrder -1 + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "y" + SID "716" + Position [25, 103, 55, 117] + ZOrder -2 + Port "2" + IconDisplay "Port number" + } + Block { + BlockType Sum + Name "Add" + SID "717" + Ports [2, 1] + Position [95, 27, 125, 58] + ZOrder -3 + Inputs "+-" + InputSameDT off + OutDataTypeStr "Inherit: Inherit via internal rule" + SaturateOnIntegerOverflow off + } + Block { + BlockType Product + Name "Divide" + SID "718" + Ports [2, 1] + Position [165, 37, 195, 68] + ZOrder -4 + Inputs "*/" + InputSameDT off + OutDataTypeStr "Inherit: Inherit via internal rule" + RndMeth "Floor" + SaturateOnIntegerOverflow off } Block { BlockType Outport - Name "Estimate" - SID "1673" - Position [210, 48, 240, 62] - ZOrder 25 + Name "x-y" + SID "719" + Position [225, 13, 255, 27] + ZOrder -5 + IconDisplay "Port number" + } + Block { + BlockType Outport + Name "(x-y)./y" + SID "720" + Position [220, 48, 250, 62] + ZOrder -6 + Port "2" IconDisplay "Port number" } Line { ZOrder 1 - SrcBlock "S-Function" + SrcBlock "Add" SrcPort 1 - DstBlock "Estimate" - DstPort 1 - } - } - } - Block { - BlockType SubSystem - Name "Get Motor Measurement" - SID "1796" - Ports [0, 1] - Position [410, 158, 505, 192] - ZOrder 69 - BackgroundColor "[0.960000, 0.770000, 0.460000]" - RequestExecContextInheritance off - Object { - $PropName "MaskObject" - $ObjectID 294 - $ClassName "Simulink.Mask" - Type "Get Measurement" - Description "This block gathers the measurement of the specified type.\n\nAssuming DoFs is the number of deg" - "rees of freedom of the robot,\n\nOutput:\n - References: Vector of size DoFs, representing the requested measure" - "ment.\n\nParameters:\n - Control Mode: The control mode. Choose one of the supplied mode.\n\nUnit of measurement" - ":\n - PWM: duty cycle expressed as percentage [-100, 100]%\n - Current: values in Ampere\n" - Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig" - "] = WBToolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n " - " clear WBTConfig;\ncatch\nend" - Display "port_label('output', 1, get_param(gcb,'measuredType'))" - RunInitForIconRedraw "off" - Object { - $PropName "Parameters" - $ObjectID 295 - $ClassName "Simulink.MaskParameter" - Type "popup" - Array { - Type "Cell" - Dimension 7 - Cell "Motor Position" - Cell "Motor Velocity" - Cell "Motor Acceleration" - Cell "Motor PWM" - Cell "Motor Current" - Cell "Motor Back EMF" - Cell "Motor Torque Constant" - PropName "TypeOptions" + Points [10, 0] + Branch { + ZOrder 2 + DstBlock "Divide" + DstPort 1 } - Name "measuredType" - Prompt "Estimate Type" - Value "Motor Current" - Evaluate "off" - Callback "maskStr = get_param(gcb,'measuredType');\n\nswitch maskStr\n case 'Motor Position'\n " - " set_param(gcb,'BackgroundColor', '[0.5137, 0.8510, 0.6706, 1.0]');\n case 'Motor Velocity'\n set_par" - "am(gcb,'BackgroundColor', '[0.5137, 0.6745, 1.0000, 1.0]');\n case 'Motor Acceleration'\n set_param(g" - "cb,'BackgroundColor', '[0.9255, 0.8706, 0.1333, 1.0]');\n case 'Motor PWM'\n set_param(gcb,'Backgroun" - "dColor', '[1, 1, 1, 1.0]');\n case 'Motor Current'\n set_param(gcb,'BackgroundColor', '[0.96, 0.77, 0" - ".46, 1.0]');\n case 'Motor Back EMF'\n set_param(gcb,'BackgroundColor', '[0.8, 0.4, 1.0, 1.0]');\n " - " case 'Motor Torque Constant'\n set_param(gcb,'BackgroundColor', '[0.8, 1.0, 0.4, 1.0]');\n otherwise" - "\n error('Control Type not recognized.')\nend\n\nclear maskStr" - } - Array { - Type "Simulink.dialog.Group" - Dimension 3 - Object { - $ObjectID 296 - Prompt "%" - Object { - $PropName "DialogControls" - $ObjectID 297 - $ClassName "Simulink.dialog.Text" - Prompt "%" - Name "DescTextVar" - } - Name "DescGroupVar" + Branch { + ZOrder 3 + Points [0, -25] + DstBlock "x-y" + DstPort 1 } - Object { - $ObjectID 298 - Prompt "Simulink:studio:ToolBarParametersMenu" - Object { - $PropName "DialogControls" - $ObjectID 299 - $ClassName "Simulink.dialog.parameter.Popup" - Name "measuredType" - } - Name "ParameterGroupVar" + } + Line { + ZOrder 4 + SrcBlock "x" + SrcPort 1 + DstBlock "Add" + DstPort 1 + } + Line { + ZOrder 5 + SrcBlock "y" + SrcPort 1 + Points [15, 0] + Branch { + ZOrder 6 + Points [0, -60] + DstBlock "Add" + DstPort 2 } - Object { - $ObjectID 300 - Object { - $PropName "DialogControls" - $ObjectID 301 - $ClassName "Simulink.dialog.Button" - Prompt "Toggle Config Block Highlighting" - Callback "[configBlock, ~] = WBToolbox.BlockInitialization(gcb, gcs);\n\ntry\n if (strcmp(get_param(configBl" - "ock,'HiliteAncestors'),'none'))\n hilite_system(configBlock,'find');\n else\n hilite_system(confi" - "gBlock,'none');\n end\ncatch\n error('[%s:ShowConfigBlock:Callback] Failed to process config block name: %s'" - ",gcb,configBlock);\nend\n\nclear configBlock" - Name "toggleHighlighting" - } - Name "Container8" + Branch { + ZOrder 7 + Points [60, 0; 0, -50] + DstBlock "Divide" + DstPort 2 } - PropName "DialogControls" } + Line { + ZOrder 8 + SrcBlock "Divide" + SrcPort 1 + DstBlock "(x-y)./y" + DstPort 1 + } + } + } + Block { + BlockType SubSystem + Name "holder\n" + SID "1296" + Ports [1, 1] + Position [115, 197, 175, 243] + ZOrder 14 + BackgroundColor "[0.537255, 0.721569, 1.000000]" + RequestExecContextInheritance off + Object { + $PropName "MaskObject" + $ObjectID 301 + $ClassName "Simulink.Mask" + Type "Holder" + Description "This block holds the first input value during the simulation." + RunInitForIconRedraw "off" } System { - Name "Get Motor Measurement" - Location [832, 225, 3700, 1914] + Name "holder\n" + Location [12, 45, 1340, 980] Open off PortBlocksUseCompactNotation off SetDomainSpec off @@ -6344,35 +6172,207 @@ Library { TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] TiledPageScale 1 ShowPageBoundaries off - ZoomFactor "1000" + ZoomFactor "100" Block { - BlockType S-Function - Name "S-Function" - SID "1797" - Ports [0, 1] - Position [125, 39, 185, 71] - ZOrder 19 - FunctionName "WBToolbox" - Parameters "'GetMeasurement','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,measuredType" - SFunctionDeploymentMode off - EnableBusSupport off - SFcnIsStateOwnerBlock off + BlockType Inport + Name "s" + SID "1297" + Position [145, 43, 175, 57] + ZOrder 13 + IconDisplay "Port number" + } + Block { + BlockType Clock + Name "Clock" + SID "1298" + Position [45, 65, 65, 85] + ZOrder 11 + } + Block { + BlockType Reference + Name "Compare\nTo Constant" + SID "1299" + Ports [1, 1] + Position [90, 60, 120, 90] + ZOrder 10 + LibraryVersion "1.441" + SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Constant" + SourceType "Compare To Constant" + SourceProductName "Simulink" + SourceProductBaseCode "SL" + ContentPreviewEnabled off + relop "==" + const "0" + OutDataTypeStr "boolean" + ZeroCross on + } + Block { + BlockType SubSystem + Name "MATLAB Function" + SID "1300" + Ports [2, 1] + Position [235, 37, 305, 88] + ZOrder 15 + LibraryVersion "1.32" + ErrorFcn "Stateflow.Translate.translate" + PermitHierarchicalResolution "ExplicitOnly" + TreatAsAtomicUnit on + RequestExecContextInheritance off + SFBlockType "MATLAB Function" + System { + Name "MATLAB Function" + Location [12, 45, 1135, 3068] + Open off + PortBlocksUseCompactNotation off + SetDomainSpec off + DomainSpecType "Deduce" + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + SIDHighWatermark "1625" + Block { + BlockType Inport + Name "s" + SID "1300::24" + Position [20, 101, 40, 119] + ZOrder 10 + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "unused" + SID "1300::26" + Position [20, 136, 40, 154] + ZOrder 12 + Port "2" + IconDisplay "Port number" + } + Block { + BlockType Demux + Name " Demux " + SID "1300::1624" + Ports [1, 1] + Position [270, 230, 320, 270] + ZOrder 95 + Outputs "1" + } + Block { + BlockType S-Function + Name " SFunction " + SID "1300::1623" + Tag "Stateflow S-Function WBToolboxLibrary_repository 1" + Ports [2, 2] + Position [180, 100, 230, 160] + ZOrder 94 + FunctionName "sf_sfun" + PortCounts "[2 2]" + SFunctionDeploymentMode off + EnableBusSupport off + SFcnIsStateOwnerBlock off + Port { + PortNumber 2 + Name "s0" + } + } + Block { + BlockType Terminator + Name " Terminator " + SID "1300::1625" + Position [460, 241, 480, 259] + ZOrder 96 + } + Block { + BlockType Outport + Name "s0" + SID "1300::25" + Position [460, 101, 480, 119] + ZOrder 11 + IconDisplay "Port number" + } + Line { + ZOrder 76 + SrcBlock "s" + SrcPort 1 + Points [120, 0] + DstBlock " SFunction " + DstPort 1 + } + Line { + ZOrder 77 + SrcBlock "unused" + SrcPort 1 + DstBlock " SFunction " + DstPort 2 + } + Line { + Name "s0" + ZOrder 78 + Labels [0, 0] + SrcBlock " SFunction " + SrcPort 2 + DstBlock "s0" + DstPort 1 + } + Line { + ZOrder 79 + SrcBlock " Demux " + SrcPort 1 + DstBlock " Terminator " + DstPort 1 + } + Line { + ZOrder 80 + SrcBlock " SFunction " + SrcPort 1 + DstBlock " Demux " + DstPort 1 + } + } } Block { BlockType Outport - Name "Estimate" - SID "1798" - Position [210, 48, 240, 62] - ZOrder 25 + Name "s(0)" + SID "1301" + Position [330, 58, 360, 72] + ZOrder 14 IconDisplay "Port number" } Line { ZOrder 1 - SrcBlock "S-Function" + SrcBlock "Clock" SrcPort 1 - DstBlock "Estimate" + DstBlock "Compare\nTo Constant" + DstPort 1 + } + Line { + ZOrder 2 + SrcBlock "MATLAB Function" + SrcPort 1 + DstBlock "s(0)" + DstPort 1 + } + Line { + ZOrder 3 + SrcBlock "s" + SrcPort 1 + DstBlock "MATLAB Function" DstPort 1 } + Line { + ZOrder 4 + SrcBlock "Compare\nTo Constant" + SrcPort 1 + DstBlock "MATLAB Function" + DstPort 2 + } } } } diff --git a/matlab/library/exported/WBToolboxLibrary.slx b/matlab/library/exported/WBToolboxLibrary.slx index 62fc6f753bf4a97eba7a1947de0bfa855a0ae5a1..7e170c6119676e8677900d0569b3e62157355822 100644 GIT binary patch delta 100591 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 z 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
BAH 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 RP=%7~1PXE2JAv%mzX15N5P<*y From 7fc5fe1f13dd121e83ad4a167190a7d1c8bdb764 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Wed, 5 Dec 2018 16:33:35 +0100 Subject: [PATCH 05/37] Separated the folders of WBToolboxBase and WBToolboxLibrary --- toolbox/CMakeLists.txt | 17 +++++ toolbox/base/CMakeLists.txt | 39 +++++++++++ .../include/Base/Configuration.h | 8 ++- .../include/Base/RobotInterface.h | 64 ++++++++++--------- .../{library => base}/include/Base/WBBlock.h | 22 ++++--- .../include/Base/WholeBodySingleton.h | 14 ++-- .../{library => base}/src/Configuration.cpp | 4 +- .../{library => base}/src/RobotInterface.cpp | 8 +-- toolbox/{library => base}/src/WBBlock.cpp | 12 ++-- .../src/WholeBodySingleton.cpp | 8 +-- toolbox/library/CMakeLists.txt | 54 +--------------- 11 files changed, 132 insertions(+), 118 deletions(-) create mode 100644 toolbox/base/CMakeLists.txt rename toolbox/{library => base}/include/Base/Configuration.h (97%) rename toolbox/{library => base}/include/Base/RobotInterface.h (60%) rename toolbox/{library => base}/include/Base/WBBlock.h (85%) rename toolbox/{library => base}/include/Base/WholeBodySingleton.h (94%) rename toolbox/{library => base}/src/Configuration.cpp (98%) rename toolbox/{library => base}/src/RobotInterface.cpp (98%) rename toolbox/{library => base}/src/WBBlock.cpp (96%) rename toolbox/{library => base}/src/WholeBodySingleton.cpp (96%) diff --git a/toolbox/CMakeLists.txt b/toolbox/CMakeLists.txt index aaa98c180..1d94b2b25 100644 --- a/toolbox/CMakeLists.txt +++ b/toolbox/CMakeLists.txt @@ -5,4 +5,21 @@ find_package(shlibpp REQUIRED) find_package(BlockFactory COMPONENTS BlockFactoryCore REQUIRED) +add_subdirectory(base) add_subdirectory(library) + +if(WBT_USES_ICUB) + list(APPEND WBTOOLBOX_LIBRARY_PUBLIC_DEPENDS iCub) +endif() +if(WBT_USES_QPOASES) + list(APPEND WBTOOLBOX_LIBRARY_PUBLIC_DEPENDS qpOASES) +endif() + +install_basic_package_files(WBToolbox + VERSION ${PROJECT_VERSION} + COMPATIBILITY AnyNewerVersion + EXPORT WBToolboxExport + FIRST_TARGET WBToolboxBase + DEPENDENCIES YARP iDynTree ${WBTOOLBOX_LIBRARY_PUBLIC_DEPENDS} BlockFactoryCore + NAMESPACE WBToolbox:: + NO_CHECK_REQUIRED_COMPONENTS_MACRO) diff --git a/toolbox/base/CMakeLists.txt b/toolbox/base/CMakeLists.txt new file mode 100644 index 000000000..1c7184074 --- /dev/null +++ b/toolbox/base/CMakeLists.txt @@ -0,0 +1,39 @@ +# Copyright (C) 2018 Istituto Italiano di Tecnologia (IIT). All rights reserved. +# This software may be modified and distributed under the terms of the +# GNU Lesser General Public License v2.1 or any later version. + +add_library(WBToolboxBase + src/RobotInterface.cpp + src/Configuration.cpp + src/WholeBodySingleton.cpp + src/WBBlock.cpp + include/Base/RobotInterface.h + include/Base/Configuration.h + include/Base/WholeBodySingleton.h + include/Base/WBBlock.h) + +target_link_libraries(WBToolboxBase + BlockFactory::Core + YARP::YARP_OS + YARP::YARP_init + YARP::YARP_dev + iDynTree::idyntree-model + iDynTree::idyntree-modelio-urdf + iDynTree::idyntree-high-level) + +target_include_directories(WBToolboxBase PUBLIC + $ + $ + $) + +install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/Base + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/WBToolbox) + +install( + TARGETS WBToolboxBase + EXPORT WBToolboxExport + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/WBToolbox/Block) diff --git a/toolbox/library/include/Base/Configuration.h b/toolbox/base/include/Base/Configuration.h similarity index 97% rename from toolbox/library/include/Base/Configuration.h rename to toolbox/base/include/Base/Configuration.h index 17a7b2e9e..70b4592eb 100644 --- a/toolbox/library/include/Base/Configuration.h +++ b/toolbox/base/include/Base/Configuration.h @@ -15,8 +15,10 @@ #include namespace wbt { - class Configuration; -} + namespace base { + class Configuration; + } // namespace base +} // namespace wbt /** * @brief Store the configuration for whole-body blocks @@ -31,7 +33,7 @@ namespace wbt { * @see wbt::RobotInterface, wbt::WBBlock, wbt::WholeBodySingleton, WBToolbox.Configuration Matlab * Class */ -class wbt::Configuration +class wbt::base::Configuration { private: class impl; diff --git a/toolbox/library/include/Base/RobotInterface.h b/toolbox/base/include/Base/RobotInterface.h similarity index 60% rename from toolbox/library/include/Base/RobotInterface.h rename to toolbox/base/include/Base/RobotInterface.h index 2aa9b2116..bfbb8bba9 100644 --- a/toolbox/library/include/Base/RobotInterface.h +++ b/toolbox/base/include/Base/RobotInterface.h @@ -35,12 +35,14 @@ namespace iDynTree { } namespace wbt { - class RobotInterface; - class Configuration; + namespace base { + class RobotInterface; + class Configuration; - using JointIndex_Yarp = int; - using JointIndex_iDynTree = int; - using JointName = std::string; + using JointIndex_Yarp = int; + using JointIndex_iDynTree = int; + using JointName = std::string; + } // namespace base } // namespace wbt /** @@ -52,7 +54,7 @@ namespace wbt { * * @see wbt::Configuration */ -class wbt::RobotInterface +class wbt::base::RobotInterface { private: class impl; @@ -63,7 +65,7 @@ class wbt::RobotInterface // ======================== RobotInterface() = delete; - RobotInterface(const wbt::Configuration& config); + RobotInterface(const wbt::base::Configuration& config); ~RobotInterface(); // GET METHODS @@ -74,7 +76,7 @@ class wbt::RobotInterface * * @return A reference of the configuration this object refers to. */ - const wbt::Configuration& getConfiguration() const; + const wbt::base::Configuration& getConfiguration() const; /** * @brief Get the object to operate on the configured model @@ -98,28 +100,30 @@ class wbt::RobotInterface // Specialize the getInterface template namespace wbt { - template <> - bool RobotInterface::getInterface(yarp::dev::IControlMode*& interface); - template <> - bool RobotInterface::getInterface(yarp::dev::IPositionControl*& interface); - template <> - bool RobotInterface::getInterface(yarp::dev::IPositionDirect*& interface); - template <> - bool RobotInterface::getInterface(yarp::dev::IVelocityControl*& interface); - template <> - bool RobotInterface::getInterface(yarp::dev::ITorqueControl*& interface); - template <> - bool RobotInterface::getInterface(yarp::dev::IPWMControl*& interface); - template <> - bool RobotInterface::getInterface(yarp::dev::ICurrentControl*& interface); - template <> - bool RobotInterface::getInterface(yarp::dev::IEncoders*& interface); - template <> - bool RobotInterface::getInterface(yarp::dev::IMotorEncoders*& interface); - template <> - bool RobotInterface::getInterface(yarp::dev::IControlLimits*& interface); - template <> - bool RobotInterface::getInterface(yarp::dev::IPidControl*& interface); + namespace base { + template <> + bool RobotInterface::getInterface(yarp::dev::IControlMode*& interface); + template <> + bool RobotInterface::getInterface(yarp::dev::IPositionControl*& interface); + template <> + bool RobotInterface::getInterface(yarp::dev::IPositionDirect*& interface); + template <> + bool RobotInterface::getInterface(yarp::dev::IVelocityControl*& interface); + template <> + bool RobotInterface::getInterface(yarp::dev::ITorqueControl*& interface); + template <> + bool RobotInterface::getInterface(yarp::dev::IPWMControl*& interface); + template <> + bool RobotInterface::getInterface(yarp::dev::ICurrentControl*& interface); + template <> + bool RobotInterface::getInterface(yarp::dev::IEncoders*& interface); + template <> + bool RobotInterface::getInterface(yarp::dev::IMotorEncoders*& interface); + template <> + bool RobotInterface::getInterface(yarp::dev::IControlLimits*& interface); + template <> + bool RobotInterface::getInterface(yarp::dev::IPidControl*& interface); + } // namespace base } // namespace wbt #endif // WBT_ROBOTINTERFACE_H diff --git a/toolbox/library/include/Base/WBBlock.h b/toolbox/base/include/Base/WBBlock.h similarity index 85% rename from toolbox/library/include/Base/WBBlock.h rename to toolbox/base/include/Base/WBBlock.h index 4460d2679..8d9fb2361 100644 --- a/toolbox/library/include/Base/WBBlock.h +++ b/toolbox/base/include/Base/WBBlock.h @@ -21,9 +21,11 @@ namespace blockfactory { } // namespace blockfactory namespace wbt { - class WBBlock; - class RobotInterface; - using InputSignalPtr = std::shared_ptr; + namespace base { + class WBBlock; + class RobotInterface; + using InputSignalPtr = std::shared_ptr; + } // namespace base } // namespace wbt namespace iDynTree { @@ -57,14 +59,14 @@ namespace iDynTree { * @note The first set of parameters are fields of the same struct. For this reason they share * the same index. */ -class wbt::WBBlock : public blockfactory::core::Block +class wbt::base::WBBlock : public blockfactory::core::Block { protected: // TODO: pImpl struct iDynTreeRobotState; std::unique_ptr m_robotState; std::string m_confBlockName; - std::shared_ptr m_robotInterface; + std::shared_ptr m_robotInterface; /** * @brief Helper for retrieving the iDynTree::KinDynComputations object @@ -76,7 +78,7 @@ class wbt::WBBlock : public blockfactory::core::Block * @brief Helper for retrieving the wbt::RobotInterface object * @return A pointer to wbt::RobotInterface. */ - const std::shared_ptr getRobotInterface() const; + const std::shared_ptr getRobotInterface() const; /** * @brief Helper for setting the robot state inside the iDynTree::KinDynComputations object @@ -90,10 +92,10 @@ class wbt::WBBlock : public blockfactory::core::Block * * @see iDynTree::KinDynComputations::setRobotState, wbt::iDynTreeRobotState */ - bool setRobotState(wbt::InputSignalPtr basePose, - wbt::InputSignalPtr jointsPos, - wbt::InputSignalPtr baseVelocity, - wbt::InputSignalPtr jointsVelocity, + bool setRobotState(wbt::base::InputSignalPtr basePose, + wbt::base::InputSignalPtr jointsPos, + wbt::base::InputSignalPtr baseVelocity, + wbt::base::InputSignalPtr jointsVelocity, iDynTree::KinDynComputations* kinDyn); public: diff --git a/toolbox/library/include/Base/WholeBodySingleton.h b/toolbox/base/include/Base/WholeBodySingleton.h similarity index 94% rename from toolbox/library/include/Base/WholeBodySingleton.h rename to toolbox/base/include/Base/WholeBodySingleton.h index 4bd0c5ef2..618d0b2c4 100644 --- a/toolbox/library/include/Base/WholeBodySingleton.h +++ b/toolbox/base/include/Base/WholeBodySingleton.h @@ -14,9 +14,11 @@ #include namespace wbt { - class WholeBodySingleton; - class RobotInterface; - class Configuration; + namespace base { + class WholeBodySingleton; + class RobotInterface; + class Configuration; + } // namespace base } // namespace wbt namespace blockfactory { @@ -39,13 +41,13 @@ namespace iDynTree { * @see wbt::yarpDevices * */ -class wbt::WholeBodySingleton +class wbt::base::WholeBodySingleton { private: /// Object that stores all the configurations labelled by the name of the Simulink Block's /// name. /// @see wbt::RobotInterface - std::unordered_map> m_interfaces; + std::unordered_map> m_interfaces; public: // CONSTRUCTOR / DESTRUCTOR @@ -89,7 +91,7 @@ class wbt::WholeBodySingleton * * @return the singleton instance */ - static wbt::WholeBodySingleton& sharedInstance(); + static wbt::base::WholeBodySingleton& sharedInstance(); /** * Returns the Configuration object labelled by confKey. diff --git a/toolbox/library/src/Configuration.cpp b/toolbox/base/src/Configuration.cpp similarity index 98% rename from toolbox/library/src/Configuration.cpp rename to toolbox/base/src/Configuration.cpp index 15e901a4f..2c6ee5dc9 100644 --- a/toolbox/library/src/Configuration.cpp +++ b/toolbox/base/src/Configuration.cpp @@ -10,7 +10,7 @@ #include -using namespace wbt; +using namespace wbt::base; class Configuration::impl { @@ -33,7 +33,7 @@ Configuration::Configuration(const std::string& confKey) pImpl->confKey = confKey; } -Configuration::Configuration(const wbt::Configuration& other) +Configuration::Configuration(const Configuration& other) : pImpl{other.pImpl->clone()} {} diff --git a/toolbox/library/src/RobotInterface.cpp b/toolbox/base/src/RobotInterface.cpp similarity index 98% rename from toolbox/library/src/RobotInterface.cpp rename to toolbox/base/src/RobotInterface.cpp index 9f5bfae81..7173f7c89 100644 --- a/toolbox/library/src/RobotInterface.cpp +++ b/toolbox/base/src/RobotInterface.cpp @@ -30,7 +30,7 @@ #include #include -using namespace wbt; +using namespace wbt::base; // ==================== // ROBOTINTERFACE PIMPL @@ -58,7 +58,7 @@ class RobotInterface::impl std::shared_ptr kinDynComp; YarpInterfaces yarpInterfaces; - const wbt::Configuration config; // Configuration from Simulink Block's parameters + const Configuration config; // Configuration from Simulink Block's parameters impl() = delete; explicit impl(const Configuration& configuration) @@ -210,7 +210,7 @@ class RobotInterface::impl // CONSTRUCTOR / DESTRUCTOR // ======================== -RobotInterface::RobotInterface(const wbt::Configuration& config) +RobotInterface::RobotInterface(const Configuration& config) : pImpl{new impl(config)} {} @@ -227,7 +227,7 @@ RobotInterface::~RobotInterface() // GET METHODS // =========== -const wbt::Configuration& RobotInterface::getConfiguration() const +const Configuration& RobotInterface::getConfiguration() const { return pImpl->config; } diff --git a/toolbox/library/src/WBBlock.cpp b/toolbox/base/src/WBBlock.cpp similarity index 96% rename from toolbox/library/src/WBBlock.cpp rename to toolbox/base/src/WBBlock.cpp index 6b8f0563c..4d16ffb4f 100644 --- a/toolbox/library/src/WBBlock.cpp +++ b/toolbox/base/src/WBBlock.cpp @@ -29,7 +29,7 @@ #include #include -using namespace wbt; +using namespace wbt::base; using namespace blockfactory::core; enum ParamIndex @@ -68,15 +68,15 @@ std::shared_ptr WBBlock::getKinDynComputations() c return m_robotInterface->getKinDynComputations(); } -const std::shared_ptr WBBlock::getRobotInterface() const +const std::shared_ptr WBBlock::getRobotInterface() const { return m_robotInterface; } -bool WBBlock::setRobotState(wbt::InputSignalPtr basePose, - wbt::InputSignalPtr jointsPos, - wbt::InputSignalPtr baseVelocity, - wbt::InputSignalPtr jointsVelocity, +bool WBBlock::setRobotState(InputSignalPtr basePose, + InputSignalPtr jointsPos, + InputSignalPtr baseVelocity, + InputSignalPtr jointsVelocity, iDynTree::KinDynComputations* kinDyn) { // SAVE THE ROBOT STATE diff --git a/toolbox/library/src/WholeBodySingleton.cpp b/toolbox/base/src/WholeBodySingleton.cpp similarity index 96% rename from toolbox/library/src/WholeBodySingleton.cpp rename to toolbox/base/src/WholeBodySingleton.cpp index 4471f6d7f..286a659bb 100644 --- a/toolbox/library/src/WholeBodySingleton.cpp +++ b/toolbox/base/src/WholeBodySingleton.cpp @@ -19,10 +19,10 @@ #include #include -using namespace wbt; +using namespace wbt::base; using namespace blockfactory::core; -bool fillConfiguration(std::shared_ptr& configurationPtr, +bool fillConfiguration(std::shared_ptr& configurationPtr, const Parameters& parameters); // CONSTRUCTOR / DESTRUCTOR @@ -138,7 +138,7 @@ WholeBodySingleton::createRobotInterface(const Configuration& config) return m_interfaces[confKey].lock(); } -bool fillConfiguration(std::shared_ptr& configurationPtr, +bool fillConfiguration(std::shared_ptr& configurationPtr, const Parameters& parameters) { bool ok = true; @@ -168,7 +168,7 @@ bool fillConfiguration(std::shared_ptr& configurationPtr, // Populate the Configuration object // ================================= - configurationPtr.reset(new wbt::Configuration(confBlockName)); + configurationPtr.reset(new Configuration(confBlockName)); configurationPtr->setRobotName(robotName); configurationPtr->setUrdfFile(urdfFile); configurationPtr->setControlledJoints(controlledJoints); diff --git a/toolbox/library/CMakeLists.txt b/toolbox/library/CMakeLists.txt index b6b3650d9..5bedcf8f1 100644 --- a/toolbox/library/CMakeLists.txt +++ b/toolbox/library/CMakeLists.txt @@ -2,45 +2,9 @@ # This software may be modified and distributed under the terms of the # GNU Lesser General Public License v2.1 or any later version. -# ============== -# WBTOOLBOX BASE -# ============== - # Add configure_block macro include(Utilities) -add_library(WBToolboxBase - src/RobotInterface.cpp - src/Configuration.cpp - src/WholeBodySingleton.cpp - src/WBBlock.cpp - include/Base/RobotInterface.h - include/Base/Configuration.h - include/Base/WholeBodySingleton.h - include/Base/WBBlock.h) - -target_link_libraries(WBToolboxBase - BlockFactory::Core - YARP::YARP_OS - YARP::YARP_init - YARP::YARP_dev - iDynTree::idyntree-model - iDynTree::idyntree-modelio-urdf - iDynTree::idyntree-high-level) - -target_include_directories(WBToolboxBase PUBLIC - $ - $ - $) - -install( - DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/Base - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/WBToolbox) - -# ================= -# WBTOOLBOX LIBRARY -# ================= - set(WBTOOLBOXLIBRARY_EXT_LIBRARIES "") # configure_block(BLOCK_NAME "Inverse Kinematics" @@ -249,25 +213,9 @@ if(WBT_USES_QPOASES) endif() install( - TARGETS WBToolboxBase WBToolboxLibrary + TARGETS WBToolboxLibrary EXPORT WBToolboxExport LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/WBToolbox/Block) - -if(WBT_USES_ICUB) - list(APPEND WBTOOLBOX_LIBRARY_PUBLIC_DEPENDS iCub) -endif() -if(WBT_USES_QPOASES) - list(APPEND WBTOOLBOX_LIBRARY_PUBLIC_DEPENDS qpOASES) -endif() - -install_basic_package_files(WBToolbox - VERSION ${PROJECT_VERSION} - COMPATIBILITY AnyNewerVersion - EXPORT WBToolboxExport - FIRST_TARGET WBToolboxBase - DEPENDENCIES YARP iDynTree ${WBTOOLBOX_LIBRARY_PUBLIC_DEPENDS} BlockFactoryCore - NAMESPACE WBToolbox:: - NO_CHECK_REQUIRED_COMPONENTS_MACRO) From d65b211dcffd70e9f335014448aed3ba5e1db54d Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Wed, 5 Dec 2018 17:03:11 +0100 Subject: [PATCH 06/37] Updated namespaces and include hierarchy --- toolbox/base/CMakeLists.txt | 22 +++-- .../{ => WBToolbox}/Base/Configuration.h | 0 .../{ => WBToolbox}/Base/RobotInterface.h | 0 .../include/{ => WBToolbox}/Base/WBBlock.h | 0 .../{ => WBToolbox}/Base/WholeBodySingleton.h | 0 toolbox/base/src/Configuration.cpp | 2 +- toolbox/base/src/RobotInterface.cpp | 4 +- toolbox/base/src/WBBlock.cpp | 8 +- toolbox/base/src/WholeBodySingleton.cpp | 6 +- toolbox/library/CMakeLists.txt | 45 +++++---- .../Block/CentroidalMomentum.h | 14 +-- .../{ => WBToolbox}/Block/DiscreteFilter.h | 12 ++- .../include/{ => WBToolbox}/Block/DotJNu.h | 14 +-- .../{ => WBToolbox}/Block/ForwardKinematics.h | 14 +-- .../include/{ => WBToolbox}/Block/GetLimits.h | 14 +-- .../{ => WBToolbox}/Block/GetMeasurement.h | 14 +-- .../{ => WBToolbox}/Block/InverseDynamics.h | 14 +-- .../{ => WBToolbox}/Block/InverseKinematics.h | 0 .../include/{ => WBToolbox}/Block/Jacobian.h | 14 +-- .../{ => WBToolbox}/Block/MassMatrix.h | 14 +-- .../Block/MinimumJerkTrajectoryGenerator.h | 12 ++- .../include/{ => WBToolbox}/Block/QpOases.h | 12 ++- .../Block/RealTimeSynchronizer.h | 12 ++- .../{ => WBToolbox}/Block/RelativeTransform.h | 14 +-- .../Block/RemoteInverseKinematics.h | 0 .../Block/SetMotorParameters.h | 14 +-- .../{ => WBToolbox}/Block/SetReferences.h | 14 +-- .../Block/SimulatorSynchronizer.h | 12 ++- .../include/{ => WBToolbox}/Block/YarpClock.h | 12 ++- .../include/{ => WBToolbox}/Block/YarpRead.h | 12 ++- .../include/{ => WBToolbox}/Block/YarpWrite.h | 12 ++- toolbox/library/src/CentroidalMomentum.cpp | 8 +- toolbox/library/src/DiscreteFilter.cpp | 4 +- toolbox/library/src/DotJNu.cpp | 10 +- toolbox/library/src/Factory.cpp | 98 +++++++++++-------- toolbox/library/src/ForwardKinematics.cpp | 10 +- toolbox/library/src/GetLimits.cpp | 12 +-- toolbox/library/src/GetMeasurement.cpp | 10 +- toolbox/library/src/InverseDynamics.cpp | 8 +- toolbox/library/src/Jacobian.cpp | 10 +- toolbox/library/src/MassMatrix.cpp | 8 +- .../src/MinimumJerkTrajectoryGenerator.cpp | 4 +- toolbox/library/src/QpOases.cpp | 4 +- toolbox/library/src/RealTimeSynchronizer.cpp | 4 +- toolbox/library/src/RelativeTransform.cpp | 10 +- toolbox/library/src/SetMotorParameters.cpp | 10 +- toolbox/library/src/SetReferences.cpp | 10 +- toolbox/library/src/SimulatorSynchronizer.cpp | 4 +- toolbox/library/src/YarpClock.cpp | 4 +- toolbox/library/src/YarpRead.cpp | 4 +- toolbox/library/src/YarpWrite.cpp | 4 +- 51 files changed, 316 insertions(+), 257 deletions(-) rename toolbox/base/include/{ => WBToolbox}/Base/Configuration.h (100%) rename toolbox/base/include/{ => WBToolbox}/Base/RobotInterface.h (100%) rename toolbox/base/include/{ => WBToolbox}/Base/WBBlock.h (100%) rename toolbox/base/include/{ => WBToolbox}/Base/WholeBodySingleton.h (100%) rename toolbox/library/include/{ => WBToolbox}/Block/CentroidalMomentum.h (84%) rename toolbox/library/include/{ => WBToolbox}/Block/DiscreteFilter.h (93%) rename toolbox/library/include/{ => WBToolbox}/Block/DotJNu.h (89%) rename toolbox/library/include/{ => WBToolbox}/Block/ForwardKinematics.h (88%) rename toolbox/library/include/{ => WBToolbox}/Block/GetLimits.h (89%) rename toolbox/library/include/{ => WBToolbox}/Block/GetMeasurement.h (88%) rename toolbox/library/include/{ => WBToolbox}/Block/InverseDynamics.h (85%) rename toolbox/library/include/{ => WBToolbox}/Block/InverseKinematics.h (100%) rename toolbox/library/include/{ => WBToolbox}/Block/Jacobian.h (89%) rename toolbox/library/include/{ => WBToolbox}/Block/MassMatrix.h (85%) rename toolbox/library/include/{ => WBToolbox}/Block/MinimumJerkTrajectoryGenerator.h (91%) rename toolbox/library/include/{ => WBToolbox}/Block/QpOases.h (93%) rename toolbox/library/include/{ => WBToolbox}/Block/RealTimeSynchronizer.h (90%) rename toolbox/library/include/{ => WBToolbox}/Block/RelativeTransform.h (89%) rename toolbox/library/include/{ => WBToolbox}/Block/RemoteInverseKinematics.h (100%) rename toolbox/library/include/{ => WBToolbox}/Block/SetMotorParameters.h (91%) rename toolbox/library/include/{ => WBToolbox}/Block/SetReferences.h (90%) rename toolbox/library/include/{ => WBToolbox}/Block/SimulatorSynchronizer.h (91%) rename toolbox/library/include/{ => WBToolbox}/Block/YarpClock.h (87%) rename toolbox/library/include/{ => WBToolbox}/Block/YarpRead.h (93%) rename toolbox/library/include/{ => WBToolbox}/Block/YarpWrite.h (91%) diff --git a/toolbox/base/CMakeLists.txt b/toolbox/base/CMakeLists.txt index 1c7184074..8eb4c15b2 100644 --- a/toolbox/base/CMakeLists.txt +++ b/toolbox/base/CMakeLists.txt @@ -2,15 +2,21 @@ # This software may be modified and distributed under the terms of the # GNU Lesser General Public License v2.1 or any later version. +set(WBTBASE_PUBLIC_HDR + include/WBToolbox/Base/RobotInterface.h + include/WBToolbox/Base/Configuration.h + include/WBToolbox/Base/WholeBodySingleton.h + include/WBToolbox/Base/WBBlock.h) + add_library(WBToolboxBase src/RobotInterface.cpp src/Configuration.cpp src/WholeBodySingleton.cpp src/WBBlock.cpp - include/Base/RobotInterface.h - include/Base/Configuration.h - include/Base/WholeBodySingleton.h - include/Base/WBBlock.h) + ${WBTBASE_PUBLIC_HDR}) + +set_target_properties(WBToolboxBase PROPERTIES + PUBLIC_HEADER "${WBTBASE_PUBLIC_HDR}") target_link_libraries(WBToolboxBase BlockFactory::Core @@ -24,11 +30,7 @@ target_link_libraries(WBToolboxBase target_include_directories(WBToolboxBase PUBLIC $ $ - $) - -install( - DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/Base - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/WBToolbox) + $) install( TARGETS WBToolboxBase @@ -36,4 +38,4 @@ install( LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/WBToolbox/Block) + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/WBToolbox/Base) diff --git a/toolbox/base/include/Base/Configuration.h b/toolbox/base/include/WBToolbox/Base/Configuration.h similarity index 100% rename from toolbox/base/include/Base/Configuration.h rename to toolbox/base/include/WBToolbox/Base/Configuration.h diff --git a/toolbox/base/include/Base/RobotInterface.h b/toolbox/base/include/WBToolbox/Base/RobotInterface.h similarity index 100% rename from toolbox/base/include/Base/RobotInterface.h rename to toolbox/base/include/WBToolbox/Base/RobotInterface.h diff --git a/toolbox/base/include/Base/WBBlock.h b/toolbox/base/include/WBToolbox/Base/WBBlock.h similarity index 100% rename from toolbox/base/include/Base/WBBlock.h rename to toolbox/base/include/WBToolbox/Base/WBBlock.h diff --git a/toolbox/base/include/Base/WholeBodySingleton.h b/toolbox/base/include/WBToolbox/Base/WholeBodySingleton.h similarity index 100% rename from toolbox/base/include/Base/WholeBodySingleton.h rename to toolbox/base/include/WBToolbox/Base/WholeBodySingleton.h diff --git a/toolbox/base/src/Configuration.cpp b/toolbox/base/src/Configuration.cpp index 2c6ee5dc9..53e070295 100644 --- a/toolbox/base/src/Configuration.cpp +++ b/toolbox/base/src/Configuration.cpp @@ -6,7 +6,7 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "Base/Configuration.h" +#include "WBToolbox/Base/Configuration.h" #include diff --git a/toolbox/base/src/RobotInterface.cpp b/toolbox/base/src/RobotInterface.cpp index 7173f7c89..0f3218138 100644 --- a/toolbox/base/src/RobotInterface.cpp +++ b/toolbox/base/src/RobotInterface.cpp @@ -6,8 +6,8 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "Base/RobotInterface.h" -#include "Base/Configuration.h" +#include "WBToolbox/Base/RobotInterface.h" +#include "WBToolbox/Base/Configuration.h" #include #include diff --git a/toolbox/base/src/WBBlock.cpp b/toolbox/base/src/WBBlock.cpp index 4d16ffb4f..cb72d6d47 100644 --- a/toolbox/base/src/WBBlock.cpp +++ b/toolbox/base/src/WBBlock.cpp @@ -6,10 +6,10 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "Base/WBBlock.h" -#include "Base/Configuration.h" -#include "Base/RobotInterface.h" -#include "Base/WholeBodySingleton.h" +#include "WBToolbox/Base/WBBlock.h" +#include "WBToolbox/Base/Configuration.h" +#include "WBToolbox/Base/RobotInterface.h" +#include "WBToolbox/Base/WholeBodySingleton.h" #include #include diff --git a/toolbox/base/src/WholeBodySingleton.cpp b/toolbox/base/src/WholeBodySingleton.cpp index 286a659bb..c59a71acb 100644 --- a/toolbox/base/src/WholeBodySingleton.cpp +++ b/toolbox/base/src/WholeBodySingleton.cpp @@ -6,9 +6,9 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "Base/WholeBodySingleton.h" -#include "Base/Configuration.h" -#include "Base/RobotInterface.h" +#include "WBToolbox/Base/WholeBodySingleton.h" +#include "WBToolbox/Base/Configuration.h" +#include "WBToolbox/Base/RobotInterface.h" #include #include diff --git a/toolbox/library/CMakeLists.txt b/toolbox/library/CMakeLists.txt index 5bedcf8f1..ca1b88aa5 100644 --- a/toolbox/library/CMakeLists.txt +++ b/toolbox/library/CMakeLists.txt @@ -22,13 +22,13 @@ if(WBT_USES_ICUB) GROUP "Utilities" LIST_PREFIX WBT SOURCES src/MinimumJerkTrajectoryGenerator.cpp - HEADERS include/Block/MinimumJerkTrajectoryGenerator.h) + HEADERS include/WBToolbox/Block/MinimumJerkTrajectoryGenerator.h) configure_block(BLOCK_NAME "Discrete Filter" GROUP "Utilities" LIST_PREFIX WBT SOURCES src/DiscreteFilter.cpp - HEADERS include/Block/DiscreteFilter.h) + HEADERS include/WBToolbox/Block/DiscreteFilter.h) # if (${ICUB_USE_IPOPT}) # find_package(iDynTree REQUIRED) @@ -53,39 +53,39 @@ configure_block(BLOCK_NAME "Yarp Read" GROUP "Utilities" LIST_PREFIX WBT SOURCES src/YarpRead.cpp - HEADERS include/Block/YarpRead.h) + HEADERS include/WBToolbox/Block/YarpRead.h) configure_block(BLOCK_NAME "Yarp Write" GROUP "Utilities" LIST_PREFIX WBT SOURCES src/YarpWrite.cpp - HEADERS include/Block/YarpWrite.h) + HEADERS include/WBToolbox/Block/YarpWrite.h) configure_block(BLOCK_NAME "Real Time Synchronizer" GROUP "Utilities" LIST_PREFIX WBT SOURCES src/RealTimeSynchronizer.cpp - HEADERS include/Block/RealTimeSynchronizer.h) + HEADERS include/WBToolbox/Block/RealTimeSynchronizer.h) configure_block(BLOCK_NAME "Yarp Clock" GROUP "Utilities" LIST_PREFIX WBT SOURCES src/YarpClock.cpp - HEADERS include/Block/YarpClock.h) + HEADERS include/WBToolbox/Block/YarpClock.h) if(WBT_USES_QPOASES) configure_block(BLOCK_NAME "qpOASES" GROUP "Utilities" LIST_PREFIX WBT SOURCES src/QpOases.cpp - HEADERS include/Block/QpOases.h) + HEADERS include/WBToolbox/Block/QpOases.h) endif() configure_block(BLOCK_NAME "Simulator Synchronizer" GROUP "Utilities" LIST_PREFIX WBT SOURCES src/SimulatorSynchronizer.cpp - HEADERS include/Block/SimulatorSynchronizer.h) + HEADERS include/WBToolbox/Block/SimulatorSynchronizer.h) add_library(WBToolbox::ClockRPC ALIAS ClockRpc) list(APPEND WBTOOLBOXLIBRARY_EXT_LIBRARIES "ClockRpc") @@ -93,67 +93,67 @@ configure_block(BLOCK_NAME "Mass Matrix" GROUP "Model" LIST_PREFIX WBT SOURCES src/MassMatrix.cpp - HEADERS include/Block/MassMatrix.h) + HEADERS include/WBToolbox/Block/MassMatrix.h) configure_block(BLOCK_NAME "Inverse Dynamics" GROUP "Model" LIST_PREFIX WBT SOURCES src/InverseDynamics.cpp - HEADERS include/Block/InverseDynamics.h) + HEADERS include/WBToolbox/Block/InverseDynamics.h) configure_block(BLOCK_NAME "Centroidal Momentum" GROUP "Model" LIST_PREFIX WBT SOURCES src/CentroidalMomentum.cpp - HEADERS include/Block/CentroidalMomentum.h) + HEADERS include/WBToolbox/Block/CentroidalMomentum.h) configure_block(BLOCK_NAME "Forward Kinematics" GROUP "Model" LIST_PREFIX WBT SOURCES src/ForwardKinematics.cpp - HEADERS include/Block/ForwardKinematics.h) + HEADERS include/WBToolbox/Block/ForwardKinematics.h) configure_block(BLOCK_NAME "Jacobian" GROUP "Model" LIST_PREFIX WBT SOURCES src/Jacobian.cpp - HEADERS include/Block/Jacobian.h) + HEADERS include/WBToolbox/Block/Jacobian.h) configure_block(BLOCK_NAME "DotJ Nu" GROUP "Model" LIST_PREFIX WBT SOURCES src/DotJNu.cpp - HEADERS include/Block/DotJNu.h) + HEADERS include/WBToolbox/Block/DotJNu.h) configure_block(BLOCK_NAME "Relative Transform" GROUP "Model" LIST_PREFIX WBT SOURCES src/RelativeTransform.cpp - HEADERS include/Block/RelativeTransform.h) + HEADERS include/WBToolbox/Block/RelativeTransform.h) configure_block(BLOCK_NAME "Set References" GROUP "Actuators" LIST_PREFIX WBT SOURCES src/SetReferences.cpp - HEADERS include/Block/SetReferences.h) + HEADERS include/WBToolbox/Block/SetReferences.h) configure_block(BLOCK_NAME "Set Motor Parameters" GROUP "Actuators" LIST_PREFIX WBT SOURCES src/SetMotorParameters.cpp - HEADERS include/Block/SetMotorParameters.h) + HEADERS include/WBToolbox/Block/SetMotorParameters.h) configure_block(BLOCK_NAME "Get Measurement" GROUP "State" LIST_PREFIX WBT SOURCES src/GetMeasurement.cpp - HEADERS include/Block/GetMeasurement.h) + HEADERS include/WBToolbox/Block/GetMeasurement.h) configure_block(BLOCK_NAME "Get Limits" GROUP "State" LIST_PREFIX WBT SOURCES src/GetLimits.cpp - HEADERS include/Block/GetLimits.h) + HEADERS include/WBToolbox/Block/GetLimits.h) get_property(ALL_LIBRARY_HEADERS GLOBAL PROPERTY WBT_HEADERS) get_property(ALL_LIBRARY_SOURCES GLOBAL PROPERTY WBT_SOURCES) @@ -170,14 +170,13 @@ if(MSVC) endif() target_include_directories(WBToolboxLibrary PUBLIC - $ - $) + $ + $) target_include_directories(WBToolboxLibrary SYSTEM PRIVATE ${EIGEN3_INCLUDE_DIR}) set_target_properties(WBToolboxLibrary PROPERTIES - PUBLIC_HEADER "${ALL_LIBRARY_HEADERS}" - OUTPUT_NAME "WBToolboxLibrary") + PUBLIC_HEADER "${ALL_LIBRARY_HEADERS}") list(APPEND WBTOOLBOXLIBRARY_EXT_LIBRARIES YARP::YARP_OS diff --git a/toolbox/library/include/Block/CentroidalMomentum.h b/toolbox/library/include/WBToolbox/Block/CentroidalMomentum.h similarity index 84% rename from toolbox/library/include/Block/CentroidalMomentum.h rename to toolbox/library/include/WBToolbox/Block/CentroidalMomentum.h index f70d38717..4a5c8a237 100644 --- a/toolbox/library/include/Block/CentroidalMomentum.h +++ b/toolbox/library/include/WBToolbox/Block/CentroidalMomentum.h @@ -9,25 +9,27 @@ #ifndef WBT_CENTROIDALMOMENTUM_H #define WBT_CENTROIDALMOMENTUM_H -#include "Base/WBBlock.h" +#include "WBToolbox/Base/WBBlock.h" #include #include +namespace wbt { + namespace block { + class CentroidalMomentum; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class CentroidalMomentum; -} // namespace wbt - /** * @brief The wbt::CentroidalMomentum class */ -class wbt::CentroidalMomentum final : public wbt::WBBlock +class wbt::block::CentroidalMomentum final : public wbt::base::WBBlock { private: class impl; diff --git a/toolbox/library/include/Block/DiscreteFilter.h b/toolbox/library/include/WBToolbox/Block/DiscreteFilter.h similarity index 93% rename from toolbox/library/include/Block/DiscreteFilter.h rename to toolbox/library/include/WBToolbox/Block/DiscreteFilter.h index 11921aa36..d9f5f698c 100644 --- a/toolbox/library/include/Block/DiscreteFilter.h +++ b/toolbox/library/include/WBToolbox/Block/DiscreteFilter.h @@ -14,16 +14,18 @@ #include #include +namespace wbt { + namespace block { + class DiscreteFilter; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class DiscreteFilter; -} // namespace wbt - // clang-format off /** * @brief The wbt::DiscreteFilter class @@ -46,7 +48,7 @@ namespace wbt { * */ // clang-format on -class wbt::DiscreteFilter final : public blockfactory::core::Block +class wbt::block::DiscreteFilter final : public blockfactory::core::Block { private: class impl; diff --git a/toolbox/library/include/Block/DotJNu.h b/toolbox/library/include/WBToolbox/Block/DotJNu.h similarity index 89% rename from toolbox/library/include/Block/DotJNu.h rename to toolbox/library/include/WBToolbox/Block/DotJNu.h index f4a2def1b..d4c645812 100644 --- a/toolbox/library/include/Block/DotJNu.h +++ b/toolbox/library/include/WBToolbox/Block/DotJNu.h @@ -9,21 +9,23 @@ #ifndef WBT_DOTJNU_H #define WBT_DOTJNU_H -#include "Base/WBBlock.h" +#include "WBToolbox/Base/WBBlock.h" #include #include +namespace wbt { + namespace block { + class DotJNu; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class DotJNu; -} // namespace wbt - /** * @brief The wbt::DotJNu class * @@ -36,7 +38,7 @@ namespace wbt { * | ::STRING | 0 + WBBlock::NumberOfParameters | 1 | 1 | "Frame" | * */ -class wbt::DotJNu final : public wbt::WBBlock +class wbt::block::DotJNu final : public wbt::base::WBBlock { private: class impl; diff --git a/toolbox/library/include/Block/ForwardKinematics.h b/toolbox/library/include/WBToolbox/Block/ForwardKinematics.h similarity index 88% rename from toolbox/library/include/Block/ForwardKinematics.h rename to toolbox/library/include/WBToolbox/Block/ForwardKinematics.h index 3fbd6cb03..fb0f43fdb 100644 --- a/toolbox/library/include/Block/ForwardKinematics.h +++ b/toolbox/library/include/WBToolbox/Block/ForwardKinematics.h @@ -9,21 +9,23 @@ #ifndef WBT_FORWARDKINEMATICS_H #define WBT_FORWARDKINEMATICS_H -#include "Base/WBBlock.h" +#include "WBToolbox/Base/WBBlock.h" #include #include +namespace wbt { + namespace block { + class ForwardKinematics; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class ForwardKinematics; -} // namespace wbt - /** * @brief The wbt::ForwardKinematics class * @@ -36,7 +38,7 @@ namespace wbt { * | ::STRING | 0 + WBBlock::NumberOfParameters | 1 | 1 | "Frame" | * */ -class wbt::ForwardKinematics final : public wbt::WBBlock +class wbt::block::ForwardKinematics final : public wbt::base::WBBlock { private: class impl; diff --git a/toolbox/library/include/Block/GetLimits.h b/toolbox/library/include/WBToolbox/Block/GetLimits.h similarity index 89% rename from toolbox/library/include/Block/GetLimits.h rename to toolbox/library/include/WBToolbox/Block/GetLimits.h index a5a39a8d3..6cb7dff65 100644 --- a/toolbox/library/include/Block/GetLimits.h +++ b/toolbox/library/include/WBToolbox/Block/GetLimits.h @@ -9,21 +9,23 @@ #ifndef WBT_GETLIMITS_H #define WBT_GETLIMITS_H -#include "Base/WBBlock.h" +#include "WBToolbox/Base/WBBlock.h" #include #include +namespace wbt { + namespace block { + class GetLimits; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class GetLimits; -} // namespace wbt - /** * @brief The wbt::GetLimits class * @@ -36,7 +38,7 @@ namespace wbt { * | ::STRING | 0 + WBBlock::NumberOfParameters | 1 | 1 | "LimitType" | * */ -class wbt::GetLimits final : public wbt::WBBlock +class wbt::block::GetLimits final : public wbt::base::WBBlock { private: class impl; diff --git a/toolbox/library/include/Block/GetMeasurement.h b/toolbox/library/include/WBToolbox/Block/GetMeasurement.h similarity index 88% rename from toolbox/library/include/Block/GetMeasurement.h rename to toolbox/library/include/WBToolbox/Block/GetMeasurement.h index d1f7d8773..26bb3c4ed 100644 --- a/toolbox/library/include/Block/GetMeasurement.h +++ b/toolbox/library/include/WBToolbox/Block/GetMeasurement.h @@ -9,21 +9,23 @@ #ifndef WBT_GETMEASUREMENT_H #define WBT_GETMEASUREMENT_H -#include "Base/WBBlock.h" +#include "WBToolbox/Base/WBBlock.h" #include #include +namespace wbt { + namespace block { + class GetMeasurement; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class GetMeasurement; -} // namespace wbt - /** * @brief The wbt::GetMeasurement class * @@ -36,7 +38,7 @@ namespace wbt { * | ::STRING | 0 + WBBlock::NumberOfParameters | 1 | 1 | "MeasuredType" | * */ -class wbt::GetMeasurement final : public wbt::WBBlock +class wbt::block::GetMeasurement final : public wbt::base::WBBlock { private: class impl; diff --git a/toolbox/library/include/Block/InverseDynamics.h b/toolbox/library/include/WBToolbox/Block/InverseDynamics.h similarity index 85% rename from toolbox/library/include/Block/InverseDynamics.h rename to toolbox/library/include/WBToolbox/Block/InverseDynamics.h index 59ac9b540..6f7247f99 100644 --- a/toolbox/library/include/Block/InverseDynamics.h +++ b/toolbox/library/include/WBToolbox/Block/InverseDynamics.h @@ -9,25 +9,27 @@ #ifndef WBT_INVERSEDYNAMICS_H #define WBT_INVERSEDYNAMICS_H -#include "Base/WBBlock.h" +#include "WBToolbox/Base/WBBlock.h" #include #include +namespace wbt { + namespace block { + class InverseDynamics; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class InverseDynamics; -} // namespace wbt - /** * @brief The wbt::InverseDynamics class */ -class wbt::InverseDynamics final : public wbt::WBBlock +class wbt::block::InverseDynamics final : public wbt::base::WBBlock { private: class impl; diff --git a/toolbox/library/include/Block/InverseKinematics.h b/toolbox/library/include/WBToolbox/Block/InverseKinematics.h similarity index 100% rename from toolbox/library/include/Block/InverseKinematics.h rename to toolbox/library/include/WBToolbox/Block/InverseKinematics.h diff --git a/toolbox/library/include/Block/Jacobian.h b/toolbox/library/include/WBToolbox/Block/Jacobian.h similarity index 89% rename from toolbox/library/include/Block/Jacobian.h rename to toolbox/library/include/WBToolbox/Block/Jacobian.h index 7963ae3bf..65970be15 100644 --- a/toolbox/library/include/Block/Jacobian.h +++ b/toolbox/library/include/WBToolbox/Block/Jacobian.h @@ -9,21 +9,23 @@ #ifndef WBT_JACOBIAN_H #define WBT_JACOBIAN_H -#include "Base/WBBlock.h" +#include "WBToolbox/Base/WBBlock.h" #include #include +namespace wbt { + namespace block { + class Jacobian; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class Jacobian; -} // namespace wbt - /** * @brief The wbt::Jacobian class * @@ -36,7 +38,7 @@ namespace wbt { * | ::STRING | 0 + WBBlock::NumberOfParameters | 1 | 1 | "Frame" | * */ -class wbt::Jacobian final : public wbt::WBBlock +class wbt::block::Jacobian final : public wbt::base::WBBlock { private: class impl; diff --git a/toolbox/library/include/Block/MassMatrix.h b/toolbox/library/include/WBToolbox/Block/MassMatrix.h similarity index 85% rename from toolbox/library/include/Block/MassMatrix.h rename to toolbox/library/include/WBToolbox/Block/MassMatrix.h index a01e445ea..7988484ef 100644 --- a/toolbox/library/include/Block/MassMatrix.h +++ b/toolbox/library/include/WBToolbox/Block/MassMatrix.h @@ -9,25 +9,27 @@ #ifndef WBT_MASSMATRIX_H #define WBT_MASSMATRIX_H -#include "Base/WBBlock.h" +#include "WBToolbox/Base/WBBlock.h" #include #include +namespace wbt { + namespace block { + class MassMatrix; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class MassMatrix; -} // namespace wbt - /** * @brief The wbt::MassMatrix class */ -class wbt::MassMatrix final : public wbt::WBBlock +class wbt::block::MassMatrix final : public wbt::base::WBBlock { private: class impl; diff --git a/toolbox/library/include/Block/MinimumJerkTrajectoryGenerator.h b/toolbox/library/include/WBToolbox/Block/MinimumJerkTrajectoryGenerator.h similarity index 91% rename from toolbox/library/include/Block/MinimumJerkTrajectoryGenerator.h rename to toolbox/library/include/WBToolbox/Block/MinimumJerkTrajectoryGenerator.h index 0cef902e7..310d808e6 100644 --- a/toolbox/library/include/Block/MinimumJerkTrajectoryGenerator.h +++ b/toolbox/library/include/WBToolbox/Block/MinimumJerkTrajectoryGenerator.h @@ -14,16 +14,18 @@ #include #include +namespace wbt { + namespace block { + class MinimumJerkTrajectoryGenerator; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class MinimumJerkTrajectoryGenerator; -} // namespace wbt - /** * @brief The wbt::MinimumJerkTrajectoryGenerator class * @@ -42,7 +44,7 @@ namespace wbt { * | ::BOOL | 6 + Block::NumberOfParameters | 1 | 1 | "ResetOnSettlingTimeChange" | * */ -class wbt::MinimumJerkTrajectoryGenerator final : public blockfactory::core::Block +class wbt::block::MinimumJerkTrajectoryGenerator final : public blockfactory::core::Block { private: class impl; diff --git a/toolbox/library/include/Block/QpOases.h b/toolbox/library/include/WBToolbox/Block/QpOases.h similarity index 93% rename from toolbox/library/include/Block/QpOases.h rename to toolbox/library/include/WBToolbox/Block/QpOases.h index ae2a8b27c..e0082e941 100644 --- a/toolbox/library/include/Block/QpOases.h +++ b/toolbox/library/include/WBToolbox/Block/QpOases.h @@ -14,16 +14,18 @@ #include #include +namespace wbt { + namespace block { + class QpOases; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class QpOases; -} // namespace wbt - /** * @brief The wbt::QpOases class * @@ -41,7 +43,7 @@ namespace wbt { * | ParameterType::BOOL | 5 + Block::NumberOfParameters | 1 | 1 | "StopWhenFails" | * */ -class wbt::QpOases final : public blockfactory::core::Block +class wbt::block::QpOases final : public blockfactory::core::Block { private: class impl; diff --git a/toolbox/library/include/Block/RealTimeSynchronizer.h b/toolbox/library/include/WBToolbox/Block/RealTimeSynchronizer.h similarity index 90% rename from toolbox/library/include/Block/RealTimeSynchronizer.h rename to toolbox/library/include/WBToolbox/Block/RealTimeSynchronizer.h index 7b3db4842..373a14e66 100644 --- a/toolbox/library/include/Block/RealTimeSynchronizer.h +++ b/toolbox/library/include/WBToolbox/Block/RealTimeSynchronizer.h @@ -14,16 +14,18 @@ #include #include +namespace wbt { + namespace block { + class RealTimeSynchronizer; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class RealTimeSynchronizer; -} // namespace wbt - /** * @brief The wbt::RealTimeSynchronizer class * @@ -36,7 +38,7 @@ namespace wbt { * | ::DOUBLE | 0 + Block::NumberOfParameters | 1 | 1 | "Period" | * */ -class wbt::RealTimeSynchronizer final : public blockfactory::core::Block +class wbt::block::RealTimeSynchronizer final : public blockfactory::core::Block { private: class impl; diff --git a/toolbox/library/include/Block/RelativeTransform.h b/toolbox/library/include/WBToolbox/Block/RelativeTransform.h similarity index 89% rename from toolbox/library/include/Block/RelativeTransform.h rename to toolbox/library/include/WBToolbox/Block/RelativeTransform.h index ce38ae760..d67620b20 100644 --- a/toolbox/library/include/Block/RelativeTransform.h +++ b/toolbox/library/include/WBToolbox/Block/RelativeTransform.h @@ -9,21 +9,23 @@ #ifndef WBT_RELATIVETRASFORM_H #define WBT_RELATIVETRASFORM_H -#include "Base/WBBlock.h" +#include "WBToolbox/Base/WBBlock.h" #include #include +namespace wbt { + namespace block { + class RelativeTransform; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class RelativeTransform; -} // namespace wbt - /** * @brief The wbt::RelativeTransform class * @@ -37,7 +39,7 @@ namespace wbt { * | ::STRING | 1 + WBBlock::NumberOfParameters | 1 | 1 | "Frame2" | * */ -class wbt::RelativeTransform final : public wbt::WBBlock +class wbt::block::RelativeTransform final : public wbt::base::WBBlock { private: class impl; diff --git a/toolbox/library/include/Block/RemoteInverseKinematics.h b/toolbox/library/include/WBToolbox/Block/RemoteInverseKinematics.h similarity index 100% rename from toolbox/library/include/Block/RemoteInverseKinematics.h rename to toolbox/library/include/WBToolbox/Block/RemoteInverseKinematics.h diff --git a/toolbox/library/include/Block/SetMotorParameters.h b/toolbox/library/include/WBToolbox/Block/SetMotorParameters.h similarity index 91% rename from toolbox/library/include/Block/SetMotorParameters.h rename to toolbox/library/include/WBToolbox/Block/SetMotorParameters.h index b887b771c..48eda23e6 100644 --- a/toolbox/library/include/Block/SetMotorParameters.h +++ b/toolbox/library/include/WBToolbox/Block/SetMotorParameters.h @@ -10,21 +10,23 @@ #ifndef WBT_SETMOTORPARAMETERS_H #define WBT_SETMOTORPARAMETERS_H -#include "Base/WBBlock.h" +#include "WBToolbox/Base/WBBlock.h" #include #include +namespace wbt { + namespace block { + class SetMotorParameters; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class SetMotorParameters; -} // namespace wbt - /** * @brief The wbt::SetMotorParameters class * @@ -44,7 +46,7 @@ namespace wbt { * | ::STRING | 7 + WBBlock::NumberOfParameters | 1 | ParameterMetadata::DynamicSize | "Bemf" | * * */ -class wbt::SetMotorParameters final : public wbt::WBBlock +class wbt::block::SetMotorParameters final : public wbt::base::WBBlock { private: class impl; diff --git a/toolbox/library/include/Block/SetReferences.h b/toolbox/library/include/WBToolbox/Block/SetReferences.h similarity index 90% rename from toolbox/library/include/Block/SetReferences.h rename to toolbox/library/include/WBToolbox/Block/SetReferences.h index 9446e0802..5a2060e26 100644 --- a/toolbox/library/include/Block/SetReferences.h +++ b/toolbox/library/include/WBToolbox/Block/SetReferences.h @@ -9,21 +9,23 @@ #ifndef WBT_SETREFERENCES_H #define WBT_SETREFERENCES_H -#include "Base/WBBlock.h" +#include "WBToolbox/Base/WBBlock.h" #include #include +namespace wbt { + namespace block { + class SetReferences; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class SetReferences; -} // namespace wbt - /** * @brief The wbt::SetReferences class * @@ -37,7 +39,7 @@ namespace wbt { * | ::DOUBLE | 0 + WBBlock::NumberOfParameters | 1 | 1 | "TrajectoryReference" | * */ -class wbt::SetReferences final : public wbt::WBBlock +class wbt::block::SetReferences final : public wbt::base::WBBlock { private: class impl; diff --git a/toolbox/library/include/Block/SimulatorSynchronizer.h b/toolbox/library/include/WBToolbox/Block/SimulatorSynchronizer.h similarity index 91% rename from toolbox/library/include/Block/SimulatorSynchronizer.h rename to toolbox/library/include/WBToolbox/Block/SimulatorSynchronizer.h index c00cb214b..85fd6be8c 100644 --- a/toolbox/library/include/Block/SimulatorSynchronizer.h +++ b/toolbox/library/include/WBToolbox/Block/SimulatorSynchronizer.h @@ -15,16 +15,18 @@ #include #include +namespace wbt { + namespace block { + class SimulatorSynchronizer; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class SimulatorSynchronizer; -} // namespace wbt - /** * @brief The wbt::SimulatorSynchronizer class * @@ -39,7 +41,7 @@ namespace wbt { * | ::STRING | 2 + WBBlock::NumberOfParameters | 1 | 1 | "GazeboClockPort" | * */ -class wbt::SimulatorSynchronizer final : public blockfactory::core::Block +class wbt::block::SimulatorSynchronizer final : public blockfactory::core::Block { private: class impl; diff --git a/toolbox/library/include/Block/YarpClock.h b/toolbox/library/include/WBToolbox/Block/YarpClock.h similarity index 87% rename from toolbox/library/include/Block/YarpClock.h rename to toolbox/library/include/WBToolbox/Block/YarpClock.h index e82c76244..dc3c949ce 100644 --- a/toolbox/library/include/Block/YarpClock.h +++ b/toolbox/library/include/WBToolbox/Block/YarpClock.h @@ -13,20 +13,22 @@ #include +namespace wbt { + namespace block { + class YarpClock; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class YarpClock; -} // namespace wbt - /** * @brief The wbt::YarpClock class */ -class wbt::YarpClock final : public blockfactory::core::Block +class wbt::block::YarpClock final : public blockfactory::core::Block { public: YarpClock() = default; diff --git a/toolbox/library/include/Block/YarpRead.h b/toolbox/library/include/WBToolbox/Block/YarpRead.h similarity index 93% rename from toolbox/library/include/Block/YarpRead.h rename to toolbox/library/include/WBToolbox/Block/YarpRead.h index 9232e0bb6..83b91c8f8 100644 --- a/toolbox/library/include/Block/YarpRead.h +++ b/toolbox/library/include/WBToolbox/Block/YarpRead.h @@ -14,16 +14,18 @@ #include #include +namespace wbt { + namespace block { + class YarpRead; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class YarpRead; -} // namespace wbt - /** * @brief The wbt::YarpRead class * @@ -40,7 +42,7 @@ namespace wbt { * | ::BOOL | 6 + Block::NumberOfParameters | 1 | 1 | "ErrorOnMissingPort" | * */ -class wbt::YarpRead final : public blockfactory::core::Block +class wbt::block::YarpRead final : public blockfactory::core::Block { private: class impl; diff --git a/toolbox/library/include/Block/YarpWrite.h b/toolbox/library/include/WBToolbox/Block/YarpWrite.h similarity index 91% rename from toolbox/library/include/Block/YarpWrite.h rename to toolbox/library/include/WBToolbox/Block/YarpWrite.h index 7ce393ed2..310d53880 100644 --- a/toolbox/library/include/Block/YarpWrite.h +++ b/toolbox/library/include/WBToolbox/Block/YarpWrite.h @@ -14,16 +14,18 @@ #include #include +namespace wbt { + namespace block { + class YarpWrite; + } // namespace block +} // namespace wbt + namespace blockfactory { namespace core { class BlockInformation; } // namespace core } // namespace blockfactory -namespace wbt { - class YarpWrite; -} // namespace wbt - /** * @brief The wbt::YarpWrite class * @@ -36,7 +38,7 @@ namespace wbt { * | ::BOOL | 2 + Block::NumberOfParameters | 1 | 1 | "ErrorOnMissingPort" | * */ -class wbt::YarpWrite final : public blockfactory::core::Block +class wbt::block::YarpWrite final : public blockfactory::core::Block { private: class impl; diff --git a/toolbox/library/src/CentroidalMomentum.cpp b/toolbox/library/src/CentroidalMomentum.cpp index cec0cc068..55565b606 100644 --- a/toolbox/library/src/CentroidalMomentum.cpp +++ b/toolbox/library/src/CentroidalMomentum.cpp @@ -6,9 +6,9 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "CentroidalMomentum.h" -#include "Base/Configuration.h" -#include "Base/RobotInterface.h" +#include "WBToolbox/Block/CentroidalMomentum.h" +#include "WBToolbox/Base/Configuration.h" +#include "WBToolbox/Base/RobotInterface.h" #include #include @@ -20,7 +20,7 @@ #include #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT diff --git a/toolbox/library/src/DiscreteFilter.cpp b/toolbox/library/src/DiscreteFilter.cpp index 02a523d9f..77fdf0dfa 100644 --- a/toolbox/library/src/DiscreteFilter.cpp +++ b/toolbox/library/src/DiscreteFilter.cpp @@ -6,7 +6,7 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "DiscreteFilter.h" +#include "WBToolbox/Block/DiscreteFilter.h" #include #include @@ -21,7 +21,7 @@ #include #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; using namespace iCub::ctrl; using namespace yarp::sig; diff --git a/toolbox/library/src/DotJNu.cpp b/toolbox/library/src/DotJNu.cpp index 52ed774d1..04ff41bcd 100644 --- a/toolbox/library/src/DotJNu.cpp +++ b/toolbox/library/src/DotJNu.cpp @@ -6,9 +6,9 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "DotJNu.h" -#include "Base/Configuration.h" -#include "Base/RobotInterface.h" +#include "WBToolbox/Block/DotJNu.h" +#include "WBToolbox/Base/Configuration.h" +#include "WBToolbox/Base/RobotInterface.h" #include #include @@ -24,7 +24,7 @@ #include #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT @@ -32,7 +32,7 @@ using namespace blockfactory::core; enum ParamIndex { - Bias = WBBlock::NumberOfParameters - 1, + Bias = wbt::base::WBBlock::NumberOfParameters - 1, Frame }; diff --git a/toolbox/library/src/Factory.cpp b/toolbox/library/src/Factory.cpp index 7100229cf..9f68a31bd 100644 --- a/toolbox/library/src/Factory.cpp +++ b/toolbox/library/src/Factory.cpp @@ -7,35 +7,35 @@ */ // YARP-dependent blocks -#include "Block/GetLimits.h" -#include "Block/GetMeasurement.h" -#include "Block/RealTimeSynchronizer.h" -#include "Block/SetMotorParameters.h" -#include "Block/SetReferences.h" -#include "Block/SimulatorSynchronizer.h" -#include "Block/YarpClock.h" -#include "Block/YarpRead.h" -#include "Block/YarpWrite.h" +#include "WBToolbox/Block/GetLimits.h" +#include "WBToolbox/Block/GetMeasurement.h" +#include "WBToolbox/Block/RealTimeSynchronizer.h" +#include "WBToolbox/Block/SetMotorParameters.h" +#include "WBToolbox/Block/SetReferences.h" +#include "WBToolbox/Block/SimulatorSynchronizer.h" +#include "WBToolbox/Block/YarpClock.h" +#include "WBToolbox/Block/YarpRead.h" +#include "WBToolbox/Block/YarpWrite.h" // #include "Block/RemoteInverseKinematics.h" // iDyntree-dependent blocks -#include "Block/CentroidalMomentum.h" -#include "Block/DotJNu.h" -#include "Block/ForwardKinematics.h" -#include "Block/InverseDynamics.h" -#include "Block/Jacobian.h" -#include "Block/MassMatrix.h" -#include "Block/RelativeTransform.h" +#include "WBToolbox/Block/CentroidalMomentum.h" +#include "WBToolbox/Block/DotJNu.h" +#include "WBToolbox/Block/ForwardKinematics.h" +#include "WBToolbox/Block/InverseDynamics.h" +#include "WBToolbox/Block/Jacobian.h" +#include "WBToolbox/Block/MassMatrix.h" +#include "WBToolbox/Block/RelativeTransform.h" // iCub-dependent blocks #ifdef WBT_USES_ICUB -#include "Block/DiscreteFilter.h" -#include "Block/MinimumJerkTrajectoryGenerator.h" +#include "WBToolbox/Block/DiscreteFilter.h" +#include "WBToolbox/Block/MinimumJerkTrajectoryGenerator.h" #endif // Other blocks #ifdef WBT_USES_QPOASES -#include "Block/QpOases.h" +#include "WBToolbox/Block/QpOases.h" #endif #ifdef WBT_USES_IPOPT // #include "Block/InverseKinematics.h" @@ -47,37 +47,57 @@ #include "shlibpp/SharedLibraryClassApi.h" // YARP-dependent blocks -SHLIBPP_DEFINE_SHARED_SUBCLASS(GetLimits, wbt::GetLimits, blockfactory::core::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(GetMeasurement, wbt::GetMeasurement, blockfactory::core::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(RealTimeSynchronizer, wbt::RealTimeSynchronizer, blockfactory::core::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(SetMotorParameters, wbt::SetMotorParameters, blockfactory::core::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(SetReferences, wbt::SetReferences, blockfactory::core::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(SimulatorSynchronizer, wbt::SimulatorSynchronizer, blockfactory::core::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(YarpClock, wbt::YarpClock, blockfactory::core::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(YarpRead, wbt::YarpRead, blockfactory::core::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(YarpWrite, wbt::YarpWrite, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(GetLimits, wbt::block::GetLimits, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(GetMeasurement, + wbt::block::GetMeasurement, + blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(RealTimeSynchronizer, + wbt::block::RealTimeSynchronizer, + blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(SetMotorParameters, + wbt::block::SetMotorParameters, + blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(SetReferences, wbt::block::SetReferences, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(SimulatorSynchronizer, + wbt::block::SimulatorSynchronizer, + blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(YarpClock, wbt::block::YarpClock, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(YarpRead, wbt::block::YarpRead, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(YarpWrite, wbt::block::YarpWrite, blockfactory::core::Block) // iDyntree-dependent blocks -SHLIBPP_DEFINE_SHARED_SUBCLASS(CentroidalMomentum, wbt::CentroidalMomentum, blockfactory::core::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(DotJNu, wbt::DotJNu, blockfactory::core::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(ForwardKinematics, wbt::ForwardKinematics, blockfactory::core::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(InverseDynamics, wbt::InverseDynamics, blockfactory::core::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(Jacobian, wbt::Jacobian, blockfactory::core::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(MassMatrix, wbt::MassMatrix, blockfactory::core::Block) -SHLIBPP_DEFINE_SHARED_SUBCLASS(RelativeTransform, wbt::RelativeTransform, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(CentroidalMomentum, + wbt::block::CentroidalMomentum, + blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(DotJNu, wbt::block::DotJNu, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(ForwardKinematics, + wbt::block::ForwardKinematics, + blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(InverseDynamics, + wbt::block::InverseDynamics, + blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(Jacobian, wbt::block::Jacobian, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(MassMatrix, wbt::block::MassMatrix, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(RelativeTransform, + wbt::block::RelativeTransform, + blockfactory::core::Block) // iCub-dependent blocks #ifdef WBT_USES_ICUB -SHLIBPP_DEFINE_SHARED_SUBCLASS(DiscreteFilter, wbt::DiscreteFilter, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(DiscreteFilter, + wbt::block::DiscreteFilter, + blockfactory::core::Block) SHLIBPP_DEFINE_SHARED_SUBCLASS(MinimumJerkTrajectoryGenerator, - wbt::MinimumJerkTrajectoryGenerator, + wbt::block::MinimumJerkTrajectoryGenerator, blockfactory::core::Block) #endif // Other blocks #ifdef WBT_USES_QPOASES -SHLIBPP_DEFINE_SHARED_SUBCLASS(QpOases, wbt::QpOases, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(QpOases, wbt::block::QpOases, blockfactory::core::Block) #endif #ifdef WBT_USES_IPOPT -SHLIBPP_DEFINE_SHARED_SUBCLASS(InverseKinematics, wbt::InverseKinematics, blockfactory::core::Block) +SHLIBPP_DEFINE_SHARED_SUBCLASS(InverseKinematics, + wbt::block::InverseKinematics, + blockfactory::core::Block) #endif diff --git a/toolbox/library/src/ForwardKinematics.cpp b/toolbox/library/src/ForwardKinematics.cpp index 868c75ccf..f86d94c66 100644 --- a/toolbox/library/src/ForwardKinematics.cpp +++ b/toolbox/library/src/ForwardKinematics.cpp @@ -6,9 +6,9 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "ForwardKinematics.h" -#include "Base/Configuration.h" -#include "Base/RobotInterface.h" +#include "WBToolbox/Block/ForwardKinematics.h" +#include "WBToolbox/Base/Configuration.h" +#include "WBToolbox/Base/RobotInterface.h" #include #include @@ -24,7 +24,7 @@ #include #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT @@ -32,7 +32,7 @@ using namespace blockfactory::core; enum ParamIndex { - Bias = WBBlock::NumberOfParameters - 1, + Bias = wbt::base::WBBlock::NumberOfParameters - 1, Frame }; diff --git a/toolbox/library/src/GetLimits.cpp b/toolbox/library/src/GetLimits.cpp index b65ebbdcc..e3922cd09 100644 --- a/toolbox/library/src/GetLimits.cpp +++ b/toolbox/library/src/GetLimits.cpp @@ -6,9 +6,9 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "GetLimits.h" -#include "Base/Configuration.h" -#include "Base/RobotInterface.h" +#include "WBToolbox/Block/GetLimits.h" +#include "WBToolbox/Base/Configuration.h" +#include "WBToolbox/Base/RobotInterface.h" #include #include @@ -27,7 +27,7 @@ #include #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT @@ -35,7 +35,7 @@ using namespace blockfactory::core; enum ParamIndex { - Bias = WBBlock::NumberOfParameters - 1, + Bias = wbt::base::WBBlock::NumberOfParameters - 1, LimitType }; @@ -69,7 +69,7 @@ class GetLimits::impl // BLOCK CLASS // =========== -wbt::GetLimits::GetLimits() +GetLimits::GetLimits() : pImpl{new impl()} {} diff --git a/toolbox/library/src/GetMeasurement.cpp b/toolbox/library/src/GetMeasurement.cpp index d0ad3cbae..0715aa96f 100644 --- a/toolbox/library/src/GetMeasurement.cpp +++ b/toolbox/library/src/GetMeasurement.cpp @@ -6,9 +6,9 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "GetMeasurement.h" -#include "Base/Configuration.h" -#include "Base/RobotInterface.h" +#include "WBToolbox/Block/GetMeasurement.h" +#include "WBToolbox/Base/Configuration.h" +#include "WBToolbox/Base/RobotInterface.h" #include #include @@ -26,7 +26,7 @@ #include #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT @@ -34,7 +34,7 @@ using namespace blockfactory::core; enum ParamIndex { - Bias = WBBlock::NumberOfParameters - 1, + Bias = wbt::base::WBBlock::NumberOfParameters - 1, MeasType }; diff --git a/toolbox/library/src/InverseDynamics.cpp b/toolbox/library/src/InverseDynamics.cpp index f5104e142..d618a6bb3 100644 --- a/toolbox/library/src/InverseDynamics.cpp +++ b/toolbox/library/src/InverseDynamics.cpp @@ -6,9 +6,9 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "InverseDynamics.h" -#include "Base/Configuration.h" -#include "Base/RobotInterface.h" +#include "WBToolbox/Block/InverseDynamics.h" +#include "WBToolbox/Base/Configuration.h" +#include "WBToolbox/Base/RobotInterface.h" #include #include @@ -27,7 +27,7 @@ #include #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT diff --git a/toolbox/library/src/Jacobian.cpp b/toolbox/library/src/Jacobian.cpp index 4f179fcd4..9dcedba69 100644 --- a/toolbox/library/src/Jacobian.cpp +++ b/toolbox/library/src/Jacobian.cpp @@ -6,9 +6,9 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "Jacobian.h" -#include "Base/Configuration.h" -#include "Base/RobotInterface.h" +#include "WBToolbox/Block/Jacobian.h" +#include "WBToolbox/Base/Configuration.h" +#include "WBToolbox/Base/RobotInterface.h" #include #include @@ -26,7 +26,7 @@ #include #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT @@ -34,7 +34,7 @@ using namespace blockfactory::core; enum ParamIndex { - Bias = WBBlock::NumberOfParameters - 1, + Bias = wbt::base::WBBlock::NumberOfParameters - 1, Frame }; diff --git a/toolbox/library/src/MassMatrix.cpp b/toolbox/library/src/MassMatrix.cpp index 06bc2296d..dbdf5ddbb 100644 --- a/toolbox/library/src/MassMatrix.cpp +++ b/toolbox/library/src/MassMatrix.cpp @@ -6,9 +6,9 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "MassMatrix.h" -#include "Base/Configuration.h" -#include "Base/RobotInterface.h" +#include "WBToolbox/Block/MassMatrix.h" +#include "WBToolbox/Base/Configuration.h" +#include "WBToolbox/Base/RobotInterface.h" #include #include @@ -21,7 +21,7 @@ #include #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT diff --git a/toolbox/library/src/MinimumJerkTrajectoryGenerator.cpp b/toolbox/library/src/MinimumJerkTrajectoryGenerator.cpp index 5b70ed55f..6015d81bf 100644 --- a/toolbox/library/src/MinimumJerkTrajectoryGenerator.cpp +++ b/toolbox/library/src/MinimumJerkTrajectoryGenerator.cpp @@ -6,7 +6,7 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "MinimumJerkTrajectoryGenerator.h" +#include "WBToolbox/Block/MinimumJerkTrajectoryGenerator.h" #include #include @@ -20,7 +20,7 @@ #include #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT diff --git a/toolbox/library/src/QpOases.cpp b/toolbox/library/src/QpOases.cpp index 6981ceaf2..1218e55f9 100644 --- a/toolbox/library/src/QpOases.cpp +++ b/toolbox/library/src/QpOases.cpp @@ -6,7 +6,7 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "QpOases.h" +#include "WBToolbox/Block/QpOases.h" #include #include @@ -19,7 +19,7 @@ #include #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; const unsigned MaxIterations = 100; diff --git a/toolbox/library/src/RealTimeSynchronizer.cpp b/toolbox/library/src/RealTimeSynchronizer.cpp index bf418b90d..35a7a48d0 100644 --- a/toolbox/library/src/RealTimeSynchronizer.cpp +++ b/toolbox/library/src/RealTimeSynchronizer.cpp @@ -6,7 +6,7 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "RealTimeSynchronizer.h" +#include "WBToolbox/Block/RealTimeSynchronizer.h" #include #include @@ -18,7 +18,7 @@ #include #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT diff --git a/toolbox/library/src/RelativeTransform.cpp b/toolbox/library/src/RelativeTransform.cpp index 5423cd6fe..c88ba3088 100644 --- a/toolbox/library/src/RelativeTransform.cpp +++ b/toolbox/library/src/RelativeTransform.cpp @@ -6,9 +6,9 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "RelativeTransform.h" -#include "Base/Configuration.h" -#include "Base/RobotInterface.h" +#include "WBToolbox/Block/RelativeTransform.h" +#include "WBToolbox/Base/Configuration.h" +#include "WBToolbox/Base/RobotInterface.h" #include #include @@ -23,7 +23,7 @@ #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT @@ -31,7 +31,7 @@ using namespace blockfactory::core; enum ParamIndex { - Bias = WBBlock::NumberOfParameters - 1, + Bias = wbt::base::WBBlock::NumberOfParameters - 1, Frame1, Frame2 }; diff --git a/toolbox/library/src/SetMotorParameters.cpp b/toolbox/library/src/SetMotorParameters.cpp index 115303583..55fb4d0b0 100644 --- a/toolbox/library/src/SetMotorParameters.cpp +++ b/toolbox/library/src/SetMotorParameters.cpp @@ -6,9 +6,9 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "Block/SetMotorParameters.h" -#include "Base/Configuration.h" -#include "Base/RobotInterface.h" +#include "WBToolbox/Block/SetMotorParameters.h" +#include "WBToolbox/Base/Configuration.h" +#include "WBToolbox/Base/RobotInterface.h" #include #include @@ -26,7 +26,7 @@ #include #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT @@ -34,7 +34,7 @@ using namespace blockfactory::core; enum ParamIndex { - Bias = WBBlock::NumberOfParameters - 1, + Bias = wbt::base::WBBlock::NumberOfParameters - 1, SetP, SetI, SetD, diff --git a/toolbox/library/src/SetReferences.cpp b/toolbox/library/src/SetReferences.cpp index eb70b8ff5..238d3d370 100644 --- a/toolbox/library/src/SetReferences.cpp +++ b/toolbox/library/src/SetReferences.cpp @@ -6,9 +6,9 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "SetReferences.h" -#include "Base/Configuration.h" -#include "Base/RobotInterface.h" +#include "WBToolbox/Block/SetReferences.h" +#include "WBToolbox/Base/Configuration.h" +#include "WBToolbox/Base/RobotInterface.h" #include #include @@ -29,7 +29,7 @@ #include #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT @@ -37,7 +37,7 @@ using namespace blockfactory::core; enum ParamIndex { - Bias = WBBlock::NumberOfParameters - 1, + Bias = wbt::base::WBBlock::NumberOfParameters - 1, CtrlType, TrajRef }; diff --git a/toolbox/library/src/SimulatorSynchronizer.cpp b/toolbox/library/src/SimulatorSynchronizer.cpp index 0dace278a..ac0c6cc99 100644 --- a/toolbox/library/src/SimulatorSynchronizer.cpp +++ b/toolbox/library/src/SimulatorSynchronizer.cpp @@ -6,7 +6,7 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "SimulatorSynchronizer.h" +#include "WBToolbox/Block/SimulatorSynchronizer.h" #include "ClockServer.h" #include @@ -19,7 +19,7 @@ #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT diff --git a/toolbox/library/src/YarpClock.cpp b/toolbox/library/src/YarpClock.cpp index 3f1b74657..08126c4dd 100644 --- a/toolbox/library/src/YarpClock.cpp +++ b/toolbox/library/src/YarpClock.cpp @@ -6,7 +6,7 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "YarpClock.h" +#include "WBToolbox/Block/YarpClock.h" #include #include @@ -17,7 +17,7 @@ #include #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT diff --git a/toolbox/library/src/YarpRead.cpp b/toolbox/library/src/YarpRead.cpp index 498ad3f63..97d002170 100644 --- a/toolbox/library/src/YarpRead.cpp +++ b/toolbox/library/src/YarpRead.cpp @@ -6,7 +6,7 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "YarpRead.h" +#include "WBToolbox/Block/YarpRead.h" #include #include @@ -26,7 +26,7 @@ #include #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT diff --git a/toolbox/library/src/YarpWrite.cpp b/toolbox/library/src/YarpWrite.cpp index 965815da8..ad7e1fdcf 100644 --- a/toolbox/library/src/YarpWrite.cpp +++ b/toolbox/library/src/YarpWrite.cpp @@ -6,7 +6,7 @@ * GNU Lesser General Public License v2.1 or any later version. */ -#include "YarpWrite.h" +#include "WBToolbox/Block/YarpWrite.h" #include #include @@ -21,7 +21,7 @@ #include #include -using namespace wbt; +using namespace wbt::block; using namespace blockfactory::core; // INDICES: PARAMETERS, INPUTS, OUTPUT From c10d99088ebbd45d7c7a8833a78d8d84804c38eb Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Thu, 6 Dec 2018 17:12:39 +0100 Subject: [PATCH 07/37] Fixed the exposition of WBToolbox dependencies The private ones should not be required by importing the target. --- toolbox/CMakeLists.txt | 9 +-------- toolbox/library/CMakeLists.txt | 6 +++--- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/toolbox/CMakeLists.txt b/toolbox/CMakeLists.txt index 1d94b2b25..f3d723dc3 100644 --- a/toolbox/CMakeLists.txt +++ b/toolbox/CMakeLists.txt @@ -8,18 +8,11 @@ find_package(BlockFactory COMPONENTS BlockFactoryCore REQUIRED) add_subdirectory(base) add_subdirectory(library) -if(WBT_USES_ICUB) - list(APPEND WBTOOLBOX_LIBRARY_PUBLIC_DEPENDS iCub) -endif() -if(WBT_USES_QPOASES) - list(APPEND WBTOOLBOX_LIBRARY_PUBLIC_DEPENDS qpOASES) -endif() - install_basic_package_files(WBToolbox VERSION ${PROJECT_VERSION} COMPATIBILITY AnyNewerVersion EXPORT WBToolboxExport FIRST_TARGET WBToolboxBase - DEPENDENCIES YARP iDynTree ${WBTOOLBOX_LIBRARY_PUBLIC_DEPENDS} BlockFactoryCore + DEPENDENCIES BlockFactoryCore NAMESPACE WBToolbox:: NO_CHECK_REQUIRED_COMPONENTS_MACRO) diff --git a/toolbox/library/CMakeLists.txt b/toolbox/library/CMakeLists.txt index ca1b88aa5..5d5b79a69 100644 --- a/toolbox/library/CMakeLists.txt +++ b/toolbox/library/CMakeLists.txt @@ -192,7 +192,7 @@ target_link_libraries(WBToolboxLibrary PRIVATE BlockFactory::Core shlibpp::shlib if(WBT_USES_ICUB) target_compile_definitions(WBToolboxLibrary PRIVATE "WBT_USES_ICUB") - target_link_libraries(WBToolboxLibrary PUBLIC ctrlLib) + target_link_libraries(WBToolboxLibrary PRIVATE ctrlLib) # Manually include iCub include folders. They are not exported by the linked library. target_include_directories(WBToolboxLibrary PRIVATE ${ctrlLib_INCLUDE_DIRS}) @@ -204,8 +204,8 @@ if(WBT_USES_ICUB) endif() if(WBT_USES_QPOASES) - target_compile_definitions(WBToolboxLibrary PUBLIC "WBT_USES_QPOASES") - target_link_libraries(WBToolboxLibrary PUBLIC ${qpOASES_LIBRARIES}) + target_compile_definitions(WBToolboxLibrary PRIVATE "WBT_USES_QPOASES") + target_link_libraries(WBToolboxLibrary PRIVATE ${qpOASES_LIBRARIES}) # Manually include qpOASES include folders. They are not exported by the linked library. target_include_directories(WBToolboxLibrary PRIVATE ${qpOASES_INCLUDE_DIRS}) From 31e585a9e8974537b545c8dc4512a243ed8160d1 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Mon, 10 Dec 2018 17:09:18 +0100 Subject: [PATCH 08/37] Raise a compilation error on missing symbols in Linux --- CMakeLists.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index a1637dddf..9290073c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,6 +66,16 @@ if(NOT BUILD_SHARED_LIBS) set(CMAKE_POSITION_INDEPENDENT_CODE ON) endif() +# Tweak linker flags in Linux +if(UNIX AND NOT APPLE) + if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") + get_filename_component(LINKER_BIN ${CMAKE_LINKER} NAME) + if(${LINKER_BIN} STREQUAL "ld") + set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--unresolved-symbols=report-all") + endif() + endif() +endif() + # Settings for RPATH if(NOT MSVC) option(WBT_ENABLE_RPATH "Enable RPATH installation" TRUE) From d7f4a6676309a6c4ebf1773bb5a27a8c9a71011b Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Mon, 10 Dec 2018 17:18:36 +0100 Subject: [PATCH 09/37] Updated template for release notes --- doc/release/template.md | 12 ++++-------- doc/release/v5.md | 14 +++++--------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/doc/release/template.md b/doc/release/template.md index 8f2d8da9c..7e065f557 100644 --- a/doc/release/template.md +++ b/doc/release/template.md @@ -6,19 +6,15 @@ ## New Features -### `WBToolboxLibrary` - -### `WBToolboxMex` +### `WBToolboxBase` -### `WBToolboxCoder` +### `WBToolboxLibrary` ## Bug Fixes -### `WBToolboxLibrary` - -### `WBToolboxMex` +### `WBToolboxBase` -### `WBToolboxCoder` +### `WBToolboxLibrary` ## Contributors diff --git a/doc/release/v5.md b/doc/release/v5.md index 8f2d8da9c..0b1538b43 100644 --- a/doc/release/v5.md +++ b/doc/release/v5.md @@ -1,4 +1,4 @@ -# WB-Toolbox (YYYY-MM-DD) Release Notes {[`#vX.Y`](https://github.com/robotology/wb-toolbox/releases/tag/vX.Y)} +# WB-Toolbox (YYYY-MM-DD) Release Notes {[`#v5`](https://github.com/robotology/wb-toolbox/releases/tag/v5)} [Description] @@ -6,19 +6,15 @@ ## New Features -### `WBToolboxLibrary` - -### `WBToolboxMex` +### `WBToolboxBase` -### `WBToolboxCoder` +### `WBToolboxLibrary` ## Bug Fixes -### `WBToolboxLibrary` - -### `WBToolboxMex` +### `WBToolboxBase` -### `WBToolboxCoder` +### `WBToolboxLibrary` ## Contributors From f19d0e04c593bb4d75dcf0bb9215344c43611e6e Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Fri, 21 Dec 2018 20:44:56 +0100 Subject: [PATCH 10/37] Updated Travis CI for using BlockFactory --- .ci/install.sh | 11 +++++++++++ .travis.yml | 29 +++++++++++++++++++++-------- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/.ci/install.sh b/.ci/install.sh index 4aa0efec3..df46b0b55 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -51,3 +51,14 @@ cmake .. \ -DCMAKE_BUILD_TYPE=$TRAVIS_BUILD_TYPE \ -DCMAKE_INSTALL_PREFIX=$DEPS_CACHE cmake --build . --config $TRAVIS_BUILD_TYPE --target install $CMAKE_BUILD_OPTIONS + +# Install BlockFactory +cd $HOME/git +git clone --depth 1 https://github.com/robotology/blockfactory +cd blockfactory +mkdir build && cd build +cmake .. \ + -G"$TRAVIS_CMAKE_GENERATOR" \ + -DCMAKE_BUILD_TYPE=$TRAVIS_BUILD_TYPE \ + -DCMAKE_INSTALL_PREFIX=$DEPS_CACHE +cmake --build . --config $TRAVIS_BUILD_TYPE --target install $CMAKE_BUILD_OPTIONS diff --git a/.travis.yml b/.travis.yml index 6522fa155..66954662b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,11 @@ cache: - $HOME/.ccache - $HOME/Library/Caches/Homebrew +addons: + apt: + packages: + - docker-ce + stages: - test # Default stage with job matrix - osx @@ -49,16 +54,24 @@ before_script: travis_terminate 1 fi - docker pull $DOCKER_IMAGE_NAME - -script: + # Start the container in the background - >- - docker run -it \ - -v $TRAVIS_BUILD_DIR:$TRAVIS_BUILD_DIR \ - -v $HOME/.ccache:$HOME/.ccache \ - -w $TRAVIS_BUILD_DIR \ - --env-file .ci/env-file \ + docker run -it -d \ + --name ci \ + -v "$TRAVIS_BUILD_DIR:$TRAVIS_BUILD_DIR" \ + -v "$HOME/.ccache:$HOME/.ccache" \ + -w "$TRAVIS_BUILD_DIR" \ + --env-file "$TRAVIS_BUILD_DIR/.ci/env-file" \ $DOCKER_IMAGE_NAME \ - sh .ci/script.sh + bash + # Install BlockFactory + - docker exec -w /tmp ci git clone https://github.com/robotology/blockfactory + - docker exec -w /tmp ci mkdir blockfactory/build + - docker exec -w /tmp/blockfactory/build ci cmake -G"$TRAVIS_CMAKE_GENERATOR" .. + - docker exec -w /tmp/blockfactory/build ci cmake --build . --target install + +script: + - docker exec ci ./.ci/script.sh # ========== # STAGE: osx From 7c8d7820e7d997d8646e2d061d192dac9531c06a Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Fri, 21 Dec 2018 22:00:28 +0100 Subject: [PATCH 11/37] Minor Travis updates --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 66954662b..d467caefd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ -dist: trusty +dist: xenial language: cpp services: docker @@ -162,7 +162,8 @@ jobs: - &osx_template stage: osx os: osx - osx_image: xcode9.3 + osx_image: xcode10.1 + services: before_install: skip install: *osx_install before_script: skip From b85c859d20c72ca0665441a3110586a3f22a1080 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Sat, 22 Dec 2018 11:17:18 +0100 Subject: [PATCH 12/37] Use addon for installing osx deps in Travis Created also the before_install step for osx. If this step is missing, homebrew addons do not work. --- .travis.yml | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index d467caefd..4277da881 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,9 +13,18 @@ addons: apt: packages: - docker-ce + homebrew: + update: true + packages: + - ccache + - eigen + - ace + - tinyxml + - gsl stages: - - test # Default stage with job matrix + # Default stage with job matrix + - test - osx - deploy @@ -78,17 +87,16 @@ script: # ========== stage_osx: + before_install: &osx_before_install + # Setup ccache + - export PATH="/usr/local/opt/ccache/libexec:$PATH" install: &osx_install # Setup the dependencies folder - export DEPS_CACHE=$HOME/deps - export PATH=$PATH:$DEPS_CACHE/bin - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DEPS_CACHE/lib - export CMAKE_PREFIX_PATH=$CMAKE_PREFIX_PATH:$DEPS_CACHE - # Setup ccache - - brew install ccache - - export PATH="/usr/local/opt/ccache/libexec:$PATH" # Install dependencies - - brew install eigen ace tinyxml gsl - cd $TRAVIS_BUILD_DIR/.ci - ./install.sh || travis_terminate 1 script: &osx_script @@ -164,13 +172,14 @@ jobs: os: osx osx_image: xcode10.1 services: - before_install: skip + before_install: *osx_before_install install: *osx_install before_script: skip script: *osx_script after_failure: skip after_success: skip after_script: skip + compiler: env: TRAVIS_CMAKE_GENERATOR="Xcode" TRAVIS_BUILD_TYPE="Debug" From 4302fb3e01b90132ece16098a5c117e55b1e501a Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Thu, 17 Jan 2019 17:47:45 +0100 Subject: [PATCH 13/37] Updated release template --- doc/release/template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/release/template.md b/doc/release/template.md index 7e065f557..a39f578e8 100644 --- a/doc/release/template.md +++ b/doc/release/template.md @@ -1,4 +1,4 @@ -# WB-Toolbox (YYYY-MM-DD) Release Notes {[`#vX.Y`](https://github.com/robotology/wb-toolbox/releases/tag/vX.Y)} +# Whole-Body Toolbox (YYYY-MM-DD) Release Notes {[`#vX.Y`](https://github.com/robotology/wb-toolbox/releases/tag/vX.Y)} [Description] From c899f6c28719b7384f81b6510a3fc2e7455dd224 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Thu, 17 Jan 2019 17:48:32 +0100 Subject: [PATCH 14/37] Updated website and README files --- README.md | 28 +- doc/doxygen/index.md | 14 +- doc/mkdocs/data/about.md | 6 +- doc/mkdocs/data/create_new_block.md | 76 --- doc/mkdocs/data/create_new_library.md | 647 ----------------------- doc/mkdocs/data/getting-started.md | 18 - doc/mkdocs/data/index.md | 27 +- doc/mkdocs/data/install.md | 72 ++- doc/mkdocs/data/license.md | 2 +- doc/mkdocs/data/sim_tricks.md | 31 -- doc/mkdocs/data/simulink_basic.md | 2 + doc/mkdocs/data/simulink_gazebo.md | 2 + doc/mkdocs/data/simulink_model_blocks.md | 2 + doc/mkdocs/data/troubleshooting.md | 22 - doc/mkdocs/data/tutorial_introduction.md | 2 + doc/mkdocs/mkdocs.yml | 16 +- 16 files changed, 103 insertions(+), 864 deletions(-) delete mode 100644 doc/mkdocs/data/create_new_block.md delete mode 100644 doc/mkdocs/data/create_new_library.md delete mode 100644 doc/mkdocs/data/getting-started.md delete mode 100644 doc/mkdocs/data/sim_tricks.md create mode 100644 doc/mkdocs/data/simulink_basic.md create mode 100644 doc/mkdocs/data/simulink_gazebo.md create mode 100644 doc/mkdocs/data/simulink_model_blocks.md create mode 100644 doc/mkdocs/data/tutorial_introduction.md diff --git a/README.md b/README.md index 87b258b2a..7dda9ded2 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,7 @@ -# Whole Body Toolbox +# Whole-Body Toolbox -[![Build Status (Linux/macOS) (master)](https://img.shields.io/travis/robotology/wb-toolbox/master.svg?logo=travis&label=master)](https://travis-ci.org/robotology/wb-toolbox) -[![Build Status (Linux/macOS) (devel)](https://img.shields.io/travis/robotology/wb-toolbox/devel.svg?logo=travis&label=devel)](https://travis-ci.org/robotology/wb-toolbox) -[![Build status (Windows) (master)](https://img.shields.io/appveyor/ci/robotology/wb-toolbox/master.svg?logo=appveyor&label=master)](https://ci.appveyor.com/project/robotology/wb-toolbox) -[![Build status (Windows) (devel)](https://img.shields.io/appveyor/ci/robotology/wb-toolbox/devel.svg?logo=appveyor&label=devel)](https://ci.appveyor.com/project/robotology/wb-toolbox) +[![Build Status (master)](https://img.shields.io/travis/robotology/wb-toolbox/master.svg?logo=travis&label=master)](https://travis-ci.org/robotology/wb-toolbox) +[![Build Status (devel)](https://img.shields.io/travis/robotology/wb-toolbox/devel.svg?logo=travis&label=devel)](https://travis-ci.org/robotology/wb-toolbox) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/1c726331d58b4a1ebfba1c25d15f00ad)](https://www.codacy.com/app/diegoferigo/wb-toolbox?utm_source=github.com&utm_medium=referral&utm_content=robotology/wb-toolbox&utm_campaign=Badge_Grade) [![License](https://img.shields.io/badge/license-LGPL-19c2d8.svg)](https://github.com/robotology/wb-toolbox/blob/master/LICENSE.LGPL2) @@ -12,28 +10,24 @@ [![GitPitch](https://gitpitch.com/assets/badge.svg)](https://gitpitch.com/robotology/wb-toolbox/master?p=.presentations/WBToolbox2) -### A Simulink Toolbox for Whole Body Control +### A Simulink Toolbox for Whole-Body Control -This toolbox allows non-programming experts and researchers approaching _Whole Body Control_ to more easily develop controllers on either simulated or real `YARP`-based robotic platforms.
+This toolbox allows non-programming experts and researchers approaching _Whole-Body Control_ to more easily develop controllers on either simulated or real `YARP`-based robotic platforms.
Develop to deployment time is minimized by exploiting the rich variety of Simulink's toolboxes and its capabilities on rapid prototyping and visual debugging. -Visit the [WB-Toolbox Website](https://robotology.github.io/wb-toolbox/) for more informations. +`WBT` is based on the dataflow framework [`blockfactory`](https://github.com/robotology/blockfactory). Visit the [Whole-Body Toolbox Website](https://robotology.github.io/wb-toolbox/) for more information. -### +## Who uses `WBT` -![](http://drive.google.com/uc?export=view&id=0B6zDGh11iY6oc0gtM0lMdDNweWM) +`WBT` is used extensively in the controllers stored in [robotology/whole-body-controllers](https://github.com/robotology/whole-body-controllers). -## Who use `WB-Toolbox` - -`WB-Toolbox` is used extensively in the controllers stored in [robotology-playground/whole-body-controllers](https://github.com/robotology-playground/whole-body-controllers). - -This video shows the latest results on the iCub robot achieved in the EU project CoDyCo in which a top level controller implemented with the `WB-Toolbox` achieves a running `100 Hz` rate. +This video shows the latest results on the iCub robot achieved in the EU project CoDyCo in which a top level controller implemented with the `WBT` achieves a running `100 Hz` rate. [![IMAGE ALT TEXT](http://img.youtube.com/vi/VrPBSSQEr3A/0.jpg)](https://youtu.be/UXU3KSa201o "iCub balancing on one foot via external force control and interacting with humans") ### Citing this work -Please cite the following publication if you are using WB-Toolbox for your own research and/or robot controllers: +Please cite the following publication if you are using Whole-Body Toolbox for your own research and/or robot controllers: > Romano F., Traversaro S., Pucci D., Nori F.
> **A Whole-Body Software Abstraction layer for Control Design of free-floating Mechanical Systems**
@@ -52,7 +46,7 @@ year={2017}, ### Acknowledgments -The development of WB-Toolbox is supported by: +The development of Whole-Body Toolbox is supported by: - FP7 EU projects CoDyCo (No. 600716 ICT 2011.2.1 Cognitive Systems and Robotics) - H2020 EU projects AnDy (No. 731540 H2020-ICT-2016-1) diff --git a/doc/doxygen/index.md b/doc/doxygen/index.md index e77019b31..198cda0b1 100644 --- a/doc/doxygen/index.md +++ b/doc/doxygen/index.md @@ -2,20 +2,20 @@ ### A Simulink Toolbox for Whole Body Control -> This toolbox allows non-programming experts and researchers approaching _Whole Body Control_ to more easily develop controllers on either simulated or real `YARP`-based robotic platforms.
+> This toolbox allows non-programming experts and researchers approaching _Whole-Body Control_ to more easily develop controllers on either simulated or real `YARP`-based robotic platforms.
> Develop to deployment time is minimized by exploiting the rich variety of Simulink's toolboxes and its capabilities on rapid prototyping and visual debugging. -Visit the [WB-Toolbox Website](https://robotology.github.io/wb-toolbox/) for more informations. +`WBT` is based on the dataflow framework [`blockfactory`](https://github.com/robotology/blockfactory). Visit the [Whole-Body Toolbox Website](https://robotology.github.io/wb-toolbox/) for more information. -## Who use `WB-Toolbox` +## Who uses `WBT` -`WB-Toolbox` is used extensively in the controllers stored in [robotology-playground/whole-body-controllers](https://github.com/robotology-playground/whole-body-controllers). +`WBT` is used extensively in the controllers stored in [robotology/whole-body-controllers](https://github.com/robotology/whole-body-controllers). -[This video](https://youtu.be/UXU3KSa201o) shows the latest results on the iCub robot achieved in the EU project CoDyCo in which a top level controller implemented with the `WB-Toolbox` achieves a running `100 Hz` rate. +[This video](https://youtu.be/UXU3KSa201o) shows the latest results on the iCub robot achieved in the EU project CoDyCo in which a top level controller implemented with the `WBT` achieves a running `100 Hz` rate. ### Citing this work -Please cite the following publication if you are using WB-Toolbox for your own research and/or robot controllers: +Please cite the following publication if you are using Whole-Body Toolbox for your own research and/or robot controllers: > Romano F., Traversaro S., Pucci D., Nori F.
> **A Whole-Body Software Abstraction layer for Control Design of free-floating Mechanical Systems**
@@ -32,7 +32,7 @@ Bibtex citation: ### Acknowledgments -The development of WB-Toolbox is supported by: +The development of Whole-Body Toolbox is supported by: - FP7 EU projects CoDyCo (No. 600716 ICT 2011.2.1 Cognitive Systems and Robotics) - H2020 EU projects AnDy (No. 731540 H2020-ICT-2016-1) diff --git a/doc/mkdocs/data/about.md b/doc/mkdocs/data/about.md index 003879562..983513b0c 100644 --- a/doc/mkdocs/data/about.md +++ b/doc/mkdocs/data/about.md @@ -1,8 +1,8 @@ -`WB-Toolbox` has been developed in the [Dynamic Interaction Control](https://www.iit.it/research/lines/dynamic-interaction-control) research line at the [Italian Institute of Technology](https://www.iit.it). +`WBT` has been developed in the [Dynamic Interaction Control](https://www.iit.it/research/lines/dynamic-interaction-control) research line at the [Italian Institute of Technology](https://www.iit.it). It was born from the ashes of @robotology-playground/WBI-Toolbox. -It is used extensively for controllers stored in @robotology-playground/whole-body-controllers. +It is used extensively for controllers stored in @robotology/whole-body-controllers. ### Maintainer @@ -21,7 +21,7 @@ In alphabetical order: ## Acknowledgments -The development of `WB-Toolbox` is supported by: +The development of `WBT` is supported by: - FP7 EU projects CoDyCo (No. 600716 ICT 2011.2.1 Cognitive Systems and Robotics) - H2020 EU projects AnDy (No. 731540 H2020-ICT-2016-1) diff --git a/doc/mkdocs/data/create_new_block.md b/doc/mkdocs/data/create_new_block.md deleted file mode 100644 index f84f498b4..000000000 --- a/doc/mkdocs/data/create_new_block.md +++ /dev/null @@ -1,76 +0,0 @@ -!!! warning - These information are outdated. The need to be ported to `WB-Toolbox 3`. - -The following steps are necessary in order to add additional blocks to the Library. - -## C++ - -### Generic Block -- Inherit from `Block` class -- Implement the `numberOfParameters()` function returning the number of parameters your block takes -- If the parameter is tunable (i.e. it can be changed during the simulation) implement `parameterAtIndexIsTunable`: by default parameters are not tunable -- Implement the `configureSizeAndPorts` method to properly set the number and type of input and output ports -- Implement the `initialize` method to perform any initialization your block requires -- Implement the `finilize` method to cleanup any resources your block requested in the `initialize` method -- Implement the `output`method to perform the actual operations - -You can access the block parameters by using the usual mex C functions. **NOTE** your parameters are 1-based numbered, **NOT** 0-based. So the first parameter is at index 1, etc... - -### WBI-based Block -If you need to implement a WBI-based block it is highly advisable that you inherit from `WBIBlock` class. -This base class already implements a lot of functionalities and it is highly probable you need to just implement the `output` function. - -The `WBIBlock` base class already provide you the following features: - -- The number of parameters is already set to `4` (`robot name`, `model name`, `wbi filename`, `wbi joint list`) and they are correctly parsed. -- An instance of the `Yarp WholeBody interface` is configured, initialized, and properly released in the `finilize` method. -- The Yarp network properly initialized and terminated. -- You can obtain a reference to the singleton WB Interface wrapper by calling the static method `WBInterface::sharedInstance`. - -**Note** Additional parameters you specify starts from the index `5`. - -### Notes on implementation - -- During `configureSizeAndPorts` you should not allocate any memory or save any data because the object will not persist after the method call. The correct place is the `initialize` method. -- Every function takes as last parameter an `Error` object. It can be `NULL`, so check before dereferencing the pointer. - -## Final steps - -Independently of the type of block you implemented some more steps are required to properly add the block. - -### CMake - -You can use the macro provided by this project: - -```cmake -configure_block(BLOCK_NAME ${HUMAN_READABLE_DESCRIPTION} - LIST_PREFIX WBT - SOURCES ${CPP_FILES} - HEADERS ${HEADER_FILES}) -``` - -where - - - `${HUMAN_READABLE_DESCRIPTION}` is a string used in the group folder (for projects which support it), - - `${CPP_FILES}` is a list of `.cpp` files needed by your block - - `${HEADER_FILES}` is a list of `.h` files needed by your block - -### Block Factory - -- Add you main header to the `toolbox.h` file -- Add the code needed for the creation of your class in `factory.cpp`, `Block::instantiateBlockWithClassName` method. The string passed as argument is the one you specify in the S-Function block in Simulink (see next section) - -## Simulink - -- Add an S-Function block -- Specify as s-function name `WB-Toolbox` -- Add the parameters: - - The first parameter is the name of the class, e.g. `YarpRead` - - If you are creating a WBI-based block you have to specify 4 additional parameters: `robot name`, `model name`, `YarpWBI configuration file`, `YarpWBI Joint list` - - Add any additional parameter required by your block -- Create a Subsystem and add a Mask to it - -**Note** you should use variables for the S-Function parameters and you should specify them in the mask parameters. -**Note** you can also supply default values for the variables by adding code in the `Block->Properties->Callbacks->Init` - -You can skip most of the aforementioned steps by duplicating an already existing block. Just be sure you are duplicating it and not creating an alias. diff --git a/doc/mkdocs/data/create_new_library.md b/doc/mkdocs/data/create_new_library.md deleted file mode 100644 index 6f3e1bdcb..000000000 --- a/doc/mkdocs/data/create_new_library.md +++ /dev/null @@ -1,647 +0,0 @@ -# Tutorial: How to create a new library - -This guide describes how to use the core infrastructure of the Whole Body Toolbox for creating a new toolbox **Toolbox Example**. It will contain a single block _Signal math_ with the following specifications: - -- Accepts two input signals -- Performs element-wise operations: sum, subtraction, multiplication -- Allows to select the operation with a user friendly GUI (mask) -- Produces an output signal with the result of the operation - -Despite it is a very trivial example, it shows how to structure both the C++ and the Matlab components of a toolbox. From this starting point is then possible to build more complex architectures which might need e.g. to be split in many parts or to link against third-party libraries. - -!!! example "Toolbox Example project" - You can find the files of this example in the [`example`](https://github.com/robotology/wb-toolbox/tree/master/example) folder. - -!!! info - Until `v4` this core machinery is shipped together with our robotics framework. We're currently working on splitting the toolbox components for providing a standalone process. Stay tuned for upcoming news! - -## Introduction - -Before jumping in the example of this tutorial, in this section you will find helpful information useful to grasp the key ideas about the toolbox and a refreshing of common terms and patterns used in programming. - -### Algorithm specifications - -The execution of a generic algorithm can be split in the following basic phases: - -1. Configuration -2. Initialization -3. Step -4. Termination - -In the configuration phase the algorithm can, for instance, read parameters and specify details about its inputs and outputs. During the initialization it might need to allocate resources. When everything is ready, the simulation starts and on every cycle of the loop the algorithm computes a step. Before finishing the simulation, in the termination step the resources that are not anymore needed can be deallocated and final operations can be executed. - -### Terminology - -There are few key components which are part of the core infrastructure, and it is important they are clear from the very beginning. - -!!! note - This project has strong roots with Simulink. Despite it is not anymore strictly related to it, the structure keeps as inheritance its terminology. - -#### Block - -The Block is the main component of the toolbox. You may think of it as a wrapper for a generic algorithm. It provides support of all the phases discussed above. - -#### Port - -Blocks need to interface with the outside for reading input data and writing their results. Ports are attached to the Block and let data flow in and out from it. They have properties like the accepted data type and they are characterized by a size. - -#### Signal - -A Signal is the generalization of a buffer. It can be plugged to multiple Ports and allows sharing data between them. Similarly to Ports, a Signal has a data type and a width. When a Signal is connected to a Port, their dimension must match. - -#### Engine - -The engine is the framework that calls and executes the code implementing the Blocks. We currently provide support for Simulink and Simulink Coder. Alternative engines might be Scilab or even standalone C++ code. - -#### BlockInformation - -BlockInformation is the interface between a Block and the engine that executes its code. Despite blocks are not aware of what engine is executing them, blocks and engine need to exchange information such as user parameters and Port data. BlockInformation provides methods for setting and getting this piece of information. - -#### Simulink Block - -A Simulink Block is the wrapper of a (C++) Block. It provides a visual representation of it, with input and output ports and gives the possibility to connect it with other Simulink blocks through signals. The terms above come from this representation and map it to C++. - -#### Simulink Model - -A Simulink Model is a project composed of a set of Simulink Blocks interconnected by Signals. - -#### Simulink Library - -A Simulink Library is a container of a set of Blocks that populates the _Simulink Library Browser_. Every toolbox must be shipped with an associated Simulink Library file in order to expose its Blocks. - -#### S-Function - -There are many types of functions for implementing an algorithm wrapped by a Simulink Block. In Matlab terminology, these functions are referred as [S-Functions](https://it.mathworks.com/help/simulink/sfg/what-is-an-s-function.html). You can read more about the supported types in [What type of S-Function should you use](https://it.mathworks.com/help/simulink/sfg/what-type-of-s-function-should-you-use.html). - -In short S-Functions provide a sort of interface (through C callbacks) where a given number of functions need to be implemented. Simulink knows the name of these functions and calls them on demand. - -#### Block Mask - -A Simulink Block is just a square with input and output ports. It is possible to "mask" a Simulink Block in order to provide a user-friendly GUI that can be useful e.g. for setting Block parameters. The mask may contain buttons, sliders, check boxes, dropdown menus, etc. - -#### Software library - -A library is a file containing compiled code (functions, classes, etc.) which cannot be executed standalone. It can be either _static_ or _dynamic_. Static libraries are meant to be embedded inside the executable that calls their symbols, instead the code of dynamic libraries (also called shared libraries) is only referenced inside the executable and called when needed. - -For grasping better this difference, if multiple executables link against the same static library, the same code is embedded inside all of them, resulting in bigger executables and code duplication. A dynamic library object instead can be shared by multiple executables that need only to know their location in the filesystem and which symbols they provide. - -!!! info - You can find more detailed information about software libraries and linkers at [this link](https://www.lurklurk.org/linkers/linkers.html). - -#### Plugin Library - -A plugin library is a particular type of a dynamic library. An executable can load dynamic libraries either at load time, i.e. when the executable is launched, or at run time, i.e. when needed during the execution. The libraries that can be loaded during run time are referred as plugins. - -!!! info - On UNIX systems the load the a plugin is executed by a `dlopen` - -### Overview of Simulink execution - -The core of the WB-Toolbox provides a framework capable of loading during runtime shared libraries. When the Simulink simulation starts, its engine assigns a deterministic order to the blocks of the Simulink Model. If one of these blocks is not contained in the system toolboxes, it needs to be associated to a _S-Function_ that implements its logic. The toolbox provides a streamlined approach to implement these functions without the need of being an expert of the complex Simulink APIs. - -The blocks of our library are implemented in Simulink using the following _S-Function_ block: - -![EmptySFunctionBlock](images/EmptySFunctionBlock.png) - -What you need to know for the time being is that the name of the plugin library generated from the C++ code will be stored in the _S-function parameters_ field. We provide a generic **Level-2 MEX S-Function** that reads this parameter and uses the library name name to dynamically load the dynamic shared library that contains the block's code. - -After the library is found in the filesystem and successfully loaded, Simulink allocates an object of the C++ class associated to the block functionality. Again, this information (the class name) is passed in the _S-function parameters_ field. - -## Develop the C++ plugin - -You already learned that Blocks are no more than regular C++ classes. They are not an exception, in fact all the components discussed until now are mapped to C++ classes or interfaces ([abstract classes](https://en.cppreference.com/w/cpp/language/abstract_class)). - -The following resources provide further information about them: - -- Blocks are implementations of the [`wbt::Block`](https://robotology.github.io/wb-toolbox/doxygen/classwbt_1_1_block.html) interface -- BlockInformation is defined in the [`wbt::BlockInformation`](https://robotology.github.io/wb-toolbox/doxygen/classwbt_1_1_block_information.html) interface -- Signals are mapped to the [`wbt::Signal`](https://robotology.github.io/wb-toolbox/doxygen/classwbt_1_1_signal.html) class -- Blocks parameters are mapped to the [`wbt::Parameter`](https://robotology.github.io/wb-toolbox/doxygen/classwbt_1_1_parameter.html) class - -We need the following folder structure for the C++ project. Create already the empty files so the project can compile from the very first attempt. - -``` -. -├── CMakeLists.txt -├── include -│   └── SignalMath.h -└── src - ├── Factory.cpp - └── SignalMath.cpp -``` - -!!! info - All the path of this tutorial will be relative to the root folder of the project. This means that if the directory tree above is stored in `/home/foo/tutorial`, when you read to go the `./build` directory it means `/home/foo/tutorial/build`. - -!!! tip - Bear in mind that this C++ class is independent from Simulink. Potentially, it can be called by a standalone C++ executable. - -!!! tip - It is not mandatory to implement a new class for every Simulink Block. If they share a lot of code, a single class can be referenced by multiple Simulink Blocks and its behavior can be selected using parameters. - -### CMake project for compiling the library - -You are free to use your favorite tool for compiling the project. We recommend CMake. If you are not an expert user of this tool, just follow the steps. The comments in the file should be enough to understand what it is happening. - -Fill the file `CMakeLists.txt` with the following content: - -```cmake -cmake_minimum_required(VERSION 3.5) -project(ExampleToolbox LANGUAGES CXX VERSION 0.1) - -# C++ standard -set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -# Export all symbols in Windows -set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) - -# Tweak linker flags in Linux. -# Matlab is very strict on missing symbols and by default ld do not warn if -# something is missing. -if(UNIX AND NOT APPLE) - get_filename_component(LINKER_BIN ${CMAKE_LINKER} NAME) - if(${LINKER_BIN} STREQUAL "ld") - set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--unresolved-symbols=report-all") - endif() -endif() - -# =========== -# C++ LIBRARY -# =========== - -# Find the needed WBToolbox components: -# - ToolboxCore contains the core classes such as Block and Signal -# - ToolboxMex is required at runtime for loading the library from Simulink -find_package(WBToolbox 4 REQUIRED COMPONENTS ToolboxCore ToolboxMex) - -# Find the project for the multiplatform support of plugin libraries. -# It is shipped with WBToolbox and it should be already installed in your system. -find_package(shlibpp REQUIRED) - -# Create the plugin library. This must be a SHARED library. -add_library(ExampleToolbox SHARED - include/SignalMath.h - src/SignalMath.cpp - src/Factory.cpp) - -# Manually set the name of the output library. This is not required and it -# is done only for sake of clarity. -set_target_properties(ExampleToolbox PROPERTIES - OUTPUT_NAME "ExampleToolbox") - -# Link the library with the Core component containing the core classes -# and the target that provides the plugin support -target_link_libraries(ExampleToolbox - WBToolbox::Core shlibpp::shlibpp) - -# Setup the include directories -target_include_directories(ExampleToolbox PUBLIC - $ - $) -``` - -!!! note - If your library needs to link against other libraries, use `find_package` to load their targets and then add them to the `target_link_libraries` directive. - -From the root folder of the project, execute: - -```bash -mkdir build -cd build -cmake .. -cmake --build . -``` - -You should now find in the `./build` directories a new library file, which depending on your OS is: - -- `libExampleToolbox.so` on Linux -- `libExampleToolbox.dylib` on macOS -- `ExampleToolbox.dll` on Windows - -This is the toolbox's plugin library which is loaded during runtime by the Engine. - -### Implement the block logic - -The only _Signal math_ block of our new toolbox will be implemented in a `example::SignalMath` C++ class. - -#### Header - -Here below the `./include/SignalMath.h` header. - -Given the simple logic it should be straightforward to understand. The class inherits from the `wbt::Block` interface and implements some of its methods. - -!!! info - The only mandatory method to implement is the `wbt::Block::output`. By default the other methods are dummy and they always return `true`. - -```cpp -#ifndef EXAMPLE_SIGNALMATH_H -#define EXAMPLE_SIGNALMATH_H - -#include -#include - -#include -#include - -namespace example { - class SignalMath; -} // namespace example - -class example::SignalMath : public wbt::Block -{ -private: - enum class Operation - { - ADDITION, - SUBTRACTION, - MULTIPLICATION, - }; - - Operation m_operation; - -public: - static const std::string ClassName; - - SignalMath() = default; - ~SignalMath() override = default; - - unsigned numberOfParameters() override; - bool parseParameters(wbt::BlockInformation* blockInfo) override; - bool configureSizeAndPorts(wbt::BlockInformation* blockInfo) override; - bool initialize(wbt::BlockInformation* blockInfo) override; - bool output(const wbt::BlockInformation* blockInfo) override; - bool terminate(const wbt::BlockInformation* blockInfo) override; -}; - -#endif // EXAMPLE_SIGNALMATH_H - -``` - -The `./src/SignalMath.cpp` file is more interesting, let's split it in chunks. - -#### Parameters - -If you recall, BlockInformation is used by the Block for interfacing with the Engine. When this code is executed inside Simulink, the [`wbt::SimulinkBlockInformation`](https://robotology.github.io/wb-toolbox/doxygen/classwbt_1_1_simulink_block_information.html) implementation will perform the required operations calling Simulink APIs. - -```cpp -#include "SignalMath.h" - -#include -#include -#include - -using namespace example; - -unsigned SignalMath::numberOfParameters() -{ - // The base wbt::Block class needs parameters (e.g. the ClassName). - // You must specify here how many more parameters this class needs. - // Our example needs just one more: the operation to perform. - return Block::numberOfParameters() + 1; -} - -// This method should let BlockInformation know the parameters metadata -bool SignalMath::parseParameters(wbt::BlockInformation* blockInfo) -{ - // Initialize information for our only parameter - int rows = 1; - int cols = 1; - std::string name = "Operation"; // This label is used to access the param later - unsigned index = Block::numberOfParameters(); // Indices start from 0 - wbt::ParameterType type = wbt::ParameterType::STRING; - - // Create the parameter - wbt::ParameterMetadata parameterMetadata(type, index, rows, cols, name); - - // Add the parameter metadata into the BlockInformation - if (!blockInfo->addParameterMetadata(parameterMetadata)) { - wbtError << "Failed to store parameter metadata"; - return false; - } - - // Ask to the BlockInformation interface to parse the parameters and store them into - // the m_parameters variable. This variable is contained in the wbt::Block class. - bool paramParsedOk = blockInfo->parseParameters(m_parameters); - - // Return the outcome of the parameter parsing. - // If the parsing fails, the execution stops. - return paramParsedOk; -} -``` - -#### Configuration - -The configuration of the Block is performed in the following steps: - -1. The base class needs to be configured. It needs some parameters (e.g. the class name and the library name) and this call asks the Engine to parse them. -2. The ports of the Block need to be defined. In this example the size is set as dynamic so that it accepts signals with any width. -3. The [`wbt::BlockInformation::IOData`](https://robotology.github.io/wb-toolbox/doxygen/structwbt_1_1_block_information_1_1_i_o_data.html) class is used to store the data of all the ports. It is a `struct` containing two `std::vectors`. -4. The data is then sent to the Engine through the BlockInformation interface. - -!!! info - If needed, parameters can be accessed from this step. Refer to the initialization phase to understand how to gather them. - -!!! warning "Signal size" - Simulink has the support of inheriting the port size from the signal size, though use this feature only when strictly needed. In complex Simulink Models it might be difficult executing this size propagation, and fixing the Port size provides helpful constraints for the Engine. - -!!! danger "Important" - Be careful on memory allocations during this step. A temporary object is created only for configuration means, and then destroyed. All the allocated memory will be hereby deleted. - -```cpp -bool SignalMath::configureSizeAndPorts(wbt::BlockInformation* blockInfo) -{ - // The base wbt::Block class need to be configured - if (!wbt::Block::configureSizeAndPorts(blockInfo)) { - return false; - } - - // Create data about input and output ports. - wbt::BlockInformation::PortData input1; - wbt::BlockInformation::PortData input2; - wbt::BlockInformation::PortData output; - input1 = {/*portIndex=*/0, std::vector{wbt::Signal::DynamicSize}, wbt::DataType::DOUBLE}; - input2 = {/*portIndex=*/1, std::vector{wbt::Signal::DynamicSize}, wbt::DataType::DOUBLE}; - output = {/*portIndex=*/0, std::vector{wbt::Signal::DynamicSize}, wbt::DataType::DOUBLE}; - - // Populate a structure with the overall input / output data - wbt::BlockInformation::IOData ioData; - ioData.input.push_back(input1); - ioData.input.push_back(input2); - ioData.output.push_back(output); - - // Store this data into the BlockInformation - if (!blockInfo->setIOPortsData(ioData)) { - wbtError << "Failed to configure input / output ports"; - return false; - } - - return true; -} -``` - -#### Initialization - -!!! info - Starting from this step, memory persistence is guaranteed. - -In the initialization step, the input parameter that defines the operation is parsed. In this example the parameter is passed as a string. In the header a new `enum class Operation` was defined and here the related private member is properly initialized. Additional checks can be added, i.e. testing that both ports have the same width given that a dynamic size was previously assigned. - -!!! info - In this case there's no need to allocate memory. If your class has buffers to initialize, this is the right time to do it. - -```cpp -bool SignalMath::initialize(wbt::BlockInformation* blockInfo) -{ - // The base wbt::Block class need to be initialized - if (!Block::initialize(blockInfo)) { - return false; - } - - // Parse the parameters - if (!SignalMath::parseParameters(blockInfo)) { - wbtError << "Failed to parse parameters."; - return false; - } - - // Read the Operation parameter and store it as a private member - std::string operation; - if (!m_parameters.getParameter("Operation", operation)) { - wbtError << "Failed to parse Operation parameter"; - return false; - } - - // Check the content of the parameter - if (operation == "Addition") { - m_operation = Operation::ADDITION; - } - else if (operation == "Subtraction") { - m_operation = Operation::SUBTRACTION; - } - else if (operation == "Multiplication") { - m_operation = Operation::MULTIPLICATION; - } - else { - wbtError << "Operation " << operation << " not supported"; - return false; - } - - // Check that the size of the input signals match - if (blockInfo->getInputPortWidth(/*index=*/0) != blockInfo->getInputPortWidth(/*index=*/1)) { - wbtError << "Input signals widths do not match"; - return false; - } - - return true; -} -``` - -#### Output - -The `output` method is where the real algorithm is implemented. The Signals are firstly gathered from the Engine using their index. The classes `wbt::InputSignalPtr` and `wbt::OutputSignalPtr` are particular `typedef` of the [`wbt::Signal`](https://robotology.github.io/wb-toolbox/doxygen/classwbt_1_1_signal.html) class and they have the same methods. In the `for` loop the configured operation is performed and the result stored in the output signal. - -!!! note - Note that input signals are read-only. You can write data only to the output signals objects. - -```cpp -bool SignalMath::output(const wbt::BlockInformation* blockInfo) -{ - // Get the input signals - wbt::InputSignalPtr input1 = blockInfo->getInputPortSignal(/*index=*/0); - wbt::InputSignalPtr input2 = blockInfo->getInputPortSignal(/*index=*/1); - - // Get the output signal - wbt::OutputSignalPtr output = blockInfo->getOutputPortSignal(/*index=*/0); - - // Check the signal validity - if (!input1 || !input2 || !output) { - wbtError << "Signals not valid"; - return false; - } - - // Check the width of the output signal. - // This is recommended for dynamically sized signals. - if (output->getWidth() != input1->getWidth()) { - wbtError << "Output signal has a width of " << output->getWidth() - << " while input signals have a width of " << input1->getWidth(); - return false; - } - - // Perform the given operation - for (unsigned i = 0; i < output->getWidth(); ++i) { - switch (m_operation) { - case Operation::ADDITION: - output->set(i, input1->get(i) + input2->get(i)); - break; - case Operation::SUBTRACTION: - output->set(i, input1->get(i) - input2->get(i)); - break; - case Operation::MULTIPLICATION: - output->set(i, input1->get(i) * input2->get(i)); - break; - } - } - - return true; -} -``` - -#### Terminate - -Given the simplicity of our Block, the `terminate` step is a dummy implementation. This method is reported just for the sake of clarity. It can be omitted since `wbt::Block::terminate` already provides the same dummy implementation. - -```cpp -bool SignalMath::terminate(const wbt::BlockInformation* /*blockInfo*/) -{ - return true; -} -``` - -### Implement the plugin factory - -A plugin library usually contains multiple classes used for multiple Blocks. The `sharedlibpp` tool for plugins requires declaring what classes are part of the plugin. This operation is done in the `./include/Factory.cpp` file: - -```cpp -#include "SignalMath.h" - -// Class factory API -#include - -// Add the example::SignalMath class to the plugin factory -SHLIBPP_DEFINE_SHARED_SUBCLASS(SignalMath, example::SignalMath, wbt::Block); -``` - -The `SHLIBPP_DEFINE_SHARED_SUBCLASS` macro needs the following three arguments: - -- A label used to extract the class from the plugin library -- The class of the block -- The base class of the block - -The only interesting part here is the label. Keep this name in mind because we need to know it later in the Simulink section. - -If everything works as expected, the library is now ready and can be compiled again: - -```bash -cd build -cmake --build . -``` - -!!! tip - Simulink will open this library at the beginning of the simulation loop and it needs to find it from the filesystem. Be sure that the `./build` folder is in the searching path of your dynamic linker. In the supported OSs you should add it to: - - **Linux** `LD_LIBRARY_PATH` - - **macOS** `DYLIB_LIBRARY_PATH` - - **Windows** `Path` - -## Matlab and Simulink - -Once the C++ library is ready, the classes can be wrapped by a Simulink Block. If, as in this case, there's no existing Simulink Library to which the new block can be added, some extra step to create a new one is necessary. - -We're going to store the files discussed in this section in the `./matlab` folder, obtaining at the end the following project structure: - -``` -. -├── CMakeLists.txt -├── include -│   └── SignalMath.h -├── matlab -│   ├── ExampleToolbox.slx -│   ├── Model.mdl -│   └── slblocks.m -└── src -    ├── Factory.cpp -    └── SignalMath.cpp -``` - -- `ExampleToolbox.slx` is the Simulink Library -- `slblocks.m` is a m script necessary for loading external Simulink Libraries into the Simulink Library Browser -- `Model.mdl` is a Simulink Model for testing the Block - -### Create an new Simulink Library - -The first step is creating a new Simulink Library. Open the Simulink Start Page and create a Blank Library. Save it in `./matlab/ExampleToolbox.slx`. - -![NewBlankLibrary](images/NewBlankLibrary.png) - -In order to [populate the Simulink Library Browser](https://it.mathworks.com/help/simulink/ug/adding-libraries-to-the-library-browser.html), you need to create a `slblocks.m` file with the following content: - -```matlab -function blkStruct = slblocks - -Browser.Library = 'ExampleToolbox'; -Browser.Name = 'Example Toolbox'; -Browser.IsFlat = 0; - -blkStruct.Browser = Browser; -``` - -As explained in the [official documentation](https://it.mathworks.com/help/simulink/ug/adding-libraries-to-the-library-browser.html), we also need to modify a property of the library file: - -```matlab ->> set_param('ExampleToolbox','EnableLBRepository','on'); -``` - -If you followed these steps, the new library should be ready. Be sure that the `./matlab` folder is in the Matlab `path`, then open the Simulink Library Browser and press ++f5++. You should now see the empty _Example Toolbox_ entry. - -!!! note - In order to add a folder to the `path`, you can either browse it from the Matlab tree view making it the current folder, or executing `addpath('/path/of/the/folder')`. Find more details at [What Is the MATLAB Search Path?](https://it.mathworks.com/help/matlab/matlab_env/what-is-the-matlab-search-path.html). - -!!! info - Every time you close the library, Matlab locks it. Press the lock icon in the bottom left corner to unlock the library. - -### Add a block - -Open the library and add a new _S-Function_ block with the following parameters: - -![SFunctionBlock](images/SFunctionBlock.png) - -- The _S-function name_ is the name of the generic S-Function that Whole Body Toolbox provides -- The _S-function parameters_ are the parameters passed to the S-Function. The first two are required by `wbt::Block`, and the third one is the parameter of our `example::SignalMath` class: - - `'SignalMath'` is the label we used in `Factory.cpp` - - `'ExampleToolbox'` is the name of the plugin library. It must match the `OUTPUT_NAME` we assigned in `CMakeLists.txt` - - `'Addition'` is the kind of operation we want this block to perform - -Press OK and save the library. If you insert wrong information, like a wrong number of parameters or parameters with a wrong type or content, the `wbtError`s we added in the C++ class should provide more details. - -### Create a test Simulink Model - -Now it's time for finally testing all our work. Create a new _Blank Model_ and populate it with the following blocks: - -![TestSimulinkModel](images/TestSimulinkModel.png) - -Then press the Play icon, and the _Display_ connected to the block output should show the result of the addition. - -### Create a block mask - -The type of the operation is defined as a parameter of the _S-Function_ block. It is not very intuitive changing it in this way. Beyond the effort of changing the string, we should remember exactly what parameters the block accepts. - -This limitation can be overcome masking the block, that means providing a GUI to the block. Right-click the block from the _Example Toolbox_ library and press `Mask > Create Mask`. - -In the `Icon & Ports` tab, fill the `Icon drawing commands` with: - -```matlab -disp('Signal Math') - -port_label('input',1,'Input 1') -port_label('input',2,'Input 2') - -port_label('output',1,'Output') -``` - -Then, in the `Parameters & Dialog` tab, add a `Popup` and fill it obtaining the following status: - -![BlockMask](images/BlockMask.png) - -!!! note - Note that the evaluate attribute has been unchecked. When a Popup is not evaluated, its variable (`operation` in this case) will contain the string of the selected option. Instead, if it is evaluated, it contains a 0-based index. - -Save the library and substitute the new Block in the Simulink Model. You can now select the operation double-clicking the block and changing the popup menu entry. - -![TestSimulinkModelWithMask](images/TestSimulinkModelWithMask.png) - -## Final comments - -Whole Body Toolbox provides great abstraction capabilities for wrapping C and C++ algorithms to Simulink Blocks. You don't need to be a Simulink expert for this kind of operation, all the machinery is hidden under the hood. - -Possibilities are endless. Despite Whole Body Toolbox was originally designed for robotic applications, it is interesting discovering how many new toolboxes can be created on top of it. The `v4` release provides the first experimental support to external usage. The toolbox APIs are already mature and reached an acceptable stability after being developed, tested, and refined for many years. - -We are eager to hear your feedback in order to have a great `v1.0` release of the standalone toolbox core! If you find bugs or want to propose enhancements, please fill a [new Issue](https://github.com/robotology/wb-toolbox/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc). diff --git a/doc/mkdocs/data/getting-started.md b/doc/mkdocs/data/getting-started.md deleted file mode 100644 index 5bf6e655b..000000000 --- a/doc/mkdocs/data/getting-started.md +++ /dev/null @@ -1,18 +0,0 @@ -## Environment variables - -The following environment variables must be specified: - -- `YARP_ROBOT_NAME` -- `YARP_DATA_DIRS` - -!!! tip "Tip: launch Matlab from the command line" - The environment variables stored in the `.bashrc` or `.bash_profile` files are automatically loaded. Store here additional variables if needed. - -!!! tip "Tip: launch Matlab from the desktop launcher" - You can store environment variables from the Matlab command line using the `setenv` function. - -## Creating a model - -Before using or creating a new model keep in mind that `WB-Toolbox` is discrete in principle and your simulation should be discrete as well. By going to `Simulation > Configuration Parameters > Solver` you should change the solver options to `Fixed Step` and use a `discrete (no continuous states)` solver. - -In order to start dragging and dropping blocks from the `WB-Toolbox`, open the _Simulink Library Browser_ and search for `Whole Body Toolbox` in the tree view. diff --git a/doc/mkdocs/data/index.md b/doc/mkdocs/data/index.md index 667edec72..85cd0bf09 100644 --- a/doc/mkdocs/data/index.md +++ b/doc/mkdocs/data/index.md @@ -1,21 +1,26 @@ -# Whole Body Toolbox +# Whole-Body Toolbox +## A Simulink Toolbox for Whole-Body Control -## A Simulink Toolbox for Whole Body Control +[![Build Status (master)](https://img.shields.io/travis/robotology/wb-toolbox/master.svg?logo=travis&label=master)](https://travis-ci.org/robotology/wb-toolbox) +[![Build Status (devel)](https://img.shields.io/travis/robotology/wb-toolbox/devel.svg?logo=travis&label=devel)](https://travis-ci.org/robotology/wb-toolbox) +[![Codacy Badge](https://api.codacy.com/project/badge/Grade/1c726331d58b4a1ebfba1c25d15f00ad)](https://www.codacy.com/app/diegoferigo/wb-toolbox?utm_source=github.com&utm_medium=referral&utm_content=robotology/wb-toolbox&utm_campaign=Badge_Grade) -!!! quote "" - This toolbox allows non-programming experts and researchers approaching _Whole Body Control_ to more easily develop controllers on either simulated or real `YARP`-based robotic platforms.
- Develop to deployment time is minimized by exploiting the rich variety of Simulink's toolboxes and its capabilities on rapid prototyping and visual debugging. - -![](http://drive.google.com/uc?export=view&id=0B6zDGh11iY6oc0gtM0lMdDNweWM) +[![License](https://img.shields.io/badge/license-LGPL-19c2d8.svg)](https://github.com/robotology/wb-toolbox/blob/master/LICENSE.LGPL2) +[![GitHub release](https://img.shields.io/github/release/robotology/wb-toolbox.svg)](https://github.com/robotology/wb-toolbox/releases) +[![GitHub issues](https://img.shields.io/github/issues-raw/robotology/wb-toolbox.svg)](https://github.com/robotology/wb-toolbox/issues) + -[![GitPitch](https://gitpitch.com/assets/badge.svg)](https://gitpitch.com/robotology/WB-Toolbox?grs=github) +!!! quote "" +​ This toolbox allows non-programming experts and researchers approaching _Whole-Body Control_ to more easily develop controllers on either simulated or real `YARP`-based robotic platforms.
+​ Develop to deployment time is minimized by exploiting the rich variety of Simulink's toolboxes and its capabilities on rapid prototyping and visual debugging. +`WBT` is based on the dataflow framework [`blockfactory`](https://github.com/robotology/blockfactory). It mainly wraps functionalities of the [`YARP`](https://github.com/robotology/yarp) middleware and the [`iDynTree`](https://github.com/robotology/idyntree) rigid-body dynamics library, providing an interface compatible with dataflow programming. The `WBT` library can be embedded in any C++ framework and run from all the engines supported by [`blockfactory`](https://github.com/robotology/blockfactory), we mainly use and support Simulink by providing a Simulink Library. -## Who use `WB-Toolbox` +## Who uses `WBT`? -`WB-Toolbox` is used extensively in the controllers stored in @robotology-playground/whole-body-controllers. +`WBT` is used extensively in the controllers stored in @robotology/whole-body-controllers. -This video shows the latest results on the iCub robot achieved in the EU project CoDyCo in which a top level controller implemented with the @robotology/WB-Toolbox achieves a running `100 Hz` rate. +This video shows the latest results on the iCub robot achieved in the EU project CoDyCo in which a top level controller implemented with the @robotology/wb-toolbox achieves a running `100 Hz` rate. [![IMAGE ALT TEXT](http://img.youtube.com/vi/VrPBSSQEr3A/0.jpg)](https://youtu.be/UXU3KSa201o "iCub balancing on one foot via external force control and interacting with humans") diff --git a/doc/mkdocs/data/install.md b/doc/mkdocs/data/install.md index ca8c1546d..05078bce8 100644 --- a/doc/mkdocs/data/install.md +++ b/doc/mkdocs/data/install.md @@ -1,15 +1,17 @@ # Install !!! info "Disclaimer" - `WB-Toolbox` has been widely tested on `Ubuntu 16:04` and `Ubuntu 18.04` with Matlab `R2017b`. If you face any issue either with your OS or Matlab version, please submit an [Issue](https://github.com/robotology/WB-Toolbox/issues). + `WBT` has been widely tested on `Ubuntu 16:04` and `Ubuntu 18.04` with Matlab `R2017b`. If you face any issue either with your OS or Matlab version, please submit an [Issue](https://github.com/robotology/wb-toolbox/issues). ## Requirements -- Matlab 7.1+ and Simulink: tested with Matlab `R2017b`, `R2016b` +- [`blockfactory`](https://github.com/robotology/blockfactory) - [`YARP`](https://github.com/robotology/yarp) compiled as shared library (default behavior) - [`iDynTree`](https://github.com/robotology/idyntree) - [`YCM`](https://github.com/robotology/ycm) -- Supported Operating Systems: Linux, macOS, Windows +- Supported Operating Systems: Linux, macOS, Windows + +### Development requirements ## Optional requirements @@ -17,50 +19,74 @@ - [Gazebo Simulator](http://gazebosim.org/) - [`gazebo_yarp_plugins`](https://github.com/robotology/gazebo_yarp_plugins) - [`qpOASES`](https://github.com/robotology-dependencies/qpOASES/) +- [`matio`](https://github.com/tbeu/matio) +- Matlab 7.1+ and Simulink ## Installation For a simplified installation procedure, jump to [Install using the `robotology-superbuild`](#install-using-the-robotology-superbuild). - !!! warning The following instructions are for Unix-like systems, but they work similarly on other operating systems. ### Dependencies -Install the required and the optional dependencies by following their installation instructions. These instructions need that `YARP`, `iDynTree` and `YCM` packages can be found by `CMake` using `find_package`. +Install the required and the optional dependencies by following their installation instructions. These instructions need that `blockfactory`, `YARP`, `iDynTree` and `YCM` packages can be found by `CMake` using `find_package`. !!! warning - If an optional dependency is not found, the classes depending on it are not compiled. However, in the Simulink Library the block does not disappear. It will just not work, raising an appropriate error. + If an optional dependency is not found, the classes depending on it are not compiled. However, in the Simulink Library the blocks do not disappear. They will just not work, raising an appropriate error. ### Setup Matlab -Make sure that you have MATLAB and Simulink properly installed and running. +Matlab and Simulink are not required to build the `WBT` plugin. However, through [`blockfactory`](https://github.com/robotology/blockfactory) the plugin library shipped in this repository can be loaded inside a Simulink model. `WBT` provides a Simulink Library that exposes all the C++ blocks of the plugin to Simulink, wrapping them in user-friendly masks. + +!!! info + Despite the blocks can be used directly from C++, this usage is not very user friendly. Simulink and alternative visual tools are very convenient solutions to connect blocks together, but nothing prevents using the provided blocks exploiting the `blockfactory` interfaces. From now on, we assume that you want to use Simulink since it is the most common use case. -`CMake` needs to find the Matlab installation folder in order to link the sources against its libraries. Make sure that `CMake` is able to [find your Matlab installation](https://cmake.org/cmake/help/v3.3/module/FindMatlab.html), or manually set the `Matlab_ROOT_DIR` environment variable if needed. +#### For developers -After this, check that the MEX compiler for MATLAB is properly configured and working. You can try compiling some of the MATLAB C code examples as described in the [mex official documentation](https://www.mathworks.com/help/matlab/ref/mex.html). +Developers of `WBT` must have Simulink installed in order to operate on the provided Simulink Library. + +Make sure that `CMake` is able to [find your Matlab installation](https://cmake.org/cmake/help/v3.3/module/FindMatlab.html), or manually set the `Matlab_ROOT_DIR` environment variable if needed. ### Download, build and install If all the dependencies are met, proceed with the following instructions: -```sh -git clone https://github.com/robotology/wb-toolbox.git -mkdir -p wb-toolbox/build && cd wb-toolbox/build -cmake .. -DCMAKE_INSTALL_PREFIX= -cmake --build . --config Release -cmake --build . --config Release --target install -``` +!!! example "Commands" + + Substitute to `` the absolute path where you want to install the project. -!!! note - From now on, this guide refers to your install directory with the variable ``. Every time you see this variable, you should substitute the absolute install path. + ````tab="GNU / Linux and macOS" + git clone https://github.com/robotology/wb-toolbox.git + mkdir -p wb-toolbox/build && cd wb-toolbox/build + cmake .. -DCMAKE_INSTALL_PREFIX= + cmake --build . + cmake --build . --target install + ```` + + ````tab="Windows" + git clone https://github.com/robotology/wb-toolbox.git + mkdir -p wb-toolbox/build && cd wb-toolbox/build + cmake .. -DCMAKE_INSTALL_PREFIX= + cmake --build . --config Release + cmake --build . --config Release --target install + ```` ## Configuration +### Plugin + +In order to use Whole-Body Toolbox, the dynamic loader of the operating system should be able to find the plugin library. Add the folder `/lib` to the following environment variable depending on the OS: + +| GNU / Linux | macOS | Windows | +| ----------------- | ------------------- | ------- | +| `LD_LIBRARY_PATH` | `DYLD_LIBRARY_PATH` | `Path` | + + ### Matlab -In order to use the `WB-Toolbox` in Matlab you have to add some folders to the Matlab path. +In order to use the `WBT` in Matlab you have to add some folders to the Matlab path. If you usually launch Matlab from the command line, exporting the following environment variable should be enough: @@ -75,16 +101,16 @@ addpath(['' /mex]) addpath(genpath(['' /share/WBToolbox])) ``` -We also provide for the latter scenario a persistent configuration of `WB-Toolbox`. After the installation run once the `startup_wbitoolbox.m` script that you can find in the `/share/WBToolbox` directory. It will place a file `pathdef.m` in your `userpath` that loads the right variables to Matlab's environment. Note that this usage assumes that Matlab is always launched from the [`userpath` folder](https://it.mathworks.com/help/matlab/matlab_env/assign-userpath-as-the-startup-folder-on-unix-or-macintosh.html). +We also provide for the latter scenario a persistent configuration of `WBT`. After the installation, run once the `startup_wbitoolbox.m` script that you can find in the `/share/WBToolbox` directory. It will place a file `pathdef.m` in your `userpath` that loads the right variables to Matlab's environment. Note that this usage assumes that Matlab is always launched from the [`userpath` folder](https://it.mathworks.com/help/matlab/matlab_env/assign-userpath-as-the-startup-folder-on-unix-or-macintosh.html). ### Environment -Each robot that can be used through `WB-Toolbox` has its own configuration files. `WB-Toolbox` uses the `YARP`'s [`ResourceFinder`](http://www.yarp.it/yarp_resource_finder_tutorials.html) for finding files in the file system. You should thus follow the related instructions to properly configure your installation (e.g. setting the `YARP_DATA_DIRS` and `YARP_ROBOT_NAME` variables). +Each robot that can be used with `WBT` has its own configuration files. `WBT` uses the `YARP`'s [`ResourceFinder`](http://www.yarp.it/yarp_resource_finder_tutorials.html) for finding files in the file system. You should thus follow the related instructions to properly configure your installation (e.g. setting the `YARP_DATA_DIRS` and `YARP_ROBOT_NAME` variables). ## Install using the `robotology-superbuild` The @robotology/robotology-superbuild provides an easy way for users to setup an environment by downloading, compiling, installing all the projects together. -Follow the [superbuild installation instructions](https://github.com/robotology/robotology-superbuild/#installation) and enable the `ROBOTOLOGY_ENABLE_DYNAMICS` profile. If `WB-Toolbox` is not downloaded and built, check that the `ROBOTOLOGY_USES_MATLAB` is `ON` and the `ROBOTOLOGY_NOT_USE_SIMULINK` is `OFF`. +Follow the [superbuild installation instructions](https://github.com/robotology/robotology-superbuild/#installation) and enable the `ROBOTOLOGY_ENABLE_DYNAMICS` profile. If `WBT` is not downloaded and built, check that `ROBOTOLOGY_USES_MATLAB` is `ON` and `ROBOTOLOGY_NOT_USE_SIMULINK` is `OFF`. -The configuration should be straightforward following the [Configure your environment](https://github.com/robotology/robotology-superbuild/#configure-your-environment) and [Matlab](https://github.com/robotology/robotology-superbuild#matlab) sections. +The configuration of the environment should be straightforward following the [Configure your environment](https://github.com/robotology/robotology-superbuild/#configure-your-environment) and [Matlab](https://github.com/robotology/robotology-superbuild#matlab) sections. diff --git a/doc/mkdocs/data/license.md b/doc/mkdocs/data/license.md index 5b0d3f650..fa0281c1b 100644 --- a/doc/mkdocs/data/license.md +++ b/doc/mkdocs/data/license.md @@ -1,6 +1,6 @@ ### LGPL v2.1 or any later version -Copyright (C) 2018 Istituto Italiano di Tecnologia - iCub Facility +Copyright (C) 2019 Istituto Italiano di Tecnologia - iCub Facility This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/doc/mkdocs/data/sim_tricks.md b/doc/mkdocs/data/sim_tricks.md deleted file mode 100644 index 52b09a061..000000000 --- a/doc/mkdocs/data/sim_tricks.md +++ /dev/null @@ -1,31 +0,0 @@ -!!! warning - These information have not been updated for some while and might be outdated. - -This page contains some tricks (or not so obvious features) needed for creating Blocks in simulink - -### Use of popup mask parameters -If you need to use a popup mask parameter (i.e. a dropdown list) in you block you should notice the following thing: - -- If **EVALUATE** is set to **TRUE** then the variable associated with the parameter will contain the **INDEX** (1-based) of the selection. -- If **EVALUATE** is set to **FALSE** then the variable associated with the parameter will contain the **ACTUAL VALUE** of the selection. - -[Original source](http://www.mathworks.com/matlabcentral/answers/95199-how-can-i-assign-the-actual-value-of-a-selected-popup-to-my-mask-variables-in-simulink-6-6-r2007a) - -### Self-modifiable blocks -If you block needs to modify its options (via matlab callbacks associated with a parameter), e.g. when changing the parameters mask depending on another parameter, or when changing the number of input/outputs, be sure to check (on) the "Mask Editor -> Initialization -> Allow library block to modify its contents" - -![](https://cloud.githubusercontent.com/assets/2189180/11606884/19fd2f5a-9b32-11e5-9f1e-89347a6df895.png) - -### Create a new block -This is more heuristic than the "correct method", but it has been proved to work. - -Create a new Simulink Model and start creating the block. You can also duplicate an existing block from the Library. In this second case be sure to do the following steps: - -- Right click on the block -> Library Link -> Disable Link -- Right click on the block -> Library Link -> Break Link - -At this point finish your work, compile the model and only at this point add the block to the library, so that its aspect will reflect the real one. - -#### Note: -The step of creating the model separately is needed until we find out how to update the aspect of the block directly in the Library. -Further more, this process can hinder the already existing links to the block. diff --git a/doc/mkdocs/data/simulink_basic.md b/doc/mkdocs/data/simulink_basic.md new file mode 100644 index 000000000..49efb36d8 --- /dev/null +++ b/doc/mkdocs/data/simulink_basic.md @@ -0,0 +1,2 @@ +!!! warning + TODO diff --git a/doc/mkdocs/data/simulink_gazebo.md b/doc/mkdocs/data/simulink_gazebo.md new file mode 100644 index 000000000..49efb36d8 --- /dev/null +++ b/doc/mkdocs/data/simulink_gazebo.md @@ -0,0 +1,2 @@ +!!! warning + TODO diff --git a/doc/mkdocs/data/simulink_model_blocks.md b/doc/mkdocs/data/simulink_model_blocks.md new file mode 100644 index 000000000..49efb36d8 --- /dev/null +++ b/doc/mkdocs/data/simulink_model_blocks.md @@ -0,0 +1,2 @@ +!!! warning + TODO diff --git a/doc/mkdocs/data/troubleshooting.md b/doc/mkdocs/data/troubleshooting.md index 3fdfb0e11..a860446bb 100644 --- a/doc/mkdocs/data/troubleshooting.md +++ b/doc/mkdocs/data/troubleshooting.md @@ -16,25 +16,3 @@ The current version on Ubuntu 16:04 is `libstdc++.so.6`, make sure this is the c !!! info Another solution involving the `.matlab7rc.sh` file can be found in https://github.com/robotology/codyco-superbuild/issues/141#issuecomment-257892256. - -## `YARP` not installed in the system default directory - -In case you compiled `YARP` in a directory different from the system default one and you are not using RPATH, you need to tell to MATLAB the location in which to find the shared libraries for `YARP`. If you launch MATLAB from command line, this task is already done for you by `bash` (if you edited `.bashrc`). If you launch MATLAB from the UI (e.g. on macOS by double clicking the application icon) you need to further add the variables in `${MATLAB_ROOT}/bin/.matlab7rc.sh` by first doing - -```bash - chmod +w .matlab7rc.sh -``` - -Then looking for the variable `LDPATH_SUFFIX` and assign to every instance the contents of your `DYLD_LIBRARY_PATH`. Finally do: - -```bash - chmod -w .matlab7rc.sh -``` - -The error message you get in this case might look something like: - -```bash -Library not loaded: libyarpwholeBodyinterface.0.0.1.dylib -Referenced from: -${CODYCO_SUPERBUILD_DIR}/install/mex/robotState.mexmaci64 -``` diff --git a/doc/mkdocs/data/tutorial_introduction.md b/doc/mkdocs/data/tutorial_introduction.md new file mode 100644 index 000000000..49efb36d8 --- /dev/null +++ b/doc/mkdocs/data/tutorial_introduction.md @@ -0,0 +1,2 @@ +!!! warning + TODO diff --git a/doc/mkdocs/mkdocs.yml b/doc/mkdocs/mkdocs.yml index 626597539..68b9c112d 100644 --- a/doc/mkdocs/mkdocs.yml +++ b/doc/mkdocs/mkdocs.yml @@ -1,6 +1,6 @@ # Project information -site_name: 'WB-Toolbox' -site_description: 'A Simulink Toolbox for Whole Body Control' +site_name: 'WBT' +site_description: 'A Simulink Toolbox for Whole-Body Control' site_author: 'Diego Ferigo' # Repository @@ -23,7 +23,7 @@ theme: icon: dashboard # Copyright -copyright: 'Copyright © 2018 Istituto Italiano di Tecnologia - iCub Facility' +copyright: 'Copyright © 2019 Istituto Italiano di Tecnologia - iCub Facility' # Extensions markdown_extensions: @@ -55,14 +55,14 @@ markdown_extensions: nav: - Home: 'index.md' - Install: 'install.md' - - Getting started: 'getting-started.md' - Troubleshooting: 'troubleshooting.md' - Documentation [master]: https://robotology.github.io/wb-toolbox/doxygen/ - Documentation [devel]: https://robotology.github.io/wb-toolbox/devel/doxygen/ - - Developer area: - - "Tutorial: create a new library": 'create_new_library.md' - - Add a new block: 'create_new_block.md' - - Simulink Tricks: 'sim_tricks.md' + - Tutorials: + - Introduction: tutorial_introduction.md + - Basic Simulink simulation: simulink_basic.md + - Use model blocks: simulink_model_blocks.md + - Simulink and Gazebo: simulink_gazebo.md - Migration: - From WBI-Toolbox: 'Migration_from_WBI-Toolbox_1.0.md' - From WB-Toolbox 2.0: 'Migration_from_WB-Toolbox_2.0.md' From 66270146ed2a40eb02d89ecd255ea148224c9415 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Thu, 17 Jan 2019 18:09:25 +0100 Subject: [PATCH 15/37] Use the corresponding branch of the dependencies in Travis --- .ci/install.sh | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.ci/install.sh b/.ci/install.sh index df46b0b55..2ea28f664 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -16,9 +16,7 @@ cmake --build . --target install # Install Yarp cd $HOME/git -#git clone --depth 1 -b $DEPS_BRANCH https://github.com/robotology/yarp.git -echo "Checking out devel. Use master as soon as it will be fixed." -git clone --depth 1 -b devel https://github.com/robotology/yarp.git +git clone --depth 1 -b $DEPS_BRANCH https://github.com/robotology/yarp.git cd yarp mkdir build && cd build cmake .. \ @@ -30,9 +28,7 @@ cmake --build . --config $TRAVIS_BUILD_TYPE --target install # Install icub-main cd $HOME/git -echo "Checking out devel. Use master as soon as it will be fixed." -git clone --depth 1 -b devel https://github.com/robotology/icub-main.git -# git clone --depth 1 -b $DEPS_BRANCH https://github.com/robotology/icub-main.git + git clone --depth 1 -b $DEPS_BRANCH https://github.com/robotology/icub-main.git cd icub-main mkdir build && cd build cmake .. \ From 398c26a7f4a7e1251c347cfc731ea43d44a09921 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Sun, 20 Jan 2019 15:08:41 +0100 Subject: [PATCH 16/37] Updated blockfactory component name Following https://github.com/robotology/blockfactory/pull/20 --- toolbox/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolbox/CMakeLists.txt b/toolbox/CMakeLists.txt index f3d723dc3..0b47a41c5 100644 --- a/toolbox/CMakeLists.txt +++ b/toolbox/CMakeLists.txt @@ -3,7 +3,7 @@ # GNU Lesser General Public License v2.1 or any later version. find_package(shlibpp REQUIRED) -find_package(BlockFactory COMPONENTS BlockFactoryCore REQUIRED) +find_package(BlockFactory COMPONENTS Core REQUIRED) add_subdirectory(base) add_subdirectory(library) From c168dbf4ce772d65b81b42c0177651446abcb72e Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Sun, 20 Jan 2019 15:09:19 +0100 Subject: [PATCH 17/37] Cleanup cmake leftovers --- CMakeLists.txt | 2 +- cmake/AddGeneratedCodeLib.cmake | 110 -------------------------------- 2 files changed, 1 insertion(+), 111 deletions(-) delete mode 100644 cmake/AddGeneratedCodeLib.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 9290073c1..dd50eb221 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,7 +98,7 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}" include(AddInstallRPATHSupport) add_install_rpath_support(BIN_DIRS ${CMAKE_INSTALL_PREFIX}/bin - LIB_DIRS ${CMAKE_INSTALL_PREFIX}/mex ${CMAKE_INSTALL_PREFIX}/lib + ${CMAKE_INSTALL_PREFIX}/lib DEPENDS WBT_ENABLE_RPATH USE_LINK_PATH) diff --git a/cmake/AddGeneratedCodeLib.cmake b/cmake/AddGeneratedCodeLib.cmake deleted file mode 100644 index f03ec7dd7..000000000 --- a/cmake/AddGeneratedCodeLib.cmake +++ /dev/null @@ -1,110 +0,0 @@ -include(CMakeParseArguments) - -macro(add_generated_code_lib) - -# ================================== -# PARSE AND PROCESS MACRO PARAMETERS -# ================================== - -set(_oneValueArgs MODELNAME SOURCE_FOLDER) -set(PREFIX "add_generated_code_lib") -string(TOUPPER ${PREFIX} PREFIX) - -cmake_parse_arguments(${PREFIX} - "${_options}" - "${_oneValueArgs}" - "${_multiValueArgs}" - "${ARGN}") - -# Check if the MODELNAME has been passed -set(SIMULINK_MODELNAME ${${PREFIX}_MODELNAME}) -if(NOT DEFINED ${PREFIX}_MODELNAME OR ${PREFIX}_MODELNAME STREQUAL "") - message(FATAL_ERROR "Model name not passed or empty") -endif() - -# If source folder argument was passed, assume to find here ${SIMULINK_MODELNAME}.cpp file -if(NOT DEFINED ${PREFIX}_SOURCE_FOLDER) - get_filename_component(CPP_ABSPATH ${SIMULINK_MODELNAME}.cpp ABSOLUTE) - if(NOT EXISTS ${CPP_ABSPATH}) - message(FATAL_ERROR "Failed to find ${SIMULINK_MODELNAME}.cpp. Use SOURCE_FOLDER argument \ - if it is not contained in the current directory.") - endif() - set(AUTOGEN_ABSPATH ${CMAKE_CURRENT_SOURCE_DIR}) -else() - get_filename_component(AUTOGEN_ABSPATH ${${PREFIX}_SOURCE_FOLDER} ABSOLUTE) - # Check that the directory exists - if(NOT EXISTS ${AUTOGEN_ABSPATH}) - message(FATAL_ERROR "Passed source directory ${${PREFIX}_SOURCE_FOLDER} does not exist.") - endif() - # Look for the cpp file - if(NOT EXISTS ${AUTOGEN_ABSPATH}/${SIMULINK_MODELNAME}.cpp) - message(FATAL_ERROR "Failed to find ${SIMULINK_MODELNAME}.cpp in ${${PREFIX}_SOURCE_FOLDER} directory.") - endif() -endif() - -# ===================================================== -# FIND DEPENDENCIES FOR BUILDING THE AUTOGENERATED CODE -# ===================================================== - -find_package(WBToolbox 4 REQUIRED - COMPONENTS ToolboxCoder WBToolboxLibrary) - -# ============================================== -# FIND THE defines.txt FILE AND LOAD ITS CONTENT -# ============================================== - -# The folder containing the autogenerated sources should contain a defines.txt file -get_filename_component(CODER_DEFINES_FILE ${AUTOGEN_ABSPATH}/defines.txt ABSOLUTE) -if(EXISTS ${CODER_DEFINES_FILE}) - message(STATUS "Found autogenerated sources for ${SIMULINK_MODELNAME} model.") -else() - message(FATAL_ERROR "Folder ${AUTOGEN_ABSPATH} does not contain defines.txt. It does not look \ - a valid folder containing autogenerated sources.") -endif() - -# Parse the defines exported by Simulink Coder -file(STRINGS ${CODER_DEFINES_FILE} CODER_DEFINES) - -# ============================= -# SETUP THE INCLUDE DIRECTORIES -# ============================= - -# Model includes -set(CODER_INCLUDES "${AUTOGEN_ABSPATH}") - -if(NOT Matlab_ROOT_DIR) - message(FATAL_ERROR "Variable Matlab_ROOT_DIR not found. Call find_package(Matlab) before using this macro") -endif() - -# System includes -set(CODER_INCLUDES_SYSTEM "" - "${Matlab_ROOT_DIR}/extern/include" - "${Matlab_ROOT_DIR}/simulink/include" - "${Matlab_ROOT_DIR}/rtw/c/include" - "${Matlab_ROOT_DIR}/rtw/c/src" - "${Matlab_ROOT_DIR}/rtw/c/src/ext_mode/common" -) - -# ============== -# LIBRARY TARGET -# ============== - -# Simulink Coder Headers -# Here using GLOB is necessary because Simulink generates more or less headers depending -# on the Coder configuration of the model -file(GLOB CODER_HEADERS ${AUTOGEN_ABSPATH}/*.h) - -# Simulink Coder source file -set(CODER_SOURCES "${AUTOGEN_ABSPATH}/${SIMULINK_MODELNAME}.cpp") - -# Set the target name for the autogenerated sources -set(AUTOGEN_LIB "${SIMULINK_MODELNAME}_LIB") - -add_library(${AUTOGEN_LIB} SHARED ${CODER_HEADERS} ${CODER_SOURCES}) - -target_compile_definitions(${AUTOGEN_LIB} PUBLIC ${CODER_DEFINES}) -target_include_directories(${AUTOGEN_LIB} PUBLIC ${CODER_INCLUDES}) -target_include_directories(${AUTOGEN_LIB} SYSTEM PUBLIC ${CODER_INCLUDES_SYSTEM}) -target_link_libraries(${AUTOGEN_LIB} PUBLIC WBToolbox::Coder WBToolbox::Library) - -endmacro() From 067c2ab462331b9ce3e0a58141c03906f3f7cf71 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Sun, 20 Jan 2019 15:45:24 +0100 Subject: [PATCH 18/37] The blockfactory dep is already installed in the docker image After merging https://github.com/robotology/robotology-superbuild/pull/159, the blockfactory dependency is included in the superbuild. This means that installing separately on top of the image is no longer necessary. --- .travis.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4277da881..29888cb08 100644 --- a/.travis.yml +++ b/.travis.yml @@ -73,11 +73,6 @@ before_script: --env-file "$TRAVIS_BUILD_DIR/.ci/env-file" \ $DOCKER_IMAGE_NAME \ bash - # Install BlockFactory - - docker exec -w /tmp ci git clone https://github.com/robotology/blockfactory - - docker exec -w /tmp ci mkdir blockfactory/build - - docker exec -w /tmp/blockfactory/build ci cmake -G"$TRAVIS_CMAKE_GENERATOR" .. - - docker exec -w /tmp/blockfactory/build ci cmake --build . --target install script: - docker exec ci ./.ci/script.sh From 598c0d12653d86a4eda5e4559636b51934bf5a78 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Sun, 20 Jan 2019 17:48:28 +0100 Subject: [PATCH 19/37] Updated CONTRIBUTING New versioning policy New section for the website --- .github/CONTRIBUTING.md | 69 ++++++++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 22 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 6c2bf8c93..2275ab41c 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -2,9 +2,9 @@ First off, thanks for your interest in contributing to this project! :tada: -The following is a set of guidelines for contributing to WB-Toolbox. This project is developed at the Italian Institute of Technology and it is part of our [robotology](https://github.com/robotology) organization. +The following is a set of guidelines for contributing to Whole-Body Toolbox. This project is developed at the Italian Institute of Technology and it is part of our [robotology](https://github.com/robotology) organization. -Keep in mind that the following are mostly guidelines, not strict rules. Use your best judgement and feel free to propose changes to this document in a pull request. This project is not yet mature as other ones inside our organization, we'd be glad to hear your voice. +Keep in mind that the following are mostly guidelines, not strict rules. Use your best judgement and feel free to propose changes to this document in a pull request. #### Table of contents @@ -14,6 +14,7 @@ Keep in mind that the following are mostly guidelines, not strict rules. Use you - [CMake](#cmake) - [Git](#git) - [Documentation](#documentation) +- [Website](#website) - [Policies](#policies) - [Versioning](#versioning) - [Deprecations](#deprecations) @@ -44,7 +45,7 @@ Furthermore: - Add an empty line between project, system headers, and `std` headers. - Forward-declare classes into namespaces. - Do not use `#pragma once`, use instead `#ifndef ... #define ... #endif` macro. -- The defines macros should have the `WBT__H` format. +- The defines macros should have the `NS1_NS2__H` format. - The final `#endif` should have a comment containing the closed `#ifndef`. - When possible, use explicit declaration and explicit instantiation of templates. - When not possible, use [three-files `-inl.h`](http://drake.mit.edu/cxx_inl.html) pattern approach. @@ -52,8 +53,8 @@ Furthermore: Example: ```cpp -#ifndef WBT_JACOBIAN_H -#define WBT_JACOBIAN_H +#ifndef WBT_BLOCK_JACOBIAN_H +#define WBT_BLOCK_JACOBIAN_H #include "Jacobian.h" #include "RobotInterface.h" @@ -66,14 +67,16 @@ Example: #include namespace wbt { - class Jacobian; + namespace block { + class Jacobian; + } // namespace block } // namespace wbt -class wbt::Jacobian +class wbt::block::Jacobian { ... -#endif // WBT_JACOBIAN_H +#endif // WBT_BLOCK_JACOBIAN_H ``` ### CMake @@ -96,34 +99,56 @@ class wbt::Jacobian ## Documentation -- All the new classes and methods of your PR should contain the doxygen documentation in their headers. For checking its render before pushing, a possible way is the following: - ```bash - # From the build directory: +- All the new classes and methods of your PR should contain the doxygen documentation in their headers. For checking its render before pushing, proceed as follows: + ``` + mkdir buildDox + cd buildDox + cmake -DWBT_BUILD_DOCS=ON .. make dox + # If there are any errors, fix them. cd doc/doxygen/html - python -m http.server + python3 -m http.server # Browse to http://localhost:8000 ``` -- Your PR should add a changelog in the [doc/release](/doc/release) file of the upcoming version. +- Your PR should add a changelog in the [doc/release](/doc/release) file of the [upcoming version](#versioning) (minor release if the PR targets `master`, major release if it targets `devel`). + +## Website + +Our website is based on the [mkdocs](https://github.com/mkdocs/mkdocs) framework and the [mkdocs-material](https://github.com/squidfunk/mkdocs-material) theme. + +The easier way to modify a page of website is doing it directly from the website. In the top-right corner of every page, on the same line of the page title, you will find an pencil icon. If you click on the icon, the markdown file that creates the webpage opens in the GitHub web editor. Here you can modify the document and create a pull request. + +If the edits you want to submit are not trivial, or if you want to check how the website will be rendered, you need to clone the repository and modify with your favourite text editor the files inside the [`doc/mkdocs/data`](/doc/mkdocs/data) folder. Afterwards, you can generate and browse a local website executing the following commands: + +``` +mkdir buildWebsite +cd buildWebsite +cmake -DWBT_BUILD_DOCS=ON .. +make mkdocs +# If there are any errors, fix them. +cd doc/mkdocs +python3 -m http.server +# Browse to http://localhost:8000 +``` ## Policies ## Versioning -After an assessment period, with few releases without any defined versioning policy, starting from the release `4` WB-Toolbox follows the following pattern: +Starting from `v5`, this project hosts only a blockfactory plugin library. All the public APIs have been moved to [robotology/blockfactory](https://github.com/robotology/blockfactory). The versioning policy is not anymore related to public APIs. -#### Major releases, e.g. `4` +The next sections use the definition of **user code**: it represents all the functionalities that can be built with the `WBT` library. It includes Simulink models, autogenerated code from Simulink models, and C++ code that directly uses `WBT` as a C++ library. -- We use a fast rollout numbering, publishing a new major release every devel freeze. This happens when we decide that the amount of new features are worth a new release. -- Major releases may or may not break APIs. Read [Deprecations](#deprecations) for further information. +#### Major releases, e.g. `v5` -#### Minor releases, e.g. `4.1` +- We use a fast rollout numbering, publishing a new major release every `devel` freeze. This happens when we decide that the amount of new features are worth a new release. +- Major releases may or may not break user code. Read [Deprecations](#deprecations) for further information. + +#### Minor releases, e.g. `v5.1` - Minor releases may contain hot-fixes applied directly to `master` (and then merged to `devel`). -- APIs stability is preserved. +- User code is preserved. ## Deprecations -The following policy is still a rule-of-thumb. We are not yet enforcing it, but soon we will. Take note of it because this will be valid as soon as we reach an acceptable API stability. - -- Functions and classes which are marked as deprecated in one major release will be kept at least for another major release. This means that a deprecated class in version `4` will still be present in version `5`, but it might be deleted in version `6`. +Functions and classes which are marked as deprecated in one major release will be kept at least for another major release. This means that a deprecated class in version `v4` will still be present in version `v5`, but it might be deleted in version `v6`. This should give users an acceptable time buffer to update their models. From 08a0eac395c2b95b96f2770403b7bea8e33474fa Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Sun, 20 Jan 2019 15:20:00 +0100 Subject: [PATCH 20/37] Updated release notes PR https://github.com/robotology/wb-toolbox/pull/166 --- doc/release/v5.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/doc/release/v5.md b/doc/release/v5.md index 0b1538b43..452ec7b8e 100644 --- a/doc/release/v5.md +++ b/doc/release/v5.md @@ -1,9 +1,15 @@ -# WB-Toolbox (YYYY-MM-DD) Release Notes {[`#v5`](https://github.com/robotology/wb-toolbox/releases/tag/v5)} +# Whole-Body Toolbox (YYYY-MM-DD) Release Notes {[`#v5`](https://github.com/robotology/wb-toolbox/releases/tag/v5)} -[Description] +The `v5` release of Whole-Body Toolbox brings a big change in the architecture: the core of the toolbox became a standalone repository hosted at [robotology/blockfactory](https://github.com/robotology/blockfactory). This repository will only host the plugin library containing the classes of the blocks. + +More in detail, this repository now contains only the `WBToolboxBase` and `WBToolboxLibrary` components. ## Important Changes +- The Core, Mex and Coder components have been removed +- New dependency: [robotology/blockfactory](https://github.com/robotology/blockfactory) +- It does not depend anymore (neither optionally) from Simulink + ## New Features ### `WBToolboxBase` From 4f8abc809d1843e308ca94568dc395e7811380b8 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Sun, 20 Jan 2019 18:17:52 +0100 Subject: [PATCH 21/37] CMake cleanup --- CMakeLists.txt | 8 ++++---- doc/mkdocs/data/install.md | 1 - matlab/CMakeLists.txt | 10 +--------- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dd50eb221..9a58b805d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,8 @@ endif() # FIND DEPENDENCIES # ================= -find_package(YCM 0.9 REQUIRED) +# Matlab is not a compile dependency. If it is found, the Simulink library +# and all the Matlab-related resources are installed. find_package(Matlab COMPONENTS MX_LIBRARY ENG_LIBRARY @@ -22,6 +23,7 @@ find_package(Matlab COMPONENTS # SIMULINK # Requires CMake > 3.7 ) +find_package(YCM 0.9 REQUIRED) find_package(YARP 3.0.0 REQUIRED) # Fail if YARP is not compiled as shared library @@ -62,9 +64,7 @@ else() option(WBT_SHARED_LIBRARY "Compile WBToolbox as a shared library" TRUE) endif() set(BUILD_SHARED_LIBS ${WBT_SHARED_LIBRARY}) -if(NOT BUILD_SHARED_LIBS) - set(CMAKE_POSITION_INDEPENDENT_CODE ON) -endif() +set(CMAKE_POSITION_INDEPENDENT_CODE ON) # Tweak linker flags in Linux if(UNIX AND NOT APPLE) diff --git a/doc/mkdocs/data/install.md b/doc/mkdocs/data/install.md index 05078bce8..e3cd307e9 100644 --- a/doc/mkdocs/data/install.md +++ b/doc/mkdocs/data/install.md @@ -20,7 +20,6 @@ - [`gazebo_yarp_plugins`](https://github.com/robotology/gazebo_yarp_plugins) - [`qpOASES`](https://github.com/robotology-dependencies/qpOASES/) - [`matio`](https://github.com/tbeu/matio) -- Matlab 7.1+ and Simulink ## Installation diff --git a/matlab/CMakeLists.txt b/matlab/CMakeLists.txt index fd4402397..d9ea3dcd6 100644 --- a/matlab/CMakeLists.txt +++ b/matlab/CMakeLists.txt @@ -54,15 +54,7 @@ configure_file( ${CMAKE_BINARY_DIR}/toolbox/setupForMatlabDebug.m @ONLY) -#if MAJOR >= 2014 && MINOR >= b -# Note: We had issues with Matlab 2014b and .mdl models. -# But this issue seems to have been disappeared in 2015b. We have to check if we need to enable this if again -# TODO: check if the mdl support is still required -# if (${Matlab_VERSION_STRING} GREATER "8.3") -# install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/WBToolboxLibrary.slx DESTINATION ${WB-TOOLBOX_SHARE_DIR}) -# else() -# install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/WBToolboxLibrary.mdl DESTINATION ${WB-TOOLBOX_SHARE_DIR}) -# endif() +# Install the Simulink Library install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/library/exported/WBToolboxLibrary.slx DESTINATION ${WBTOOLBOX_SHARE_DIR}) From 8f00da1d888b31bef31add512a5308011d00fd43 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Mon, 21 Jan 2019 10:40:11 +0100 Subject: [PATCH 22/37] Fix deploy stage Python package setuptools was missing --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 29888cb08..5ade951e6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -212,6 +212,7 @@ jobs: - doxygen-gui - graphviz - python3-pip + - python3-setuptools - <<: *deploy_template if: fork = false AND branch = "devel" AND type != pull_request From 0c21a548f4f589f5e177d15e4c02c94d894ee42e Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Mon, 21 Jan 2019 10:40:28 +0100 Subject: [PATCH 23/37] Update website --- doc/mkdocs/data/about.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/mkdocs/data/about.md b/doc/mkdocs/data/about.md index 983513b0c..aa05c9231 100644 --- a/doc/mkdocs/data/about.md +++ b/doc/mkdocs/data/about.md @@ -1,4 +1,4 @@ -`WBT` has been developed in the [Dynamic Interaction Control](https://www.iit.it/research/lines/dynamic-interaction-control) research line at the [Italian Institute of Technology](https://www.iit.it). +`WBT` has been developed in the [Dynamic Interaction Control](https://dic.iit.it) research line at the [Italian Institute of Technology](https://www.iit.it). It was born from the ashes of @robotology-playground/WBI-Toolbox. From 6356f69d9360cb87e38468457d50d6a1b868b5cf Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Mon, 21 Jan 2019 11:50:04 +0100 Subject: [PATCH 24/37] Fix deploy stage python3-wheel was still missing --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 5ade951e6..ac6304b82 100644 --- a/.travis.yml +++ b/.travis.yml @@ -213,6 +213,7 @@ jobs: - graphviz - python3-pip - python3-setuptools + - python3-wheel - <<: *deploy_template if: fork = false AND branch = "devel" AND type != pull_request From ac4494119c02c9b7625043abb16cb09df3022dfa Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Mon, 21 Jan 2019 12:07:34 +0100 Subject: [PATCH 25/37] Properly disable deploy stage for forks --- .travis.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index ac6304b82..0d2c8ec47 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,10 +23,10 @@ addons: - gsl stages: - # Default stage with job matrix - - test + - test # Default stage with job matrix - osx - - deploy + - name: deploy + if: fork = false AND branch IN (master, devel) AND type != pull_request AND env(DEPLOY_TOKEN) IS present compiler: - gcc @@ -190,7 +190,6 @@ jobs: stage: deploy compiler: cache: - if: fork = false AND branch = "master" AND type != pull_request before_install: skip install: *deploy_install before_script: skip From 828b4c9bfcef98f198f9321b774e2f2bad6f8257 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Tue, 29 Jan 2019 18:02:40 +0100 Subject: [PATCH 26/37] Use BlockFactory CMake function to register blocks and create the plugin --- cmake/Utilities.cmake | 23 --- toolbox/library/CMakeLists.txt | 255 ++++++++++----------------------- 2 files changed, 79 insertions(+), 199 deletions(-) delete mode 100644 cmake/Utilities.cmake diff --git a/cmake/Utilities.cmake b/cmake/Utilities.cmake deleted file mode 100644 index 85c4f5587..000000000 --- a/cmake/Utilities.cmake +++ /dev/null @@ -1,23 +0,0 @@ -include(CMakeParseArguments) - -macro(CONFIGURE_BLOCK) - - set(_options ) - set(_oneValueArgs BLOCK_NAME - LIST_PREFIX - GROUP) - set(_multiValueArgs SOURCES - HEADERS - ) - - cmake_parse_arguments(_ARS "${_options}" - "${_oneValueArgs}" - "${_multiValueArgs}" - "${ARGN}") - - set_property(GLOBAL APPEND PROPERTY ${_ARS_LIST_PREFIX}_HEADERS ${_ARS_HEADERS}) - set_property(GLOBAL APPEND PROPERTY ${_ARS_LIST_PREFIX}_SOURCES ${_ARS_SOURCES}) - - source_group("${_ARS_GROUP}\\${_ARS_BLOCK_NAME}\\Headers" FILES ${_ARS_HEADERS}) - source_group("${_ARS_GROUP}\\${_ARS_BLOCK_NAME}\\Sources" FILES ${_ARS_SOURCES}) -endmacro() \ No newline at end of file diff --git a/toolbox/library/CMakeLists.txt b/toolbox/library/CMakeLists.txt index 5d5b79a69..b8dace97e 100644 --- a/toolbox/library/CMakeLists.txt +++ b/toolbox/library/CMakeLists.txt @@ -2,182 +2,88 @@ # This software may be modified and distributed under the terms of the # GNU Lesser General Public License v2.1 or any later version. -# Add configure_block macro -include(Utilities) +# ===================== +# OPTIONAL DEPENDENCIES +# ===================== -set(WBTOOLBOXLIBRARY_EXT_LIBRARIES "") - -# configure_block(BLOCK_NAME "Inverse Kinematics" -# GROUP "Model" -# LIST_PREFIX WBT -# SOURCES src/RemoteInverseKinematics.cpp -# HEADERS include/RemoteInverseKinematics.h) - -option(WBT_USES_ICUB "Build models which need iCub library (e.g. Minimum Jerk Traj. Generator)" ON) - -if(WBT_USES_ICUB) - find_package(ICUB REQUIRED) - - configure_block(BLOCK_NAME "Minimum Jerk Trajectory Generator" - GROUP "Utilities" - LIST_PREFIX WBT - SOURCES src/MinimumJerkTrajectoryGenerator.cpp - HEADERS include/WBToolbox/Block/MinimumJerkTrajectoryGenerator.h) - - configure_block(BLOCK_NAME "Discrete Filter" - GROUP "Utilities" - LIST_PREFIX WBT - SOURCES src/DiscreteFilter.cpp - HEADERS include/WBToolbox/Block/DiscreteFilter.h) - - # if (${ICUB_USE_IPOPT}) - # find_package(iDynTree REQUIRED) - # add_definitions(-DWBT_USES_IPOPT) - # configure_block(BLOCK_NAME "Inverse Kinematics" - # GROUP "Model" - # LIST_PREFIX WBT - # SOURCES src/InverseKinematics.cpp - # HEADERS include/InverseKinematics.h) - # - # include_directories(SYSTEM ${iKin_INCLUDE_DIRS}) - # endif() +find_package(ICUB) +if(NOT WBT_USES_ICUB) + option(WBT_USES_ICUB "Build blocks that depend on iCub library" ${ICUB_FOUND}) endif() -# Search qpOASES and enable block which depends on it find_package(qpOASES) if(NOT WBT_USES_QPOASES) - option(WBT_USES_QPOASES "Compile also qpOASES-related components" ${qpOASES_FOUND}) + option(WBT_USES_QPOASES "Build blocks that depend on qpOASES library" ${qpOASES_FOUND}) endif() -configure_block(BLOCK_NAME "Yarp Read" - GROUP "Utilities" - LIST_PREFIX WBT - SOURCES src/YarpRead.cpp - HEADERS include/WBToolbox/Block/YarpRead.h) - -configure_block(BLOCK_NAME "Yarp Write" - GROUP "Utilities" - LIST_PREFIX WBT - SOURCES src/YarpWrite.cpp - HEADERS include/WBToolbox/Block/YarpWrite.h) - -configure_block(BLOCK_NAME "Real Time Synchronizer" - GROUP "Utilities" - LIST_PREFIX WBT - SOURCES src/RealTimeSynchronizer.cpp - HEADERS include/WBToolbox/Block/RealTimeSynchronizer.h) - -configure_block(BLOCK_NAME "Yarp Clock" - GROUP "Utilities" - LIST_PREFIX WBT - SOURCES src/YarpClock.cpp - HEADERS include/WBToolbox/Block/YarpClock.h) +# =================== +# BLOCKFACTORY PLUGIN +# =================== + +# YARP blocks +list(APPEND WBT_BLOCKS "YarpRead") +list(APPEND WBT_BLOCKS "YarpWrite") +list(APPEND WBT_BLOCKS "YarpClock") +list(APPEND WBT_BLOCKS "GetLimits") +list(APPEND WBT_BLOCKS "SetReferences") +list(APPEND WBT_BLOCKS "GetMeasurement") +list(APPEND WBT_BLOCKS "SetMotorParameters") +list(APPEND WBT_BLOCKS "SimulatorSynchronizer") + +# iDynTree blocks +list(APPEND WBT_BLOCKS "MassMatrix") +list(APPEND WBT_BLOCKS "InverseDynamics") +list(APPEND WBT_BLOCKS "DotJNu") +list(APPEND WBT_BLOCKS "Jacobian") +list(APPEND WBT_BLOCKS "ForwardKinematics") +list(APPEND WBT_BLOCKS "RelativeTransform") +list(APPEND WBT_BLOCKS "CentroidalMomentum") + +# Other +list(APPEND WBT_BLOCKS "RealTimeSynchronizer") + +if(WBT_USES_ICUB) + list(APPEND WBT_BLOCKS "DiscreteFilter") + list(APPEND WBT_BLOCKS "MinimumJerkTrajectoryGenerator") +endif() if(WBT_USES_QPOASES) - configure_block(BLOCK_NAME "qpOASES" - GROUP "Utilities" - LIST_PREFIX WBT - SOURCES src/QpOases.cpp - HEADERS include/WBToolbox/Block/QpOases.h) + list(APPEND WBT_BLOCKS "QpOases") endif() -configure_block(BLOCK_NAME "Simulator Synchronizer" - GROUP "Utilities" - LIST_PREFIX WBT - SOURCES src/SimulatorSynchronizer.cpp - HEADERS include/WBToolbox/Block/SimulatorSynchronizer.h) -add_library(WBToolbox::ClockRPC ALIAS ClockRpc) -list(APPEND WBTOOLBOXLIBRARY_EXT_LIBRARIES "ClockRpc") +# Include CMake helpers provided by BlockFactory +include(BlockFactoryPlugin) -configure_block(BLOCK_NAME "Mass Matrix" - GROUP "Model" - LIST_PREFIX WBT - SOURCES src/MassMatrix.cpp - HEADERS include/WBToolbox/Block/MassMatrix.h) - -configure_block(BLOCK_NAME "Inverse Dynamics" - GROUP "Model" - LIST_PREFIX WBT - SOURCES src/InverseDynamics.cpp - HEADERS include/WBToolbox/Block/InverseDynamics.h) - -configure_block(BLOCK_NAME "Centroidal Momentum" - GROUP "Model" - LIST_PREFIX WBT - SOURCES src/CentroidalMomentum.cpp - HEADERS include/WBToolbox/Block/CentroidalMomentum.h) - -configure_block(BLOCK_NAME "Forward Kinematics" - GROUP "Model" - LIST_PREFIX WBT - SOURCES src/ForwardKinematics.cpp - HEADERS include/WBToolbox/Block/ForwardKinematics.h) - -configure_block(BLOCK_NAME "Jacobian" - GROUP "Model" - LIST_PREFIX WBT - SOURCES src/Jacobian.cpp - HEADERS include/WBToolbox/Block/Jacobian.h) - -configure_block(BLOCK_NAME "DotJ Nu" - GROUP "Model" - LIST_PREFIX WBT - SOURCES src/DotJNu.cpp - HEADERS include/WBToolbox/Block/DotJNu.h) - -configure_block(BLOCK_NAME "Relative Transform" - GROUP "Model" - LIST_PREFIX WBT - SOURCES src/RelativeTransform.cpp - HEADERS include/WBToolbox/Block/RelativeTransform.h) - -configure_block(BLOCK_NAME "Set References" - GROUP "Actuators" - LIST_PREFIX WBT - SOURCES src/SetReferences.cpp - HEADERS include/WBToolbox/Block/SetReferences.h) - -configure_block(BLOCK_NAME "Set Motor Parameters" - GROUP "Actuators" - LIST_PREFIX WBT - SOURCES src/SetMotorParameters.cpp - HEADERS include/WBToolbox/Block/SetMotorParameters.h) - -configure_block(BLOCK_NAME "Get Measurement" - GROUP "State" - LIST_PREFIX WBT - SOURCES src/GetMeasurement.cpp - HEADERS include/WBToolbox/Block/GetMeasurement.h) - -configure_block(BLOCK_NAME "Get Limits" - GROUP "State" - LIST_PREFIX WBT - SOURCES src/GetLimits.cpp - HEADERS include/WBToolbox/Block/GetLimits.h) - -get_property(ALL_LIBRARY_HEADERS GLOBAL PROPERTY WBT_HEADERS) -get_property(ALL_LIBRARY_SOURCES GLOBAL PROPERTY WBT_SOURCES) - -add_library(WBToolboxLibrary SHARED - src/Factory.cpp - ${ALL_LIBRARY_HEADERS} - ${ALL_LIBRARY_SOURCES}) -add_library(WBToolbox::Library ALIAS WBToolboxLibrary) +# Register the blocks +foreach(block ${WBT_BLOCKS}) + register_blockfactory_block( + BLOCK_NAME ${block} + PLUGIN_NAME WBToolbox + SOURCES src/${block}.cpp + HEADERS include/WBToolbox/Block/${block}.h) +endforeach() + +# Create the target of the plugin library +add_blockfactory_plugin(WBToolbox + EXTRA_SOURCES src/Factory.cpp) +add_library(WBToolbox::Plugin ALIAS WBToolbox) + +# Set public headers +get_property(WBT_BLOCKS_HEADERS GLOBAL PROPERTY WBToolbox_HEADERS) +set_target_properties(WBToolbox PROPERTIES + PUBLIC_HEADER "${WBT_BLOCKS_HEADERS}") if(MSVC) # Import math symbols from standard cmath - target_compile_definitions(WBToolboxLibrary PRIVATE "_USE_MATH_DEFINES") + target_compile_definitions(WBToolbox PRIVATE "_USE_MATH_DEFINES") endif() -target_include_directories(WBToolboxLibrary PUBLIC +# Configure the include directories +target_include_directories(WBToolbox PUBLIC $ $) -target_include_directories(WBToolboxLibrary SYSTEM PRIVATE ${EIGEN3_INCLUDE_DIR}) - -set_target_properties(WBToolboxLibrary PROPERTIES - PUBLIC_HEADER "${ALL_LIBRARY_HEADERS}") - +# Main dependencies list(APPEND WBTOOLBOXLIBRARY_EXT_LIBRARIES YARP::YARP_OS YARP::YARP_dev @@ -187,34 +93,31 @@ list(APPEND WBTOOLBOXLIBRARY_EXT_LIBRARIES iDynTree::idyntree-modelio-urdf iDynTree::idyntree-high-level) -target_link_libraries(WBToolboxLibrary PUBLIC WBToolboxBase) -target_link_libraries(WBToolboxLibrary PRIVATE BlockFactory::Core shlibpp::shlibpp ${WBTOOLBOXLIBRARY_EXT_LIBRARIES}) +# Additional dependency of the SimulatorSynchronizer block +add_library(WBToolbox::ClockRPC ALIAS ClockRpc) +list(APPEND WBTOOLBOXLIBRARY_EXT_LIBRARIES "ClockRpc") + +# Link the plugin with the WBToolboxBase library and +# all the external dependencies +target_link_libraries(WBToolbox + PUBLIC WBToolboxBase + PRIVATE ${WBTOOLBOXLIBRARY_EXT_LIBRARIES}) if(WBT_USES_ICUB) - target_compile_definitions(WBToolboxLibrary PRIVATE "WBT_USES_ICUB") - target_link_libraries(WBToolboxLibrary PRIVATE ctrlLib) + target_compile_definitions(WBToolbox PRIVATE "WBT_USES_ICUB") + target_link_libraries(WBToolbox PRIVATE ctrlLib) # Manually include iCub include folders. They are not exported by the linked library. - target_include_directories(WBToolboxLibrary PRIVATE ${ctrlLib_INCLUDE_DIRS}) - -# if (${ICUB_USE_IPOPT}) -# target_link_libraries(WBToolboxLibrary PUBLIC iKin) -# include_directories(${iKin_INCLUDE_DIRS}) -# endif() + target_include_directories(WBToolbox PRIVATE ${ctrlLib_INCLUDE_DIRS}) endif() if(WBT_USES_QPOASES) - target_compile_definitions(WBToolboxLibrary PRIVATE "WBT_USES_QPOASES") - target_link_libraries(WBToolboxLibrary PRIVATE ${qpOASES_LIBRARIES}) + target_compile_definitions(WBToolbox PRIVATE "WBT_USES_QPOASES") + target_link_libraries(WBToolbox PRIVATE ${qpOASES_LIBRARIES}) # Manually include qpOASES include folders. They are not exported by the linked library. - target_include_directories(WBToolboxLibrary PRIVATE ${qpOASES_INCLUDE_DIRS}) + target_include_directories(WBToolbox PRIVATE ${qpOASES_INCLUDE_DIRS}) endif() -install( - TARGETS WBToolboxLibrary - EXPORT WBToolboxExport - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/WBToolbox/Block) +# Install the plugin +install_blockfactory_plugin(WBToolbox) From 7d25e893da4ba01f22cc538cf3522a73a6fa51af Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Tue, 29 Jan 2019 18:03:50 +0100 Subject: [PATCH 27/37] Updated Simulink Library Due to the change of the installed library name due to the usage of CMake utilities provided by BlockFactory. --- .../library/WBToolboxLibrary_repository.mdl | 46 +++++++++--------- matlab/library/exported/WBToolboxLibrary.slx | Bin 545199 -> 545440 bytes 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/matlab/library/WBToolboxLibrary_repository.mdl b/matlab/library/WBToolboxLibrary_repository.mdl index b7e115929..e62a19382 100644 --- a/matlab/library/WBToolboxLibrary_repository.mdl +++ b/matlab/library/WBToolboxLibrary_repository.mdl @@ -1166,7 +1166,7 @@ Library { ZOrder 106 BackgroundColor "[0.513700, 0.851000, 0.670600]" FunctionName "BlockFactory" - Parameters "'SetMotorParameters','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,readP,readI,readD,pid" + Parameters "'SetMotorParameters','WBToolbox',WBTConfigParameters,configBlockAbsName,readP,readI,readD,pid" "Type,setKTau,kTau,setBemf,bemf" SFunctionDeploymentMode off EnableBusSupport off @@ -1503,7 +1503,7 @@ Library { Position [125, 39, 185, 71] ZOrder 19 FunctionName "BlockFactory" - Parameters "'SetReferences','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,controlType,refSpeed" + Parameters "'SetReferences','WBToolbox',WBTConfigParameters,configBlockAbsName,controlType,refSpeed" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -1684,7 +1684,7 @@ Library { Position [125, 39, 185, 71] ZOrder 19 FunctionName "BlockFactory" - Parameters "'SetReferences','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,controlType,refTraj" + Parameters "'SetReferences','WBToolbox',WBTConfigParameters,configBlockAbsName,controlType,refTraj" "ectory" SFunctionDeploymentMode off EnableBusSupport off @@ -1889,7 +1889,7 @@ Library { Position [180, 11, 255, 144] ZOrder 19 FunctionName "BlockFactory" - Parameters "'CentroidalMomentum','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName" + Parameters "'CentroidalMomentum','WBToolbox',WBTConfigParameters,configBlockAbsName" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -2079,7 +2079,7 @@ Library { Position [180, 24, 240, 216] ZOrder 19 FunctionName "BlockFactory" - Parameters "'InverseDynamics','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName" + Parameters "'InverseDynamics','WBToolbox',WBTConfigParameters,configBlockAbsName" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -2273,7 +2273,7 @@ Library { Position [180, 24, 240, 216] ZOrder 19 FunctionName "BlockFactory" - Parameters "'InverseDynamics','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName" + Parameters "'InverseDynamics','WBToolbox',WBTConfigParameters,configBlockAbsName" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -2361,7 +2361,7 @@ Library { Position [190, 199, 355, 331] ZOrder 75 FunctionName "BlockFactory" - Parameters "'InverseDynamics','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName" + Parameters "'InverseDynamics','WBToolbox',WBTConfigParameters,configBlockAbsName" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -2520,7 +2520,7 @@ Library { Position [125, 37, 185, 68] ZOrder 19 FunctionName "BlockFactory" - Parameters "'MassMatrix','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName" + Parameters "'MassMatrix','WBToolbox',WBTConfigParameters,configBlockAbsName" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -2741,7 +2741,7 @@ Library { Position [125, 4, 190, 126] ZOrder 19 FunctionName "BlockFactory" - Parameters "'DotJNu','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,frameName" + Parameters "'DotJNu','WBToolbox',WBTConfigParameters,configBlockAbsName,frameName" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -2918,7 +2918,7 @@ Library { Position [125, 37, 185, 68] ZOrder 19 FunctionName "BlockFactory" - Parameters "'Jacobian','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,frameName" + Parameters "'Jacobian','WBToolbox',WBTConfigParameters,configBlockAbsName,frameName" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -3118,7 +3118,7 @@ Library { Position [125, 37, 185, 68] ZOrder 19 FunctionName "BlockFactory" - Parameters "'ForwardKinematics','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,frameName" + Parameters "'ForwardKinematics','WBToolbox',WBTConfigParameters,configBlockAbsName,frameName" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -3585,7 +3585,7 @@ Library { Position [120, 40, 180, 70] ZOrder 27 FunctionName "BlockFactory" - Parameters "'RelativeTransform','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,frame1, frame2" + Parameters "'RelativeTransform','WBToolbox',WBTConfigParameters,configBlockAbsName,frame1, frame2" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -4015,7 +4015,7 @@ Library { Position [115, 33, 175, 102] ZOrder 19 FunctionName "BlockFactory" - Parameters "'GetLimits','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,limitsType" + Parameters "'GetLimits','WBToolbox',WBTConfigParameters,configBlockAbsName,limitsType" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -4171,7 +4171,7 @@ Library { Position [125, 39, 185, 71] ZOrder 19 FunctionName "BlockFactory" - Parameters "'GetMeasurement','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,measuredType" + Parameters "'GetMeasurement','WBToolbox',WBTConfigParameters,configBlockAbsName,measuredType" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -4316,7 +4316,7 @@ Library { Position [125, 39, 185, 71] ZOrder 19 FunctionName "BlockFactory" - Parameters "'GetMeasurement','WBToolboxLibrary',WBTConfigParameters,configBlockAbsName,measuredType" + Parameters "'GetMeasurement','WBToolbox',WBTConfigParameters,configBlockAbsName,measuredType" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -4846,7 +4846,7 @@ Library { ZOrder 103 BackgroundColor "yellow" FunctionName "BlockFactory" - Parameters "'DiscreteFilter','WBToolboxLibrary',filterDataStruct" + Parameters "'DiscreteFilter','WBToolbox',filterDataStruct" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -5172,7 +5172,7 @@ Library { Position [470, 93, 625, 147] ZOrder 78 FunctionName "BlockFactory" - Parameters "'MinimumJerkTrajectoryGenerator','WBToolboxLibrary',sampleTime,settlingTime,firstDerivatives,secondD" + Parameters "'MinimumJerkTrajectoryGenerator','WBToolbox',sampleTime,settlingTime,firstDerivatives,secondD" "erivatives,explicitInitialValue,externalSettlingTime,resetOnSettlingTime" SFunctionDeploymentMode off EnableBusSupport off @@ -5354,7 +5354,7 @@ Library { Position [405, -6, 595, 66] ZOrder 104 FunctionName "BlockFactory" - Parameters "'QpOases','WBToolboxLibrary',lbA,ubA,lb,ub,computeObjVal,stopIfFails" + Parameters "'QpOases','WBToolbox',lbA,ubA,lb,ub,computeObjVal,stopIfFails" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -5514,7 +5514,7 @@ Library { BackgroundColor "gray" ShowName off FunctionName "BlockFactory" - Parameters "'RealTimeSynchronizer','WBToolboxLibrary',period" + Parameters "'RealTimeSynchronizer','WBToolbox',period" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -5548,7 +5548,7 @@ Library { ForegroundColor "[0.490196, 0.000000, 0.000000]" ShowName off FunctionName "BlockFactory" - Parameters "'SimulatorSynchronizer','WBToolboxLibrary',period, serverPortName, clientPortName" + Parameters "'SimulatorSynchronizer','WBToolbox',period, serverPortName, clientPortName" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -5819,7 +5819,7 @@ Library { ZOrder 85 ForegroundColor "[0.490196, 0.000000, 0.000000]" FunctionName "BlockFactory" - Parameters "'YarpClock','WBToolboxLibrary'" + Parameters "'YarpClock','WBToolbox'" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off @@ -5844,7 +5844,7 @@ Library { ZOrder 22 ForegroundColor "[0.490196, 0.000000, 0.000000]" FunctionName "BlockFactory" - Parameters "'YarpRead','WBToolboxLibrary',portName,signalSize,blocking,timestamp,autoconnect,errorOnConnection,t" + Parameters "'YarpRead','WBToolbox',portName,signalSize,blocking,timestamp,autoconnect,errorOnConnection,t" "imeout" SFunctionDeploymentMode off EnableBusSupport off @@ -5943,7 +5943,7 @@ Library { ZOrder 27 ForegroundColor "[0.490196, 0.000000, 0.000000]" FunctionName "BlockFactory" - Parameters "'YarpWrite','WBToolboxLibrary',portName,autoconnect,errorOnConnection" + Parameters "'YarpWrite','WBToolbox',portName,autoconnect,errorOnConnection" SFunctionDeploymentMode off EnableBusSupport off SFcnIsStateOwnerBlock off diff --git a/matlab/library/exported/WBToolboxLibrary.slx b/matlab/library/exported/WBToolboxLibrary.slx index 7e170c6119676e8677900d0569b3e62157355822..a7e0a6ef4d131f97091bb4ab7ece5ba34b140aaa 100644 GIT binary patch delta 482980 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
  • lGSapMQ62y57#t{JwSK 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

    3-_(}pH-p* z5!tPl(0>dtfLq)+fH^YwB+o~)m5_?5thmxij<=w&mMY~@dJL>YNY$R_YcdM5r+Yr) z$rw3qp_rwVbtlAW2rFABz=@ZJ&abi1R%RMOwOaoO{93Y*a|v*BOGYXyFLjt{K5nj7ZbvpEw%#w|! zrudF%{G5gFG}E%-=873g^O#Dbn^|mVv)J}4DQ4D7hN2U@9%0pjgABkQ=1j^Xb)$CK z`52(feE!EAJ(fe>yXx9o-CYN5k_c~oQ2bScO(MJQ22qkJj3zf6a+Yf4Va9t)cYj5b zzX=J(Nrv{=l4g<*Z*c8WvwYWuAAT>qtXvk*{%r)0`#B)XgZt@M%0o|8_wcWsIns(H zKlI1xqacrb^wUCgXhK!Oo>ahs==zx7BXPZR~CM}QrV;#<1 z|5-=HoVD@GaEHGw5yqs2yk>w9WPjNAxbG*zQ*Hi=Q>#Ktwj(CBl{Wd5nKwJ5# zSIQqBrk1cyDlX&d@jV6km~%o8pi42^#5El>tKK*$eUvj`2~hml7F2Osjryw zPu>Fz&ut%wT0{NT^FTzd4_0YeSwzA@+OqskVx}4)!VR)b^Ia(xrlxkmHb}=DvaEfk zM~k6RHg^UE+07pQ$zanNN@ZAMh*mFguW0K_T7l@}TXYv6SbhxZaO^m;u ziM{eh33jw_zlA6P=IIadvBo#p-tm9r(6mMxWu}k8OrysX9A@>W+HR*5H7Or{d;Ub< z0#<$c5fzwF+^C3>s&XH)S^34)mV{R3Es>fV{SO%COXmHX?8e-tANwVp9Wl- zg(%nsM>%=V&|k9@$J|b>;Y5Y#)NobhGyY@y%xR*Kra4X&1Wg%H<kq$M!vd*x`5+Jv=F z?G@1|fSn?o5hb#+#L>x!i|(~H6}#(9-adS`IamQFzxrvUA9w0HhY5IhGMRij77N7z zlMX>?o@FbR%x0XTYD5l_oz{P9c6VrOaH)O`7{er{H#lJ!h5oHPUqk;Y`YI<{>qzp+ zI3KuUHtrcz#kKuGQ>|zSffOe<;)SJA*2mNlU+; zn#P85RUDrsvz#eeVy(enG}Hn<_b!eVeT^MGcLmc&1!vfD8A2diOoxAnr_t(kzvNH{ zLJnrv=V9?~E*1*3VC7N=Y4fhY@^nC;bW_0y2_DV<_R2?;OS20Y9VwV30W^}wBhvQg zpIXZe4;nL1n}tmf$Q$^1+E7gX5D(N1S-?ma#o7~rxSUl*-k+4R5*m{0GJ($lu(G>s zFxiq2bcQFtGq`TFm&1Rb>|UA1q_AYQ2$?8zq2&BLm$p>;uw7Xy(jlEm)|#)dlT z``!dG4Nnf}88cp`^ZFT~}i zT#%+LWp_D}+@YbHVA<+!i9i6!Ec z`##jrWj%7j3`u_j49vdX=(w&CLt^X<1`w@MFX6Fxs1rzZX8QiNefQ?kc+tR20)`9y z(JeM+e*i;g(GSTZ(nC5Vw74y$hNtHjtQ8i#UP!&4@?VO+tMiSs_@t19HrkRS%#-|r zf;27X%5*y|_B83$X)uURa66OwCW@7-%ixzYcGehk6X$;{V%*C!8t+SfEESO?gclq< zPz7R!B=}4Vr;4+5F*AOgzn5P-G16@h8&6%z`vi0Z6hXAZ;D@n3xDuJrFJFO-zKdfN zU1s8EqG^B2^$zl}8LMOZw{ZHR(x^U*iMJiJOWzJ}I9vp6tFolFw^e}*PVv+C{1hIM zX(|GgpPLF#(xPkecEJX6eF4EDbwznxoUVh`P=|=zQKzuOVxDK_wu-aZ$81$H_&|0_ ziI#?)$bxQ+#D74#S$-d}lMy-uAC$e>yDajMHqU>LG~Bf~WvL9o9pCe{fDV`i$!%y! z8uJ(wztcF|dMb%&o z?D>D5gngze{8VL$1`h}`dz645beyQ`he$jIeCQ8M>m~~|zdw6US{ZR-VZlK?ZjtD% zG)iJ^YEt~p)T(kj12%vjrrQEYn-UGMc`^P6e)CNPWV=vdMO$Ingc%|Z%vzeW;v-t7 z>I)T=v~Shv{jPf%Sn9K`aUf6566ds9n4*8#AFHRg2FUaQTeGw^aS#Ex2=k*?gB;A) zHsw!Dc{Jceh`K=I@CA+}01r(2j@}(d;dn+^M1(d{K$Q|8G&=Crlnc`X;N=q4Ov@2g zUc)RRxQ~qj*~beyib%3K(w$yp0966xk=&JW63Bj%+RFOCqpxTjWCp>aZb@iub1KFt7>wyUcxH21FXN;@~7m#qBbs%N)p7vKj$YFqFW#C)3{^#?*7bx3Y} z>&TWaec4kMG|OFck4zo|1$QT|SD9`PrMz`3H%yg}T=VEs6sm|B+SQV%CMWk!Mnf1`eXgBe3ck$*VczAmvxDj(2MtT=fEw6 zKi!7H`S3a6J>6PWo?*fZUPaqgMQo&x!SUp}0Jr{SITO}t)En{KX3>Q^Z>VK%i74Kz z9ZtcHfgyMnpf1p%6~0a6{n}>7J;)Bv$?LVV-$S+aBL)j}E~#VQIm=mMESwL7<`GMK6-lFPfKV zsCsmZCr@k>{1>AM8~!Lgy;gKab0g@?IV?_lo z;#+&P0HM5ZASiOo!EU~b9^-#1$q*GAaC(7MJmg^K#(1Y&JUk@c4ve+6$r^I=Z}Mwd}d6?VY9?0>l}X{mb_ZcRfT!V z1n#klDBvvEk8zfk=A2J|x6lz4;^(A4I3v+%45J#RD%X@S<@MPI(19&eS#8ECS6Y&E z)@o&}Dc!WnaLIe9Y+AII3f4DH_^``nWd(IG@O`^4-i)b}Mv*}VI6t>?q0g>s3u0_# zEHruDa_+Bu5lAWWs#1TNL@a)2eP&t1)8ipZo!f9qCz-T@q2_4gTVA6)fpIP_sqaWj ziG}W)e=!B5k@Qu*H)hi5ui&RBpZb(c5D&Z3HXuRsd|WeJcoihV&ky+VrBCVxF%btI z(4>+S&`>#un{_EitiFB#FZEDl76C}j7Ns|iA(CQsjn1^+*Rg*-Ze*N9`7FYliKT69 z)VUxHX$-RPL2|9yL0#MLN+e^dS)XB71-pxWp@IgD~#+{rJRfm_#CJ1>65HJHL3VxqU|ZymR$eb;y| z#lob@#<}5CE_u!}l_=fv=eIk-}hJb(1;u6TwyzjSr&tRy|ag*6Q zk5^l*Rxr!hy`4aVIv0P0;!Gm0|LW9RIXLK0EBicQEm-^Ab2#U1)DbFc)yJU~%)`c`)Uzz~s9q(SrH4@T)f z!r`ph`_;?or~nwWFAW47&EZrI5W>q+oHNy##Qp9W8#dQyn%*i}%=?^Pl{Ea;$){#FvgpDo_nXE3O0PK&sp&x^zS zA;)IVDq7&(S##Q$8<{Y_i3tU#}jZBA~(rJ|8?5Bf37v!4nW*b>u3hpG% z)pEe<`0I6jgx~0yFc|6Cs2Agm&9?(a_+{p2>)DRrxxn9=D+Tj=LPW{pdxx3YZ zms-a+5&VY^aGtlrv><;6Ff)0#vwhf|^>Wgt$nHHar z=NW)?8FaObc{nIhV~Gp4kD~x_e2m@^6(Jl~RBeAhP^D6(UKUw=uA?c^K91!hOxSbD zn<-OvBX%1sv2FKR(0x8Fx_k!pSp)UR#{taJydgw>D_jzOCCt*#5M6ui(ola#^lcmi zdh`YQB7Cj^&72~u{4h0XKLP9UQq?IMuA0(ZRlOdDuRA6mFBDJtPZm!1!4l)THynx02hDfWh!TTit5IW zs%K~aP*dVgWFpikvJqHP5Iy@PwR*RIB~ZRw_E;?t!7Rt3f4+0<#yZ<9;H~ewsWAbH zLefAo%OmcthEGGrk2lTBma6xP`fCYtjrdQI#`ntLgB7nFN1Dft>Z?j4|Z5&I$-Ip)!7QZd2p1@|4C`{G{vka;=MC51H{M zhYH%T*qUg!_D>rGC0^^eS6%U@Q|w7mbOh5~3%zB`K7{tkJz@W7eUcl{T;#ttTi)68 z(2%i9*cj9`?LMn{`2vy6{W8+X_o%stOQFxcTfDx?Uv1>* zTlrPt*Y^QH7OPWv_-X!rQrZ&H!#I>7UX^+9iqIrIOTvWQ_>Lv$_&6k~2dlI}CA{&; z*QaD>+M))!wkLmxafhv3@05o2y>H}ri_{GF5yQ(WghgSmEsCM=;ya`60)2Ca~PV|NNB`sns90AUtCO} zsiI(59u~2H1Q+LYI|MZ(dQTPeCk5FMmtC--~r}6{{U3JPTOgiQ*FE3CaMrr%%A(Uy->>5%ww*BIwss(e;WQy@F{Bg*>RM`$JS7dAZy zKtW8nETDhbI7(4Qdp{|*#ypfOsN^^yR93OPglKTQ z^wCrm^996nOZ>FkU9%uRW-|551q78=RKG_XK{`{7qn=l9W#%7!M3o+zZCxH3R&>Uw za>yPlDV_4_&s`m%t}-^r|D1*h?0vSi$Oh$c8FazRRaGKzB~P}TAT`>ity8;z?7gob z{LO!Wv-lyLRne3nGp*~2J;glW^Jq^92YJ>Cu{bFlsa;3i@eBFT3coN9HCW&QR5sAp zh69rfX&Tvj5R&^l+_d1kZ^hH!Sa#b-X?^M4wtKSkp3jd|uXD;R$%d3?U_ z*!Qy`6jSpLgiZ%VAV=(G7icy_=k8u7Vz~ZB^#hkFOx33X$*Ts*`I6BvT9iKuk1KzC z2oXx-+^QIRN~rDK$~pGd_g^6$s)QFI);kQy^KfT=CqTk`-qsEFCGCWqy==)o1ZUJg;$BaAjvQI#x1!qf+KUN~8xnHB%B_5j)K z-2oar%sH4w7v2sw9A<{OrrCtXjD>%^?vi=L+d2i$CU5xCwp4Jie zicTf&QAEzXf5USB4v7FLzjbzK?zH&o{BG}-sZoLGyDBOKX$O6sQ39VP%HEw`Jr-(3 zI8w@V&g!?`&q($N@d>Di;A;m{!Qyv!XF2`t`}YijoDy%W$z0rIUygp)=n{V^>;|J> zkFhqVp@9Bf=#8<34b{@a+BJ6Hq|OQ+Ed)!llW-N@lnm3`^%2pqe35*{w5el1MDsnx zOACk^I@wRHg6>9sb|C3QBlGPK`GIijn0QO_J(4a<0c zHBTi8XES3h2|C3%?Na1^^L~FAeFI@2`N3dWdJ<)0sjz$hJ~DYm|7Bh?8sFWP#>i`Hnj1=>(_9WGYJgf*V3r>h6)Qt z50{-Uf5tXTW*$ZU6mB740(F_H6C^X#9yZ%=`Qq-DgiB9XS!tC(FlB#fDl*8tGSsZd zC1-BRLV`0ZPrtG<-)~#5BL_nVvTq8*f|6AkkoygpH&GEX7yU1JLOTU2dcSj|xr)EK zoRCCA{g}}2rn%+ui*9^USpnu63)UKp^kq30Ld2+n!k`Gdek})So9g++(YR8@{(FeW zVn)8RD|%YaBs|sb@4J6I*H@V-srGUPVPMs`uUj8umq}aGThCW3`7BH)?ds#Mysffq zF3Ut^8))J6&*vpk`9#0_6Pi<3;+4apc_dR>oLO5X-)sA$_hZ-Y>kF0AwGqpM)RN7I zW~gVx%dB;(W7jYHvM&$+Y_FgK@SlU;1_zdgl?)7#!-iyFmk57Z;>l~QSh2Y$%+UEThH5Ar>DcqGGL3#Y&@rkJwbh^SKJC9GQ8*7R;}hHnRl`ciCO$${j^u$BQirR z!W{~6Lm@_%{^d3tRmJp-B?}G5L)%#3B=J#%*V+CZGzU-z>+h$9!n$_ zol_q%5hq;r@;!`820iY%Ie$cmsE7V0*3zPEC?!IWie`VIQthN-NyT^mce(+LgR~#)@`Bjm*!+wM3EV+_E&=aukj0aGvA;TXn z>y^(aCP2-jyJHsiyLZ}myuu?=TWBu+lun$p7+QQdZ5Jv<4ms2dIhA`E&A|vJF+P^z zQxw6I-S2-P53&bikXwnpfkx9r2g3)!JwMXwd-J*B_mM%%2-b#iQ70Jh zWalmp=902(k;|CxO=?Rj5AcG=sOJsoDB)+~c+fe>Z;WR{D@QeIsp-~>F3DudV0+h@ zsGNPD9R#4JOMRnn%*1?}NfynJvG>>_?T1|fTd03I)%{y^S`A&8dy21VAQ!Pq-bGZp z216hHPyN7m$d-RD`CT&+l$+&GoycnP!)PmcyjLRf2+9j4DuPI5J2Unvgt%+)L0_s~ z;=*_9Fm#o+`;+|&X&jRK@z^V>=Ku9S9(`DS-HsJ811oVhqFH}BRq3i;eV|e)*%9fL z>e_$$CZjK>6VEc7EYkwY1Ca>G?Z@auzb^}28Q5FcQF>9~izDwu_9i2xNE1?Ct`+i5 ztzCV3L)v8YRIbohDB&h$V)?=0me14K6-??&)r7c3ftBWM6taP>($4S8gFcoCq3ljdWg?45Garq;VF@DqGaa3fhpi`266&=Bl{Jk5zPE)_2&tP;{>Pw`d z+v{I!_KytaGqeBx`5L00&z`fI1_+2nC~0f9bF&nZY20JRW7%foI|(`b-T~3t&BISg<84#VXH#cWs?FQgC>8hWnx96 zaKCCxBmC1u+4M825~u|E32Wm3(1yYIEHb4HtPuk#6LY2!h)|}RCbYF z;mq8F7CdfvZFxlUeqVp=RA#NSObVtzKw?^{t8ONXuSVyPFP;JD_rPP{fpuf*gSP8v z4XQq6=FufR0!%j)4xvh2CQmWd_~^h@CRD(>X?Y`ZGrIWI=1uZ74=XWjc^r3&az1}FNxFdCR-m^cjy;B=B zjgMI0>3n||4-`B60^jMm0L5=eA6ZiiQO)S}Y{@6l#yq@?@z{>_VQQ}oRNz*TUoawr zu)47o_Qe&4nR1b(UHXWR{)CGrSiJ#M>^|gA^IL8izQpT83Ph|Q6e)QN&`h~2d84m% z<0xZ??0;mcVRS=iYg!FjBl3Qg{yX@LNEQgeWrBx+w&w)F-eT1TFwOA{PT`K*A!8}biIDgy~ zEME8cHv3>06zFzu0lKl2)1N=SzCxe~KzyXYo>D~DKBP^!z8F}P0#?Ue=o5_jf_jYD zMM-}HA>J>W$a}9+v8PXfQD(dc_YD-Rme9jN)+lWa5*_CUkyIcoaTIx>L69#UZSei+Q}%^E``JpNv_+!HPp$c zPC>mUl4;`#l40mv+_F8rFDAJNCTrr>O*d#l9`cQh3EcA_#9NZBW=6pU3fR34nL>IMcRP)_0#JTyXuC2V0 zzA}2T96)@dK{MN14fd!i= z%y0(hH1+Eauu{3Hw1wDFfSMIT;Wp3)YfvB~Pql%2<%kUGXjGhFXHQY0%y}qnMyvVg zR1g!qc1fpu0L_br#2p_F16QbBHbl}&j0RP#Md2}ec%p?;bL<@NxkSqBDE0c4ncb0( zAdn(*U`%*sRFQv^j${39zo_(YbFbdH$GwJ+WmT9w-X?cCtx#5GiL;3| zJY$*mF=vG2=7xel$U&CuR?Q+<4#La2XDuXJCB zL28mH>#Sp7P!bbI(IoRkgD6BG=vAmxX+oYvAs(q7akYy28%D0E#806-Ki2ox{)Rus zW9M6h+^+=u#g6u<^x=PF-{zSx1eF>wYrDsCT%;WKJszW-x?JFzBhBO|@(!*6&!8eB z*<^p1BQ`KBRQpW+g&>o^A>+#WWKIzrx#;g6cC|B-#|VY~C2Jvs(?E#~depaVIE$x3 z@Ux+{l;1OBhi8nG!b6Vhbo1dePP}<-A>xL9q$qZBlC;qZsT6-p8h@*;Pp<;hMHIvX z0pCg}Gz*zE1qm^+Ak_7)8|@T>tXvv9En%uJI$#R&aC&=2>fIHgzl>Cc7@!wJI3bZj zNb!32xJ^+UqfOc%1*8*dei$+gA8?$BD)=_L**npC7jedwQbeh?GHzi&sHhWX?5|C5 zCwFzCQsTFWwYq3Ht);nooZPR~|*g#}cM`!Hb*A%cmV?%k4xPlpvI-y!0{rmCH}rpxi4{Bvr;c zHya9-!7-UY@XH+^%j5a0^b&n?B_Ozr`#{h=-Rjk zx=lJd>n*Jpy~xq6Yazi94D4iX@FU`nO?CO223)&gT!KqKb@M$t=#=5h0)7S0h>hp; z@bDtK-CmP-stZ@rCE^RA1e`IbftJL$XjJieqr96h#K{<~Vj8?cY44PVy8(c!p=&b& zwe_uw8z6tL0kBjO)B3vMUeGW!yHFfR#m1yLn^empDGUu~Q3W#3?qSx}XskNo^pi4P zX;K5SR$i6h-%Bn6+>{)|Q<`65hv|pFgnCep7C4LMCtliSIlXO&ngkr~hZ1{l*Jsu5 zzV0&AGKvg@3JwiY73 z)~bJbV6)+4mkb97dt!tu7z@`*ljQ(@?v~5ok&Uv3dlnnO5UbKRDgyj{%aA>%$%ryRm;e z>8CHIUs=XkF1fKf0C{tuGFeL9RQP5s*CY)wO zIp>;5$A%`-SzZP~SZm$l=J-pO#z*3dzs%7FM@Xi+Fay08ID_=^ z1F8pSjfQ?6zcp`MeXeoP^$E=%oN<4Ch)`Bi28CyA;BRhFRcFNjP#L^7zDiqt(%2a2 z4qfbe2eky+<2Jc;qtYWN6CJpX0V^MO(%^(=WzhcjUBzdPPMGzli5jHLm!E&p5{VVy z)ku73LSNA-x7kh}G2QqqHOejgb$HSFQb+i$OiJ-fqabU!6ag?(u6QxRXh$c#Lq^$? z?!2mzN|OWd;pkOe-m_u?Xj7%zjbR_OXC)Bz5-GM=91jJ0uTKwWOm_cGejCz$w}RYH z%OO`Mua)__`yO@crZ&|4iH?8Cad@a8!t98{ZVf5352r#TaOa~q!u{I-JZ(2(9B|mw zaINCrQcl8apq|SBov{$TG<}QXHA_MlG_?en6J#amPY7;|7UQH>%mp~uD0`&T)OT#k ztIRe6`HP8SKvCrHXLkiH(G>m}zu}!+VAi?NQSUnaG3J<@ZF%m5lKZ(PLy!%vY>Xeuer zF!rURA@_@KRx3qYTMJeO03#xJJ4t#(V(WJm*NxR$)XW%H)KOXU^zGynrK|AImo0Z% zMgS_qwH1a^fCGQv7+&iUzk~JNwx7S&2~J*3SXxa+D?o53BH>E*7Ce`0T>gERGlR|M z1(9@Ks$K9*aL{}!k+n1QCG3t!O0kvt+eqDpV5L2a19><3UTkqZn-Y$nWgw3#aPzMKLOekceyrs-)7I52DhwpI#}i}!$^ zH6Q}pyqtFIWn#d8W(QLEV$*AHKwDyJ?1(tz(NljJ)-Yh;!?EuW$0`h2cU*J_2(AqJ z7edc%b8;JSWXFo~A%hJ{;QBF3~a z;kHesIcg7ogUeq=ZFK`b}NBegf5gSomXIVM6^Ukw*|g{naw!zDZjlri*a|@48wdu_E3^46JGX`AeJ*4d|Lm1NIH+@X0;#) zKM)IYT9R`{q#ap^oWs*!{NF0CT(%I*Om}~O;^>gqpDVyoA0nUJbqx zzENRA((>A`z&9%YeLq^Dzju;{&%)5$1AaIn3d1H>$E@yWg*bZ|Ys(Z2zUUhliMD@W zer-nMijMV-e&=8FW%60zx*je-a$L#Y*)BSWL8Yxb0~kHLCkLweBA=xfMyaCqFA}Wy z0wOX@_;0X=Q%G}SSfKA75C!DikUKmdx`>N+7_K@lc8r7d7O(X2B;&AQsWCUl+G&(U zYF1b7Tp9BK%B!H{ypjl;%mLe{MMHn`IfhaTIi&+^bKSBFbaG`u1E^2y?gR!u#-_5b z(oVn1g5Mx6QV*%V@50xIxnDODhaakN&|ODGQf54o9Fe#V%db_uhFyJNTka~*jFERp z>AK)@z1>z#eP(|BRQ*yIXGd063(iuGHxS4Q2IY0_HSMz>x+X56aJbImIM{zpY$3GZnyP&g9;hT5mp*=1mfWrFu+QF7@WL*jF5p92;fRv@jC@EYHRV zI9Ht-MUB5&kq51R~av zN~4eA8}wCZT3R8&bM$l0(}U>7;S$)=z>q6M3q4G z))XPIPxX=}>rq{2y~iB8@K}LL3(r1^uZPccx(r==+=eznv#G`dySjTyd~iTpJ@F2^ zcRD=!Y!C?D9}xQOAH*w(1S_RBeoCm{YW+#RTnXvIL4|g($Ow!) zV8jGdqx#TXMJrPR=(m64<3p5WWkt8O4w|(lQFDUNprhwV23d)<#)2|9m5ynjM}kXM zM1bkY)J*5`)xJQ~9{ZweOXYwmyU|G9Aht$41%1Q$h1asA>PBixJ@clH8#elptPhoV z^SE4*ClHoPm)bKY=f~qwb|9f%PmrQ?sU)%i(@l|6E_Kk{~ zyMG`|)S}J61++`-RxhNl8l{1qbRZqqifi>e$kdA`&EW-nYVH<$8sIaOY|@NUmsqUy zl&7Hfb)wuY`DS9gWv5d?axF|3uQ0SWfPc?nWS5qr^rcKMYU{Z0o6E5U~5;F8PQQpS(b$u55$m8CbDk=#AGcevcw8~3de zL!|>Fxmes~=VTEbhP=~(1yQrgMrLdW4ETem+$#?6Wm|CTfxJL@QJ~`6S8l`CM)cVh zVL$y6y+>E3N621+^usv@EfRsltmBo~e7*^CQKMB<$eM0iGPPwiRi>F%cE7USx~Ri4 z8B6oC5nO-CHFSdF-n&kK&^19GS8lqfOAl zFkK&y-%)q9Te|%MZ+nI^Io^;}*qk3#huzcaFSZ;hL-#$0SB6jDOI_Y(EKnEIM9h&VgO zE))Ly5nv!21E(AkZzh;NWoEE@L9FKtF`ymTge>DzpXr3>;!wKL z{y0>ZQ7oiVq;)MB?%3?WrhPuspzZtXN6u^XWetDA-hsTH)H?xQ<^%OyW9(=Jl~1C5EAmol zmRR}T%rMP=lOUB#*p5mSQ#cwHB8`u#`H+nuFsN2xw8{L?*nOJGp$9HTL_^5Y1tlY& zZ{a1>n`ZVl`qMD>9@GsuCZ_UUydEX3;+?yRItD^;CT=jNhj4USr zQdB2ch*J~9^V_Pe(QF*X^ptRD0J}I+z{YtA!ZeA`o-ngTB(JClH4Cwgt3f=uh?P%y z1J||)S&21aZ2`TWOiaNeQ8(__ob!K;sTE>oX0;^@wdF17;%Y;HXWpSSp;bdqm%nP< z`7H7Eow{6a4)GW+tvJ~Qh5kqD*V0?2_q+qP=w1;qHjFaG2J(RCi$ix)`N-`bwSB&< zX7C!ShKbqBLfRw<(5Scnxis9rbkr>w_V&@p#q$?uS#P9w(yD79e^q1NMzeo7qwDFS z^U2ljqqRfb9pI3Ek^$R(n0w*r`T9?sKgZX|xGPMWLy1~>a{WMz@JoU!=}BrT?M#|Q zHF^|P9#>8x0f&%qwhFZ!6WExSjx6X>pv1>qe=?}?Lk^Xi^rf4~H*Zli3@1ykV64-^ z`e+*#eUEmxoi^je7F)*F*HwRXiv@?y{i3^6eB z^6`B~GxmB`fNWc+4`L5W4MAC9lvrBMr{R*hq6!ATlVhGjPw_9S8S;OI^vbOy#Z!NM z`3rGBeqkY=1TgOEFu6R=7YgyNIKO8NwXZJeyUpHl;l`Gqoy^}}1Kx7}R!$b44tg`t z@yjnQvP_hl3`mWH4UF8qx9fVr?F80nHvmKO=ivyWx zWT}0S9-$aZg7=nMG)RB>ZXG@KWlzNDUM8?sx|Bffulr+6VmqKW$wxHF>;O<(2N$_B zIt)nmmsFYkZM}5A$E$w8^i?#u6GC43IGnB%U$^W#<%tu&KlceTSxbw_p%!W?92ijA znb#stJe+Eb#h5Y{RtKMp?`b_xEj2CDpr<)LDHAdsv8J^%DXAfrE&`do z$@l!e`dyYB`j&sa^s?CAq&|aF83Wr(YHNdO9Q#>nwP`UCj&8syGieGddE-GW3*{Hi zDpTPI$l3Hq*NF0lJZot)BUQD^pQz0buq?9oS%EmXjM$e=J6vMPeFI#5q(?99$WQ^f zpOar?E%F3Hgq3r*a;(r3PvvI<#5NPO6V zJ%T>K6PT_d-|f9!M3JDe&Jq zo1S8uqC4ZoN=zoJEKg?WAI0{$a&K{qpUQPO)p-^s01)aP5if0jtbxmnrAOMd5csL~ zIpVr=9?EE0N8FsZ^%6r@L%|3XJjxrlN*hDIupu76wm^4KBQJ)}yw(-HA; zw|IY!3eAzvTD>aB6jT;^7U9KR5YdQYjO7 zj{nsZ17(?K#w{1Qpg#fjFJDb2AKIy0CpAzD1)g7w7Q+5JsGWiuil-_dGF*zWY=YVK zxdi8&%WF5StIH5S{fL*INznYHy|T2s?A76)WHF~5Ge8vId6Y|%s)<1pQC&>6(x`t3 z_FXscnfCFT62XL6Bp1`n@Ivz=_zhD?ZAr@0`YwfdZfE@9EI;(aHrbFfzn7WUGF~TH zs7u`Lf#|Rn1)US)+C$nx2fM|&q<#_96v$`RYGBdBzE$ z>RBk@gI*Yo(mB)vlz{L}jFv}?#)N;)#n%7=-#@TS=2w}mo)!j5S%*&<=P^t+6h-pi zZC`l+%C99j0GUZ;xq5zMFwI$4u^3O8krSA?4R8IAT5UMP&}-=(n9`zZ5Sn>vecOpU)s&1SRHdeX92;&pktjv81beg9XcK>AXWymr z;LEWXhtStAR!uQ05O=3UQK!pM@$k^bTf@APJ-U;w^a!TQ)$)v@8(B!t8yznzFO(t* zQY&+>dQtT+Utbrh2EciI8wo8ENwWe@ya*v|D; zuxREzI*no5`jNkngZ=*Ye7b+HLlmA}!;P-&eS!~W(~Uay?$C+P0-;!yLK z56jzf-um^jv$yc6W=pN#+D9N5Qq^)Ya<&7ZfpAa<4y?sbQ6(I~@h^2-Nw|75$f$km z|7{Q(MMO^o?&NEj__0P53N7c08@!hhwU`~04)?7oZ{Sx6RMK%Ot7CsnLZ(TD0Z}jr z$Vp#Kj?t5lyf){GA{5WW9V|Y!LFe+tRSYoma}cBLb-p7{&iW}8UrcC|)kq@2jV{2i zqh<{A1)a7JyLwIcMM#_h&qM@&YC#I-k373uDoUKx8ZQpQ8>nQwF$uo5Xh{mB-|fqQfy z2@2t;kEe@WGObDtWQdKwiEqZt1iJmBQLP_yYdX5})(9 z`W1ms+}vnbUL|0scAfvbM>#{{Jd{)L}FWGlJAHx{E0Kd+>1A-KoSYfbC14D2FoD zuBwxO>KP)1K(*dl+|;rbzvic7Yzt!tOzpvM65)S)B{jic2xX(jdFd~^nA+mp8J%tF`hr)(?8dn{lQ?03bVEirT5s+dseO@Qc z#>oKp^8?cMtI5J6m#67(=f0}H%F3r1^EOt#R(k$P;xJ^qWczy^_}|+5oY_ATW13YM->T==34Abr@?uTT7Fso4gwuAq-z2k!05@+)NTyTW zbfhBN-KkV0tg^o){Ab1J5DGc7(B5d_A&zI*D>d3Sf0|$2(TK?EzfT2W%kkYn-uA2W zxpLHD5OX9+1-nu~b}#rNn1Vm@2Vsp3P;BhUKULc;)rj$#4wZ;JnYVB3cb_BB1}ZIo z#1BHwQ4wr3Xfq)Fw-gYX9g-~LS$*B_-WQRron!li4kEON$xWp@abe`Mi16Z z=;kI@hItk70^LK~Py32%rUk2^w zC_K&xa~`0-SMGs|pEzMhER|r{;SKPFP8wC}f%ueF*JtQ4kn{b7NtyhA2{qPoK*R<(G&2Y?@c`h*Xf88MJU zs_&!NAA(L#)=0&n++Cc3_~lqx>o`LRtdSLHoRb#5>b17~i2>1|4Pg}vQ$+B?iqbCx zVK7KpEC11$+bi6v5RrMV7Dh!&vk~u^EE+>JZbMm!@1U-5;g>c)%_6IhEC|z2M=ONujGgne(SF`S`51ZjB)}eHB5~mu&)i5%#B}oU7j`%wj zllX}Bls2M_-`jRHi#mY~4~*WiI-SnjgQ;AU-!tjKd*_0Gp!iI-fMLdX?x5o zDNT1lYFNmB5zug~D`P6(idrzLrTS6K{2{{(P^kTmeX1$4?dx&k_@_e#me9Jga_{kf z)pNvPQ^G@p;mQmj2VuV%i*-QTL&(R2P>^#9$IzG01@kIuS&imSfjx;|?dL58vuvys zx*UO2x+}Ac>(~P2$PIJ(@>eVXXigPTNQTom-kLy22M~cXTMy;~B^e-Ory#pm)q5Llt}U zv(LeQpLhH$dPFZ^+il@6GoA9?YPH-+gP)QRuC zbG(RB!DwB6;|8Skv}a;N_QQe8AWVP490QMk=C=7@n@4(Zf2r=mnPwtZVb(%q;}(N8 zT|St=FVx?*RWHdw%91SLI@{Gfi9+KMrbn{U9#%AMIuPS%3d^y0eoG<#Hp49Pr~q2E zq(J4xC!ooC^l$RzCq{cHwqPk)HG!JOKb7d8HWeWwxrwPieWM~^_^PZW)>G6<{8DKWQ2TV3u_%|kS~^>eid>u_aVki3Pq@0>SLzoQ ziQ7$~ILsZC>@TH4=&-C#Sq%5%tX{Vo#^f!=)bc?H-@z5VRMm5`Ru=5f-$;djOv@2! zm$-&pJrRy*l^E3d9IwCujIsHWt&(lw%3oh~cIoE>!l7 z>AZ1VmqLo}SUO(~AC;H8;&^kpnCMc9r(X`UO0H4@JcRMZCE*9F+N)KCu8=vOnc9`I zK2<_W@Pdxwl{^zM2j%(F>iB&QGh`a9y%9~~>mnzxBV65+lgN3(HEt{c#L}Q3wGx=5I zxsx;eI|y0){7{Ar+V%7;T40Ms+*?c0iWDXt5H`Ss!!MrLvMF50x9^YJu75s!yUF9u za>4eh!Ab9bhjQdJ7hU#L_$+W5={!h)x31ww-06VtS||4*7bEOx92Z2t^p|6xXx_J? zXUVZ~BO{&udT`Kyg=evU3I`qVwX>(p7^H(?XJIr{E_cwr;50fiYz^>lx*R8|s;cs3 z2w;o6O=dgm(Copbzlpa@E2u+=v6@VBO-1Fq$+d;s5E19%Xyint z6HR06L6)6hu`)15^9SeL{+>4Hgpu1$4)6~p4oOX30!C^d57&Kv<4?=Cq46-1o^Lh3 zp*Kv0WZ^4M`?MN&@(7rMcrRntNXnm0a*Jud6vA(9u@4@WbMm|CTQ!P`T;ZS)wvQC~ zCRx#Wq=DHarVG=nA;N=b`Xy=SBnYc%M-?wdqPdtnP;=I29O;k&)L${>1YG-r8 z3qy7IU4w;j7L%TTG(2pV0ld7H`EbipVTaC|ey2Yr3~Nwdi8qQZq7ullXrQA5&WZn6O-g^=`SxUZnodq34lEK zmBw98J-r`baYfF?Ev`jLxfojO>zZf5%R}hI%d4UbcWSrGhdU&T;1Wvl30$auXvWtp z8c&Ft6uYwYMu1-vrrh@90`CjYm1ck;^E6opEp3@>BE6W6v1*9Su@MX7M3I(T7`*~q z{oV;Q?NARB}4CJpO1r8e{gJ{M?{3p5Wd74E>JyiWQn)6@n{P3{2PQp}u> zTwO-3^H_R1qd5d(6?#PGpLAp+g&wzCppY4*ko6#c9y}BTu0G!hi17Z^o~?YQzB;y- zi$zjRUlqXlC##H`^zb1;y|L$zy}MoMi=;-ks-1@hPW(~Pn28bDdV4>T%wXjUF~4E@ z(t4L*k3(Wr(VphkdGU)nO3`7X&1u5p4MB_BZx}ZEq5ILvdbI&OoeRV6KPIz$XIfuO zh#ED2$n6N6OXS59Hwhbqs;aNHR7DbUP8IEb3ugI`@vRpCUB+Z%knP30%}m@BaLY6} zKBWiaPF67w$3CBe>B1?7w|LPX(8=@(@yXtdXpy`Nl7%cqIB*mldLpa~C>|wjRTpJ^WB+_Za){9aCf! z#ydqIqd)_ExkQpaL_Be;!=3WRu6JAuTCV+;n2E(Y@0TI0R1sIEj!D=}9U>?=1lOW} zsGowSUl(2v0W=hVJi`_~0k7yHWn^>~GU&n1pJ9@lhY@R4D!I2W1_mbQ1KP{^f5$9uE= zTX$JCTk$3PXb1Vb;QOMcu+O*ZuTLDD+fu$RQI(&hZlODxkE=@z{f5TiI}MB00JD*A z742km`WZws{${HtJ3l))&8(ym8Ucq3W3~WYI$Ij>gYyaOu_tsjMO=tA)( z%O`eE0DE&6z8CU4n3(uD4T)*k|P zjfs9PdWkDv+?F2A7t&l3A1(=k+~L*g!eMC-FTw-q5KF}Y3m=1JQH(L2Bx={Mt*H7| z-6w6^8xi)0?8L33*x=RvDSs4yb7d1e26$v?Y@Ju{@VK9j8r}4_Ns~fZ08s z+zb&MVw`kd>twRY&sGp#P5Y-1tlG-Us7KVUNM;y+uN!XQ;lSZ7oR@EZsv}r3PU)-A z0JM?Z@yuDYUC`u1#M^VMiOP zV|$t$n<^MvXX+ot)+fdFH~xdi?yOZ|AmSv2NR0FO-i?l`!g6F_mj~j8-^kV>{&ByL zz2K@>OYT(jxU0OgOl24`@VIEQ&(Sc&%g3%!wqtBb+i9+U5knfsYl@zRtBNdr!2{ZT z15DH4D(sYVSmWrheKK9j2~lYich5|}ymUXXn}>b8typeoowro-uhWRA5APGT z?k!L5G)@zL8CMg*GAhO>cW5iZJL6`h&!bhERvbVeY}Qq#vV2l>LNnG*EPIl|rPvP9 zsL#AZWylSLFfA1@NQdDRR*+pg3dbtQjV*A&rQzO+ZK3UVY9Zf_))NXkmwd6K7_4Eg zB1SRnPEmg!`pkyyi{Y?oG2N)=6jgjd;(KNIhI*WT_8TqM@_{cwb#gfOkqz`eba~!j ztTl3oKal`y!myGr1~nf*T#r`0^=D~|M zDP6Esx0Ne?K=St-hw0Godpj1R!E5>#a-bc~(;gsV`W4CK)6uuHN)#=;ayIzovlUW` z#V|R4+lnHy#Wh!)uhX=srDOhD%mK03a0~}+2)B7xot$o}DE{r0E>IIx74xPoCEJEN zBF2O#F5{9^*Ltem7fkF2P!`vam!Cd3m0yq2KK}oFhmr##^a_a@))iDBkP(u9&5cnS zO-K)pkFpZ4hduLVNA8*N%ywWkAKdJ&P;2dfE0UODFf{9Je&l!HIZQk`3YS2M+b6lI zF70d=O4n4<)_?1<*d06I>}vwE_Ic-$4-?eNCl2>CK!~&e;g}lVMETHdm7#v2Q%9?Y zJ(=P8eZVd_nz%^?ep=}Srw-M23F+ZIAcXW1G5qtZcK0rYu9a!}@@=Y?pCsZsB$#Cd#VcN2=aD z+fkN|H&9jr-<8k_@+L$#SPGAB`k*$lXAB0PwMil4f^k2?;ste?&4IgpMyAmbiK4*P za4J{}n38VZ-Sa{=p^ZbscSAUx3P*Bu6ZGZsVkK#h0QbxoL5S##hO$#X7vi%= z{uL>pMtB3);o=cr?8zC2`~D0*$pvX5GV~{?{4`lF1 z67o{5KoJCI%F(?X=}R?#g}yS>ca-?!Q4!+hG3V0{{spqn2S+1%IIFEcx0=1@H}2bv z2Sm_kfS_f)eGFla*%r~E^UP<|?jI@yE%ulteQ@`Y^K%PyP`#yeog^s39031HkeQyQbx8Ayd(o%V#pxf?ILdrlNCsNpExl2^T7P zc)~;F+Lne{nS3sazwHu&gNTa-DRXOD#l!{vM6mdOszhRS#HKz_A zp_f0A%$y=LQSk;}Wq;`1T}PNNzRi>Rzok0snP2VCsMve4k|01D5@N2ipj0S? zH1gcJ)^_FC)i9FWuPPxe$H_ydndE-Yty0HZwnTC?GkbdJ^P``#e{^G7sfi7RX$W$4 z7s~O~Z}LExp0Fm>Mh$WjK8@`=VP7#)T*%Ip-MOrafC!;^MmqNJUL>EH{`$c+lj?K zwc@aUDul}e$(|EQT(OjRZZ+M;&=R1pzS)KyrNZb|5r}_Y+tf}E31DwKsin7XdMXIL zlZdjrTmJJyMg8IsA6dxvFyhCczA_Qo0vg=nC2V~1w?Wd$+%KADYQ|AJj2xlMP`snb zeDDNaUcFS9mPgxp#UU?NFZ^EUBYzMTy3c8UV#8z#sHV)DNC5QF4)mVvsS)loD8g5G zB;RQzZ2c6;9?=K#Md`6gt=cq!2^lyMUnLwO|AP-EQXnJhcUFyR8H{3cGnh$g0$ zO`bjY9ImPhkC-WzeiPJ~jW(p(=8GUD_7#x{O>-;zB{>tK)bAEe1bx&u5Ffl#^%*LE z2mW`wdr=#j-CcT2u%U^#KA!B%J&40)SxwBZNQ$o@e|?-|ELWdtdBQbB{XxL-sM8Sw^`0Cm!nc-gRl=iV(#f%NKsNYf0n zB{9om*YZ=>V1+4%Ej~bS0b=C?CJ}^=ajPhwg~5uMo9~iYKreWBY2Zo8M`Hu8Kb8@h zE<&56tUl;v^+9o53C^y+DNUm$J<0OgU7YfBwrNSPDJh)tDjo69Kdr?7T##)3I{r6q zZ)z<_ECQ>^MTwyL+i1?@itkZ>wo=?3?krEB#4t?F2%X>rzInD&yDWSJ=#zSNeAoGsRB&d%EZMQnk z(43qXFS3vD8(AULjO7GYVr#{BUr(R5Y1xfS-64)QV&$`wu76FZQiINaSqf7-_+gJY z@3rXhW)&#Tld@bLT9NQ}_82okKpFEQe2lByS~gn~Zau!z&4{oa|47L+qxg~xFD_wY zG;_sL~7^7QC_<*w)}gRP+K(05g5fb zGt|vecZyJUGLcX?KnR|HIh|eIqp8cdW!&|J+=ul6#&NX)*^Am}<8|{6D$PT{ ztlZ>joZS!aw1h$&%R?h$v^aO-GuP-=x!-G6x3=P11SwGWFD$x@8^x*_9W0|AV$KkQ z8!hV#d66qg<)`sOA?+6A?*Vn+H%T=F&JOM8=6*gV7`DeIWZvd~UxtkaHj?j8`9Ror z{-r@{;fU|!Y+cD(Pml>q$ zWwU~v>$Tx>!Cr*_I68|hNr51Weh>@XmW4YM4m+H}-M)T*=vmF_X(`Bzd~q*|Osk!F ziycO(ts7eF`QSHj=*=#D?PJG@`0^mKrNP={Q;U~HpjWO_XARpBLn=QlZb;_GZk7|d zT&OU3j~0I4?_kdGh_uWZ>5Kld*tn$o{gmRAj+ty*$$(y+oTOBGen)V~nk+1}@NsU6 zx(mjj4YHJf5LI87E<<{kKxhOdMdX>hUwL8*pYP^ahXFa8Yuq!d2JHu0tx0$Si#>V# zMhawFKS^|KZ;brD5QlsxLZ7Z#%o1|6ycQ2kIEQO~mu43sKZNGX=aBGGMoh3f3h7YO zvC=RmA{$pc$%E0^=;-MJFD} z$Tf}X&F)Jm0{KrmnK#_uU#**(6`==l{>g?)scrZxdaL%?pX2pHrkJ)+Ddk|q7){{a z59gg&4$UxetM==5=6!?fKw7*AFa`)pRkDSo{p(X3K*wolw}V5L8KGQ%jq*K!8HG%y z=hqH@G4jKUy6?%5SqcPDDp^r2dq(~)NwFsy-dZixj0oa9sI|LGny@$Y165+=I`kPH$X7Hbjpw$B4ime6F*v3v7d!;*xb;V3MAFb z3@QymvPDAiW-@K(RSdn1Yn|uEV!F~@eb3*2t2O4q0(Ih4Q2Qe)`?u)O?Dj=JV$PoF z$#jd|7CDe0Rr-h|j$`|29v;#ilg!umK4TKB;;uf8t=u@j-!z$~ks!M9H>p$7iOSP? zQJzy-YBaCes>$!6-gj^;d5nx)TW2rbFjv;y6mTH{S!|<%rW>DkV4AZ76?PsP@Y!vD z>w@1Fzc3%*Fx}`|ay!Dv*yyBeQ#us?_#PaX=p=TDrJr?7u-xlX7{7)$f-*3)s>!RE@yB&1O4`%UEIq;J2bhRe~%^w5IP%q?OVjiWA;)#JXR4O zd-RzRGege(8F!G) z-e-knYg!R)ax1-cZ&->-Jpd)1}JRv(J5lyApXr#!v%@*&gO zvsfrS%4^`Xal!BW4*>LzHJ-}a3S($c9rd=&=jk&X+UkuEDhPUJ< ze2CCpdmcYk3XoL507+h@w>TZaf~$sF-1?fzHEEWN<<7h1K~A|Q^_#Y>ozS4yS4c_< zXO8gu`HWetG34%fz@%GX80Tr~eu&9ID@o1Xe88wSRNkDVkDKw z$8?3$w-*|ovh35a_`CmOgaR7i6E%-Kw>k}L8W6Mk?mJxYbm$^-^9HbgV*OIRGf4qf zV0kdZLmmDOkL=s4UhBKyES8y1aVHPv$he!LSrSy>H-CAg1V+Defp!WfK zpTX@;A?@T@9E8((1i z{Mnu@(k3)RJuXfsG&U7~6xj&`d|}3pB#IndzSTZdj&Mrobb0YASZucnKMzqypt(>u zJ`bYXknUY_y=6YksK;Vi!#p z_Zxm$9#maiH4R|OY)KV1a4Yy^;0#F0|ar=CyHTzZQ-s6sAO#Rku8)T z>b{jWr3Tk;CT_)3o_LqnVm^`9L80pbXNd?$jmEgg18FVc|?SjtR1MfTM_{Ke5UL_SAwGZGQZ zFSZ*eVFoeh~bYe9vRoB07y2Lv3NSraT0YuUqSWM~bf8giuSi7hvA+*b1t&lUU! zK|l~pvCcbpu7V1ms7sE-M2_wZra|p6&cvbbIm#cNXxnk-?*1E)x^wN^QPB# z$*Hzzw;Xb7|E}^t+&qx$IpA+oF~R*F!Y2;gPba%P&gHa!CGvBy;DTT@)b8^6gpW(q z0xG_OE#YZI0(44~gx`voCI6Y8^NvR&`i_BDI^s#bG%OAPFr-R{v* zj>frZtfJYVWLx@*;%osF;zrPmcf_=1@hU4Z>nDwBr3(vDSp~`h{PUNsN*;^?VZsw= z3cdL?^6v=Ot2_eavVCXUruTK-t=1V53*oRd%1Et$K1G84yhZl+tXW4OZkz>`y+zI_ zHCoV)qvIuz!(;OD069Z1K4uP5^44Rorg3K5-odwVU>f&e!7rwo`%V!mMlJ+#+ZK+f zo;KwRc0y#(K_1#h_FL&CdV^*Zy9=O5L<(JqE*v!H2D}53R|22cn!gN7Ln@-iZk-&t zZnFx1lIOp6rfpmH0hXkuqW_T_rz>2z_K(Hk$9P;X=yx%rdkY`)KHPV<6KF5hbPoxS zOn4}p|lzjTX!~;WOS9(8vZ%%eUqc!Bp;FnbmWP=V+qZ=dto$L zU6O>s=qbYW*?z^M#me8?ecfVALJ=#sgppor1eJ`3I)m9XnN`C$n&a19g`jKa6h8M!4GzS zBZ4q?_lAuv!k=L2o2rT0e{(D@zQgZ+Mb3?e<;P#dFe|_hB1hhAE0k zvTVm)4Dk%XMxS3ZX1oP(O52RzfOt8V!_bwSb4l&L;X(lVNTUqg7ehw=NZ6+W;CW|$ zsbGdui?4j{MDc+XNGv9ga^E6U%!!1eE`XMree(YQ79X?iI}y4bBxC$(n0} zJ4F7Sll#MO)9vPID0?WJqy+eZvy^ph?<$x?LGIpISFfV>iuj3`Pz@^iGU1m3)081- zU1w{UTjoT1MBV0A$!3sWmMyNxM)`a!1?hhi_4k9M^Q|!@+5(3of#A?2>s~m2J4x)~ zSrUu@%x#7E4yOuiKi@C>`_to&#>+;_4SD9oj)|*nw2TcKwjBaCkluA_0`$O!7ybfm zG>h*R0lSI^_WaTkypV0ULYwL(#*!;ywrnA1l6}#sVq4bG|$5 zt$A7CeKD)I6zQg0GE8WrQ4oKB?o@n`y4V$X_$TVQ&BV;3MIW<#%BP4818%846R(6c zNuV7lv~FWcysXeSO@BH;T}YCuJOxuC(fjLKPl^+t&DDLJo+gHjCy6-2Z3?BJcPF~o z_oKEb;UlYS?n{Zc_T|>EE?x#h{dVLo&s(>c?sd{NW^SP!9 z>;`Vbt)`oCwPG}#H4;W?z0SruHSd?I`+BzalMqRD#&|%(jDVDiEpB?Q4U)J@-%dUo ztD<7DZl9)Lb6hHRA-tdVb`2s*f1?nq6DVu3eb@+wND?4l17Hfw4Ruh;?NjJ!3K(sb z4)mgTQ-SF+-sX|(+qCw72ccS>7^J&>CVwC-cl1BQRq3YD8ZQrc3A+Z}MMT0(lu437 zzLVqor{H0$)3XiD_Ez>1lYCGjX{&n7GK=nU9Mx^bZ%21t$Gc`PmYxJE>c{7!XA+}xU(pHE{SKl zEGJp0P>5hlcT|hXrP6o9YY)=+&mKC|=1}vXz{7)rif@s7JJ5-4LQ*sC&1Vz4a@X&E zk-kjwx-S@N?l6SIZ-H{(grNRN?j6&L6Y;15RE8YQwdS4A+66p&ub~)0hG8w*V&mH` zBe&f8dsd6yJ}hy6aU6eI1&ZBbrM?@pa{~Q_qGKs)N*4>_yTTfQUJiI*?LIwrCE`+C zLLlr_Q3X|#)E8n2>e{En^`q!$P{g_5R7U;jRcS`%v?J^1M_)wFaPQ6^>7=N2Xw@pD+-fF_a`2KXRt^g2EPE)33#K$JQ3=!c-s@X1SIa`=e8$J ztdL>zr3ZltgUl(A*Ey_CYtSEGi(3kV@E!4W3Phy_KX+Ve4~LUo!KLo8QZ#)#alJgK z^s2)36c|%5cesh(59~VPTIQvb%+ljVk8*-$QXLI{iuGs99C!QC%tp19`*7#Ebp~Eh zRiWte;oSb=ayeGwF*8hB3|EBzEg}ZC`>)8upCccGJ1;gi^%r(uyh`3Ic>4_zxDYW- z9__Xl`cc0fXeRx7IAV)|jk!H`i5`C%Apz6o_qNhMoR1Ymsu&~?r8*o+^tJe-bzFP? z-SCuuEAx1f2Me8^o9Xn)`f?7F>|L=5hg$k&2ptIYP5J!zWd;?wJ8dr>rdVH{4l}a< zFuIob42#BJz=SdN^5G)}XXDHjZI0;Hg5; zbo7noTa-c765A+xZX18Y?bp@Nn)NhE|B6q4)${<48d^g<`#$KPs`6Se7dJp2-%tOz z3`Uj6cp^Ma_6SXl=XWGhi+JI@pCU$nRO7~+YT78zO9MgoMlslbcUAUFTy^8igpk%m*k-tY zGbBj%I_2VCdl6K`-5y{VXj$HQ&vOEokuks7I;X7`}sj#5C}!?;^4+htO$%14&sA zTL@6>vwS)x^f``B(2pOWiYq$Dv8<31`N|oH*-P_xk!bmQ(e9m!VcJ&R@|G_uI^MaU zd4*ALjoFw(NL%l~tEaL4G{25nh*Z&adZ!(dT7H}A-6wFZa+Yo-0W@bUK4LPlmWMW* z@rq&-cU6q$vGOQ6jReeWW+x|qUJPiNVO!3&i8lYvR_7wRqzJmAXyC92cHkBWG*T91 zH93j&*N?w;=^V*s2qVPTerPmuc7uTbDAS<#J8P`ZK`3nh{&1MjPG>3*I_C;2x|wQ1H`=#r{mx;J4bA&-+==fXz<087-|k zIa8q3J67d}WN1cC-yxDra?dO@I0n{&&fXo5liYKgI<)O3^Yta{p@WDr{D~&QgDA~u z1Bo+P5m5GkQYG-nBr7q0^1b#V{d&2%L|!ibCWsXMw;wd$)D){Wg>BU*%z3ZO&+E71 z9Ajc>=x|R#`${`k?)okC(gSxY`@f5uc&gOF&@N(DDgwh_$t^!@Gbl{}@DQhrG9^0m~x0 z?9ka@*>Xg>xB)(X4b;G^x-05xH63!|QPvHU=XR)!;Vp)qA#Rath-;M?^NEY#N@EGD z9KK-BXu81T(Ys-PiCYG)Of;RsibpD6vZ7jweDNhjB<&j2Bi!Vie*0dQfQ${(7<9V7 zEO&uwd-L0!VQNUP5X4%sR6d;*sy2;>);xrB#UE%b^*;;slt);McG?R^QyURrY16+* zY`3KK=uZ*b$?u7NgBVq7X{w{Q{H{IfdYmIPyqy_lFPUwBgBr^tO~QsuR5k_S^{)O9 z7c9)4^^1OO2hG+wSvfwj`J(rkbtTBHJ~Wu5VH=~R8VT)V0SV^?Jzh^}8dpCt;MfoD z%Pg@)PAq%%B5X-b;He@4k;lRkq#<-5L`5o+Voa@gYu1)Xnge)5Dm3Bl*`Z(Q9vGwzDibDaGm9y z(&`uM2;oLym5ip1IKY}-dvkRYQHH%x-`Dkm*x2*9K>crEB|P2lJX*xi1+%nw0F3btf%;_S$mAp|FZ@pJXTZx0n7h)4{$=pk_XBKnOiA8_BVql=qKNBJFj;{Gg|0ZL3BPu@>0j)X;2*JL4o-f0L+IL||F$BFK zKPFIeX68x^)CZ|AU^KPXlz zTl=14xz3{TZN}f<~jrN07)J1~@g4ybKnKf~Q|-`^{*9-+dE(A87;-)YBIInpwErgsAP0 z9{0b4ulY1<{_@cAovaAAW$4&E2JDU@1kxZ=X;NJl72(~Zrz%yN=gey9^#ojhyyuVT zHXi==Tm5i|v~mjUrA_Szux%81YbfHx%&O1L-S#4kFs3)OA!C4NTG3EXhIramxKMjb zp7;qk^m8IeYU#`5YO=+J+S_g4?Z%4N`#C`qYlkzY-%!}|%dQzT0}l_{l7-m%)~tbMFESIzA3s1gB)Ar~ zI{n`j{avER11D#EtxXf5er!ofn&)|gP3}WOVRYq4?`-Uqh?>f_MQCGx7>*E==(1O@ zOul%wZ@e$@;j`}+V8hJ4aX*Ixk-C$HzpWc|WKtY@>S+d0sIttT#5v0`==zK>b@nCw zrbcx_Wk~Psa}(~PwB@Q1n++Xc5;WgXlIHIf5ybR&SGF61MJ7vT?G(60*l*veM3i}I z1O{kY9OhvZ_&`$}Xi=|!tHbtYS$}&iu(>DkHZ?0rK(p6*lLXX4!>|dq-3ET%D0DXs z`;H6A{(i9Wc^>23<%@Yc>Z9Ixk(H}%3I}eR-DWOmR5awi-@B^n^ci*!NTNH-n%L{= zeZ*|H39rke+!-Q%(QT9@v$_UeN}v&7?(uY$2I;aM+fFFZ-o3kj^|7Kh_qQ?x>y+ix zw8Y!Sh~WLb4hHJ>PPkRtoS7TJa%9&sv@|qWhfi=K0SK6aDx2|}edwyE7*vp{m*+<} zorGnoSCjH`(rcYI=Y%#qg!{p_e(AFAb+ZheKi#+|w|gU;hvSwqcV#@}FZzzKOl!kb zQ(|BvKFxjGJA_PsMME|L+N>3U;1$lbej=;F$%1o>R@Mz@A;9ZbzmHaY?0O<|^i$l% z_^Q1&fV3R5j5dzpf;2fQ@|yJ5Hd*W zU~5%vy9RK7Bzk?DHSE}IkO44HD(4k^cSdq2MMJ9@wQd?$kk0p3ZHQRGWa9aI8!(+t zM=z96mB6ov484sZaBRF0kHC8k_IwI(T|;z~3t{bU!(!0YRK+A)@yV%jHbis`4d7LX zWiQ=Mwx8-y&D{c0TI=SUKNbjr-#tp2?u2$e87RbmO^xR_z1{iN5pkmuKFOsh$Pz>f zIYi4sif)TLR>&epIha{{gbbP0#f!IqMSiz^wsBf8Y!08mODZ*#{O0WEF)<_$`+{b_ zXyJdLy1@pGpDFFdqq3qVtL(l01$4iP1pN%pm$^h<*{$qWo_BwP7S44>yMZE}TT*?0Esbz?XrwmafeMSbVEH+~C$ ztF+oDFr_5EpxWC14&YzP4qA8py_t)n4nMttH?#lFPrwortMjj5LC6%mhYW`0ERRCG zAu!y_@%5X0!8t>`^2&A`i6#L#wD1~A5)%)q^I|WC|EhGjMp!kNh7%1bicGXZYxD*@ zkmelEyNu6}bK&^gWs~%xD1@>?OY1;?&-fiBAqpz;&o6b=n0b;fVCJja?gU(&xGen8 zW2N#*y#b^d^0hIm!y<_IDMKRH#Isns>g79t6FBHDigl|J5?|miE^9c?!TL{_5Hc_m zF)V1<#oOP$|L83o*aAxB>yY}=UDklyiaT4v7B+b?d1BR$d@r??=Qap7r`}(Gb_%V1 zC|GnyWd2>DR16`sm``LWQT;BEk1C3{d7FU_5cZAc>y<83FNSbz6*6a-;&A@7oL0)^ z7RlMCe~IuRBvL2e{Qj#IksEq$Kbp5_!CpDf_*3F+WQj4OOkJE^^!tDEjl=ZtlmnaL zQTM4uvIxR%?L!avX2+wv`sHAMRHWtQn5&bjdP)&;5J0CT$1+6BLOjco({^I<<9$FmtZR1Ea`vyZ8qqySMP#N!v|8X=} z`B40TLGn8kTSg-D=M}DI>~3aU;7y?|DDR z#T*3VMLA*&MzrD@E^>&gIWmkS2I8;l)vLYD;faI2y*-mfk-?Qa&=csc{W05cUXXhE<%GV#%GhXOFcH<_Vt`=tcNW zKA=J8f5)bxERQ&`b(FN6H<5|w>o|Em(o`tPuH8LWqqD>RZ z1|v(`B8a}H(Tbx~Rf7j5VxJ@aW2DOF2$-3Z^{Dbgg5Xxi=R$#h0d|C(3{gCO`8LVg zyQAdD#rTpL<%gG+T>xbhgx3*dxKCsD#XrY+s2?YDZ}*H|p#O5O?OlpLB%CvmI9YN7 zu(#ud!-dOf(4F=lZjz{mlkMvMnwI#=v1vK&T6M;e8M`*1{pf$KLQ2fXKTGrnUihzY z)}GK>0bo+^q8?3ucLe3>(}9N+93y0XFC^QfD>yHm&-eAbM!-`oUHk_6*vh*IJz}vB zrKjO)GmZ$|N!cfeZp^#F9_}Weuc&Bmilb+9ko5^sV>OfFR#fQTZz$zf?KZ?|{g5dJ zbr-0*-a@kHEyX#et9(N_KLYjBUjS3u`O{W~BS*=+R`i|C`K20_Pbs14{!#kh9)GY4 zztT@lVdFjD69904D+i_uJD0oGwGFUq08&7$zoZn2dTQ}7$F~17 zUig;lE$qZR(ZVXrv7y(LqLW#)f9YC9V9f9LPk@qDh%dH_ut$eeK~ z!_acJAe#k(_u`pzZhWyG0s`t? z!aE??a)=D>(V!j*FQe4JlXijZI5xfAOHJcxooW+z!j|2{zvFKdepv!Q%}h;%{v#6= zsw4suL%(8be|zs(VPiSJP)Jx`FtjS*6Ocrx5A=f9D$?tBBAiyb;1LF#08x+lDMwpo z47sv_bk{$m-kMKJld@SQNa0whJ2m(axL<;;Y$h>s)Sn%fN^l0FV|poC^zrOhqK@B> zBNs{2$=Sn*iZwbY?sq84QK8dzHsJfa7$FRd(PV3Se=E#Ugx}O21H>!<(v8Yf4fw^t7N-0n}`7`yEpFXesa2)z-2I4iQDSuk8(f_Hse zSaKF~h0^|xE!e`HxE3CI%h%75VYa?oQBMWOwvU|{qf~;+=a*K2vhXT&1s)U2OXEU6hYoE(kRD1wms$R7CZ|A{G4o+7=ddBNogZ=!Hgxn@2^p z9-4nva88dy-p+(;nXGnMsEkJxU1bZ6L ze~xz1G*4}4J|wy(aUG&a zH$o=V0p7xMxu3T|Xzz^*ND%0@ECvXpe>duB%7g8lO!aR?a%VVd4OgpKHrZl(CcylQ z=YTKj<6wX|Ze$2P2DFCww}56?UG{eVXkH3fGilTr%77doh?g4YmPVtf|WlT zy0BYVZ6}eVh#yYo*4u2hV38Losr;mz-`?pep>yO(AwU)qAvk*P?-*!Yr#vD4f6iCZ z;2NvFWzcx0$1Go!PbUK+2*0i?7((0g&A#X-o%p>!b3G%+Fa`CO0mot(ibyE)XIoB;o6j zzlV?jtiu=elLJ1Kkj>FQa4}lzoRjct&dn$OeAH(kvZ=i!po#+U!EVNYAbr;%&MzyTynC6@I zI{I#M{P~0kX*;?w;d}Z58V6BlQNUn3z9AsL?y%3wQRYn5l{@@tmrUOq9)gICOkdu| zMs-Zw1zY*pk|O&1qkWyMR!Yl^U$d4;F7FI~!_3W-o$0!6QC~pGf5;xK7yTPdi?-m{ z@YXI%tY4(1@YmG{GCk8c?On2Aj>_YLUPAo@aGQ-D6OcH03F9f#V=ik!JT zH(_IXU^mttt+Wzyacj4F%6|F#=_lTV10H#M>N+Nw^!GIRO3Yx8xL_D{b8ux>|g|DHj4$CT5k6Sk{B3RrP}X>o%%Dkn0>e-CMwLUPVaI>(D(eeiF19s^de5F}dzg!BZykwubYNG9NxgcjJvXgWriFxHI_iwOJhBbgt~@b)}7>BAr) zn%P(bwSc8_rHRKL=ejvZdkES7T?^Uc`6Ia;uK`bie_lvL0NyXh5gHBK<0v4=W?wvV z!`dlX#Mjsr6>p5X9qq0Mj}sVx%j2!Sy+zqu_$w&^l>AO?RCchXAtws;qO@i@wjNN^ zK`gY*X(#XpcrkNtNt9&vE3K{9;uaQZk?TMJ5J2z0qJ;luor?O}N0~oAkaDBd>4I#r zacBC}e>{8qXm_cmc=@6iz%tO>ihF135kAFjAOSe9CgQSfFk8v)o|j10_V7$sVBA-T zbKbc9B1?eaQPuLY<1_JA1PlmzqnXA_EP&J5tfEiT;}!rnfehWg?d-38g5CP9kvwG% z*tJ7Yj-h4^8n7IYMh(B?wsAIlaymFTLg$I;e*zm4A7B2Ja9TS4o)oDx*yc6Jz7cJc z+dfXMI|n4RgZf_Zg9mX$;Y@DvO;MN|S`1fB4E&vH77pyY*%){Hu#hz8o^W`CKFt%G zY$-~sL^EG15$14z=L)xfi7^_#J9{aaEw#GjTYt|sf7Sa!1y4S1)U|JiFGO)Z*m~?G ze<@aEXL|`|vGsBIR=4#;=rmiBlOxkmxns>^(ON3G33Tg&UA^1*M|M-MOMP`Q8tr-O z=N}puMzD*?dKVAApMiGWf)C$kT&k&f>xX}fu9GX)B9YSbWGy6Dxatl|lI^eAdT}ZE z5#Z^S9sF=-KD&hTwugq?@$c3t$9O?ze`Gk|_4e44(NwCx)u)kgL2qcSj>v%w9t6Ej zB|<|F-K-nB-$0o(B1HgkliyAOmNk(krJ%OwW^w|*DX74>5xbvASt^f8lJL^g-Qr`B zP|F2DedoN-L-5XPmu*B^m!_@FRzSXzvq)0@Ks?~xeuo~HV=p-}4+=@+h0J=4Bs#7(J2Q%D5=m_aI!!gCvgRo1 zsar^`QI)c)YgyBLkN^jriro0#(x`JK51}v#|BM{XTV3eJNc{&Y;f?j>tld=Tdyv7t ztmFz*9|7rvQwsc&2iSuED6A;xf5}q8f;bjngrksJid5_eqYj)g0_5FY=$U>9*U}s* zL+hLx)@Mkl2vvH}Z1o3#66aKv3b_(1v_^GE>4>gFH3wp}osUh=n<`zTm|^(6HDF|< za_~7gOTt0@&2BU+H)K!I2cvRr#pqB=P7hqmw zx^S~hU{T))K(CAu}wyjY@?TN)r>r!AHj#-;NdKM0(Ff43{5jP7opTbikX z&Xr}TxW+QgU_-wg!{=yJe>Pbm0&vEGFt+UFwO6OF@lzdqC~0?qUpEVRs=ph;D@DN% zs$T7FDpyyMCw3qu(hwb@A<+ubS5M__xRH;;(*sAa=^r@^B-*@ME5CJXdUvz-{1ahA z{O@@{IPt2TrCeG8a1Xy-H0{^gpvya111sSUOype(g8OA?k=Zw2e=O;jyOTwr>jnbL zOT;BF9`|L??A_Jt)ns`;Rn59XRPE5R3+C7BcUY;6wa@VFK;=R5E8HG8Y6MsS)+p%U zcQt)&epIw^%}8fqq}0duZ;ku)e5jrn{GH1P7wU`SR5W(hBFHxT@jjfEmBf#EzUv|t zwflX!Xt<}cZ4@U)e=Y}&w<3N z8S0H;%&4cB&UQijK_Bf82PjUPn9$q0c0s_s*3gt{TR*e302nmh-?ps0HuaO8n*VqL|(X@SptRB z@#Q<&;SVl&bAjln?TwytQ#gDM#;&sd-&Bc7???O$d$(Gph1v&d+WP0^U90V=*{z7M zJYdU{kG;Mftx8{aq;F7{=9aR`4qA5+K~J0*=`mp4b{AMe_2io1(9<2crlKEIf2jc8 z-@tJ+L&}^oIVabN8G;SV=iA8gPV>iN&}h}tRa}rfe<4W=4oY3f&*>F?o)+JY=Spr} z2HT-$^ikrgjshDhct_wxIZ^?U{RsHqm1*68ynG~lz-iR1J*^C)vyz{@?xkj^FfcSS zdCzNU`vb6G-Na5KEWEp&z5#v`MBZ(jZw?{lxcDuPw9FD z@a)A3@vpp0_WOq;DnoYpWdK4a1q+~-w)&nR=^cuNe!4P6?3a4K;5j#)3V@q}jY3k{Sm`Nj+l%coxGj}0A`q?sg7 zf4ya+1=cf&5@CI5U(GuVcDCK!n7|k*v-%n9+oD& zk0$X0mup5(6w3^$zRGojwLR?^em2k`e_4@Ja}Gr>k-y`o_XC44nXvH)@vrnQBib|a zgan^(!{k!8;&u}oc0c3+$<#p)e08fMg5E2oH*`K{%+ zg&%?m@=UC)Sk=E~0V)wwt4VfyhZe39$tkSohPyzcjs!y&9EXxt)59CKh#V|ue~smf zu3^Mpx^WqiF4KOwF&JY_BC>o2P4HUPY)oLQ@0kk^qOXOcH68z^^d^HdYJx0R5L-6w zF{++bCYym+udzUa1Y3|VP!^z*;PlOZdWsESzNW%Per`;vIrCN41%1ckIdg1nXcaOz z^rP39`ZS+s#9jjy^ApV>Jc1X^f8!bCiR5Kimr7OJ2KSSrv>}~OIvxX{fk2Rj5dN-t z5f_~8!xxfZDwb_@7w7A_5U>7@)6;-K8WnX^QCZ*bL9=(BO}b}Ld*O-xE@cN2R_oC$ zF3>QD*_`n~pc5SUjCn&I)DGvMrE7((l@{e@U8lyw5~> zHxp!tzc*hWW&Z9FP?F*)Jg;}Nd*+5^8&RthGlJQ^X%^}qFd?9aw-;{>uYW9^$C9JU z7DYdZ0p1OT7arl6;l1~K{iXW7K}S?oM@S-da-X#@nU+?033Ug_)|zneO_6xR22B$A zWH&8*Zz^e8hh@2rB3NeCD+$Ero%Pe%^Ixl=Wkh6^+NaD z6MWPRTB6BEH6YL78D5#+A{aFv1INDDc);$L>-D6GXss?QvFn96LZ_j!T!{qSodQ^z z5qR!6)~z*0&XT4tm^vJjn+G)a+sb(x;Q_XW0Lnl$@rIg$GL`oae^t+*{Z8=6TdPP9 zr`<_$ao?UQ&quH)?r3Uqyt$!q!$|Vml7`M5xy|q}K)=KD)D%x@grVj4!O|j7tLEa! zB1OW=xX*_Bc#>_^{I9y_^V?x$d}cgtJ--d(J|Z%Dz*fNdX%7ZRNXeoKD*ZB&d1JRB z4lkH~O^`oJnz7NZf6vu>!M40;h(-$5&H_}uNCUI|I2rHa3>rFz#7H*RS&krHcpOkq zdnYkbv&hiagH9KzNx^YNhF=`;4wC`oq01*?+}c?fV)`QLICQ&Vli8?0Q2YwJ%DB&g zJ78xSXgDt-d9;TKepxs2PQbwFWVb{3zMVnZ#UeSzMuP1;e|`KEAl8sQiXrlY=?xdt zS*J~ZR2+FL*d{i*u-6ANd=<@Kzjj&17~a4GR@A452M>mv+(-e(Ufb=ctC`fne`^ds z18zm-!Um&eRlCXQk<^t<%Zno^^dA|pEKDQl-2;MNwaIHfq#c;Pg{?YUjO8fv1?+(M zyQTvzdkw0Sf3}BHtJQ7oB|3Emyu^A0;F8VX4ofEn7tp$jH*i6HZU{)36SeYw?@QG-c>wxL`&!!X;C5ksKWpR=z$Pe{ z5+OgGe`$i6*vK5&7H^*i;uzna42}sCB2@U3y?k@eFE^QZrQ%0~A?ARp{GFF3p z7fZ#uzt1+KkY1xJL@e?s_l;x6`ei{0;rtdwJcArG&|8v`n~XNWy+JhRNECYjGYJ%N zMGUi0!EX!4Ix#|JN$Vvvclv+_QHY&eS2zLze@uEI0G3#AYDDtG3`=rD#v|T%s_)IW zCvog@W18gz0yvA!1EJT4bKnmeIT(rLY%V|t3fjr5rr15Ty|Gf~lb3sb2qM-`eZ!Pz ztQJFyz=#C%6!;F;NBbf%oH;j0Mw<{CpTgxb1CbbJlBUFi@fW6CX5;`1a@;&k*6r{g=}o4kU6r zm}=gT0N~OlvsaT!D8Y@se28u4oa*sx`s#g0^Wb!6L$KLU z0dO9|G!W>%$|a%Ar#9$5d8QcXjxPqZT-K&1GYsd$mwy{nPX)evD!9{T3j_Y!W5X!<;tmySE=~Sje{pNp z5#yj7r2IxO>oCr5#o1R5&z+%K&Alg_97S;}qM05rMe_4h8M_Q)XmnLV0fB~R;`8xx%5NpmBHso#qTZga_~6rpCTAZ^fq1euu38)4^0@@_LYT+ zJWw>SGNO6ACXps{wWyyA5yG4NfBoHHg$C0@(!<~QPRAEWTX3t_!`{A93FSQTyU>#S z_2C9HHyP?bu)Dqa{dn;YqVo?z2R+J=Om@d!6C5iTB-1x7G~TGkd5Jm@paXtmP%3(y z>GL}}-Y^a{RJ7JM^9kzT-fhKWkwY)P?gcpvzuZEmzt>zP)5d5yI>@9%f5U>kdke@( zTt<=gowPM&x8}A_#7k;jJ05EZCFfiI=MDFIph&p=suRBX%cpQP$Q&wuNbjZ^yz_bC z9x_%+yFUI?+gAhd0$rnj&(4jS4C zNLeuFg{+sLzSpGO^;E9R%MV#bOnS9CFDM|}g9)k5T-v`Ib`=rVW2O80wdLs z3;N2=&w3?cmYP_`?8XZ|UIt~e!mLcAvEbot1X4+q{YB7GN(Cjhb0&)P+aF# z-^J6;wGFsv={LpXLXrc@th-2kfYDnwOVIxwq>kM?PMR{Tz#ARm2=2KPsc%eav3UGs zDIgd=oSh_V zC?FP{Kc)ex0C0(qNb1#lm|9jNAN1wUD?~r+33h`?5c8ABLKmKI(|~_cis=1by*Qfz zK9+0|cPby6KEe-1CE7|D)DwGpoP$5p-g z#;QSsGx2<*&U--T%CDtL&glXcQyWuy$5@s&*L)ia0R28;j9#NNAt_3K?Q<>bW3L_c zF`i6UE|bvt5(i(f7u%cqk@b#UV?S^kOSOUh^%X9NiWUA_xJBVg6H4WW!fTAklwSi6 zZpXTQwy(xwf4QdAIkg0lIk}e(iNSl`UM1-#Wml1?^fE+zbf^3d2Hh_usD;!<4sMvF zFZ@#dInbj(0_9}fqO@-(cKH5;v{+Bce=juU;B_sO_i=BlA!Lx{K2aP& zalw3@F8Z6>7etSncmoY*2v3jBbx)@uo( zChc!%-E+!Hg6Fa@E|z;QY>Rs{;LTn6hnnYBvxzzzR4im#zl=D<-QSP*Gm=m_moIW* z$0CkDe_*T_#5yyAW4<+U-kgJ0!Qt?gh&So-I$EXUySCNNRn*lo!wg^S5}+s=sfGt} z7)>pQYr5zkJ9L_%-gmmR}3c$Bl98c(< zaA3dFu#P29kdfguTvQ|U;jm&KW-LQ4!MUCpEuL)t5?!Dvgubbo0m)607CiI#Cwg=U zntVtXNM7Y2?_}n+tmjGzlnicNLEf}!e|-Ep=3<=OrImI6axbWzZ_~&4zy90<4@4u5%SI%md(F9((NT(K*W| zg+GR!?)3v%*5~v6F!GNVTnDjmZZDG!Dvh1A!=>munr0FaAOK_ibrU(7Kk+pkf8Peu z#Sfy}b%4fjaM?Oc#QLBd`3>?I+W;}|V0mda3pNaQe1VCwuLIPRhwOa^ViBAlx?v%{ z{aIWE!#}wY>mZ9fNbz^M!wKoPQ@`c4q@9_&USvDpv?oCRLl@+QVIZD&a-Hf5%6_x1 zgB^n)m~jPXqkFSzKF8JB1aW_ge+eu7?$+)MYDRbEHbVcsO?{dE?)jE0f%YB-)amBA z&D;W-OWUHg)9p!d>T(8QZ53u?=#^{1$a@Vt5%^D}$@cU$El=oP<|cz4=X_uWscVlCjN zOv)Mns`Rk$UE4$Vc?gL>e8}@c;~%jMp4}VMZDF}z4!QveJ#7^-SOEAu93L+&y6Kx^ zMZX8Ji4KXJ=Y}GxT-PCuL(T}C46FXlg`6Ww4mmle(1LaUJ!T9L;-!JdrC?@D(=!%M8gE@g^Nm@j_X z<45=tQ|(sSjRc9qe+D8X0;dkp)2(f}-W1(Y5VGj*7QLHu5?K+T--HQ{&ZGmGKFt^~ zTYyOZ)foITg|RLYG$V$aD_bjh-@rbx%_(x<|5D(D_aM9?eza);dZbUt)4hrCTDefDA5J}G^ze_95$(#U3t%Q|q*)Gi+& zbwejxbGx&XBG?w{0TGF$xU{cvNbf)Z&;6<4_?vg6lL(EXx$*9BaBV+QZwloTkH^uN z3J&VFpiAl&uXh=~Jh=-wII=sX6I@xJL6sMS9B^~0w5hu2qB>o-E?-Z%v!A7(xuX^ggbSE~Zc!~kViMoLQ;@%T~sAwVSIEA0Jm)AOe2b!y$JZT|* zcdqwue@N_yS1~YMvHmiDM6V>OsfrW~a5Wi`(&!Fr~?KVIfXD zbrzNAMT*4*s(&+jGoN&Jacag3ndYqJLN?08PhLSC1M^rFcC%)b1G_a2R;gS3je)Ae^htBj+&n^HMrPaoMkA-7RU2B_$k4_-E-S;Ho95yc~Rr1iGF3+2)% z7Jq@AT@;%UtCH}yhMW|fz5%qE0MJilh!cMJafL>^&jl|Z5On>mA67m4+(3jVe7PbS zsD})0vaj6^7;B-s2eS)Ia^jOWWyZ$=e}*=^Z(;9l2Wl74W+Z*N6CBN;Ql`l(e02TD zA1NZunU^-TI;s3d6yQ|^2PaA223xI3^srQg!$G9z1IZm4MABf35l$ zL^tW(c39q_oEB4JjYh|G5L-rLn@G%Qb}`0WAlxQiQ_K*}JFtplb*T9Z`JXZ5UclQE zKRvid1OAAY8`Z=22SorLh@WBg#0ago=U-iHUHiSNsMEk(C86|h&Dr0$#u#yFgfEcu z@DPa;!YPiPpxS(+R5EzG$OR%Bf8PG7oME_na()zunttRdx37pW%v)1 zN)PbQ>Tu*7G~4~Rd3XO)EaMo*6XLn~4bruG=!N)OPx0?O)+))c)?f><6~B2L#M>?A zLBiKwPxLRFsq*5%e0(}OmV*BJh9Is-^Sb}lKL8p%ePTCx<$VW>s{fqYe~`TnIPK~| z*fO-L4orL^*FiH9GrU@wfOdRoLmDk3HRsFN^*wd+N(EsRT10Q9uCJgGn3gJ3@J*K&UqEc3BzvhU z`=h9;juh7)btq2b0=AL@UQzTi4JQrq)zYrH-fli){IF>B{WeM^=xd`A<)1-?sru>9 z)s+l?HfDirK?!SoUX)~z8u#w~jlA*k36Blt2u=D@0`2oO2c}F#e|Ir6mA4)9A8o?o zy$G}K%cS-(a{|^-ZBx;o_igQtpbH=59{=&P?zW-eZ(aAu6A4bjp*9((*alelL2t%- zIlneU@@&pPtk$fie_8JBkFqI6OCLjT0YhafZV#0mKnz#!|Gu0>CtS%#U@XRG$m2v0 z#0^5xVJF}ca5V1U+FJFLtlDM92%OnqoHv&8+QIHe*scoQL~R_#GBnM{bV+72U#vxE zcqe^|Losv_OPE5R1z}*-AfEIm^F1l_5we?c}7*c@qnvG$RUs7luk z3{ziz>O4Jxin(>}@NZb+YS27Sz@k6x=L=E%=td}9Ef}f;rxCT=gYZ&sCHjZo#PW#s zDu!v#R19Xk+@ZrFMBnF8l{i{S8+#F*g$(cu&IJ%}gh+kz#`cJ#= zszxTecRT35f8)GV9a~i203{((3!z~(45!2SQBX~2fh-fe z@b{~T#hmVmEq*xHinGt)&2lGrtnHjY_tKi4l@J_zsP=a%=APB}qa?2x04>8@c<7f& zx_kpk`XrPRuI_w?zsb#rl=p+in}+)Kq@F+KWhA!Cf2x6?CyuwMQPcry@~Vv%CROnu z%4hzI#HqpA69NW9M`Ot9Uz?UJlf-_gD$k$lFeA1z6;>;_=x^_2(q%}19NVOC;?L=) z%JbU1!`i4@HsvO2{DNYwU^SVFCMJ#~2lr}k-Vc!J*-Z}a^Nb+m=#=b$!Uv@<;5a=~OZN8e>JG)h1>DA)4XK#tW?Q3l=Hl|vLsFP*v9PLN(nSki?-dhN5kc~Jy zYChjHq=3|HZ2=rk97Whv1Ea-ZJkxsiWBTo?O_%)LOE?L3;*)L;lz_A7XxnMWfyvs` zPj=18bR0P)UjfLHy5FPu=>+S73nsYw4FbPMf1VD_T&0qrL4AK3+Ms)JnfEg;OgLs# z@yaD;hKWFEQO-eMOowgjriJ~(y8>W9Qw$T!&UVI2f*Axc#yO$XTZNo3B3`wf#P+{) zZv9JQbylxSjx&(a{Mazm1=FGhy|4}!509&R8wn}xyluyHXax(Mq{ejK76JP_PP$*& ze}AJS7-r$hDvDME{-cy8&J>*IobiLdhcWcv3FA}fZawF27aoNe*@x>|z9ScUg#$5s zSrY;#_*h2k|39zyY%!T&aXzI;*#h}<#4VkmWS@#K2SrUdSOa`UotW%;RpMKJc4A-; zV+vKb>eU#^jVT_`g|*oqfb#f*2+eQ<)d8kWy_;xI+K$(JQB?V1WD5ntcQcs z5TOmSG{X--t3!ubOBaKjyAz4b+#PF$xR!FOFkMKgz0lLx_+Ac;H{c>7e?38OJHgTI^j zOA%;6FPxaRs>o-jx0O$Cf6yCXRzkpM;7s_pkQpchHf?`sq+oV6?P@rmySU3fNJuZV z2pz{-(mR9Qw&r{tO+?r6%?fg3+}H9ynSy^j;qRHByO2Ry0^GvHBZclUFZtpRD)Wy2 z)anLW`{MEq4O!DlRm2vuN-pYzC++z&DANp0!`y7x_!iq4X?bE1e}Ai;JU`y=t?gyY z0@`(&x^EI!XUzhveE3_Qalz9xUps^yH^hXLA{QzD0wbt6O3l5|8U6yQqhS$m^M`q9 z-@xe{vA3`r>0AMdQl+ZSLj^G6^aM(apj?daH`nm@Q}mSHK5?1j4Fer{@T(*L7_4-- zel1HdTdKiK1soFze{rKhkx}#($`Z&Mb?8F>Xc>R4Fm4?OBgk(F?6s^pOH5SenWYA; z@*Yw2Yk6G5njB(2A@6a|SW*s&h?Bbh`+E1$t%vdDWUr-}<|bAsgkoM)k6 zCBN+Q(Nj=<7!lj&pZl2^(pvpmz$0F9(WJb~!-kDMX1+cfc(G5tOyi+x)f{I{|pRLE99xFx>zj;I{jYETaVO z6Psc<)}u+VJml{pf?GI6q9g8*l34;!09&F~|JQ07+uWd152 z!#UO9Xb{icSF#}rh3SOrap8bVo`^+O_G_|#dl7u}y;=S?d-)!|9!w5F-%Yc9Q$6$E zFF-%sE#9fYzUoXH5nKLV?_kAGIY);_HRL((&SeMWf1c28oqc%CXoF^JMM6dpR507O zjuMI4X*xMn)otEEmV%(2AmMvcW(u?uTGCa2#NKJc=C7+?753=;&MTOx`nG79;1>}7 z_oseWHR4fKAknhUB=q%>zR@Po;&BiCf_6y4qc7_FX~9XTH5~wS(EZecS7D$0;1aFO zkd(~Jf8!9TGY&)82I;5so!nY``3F?(UNmo?r#3>$!xvl*PXnc`)p}aY&vcv7Qpt9{ zJi!2F(QYa1>nC7Dk6>6w${PvRDH}5;_!I-ogeq6v1(;J6KrJ=1oTyLd@mjX8rAZVN zv)#*yyIHkO#7I2&w|1~9q0J|vTGkaa`V05Cf9Cv-EM#gwE`UI`BT0(cUr(5TDrM^w zNH}2&v92c=78H)zHCi%0^B&4F4PcqFuB!Di)D8C&<6wDupq* zQF+L>T*&QtnI#+6L}9d9K7Qr_1O>Ofu`3E@d4}^zs?j0O&Y7`@{ChUO6)q~me?@nU ze_6>Hm5CWYmsknVOsU2d2SDFN`jCQl+45GoQYo`w#5cdM>})0N+~@%)__swrv{P!W zV|+YF-~r6YL&7}Jy2IrTRljhWq>6Vm_!RKqiED7xY>f$kF)@Fnqwuj4IQqX;!?Nhw z5ZOX#J3tvgeGS3ey61Q5G_&}@mFhbnf1{wdj3ZCPZ1%l}jD-^|+me@4|Lsi{d>#Au zGBdtJq~s&;*`JPMiJY3qp`;qUWf+5G8lm(>fUuIxLA}wGXQZd+l0s$p5Yf{VpHAu? zkB5RV9R1nGv_I*yt7@G`7d^q5=gA@J9t1g){ip&*j^w7e%?fTB7Gv$-_iKCMf5mG> zQ{4sXf{6%Mih}B1xK6Y-f#?$vJty-4(8b^q1mG2~Z|kMcjB*|Ym-{(ZSDh&U4C-T* zPrn$JHfRg5e0=+;d3({SmKZ%(BPxNgSp+&cVY4Fl9%iG{b7u=LWfbfvd&ONd1~6_((Z6y~E3 z^wvm^`o)$uiLaKjjGTMQn)`qb!`NsX7euM9|M!;)jZ1w15s8rO8xvu1&dq(`XXxh1v}V3gcX{-3&dV**ec3Q z{QSv6&u1d)#RU9J!ih}$?sA~uTAaQfKO`rqdU+3qB%5tVQ{=V5AQ+pi1k%^6tiMI| zl_>fth$^QVx9zXEEidd|f0&nnX3rIAZ)+C;?9+0vN+8QSvrD0)NMpi&JvjNAKJsC! z`e}-w(M}mM>2|g>09g7KEg9x3W8Mh-+%MV6CZOR}2OIUng>wROlV5`vp-5-q$-@)r zufpXZ6iY;|BmDel1OX*^Oy; zW%Pvp&Ocw1C8y3Ie>|->{b0`={ZpNv10jDL|KZ{=?yAPOq>nnft$cI#H!$68xF$XZ z03CypIU3o>(trNI;P~ud*NwzzWm4g9;g{#^4xFZeqbrZ)a||=0B0aBBX)6}H@rt>@ z`amTxP1^RfeMvX1@BiRfD-eTTlXbo>l6e|sgIk-Uxg==N=VZU%H7 zZqabs{m?GI;;B(MijPyW;PZ7jY%EYmz_1-jU|vul5E*tL>g=XEGNJT}>Stosoge!u z!3A%Q?FQj1W|Fvr#X3wLm5f&5rGmvFSh(<6<2i-X*K3~yzJBuREmZ%hUKR1a_$^e@ zFu{?}b~IpWf4f0TpU)UjVf;B=bf_?si{GIbQEqx8G)k{z`#1m{lbly;8=jQZ8%}Aq z4e8jgLvGN|kVs-W)Op-=?5Xi2`@`bow;uoqZ_ISzD`3wDwDr#oWR1Vv33a}4PrY*) zUxOr|=5h(Mz+~7GJ;D9;vHCeQ)#@;Fa*~jY>=V>vf9R!XX_D(XD^hB@2kv|oFZ)qj zrP}sVm#@|PUM+IV+J!~{l)Z^Gi4Y)$5X zF+V8KI$!aZ0L7Tu5xq~k7HZ{6J?Y4p!q z-x-N1f2i9g5?!-2Na4JFkKQ(%5&Ak}RaX+OQu+YOT9)>?gZ92;?m9bGPvk^gyU?MS zJPQ}*BJ`Nw5cy1Q^<5LC}Z+q>yWfzc#ce+t744aWWw&H{Kq_chf6q0JRv%CZLthZ}VYsz6HKg+b8i9oVBLEd6iny-a`VE0K6PH49jOw+V7PMM}gG|Bom05^h$ zw}Sa(tIQms2XdDn)Eya0;y72|{BRyoua2=SdNq00G(~)6s=|-$xgGt=H=%bPq~y{l zQO6lhH1jn{pSbU`XRHDeVA-+Yofh?`e{~*VndB&qfgzSvnG$9N=;()TTSj@pAIh~- z!y|!Hi24J{tcL#pTCzGD%8%uaQ8y9joX##y+8a~ilt$^yz&bw=M8Wj>g(Mwg56#UPsHC5o%{LFa2Akx<&1~ZdNEjc{tpo%-g4@3Khh?2|xx=?xj2XSD%l*4&iNkl7eK z+zhrQgR(E3KesZn^QGhH;3xUs>>${GxKjFvpJcQO5B@kX-KbCVcQ?)3HANP9+XAEh zsPYXGN|U{(c*;#AXzBYI;4u2TXo-;zcfv;w6=}QYDNa6+AGLWQjWVfXf8!I5H860k zipdJuHV-&0d8L4MBsQYxHfL`b?&pkK$zS6Sy*^9Z9((q7QS}Fz@HgK%DbHR&y+5Ww zv_!#4E=8K}&yPOc-rEe~glV?j$yo$OP~I^$h-#IfY`U5w(nM{Sf;SQje*m*uWI#D> zdKbVhi%u&*P&X17G&+r^e>RWkX|Fa*VxdDG08$B)e=!&i23<4enQ@w2(viR|=d~4( z`zFtli43CC=)+$@6rIJBA%Nv@XN+?8H?F7qR z#5yVA+#AQBMBlAJ2BdbsZqlZdyfm#S?+x8>>K8>Je+8-?5N`eg<~LN<#ay+uxw`={(gFhYm}_*Fx7)LBBo|+CZ7qxq zyJz|^>%=tmT`2R771ZR!pB>EWzL4H%OB$|yqQ!1}QF{WDKI>!89l}S`{swV)^4L7h z<3WOkDf&%KI$^m0+5}1LlwL0mUR|dSmkfmR;fV*oda#SYe|}%{1e-&y464OQfLl;f zbC_5|w^GG&{D&rcf*DGqs!@J`cR~5oBkL*9i_VH*q^QryhSUAN&uaN__9;B_N^;Ff z|6R8O=mRTIb0jcMS9f!-7N&F#-jL?Q_~^tBXi7f{rizm$@$J8a0euLuC)4ti@!vtl zJ~p~*AQj-UfAeak&PB1LKiyqxXxQHyYmydf4lV{LN@)n-^!Dz1m$+We+XF~k^M}F*vC9attm)r3g&(^ zw>?lSD??Cj2}zScNCC@Yml%bAupPO4QDwO|kT?{_WlH;~?C)$K&<i@uVJz}Lrqj$!Qe&a58YFFdzAF}qefqVEs)dMCsQo{8_5nED}JT!yc5t1TqH2m zYseu@e}mv^B9m^iEQ)G~FYgGy;*7q2o1GR}_C6B)j_xK|c@i7n_7{X9 z3{FkqCzQnzaS5jb!3RxgB^gSHn94EZE-Ry{%BDUta4v@NqFAvCH#%&s8jn^@>$M=sOfBqB2kaB8h36l?4kldEa51q$_dO?S z!3T+I2Z^?@BpOlSrr|K8_=3)k(|Wq~^n5VB7Jj;bN&p0Y+u{~cGI119+Zcz93O=Ay zf9C$F^Lu$((ZT1Om7Xn<^e3svaOE73_&-~OKQ&>K%o|4be(HIO?X8guA~j7hD(W6nIEVUc zEaX8E^71wWK94s*-*zm~=$#sPE@lk1O$5thg_?#HaJnP1(O3@No8H?1On*}|efC_! z%m%K=$lKs<5yBbvR6WX(IIe!Ue+WqN;d2S!upeNG2y*F^_JdkSFCQ-XowjzK*Z}-;Pd`*c*TZg!|@% z&fJYNCnZtP&u+E_*XeyOkOgZd>ly~-UFqvyZEw1%e~})A*Yyt1y2tu0+t4nGK|f{Fnbg;H1HX2>yzOgSa#+~V z+hD`bbpiA*n+IMRK+<1Cf8mgW=PEA!zKmTs#i4q#QWP_%;mZJhigf?!BV7myd0=35 zNI^&*uJ`!vGktylFF?@0Xv%@4Rw9UjP#IOQ`>$fNJWZM|4YMgltz;G=Qd|~pvx_8A zfgh4Uh`wqt_be3Xy3+4T79;M*BNfl|!-SdTVtEUwi4$6X%PW>`+l|tTw0|*WcH~K; zZ8z-f>H}(js~>4udg6lJS`C~GU8y~SR(onEV|NNJ0*P-wvn@RenP*KYVdd|?EF%!f z%6c3^SGe0oJ=hacJL+&=ZJ(}6{#o`wW(NVJ^-_S`uilFax4=A5bhK%2?u|oNO;jRU zh3jAyfqP$fm%~5hllQK0NPqAl*tdlqjOBb&{5<#Zd{3ENBWHtMv}GE7I==&pJz;Xz&jgw zas0l0)M~1gjZ18Fx-IN3sF$8PQ;VtOQ4pMmgFeQ?jzSM2C`Mzm?SF5_Gm8s}`Oo>t7B8)@2E5PaX3+XKqUPZ)NESZ+l5!P+8?ObGdrAu%v!kzUZ7Y~f&w zhWSy}mbtahm6Rpt1s=^MOd&T1xz978#q97r>x+}cMpdx%yP3Es!^kv;jpFwtHv*0- zcXB|z@4#s$>r*<3u7AL7duV@>_f{cg`D_lbFVB%*&~jRk;fs!)u~7WyYHo z@UX`{D>(ynl7SiBu*5!)Hy+Cn7Qflx{prHTm6l>)mZl%07=L@B2!Crp)0xdB;UI-P z%Y~W?kdvx+#Y~JUYzJT#XR%++%eQSKa)rmPGYAte`-uGft)?A>LdHFv<@+e_}lNGAHK<6&YQ96ot)n3 zsy;4qo_Zq{B!7~8XPj_hM*Rp9>30{}i%1&29M$GFh2W;TSojiOTg8D`-}z(ZOHv1U%Q zvtP1o7|JblB=}+C3m)#`$coILML>TWZ`P5C z9@nM&aL<3t@RAg5a`yp-x=&-ZHadX@32dq*zuxo6Qb}hrK}W4GI-d`fyHGb`vGk$o z%e&nWfQTQBX2%B}k_7o(wA&&@u!-v{K41C)$5mgXXG@E>$5LFN;o22_m?H0ebv4LY z&zl}8JAWcUs<)KxnsEG86V&S*2?YKbBr;w1UaZ_BB~~=bhdjps7ej!t5?McQv(K0h z+*V26zYIm^L>7kYPv~}IW!@g7$Wn*ORDx~7w}Nd4)3Hf`_4B#T1ccUO`CRF&b$|P8 zzv`Tu{bV+}CS)o|kd`@?CWRR_6U*aQ`|VG&Ab({4%U|>jM|0xq^4Qj~N7vVRGZj4s z4GX!4-MVu}5sLmip0^qkLyzem{;k541BmHRKCY-FvcQxXObvZv-Kf+bAbRK8uSv*c zg1tb`K|tlIqJTZTd=J1Mx-AZ*?S5-S=hmI7{`|A=D!jYE;H~Qy2S7y&0pzl+PzhE$ zsec+QR&MyW6?6;5`PvH~X>Qp-!0r~ECjbCao->aP7fYFxLV`&?dD-Hay}y&IJ1<)b zi1`U-8w!Rc$X6ku;l$qI^$ehu-I^0oSv|#q80w;DA99HY{qyZ#5EY3y3n72!i}OA= zQ70X$zCdjS9M5E5&G6;n5ney9oSj}p>VLbP`){z7FL06jEC0ze_Sc&?@CM@G@H7;i zt10)lzJ5(uBuQsj+U56{t~?iijc=typX5{JN69k0c#l4R3DP+m(|rPOKI)ef`ro;w>EEusxnp)xDV~yFkkuTBsW)d5+3x6lf zVgBwp_?iv#d*MxyNVN}Y?dR9Y%hOo4E{I6-lt>~^`SR3(@^uiAiW6aiLo6{|z81fw zpyUrdG5(lk_sI6amA`j$e$}0LfyZNjfnfM>vJI;EntJlv=K=hHDC%M0K6&8!zV`}74}7D#w@rd7FyHj1bd`M-=%k0{+Y%IUi3&GHZ-1{$5?8<7 z`2=b>NGuA{YI!w^+>NgyLq52wp-<@+thbsp}YWY)+`H_w_a3$2{kI$Kf zk$z>4fB^@{xmCP?a70%!secU$hm{}N+}>1x+dK~zp44JVZ#Es%I5$B5ilvImkvg>) z2dKnKAaWgHKY(TtDNABZsvo>oUzRk?nY!1OLYRPQbq-wYi|-(X1^|j2phpG8iK^W) zez$q}Iw(I^1uiP9mkIEFiaM64=+Jm*c2LhCMnJ#mKVnGbrMQLkgMZm{Nc*Ds%ziy(GsJqb=lM64%(mm;L8~;j&pn1GDiZge0-^*kxHQP9@}$=GKXo0E{gbD>o+in0I&K>EL=oPUlyIcr)>*1W86Lj!me z^dRO1aVWPjcDhB_7p+dZe9{1I#(@}fgjrx{Fyge?$!dW72>F3e%&r-FKQZ=z4X}3u z7==Bm8EW{bc5Nhj2EyoCydj!L3Ki6%R)XR)M9!Amk_XL7Qqr$}Uj`a5+uJ9Hucw6* zQt3)So$kep=YI_sCei=)FZP!5cBx}S+L%TB-KKkKT+z)8p@u1=SHI>b{qfBU=wc_H zzUk{LZT!@-pkE&^H)4$V-KUF1#@C_fv!8Cy)EyDe@n!$%}*;n5sZ3YA`uQqK1Uv)JlwL_D$T8q-bJ3*Ft0=H4K5$&7kdX zJw#wY8X?48T;c*n)Q7g5baB?m)2z$UcP@1^D^+*)DJ`5boF&~zREdN~0jUVZ8BoY$ zOMfpNhJb(z2_ya}vZuVHwS);LBnp8Lg2Xo-aSNTi!pB*Z;C1-uh<><6^dPn$?EOV4 z&+MP1*5OVCh<7IK(%S+#GXa)?|4a|uJu#x68MOxr2#osGC<8e&Dacs45q;TQW*aLv z7iKz#qgGNP{h#e+Yj|Lv#lyMVP9^%#8h@G5ynInQ-2tMvD>gEUGAw-+b^$?W#L0Q| zPzZ32-}Gv%8RY`X`akW{zi{m(<*0vqM+T&vi@#Ecrq}_29KA`vc)t1{q0{N^_zv(> zx)RUCN{Dg)y?TvWSnY;;>mK#DqxN}=QAsFV{Iay>wi+E zv@x(u=s8^CFgKk8cG0L2;)nX~=Gc$ip2n2vohk*~7^|;jEi`(~7teOu|h-&EQ z{Qe3;J-PKZclAfxpWkJBuq3gPubzxAA=8ZwBrZ|w50o4NH=y9rfo-d_3FG-FQns2X z-*jTX*|bSnDYqNFuX6L)(-V;B_J7Bfu@{N--v>d+Wr~A{J;~Al8r&qToWI)Q(kl24 zjfkh2KCzldk`8sPMUv*C-_ve03P}@HvA)J^y~KDRGIRBXq_P9>bY}1gM**h0+TvQ? z@W;3p2tMq~WnVF4=1yRB0p>~nydRJ|cS2!*ua)Zd*;B9O3N~<<8Py>!WPhg98+L=>YahR!WQAzR*29te`qZ4?`AzPN zaCR^eQI?spFrjSx30lydE`QIt+Y&)EAy0VYko%C5UqHaJDZ{#nD}d(SPsMqcWVa@Mr^> zdUguf%P*7Xo#+PUYuVj22<+j$0qFhv``L|#HaZ9sAL=(-eq=J_rgkkFM;~*~3mW$_ zb3=+C3HvEtco3yVH|}7+=p>H(g$OP%{1~xhK>yl@ANM5}%ZGd2=xec%Yzw-1@@!NF zZ{``=9UBBL-B9wrFn^$oW;}^p=bCB+Fw&lH{Ehic`VHnGjBmPo-9>ckF#X}Fiy9md zC!F|YUTCBN>^jCY+fNTY1)A8;kvVW+F%p2mX7KRG;SJ#z5 zDtxO=j0k4A>0m*LI4E6$YCl?hX9U>N{%0L?BVeY2A2Mo<2$fUbSf6^RYF|0uf&9 z9ZSjB&OH(!x-V@sD*_@*-RR_0Q8m=>oJI{Q+xL2_;C>_K{I`RP?JVlD-tHdIcRouJ z_CnUfY%;jtX*`dy9DF+c+XPRnKgJw7rRAj{x@7PZS$}Rk_DIPc^A90lfh2|^_g6g+ zhy&776r%q2>I>;NTZWsa4I;;qZo!CqTFX{Eb<~`e=4Vb|zDe$;T)d|}7DcAv5mwG& z#^ML3ap=!?5qIK`lTTs6QZjMxmLoW6I11h(*q{UmixMu&CBuk!EC!IaRQ_%0{&I`p z)t2L-p?{?bkYnovLp5f0%?pK~2GQr-|z`Cu}?scKp}A2+GV{R&DxxiIxf5xPcyiVh$Ys&RnvNC>*61JHdN zU|V_4>LR1cW|rHj`;}as@pn`sc-}i7njAX3nZV^X3vQ1(8t`q-GRp=kgWm~EM9LfY zLx1EM`~O;f*?yoHHot#sOMP9_B!c_~X#k2z%Zz_(_`_hN)a1VaArXu@b13#57TUet zsgE%1klPePUBu4alZxf-Wu#3f=f%g#(LSUXLmONK&7CzzS~8{WhGXV0@a`wzEc~I@ z3B5x>NSEvSqxYiYAH*9E01TF^vwPQWM*c!FfHx`Bl}^Rsil!utqIBv8TS1J2fSOOS7y;<=Fk_ zeER|0k%D=Pm?!!ANKt9Krd;8B_sZAJ{65(gd&)az;l-3b`*QMI2f*N3H@swyNq^CW z{E<+&qv}gxi-{22!#`Cr4cMFR5T`DkFjG?=1hd^j*gr6?!Q_pYVR9ru2)&^$gXQ+OlqZObAD)-u_IWVy#rnyfG@g_96BicsK(Yqs;R&pj0_o z!WP1eB%CaYe(V$EiGUs*P&OxI+#S)rt^!Ee%~O$@J)ix1HD35|FNB7_~=-gMuz;?0;$|{9G|qSXuy~=cRjoZuBiaL3Bu}VBz%um;_e+rdP{_ zdE!;SDnv=%^Vxu;0Wj87(gaZ_b%)Pl)G?fo1c#4=@hJ+l;Om{7D1bPvQ5zATd>Gvv zg7(4OfhWDQ2Xs?X#?0V~4A`r+IDU-|#Tith#3aJw`PuJ-EdlIhW%;mH*mWQ%HfZJf3xQz-?`w9;^CzZ z^Py1g3x2c{GpvX3t}rA`;}%5?2juTgWRPc?;f*zJ9;kK$rPn+oaL*+)dC~wd$0T|w zMf@RZ^=&Xkn}6k~h<{{H-Cd66to6K6ScTLp?_A?l^&sFcFmTk@TV$$u7PXjRJnvi3 znLTd3n;Ryk1>n9jV63oEK4+E_a=(d{_M>EF7SV1qz`<`;!SD+l5NJcPyX3=PGm1h6 zS<`ECBiCb{_IZ}s$PrlK6S$2xKR-RDw6^RHLBXN58-lfFA)pxyiNvqYhBb;wzXVz97)%ZQJpag@$yZKT1cpqDqcIKNJ(a zci``0-0LLkk!M4gu)n#_4RZT@@q;SX*Ne)+X(WWS+()PvU~AKLvQ#LM6lvKn;xz%@ zWms<+l~vr827f+RuTS)HkKY2gj_-cn_ZgLvBS+s}YFX2Aq9#rjplEEV0pAkPMGVL- zuVqY({;=gooq??m-hYf1IIe5vSb(oiQoOeg%Z>b&F`=`PYCx(r$~_njf0FFd%IPM; zCQQZPk(>_bye;H$aoQz639fn!9qhsEG<9WQTSMPC#eZ}V4i!pQ&HbY$FS$s~*4{2y zav9ft42eB-9bN>C;uU&k?TGw6uU}!ski-nB`Z1f;_Q@w?Ie+e4<1pU?@mk-TTcprG z7T_*e3aQ9t=ee)GSZ5>qOVtaw z+ZmgGqkkSD&CRh!p+FYpo7)o=c**WA$>EDv>7a0jC60?HQ~k**=Sd}8djhAZ#`AT) zcB#v`gj2)~#NYuf1@Jsy7N>?jr7(G8k%;HZyfRea25o|>e$o0%c!v+T2RRz_1V+N2 z=R>wMd4ygcWNc{QNKfjlm$qbfi1mGm1{mGhP=9v;5SpxIlssIC^q`4BVHmt&{JV0% zU(rsZjpdw%ehq2{u>uJ_8c6tC{S{4mOXwE~2)IF|J1ClnJYP9;Luux%cuD`RKTo-9 z$AD*X#h0mWl&|u#7y0`0tM}^;(l@)C5L`z7$%@v`I3=0uORK6OQ7T~r-nV;{H2Jx78qTWZ;|V=exNcJNkgF;52ks%x?+dQ-)j_PJkk=;K z3{UQ^%oZrskr4P;;#9X5@_|f>powC_fvn`iYM;51nE5s(QMF*AUR0XQW9~b2lT}2~ zP;jyI_H~+V(fELHg^&X}RfB05(D&GAV}FtqkD#Wh_xx=OHEs5+ZvqYI z^#^pFJ*elojbrOaD^-qabUdLz*ih>GaamNE*moS1v5B+k5@cZQZF4yLQStcXmw&=J zKYBoFttd@M>&NEEo+0=NE>&Q}^jm<-Y)Mt)1_b?c{~Rtced^y{ z;!qN}uT>rkn|+F4%YLnP-1(^Z){5PYv<|;*8GKK8XxtjpV1W;s#s(e|qMmW3U&l8) z8e0_*zG;Pxue;LxF93IMfTvQ=*MC%1Y&}&(IM&-L%2wI-m$KOVE2XuzB{K2`iT?TW z(>qV{sW0pq-nnmuW+(u)j>LNor9oPK13#=};rw!|j#*2d?~>caI21Po*gUgjMM%to zF5tOoQ~rHkAIe|s1TvvzjAp_vdIsX@EpDOTQIH-fJ(+>3YhE$@U6vFA^?#R0MqS)J znV5;JvoiS_i7!MTPq1U)3pW^%&Y!3UQS(;DlTMcazTm145ZNp2ME^K|ISsd;y;hZ) zRnb3aVZ8Rs(#z~jh-be=F2WUN;;&h~V+o8MVz2>2x1<+USQS@`B{QJ5(YS5D&dn{5 zK9s4ekY@G+v@g!#LHSh*6@N2Q_baNS;pBErpDX~OnhunBO(SPq36Ob*J*y2a3u@Zo zT^EtL(!JuD>y!(!NzEKI&{=}2FNlTV#3_5o(wakWWri?flJaLzx#Nm_N!;C2ZNBh4 z20HxW&oX-CFr*lbZcav3g9U{E6g|RLZfXk^JU|{XPlk-CV_}eL0Dq^g{MCzk!Sgau zYH?Q;+?J4(yxDI3o%s_$W7vB(kM1{x1ZhXt`5LL~{DO`>F+?<8Z8fDWPDL?)oZJ+t zUYcoa>kY5z1PLH{&Xi1S<-HYUdcvvzXgu~m@GG>qOK!=%f0y{ zW3hF4<6LH4PlVk!TYn-~|IS=cyS=z$jfSHtD!3|def@btOCvZaDoC?9D)$52?4sYU zgycN(tQr;eG#$E~eIL@GTV(9e7V<_36qPvAhA{gCU`zk-r~;M&1v07XQz~@Py#+d_ zL9j(jlQ;L&x~;q+szCRrjtC~9cxIS#-M!H0^xtG^jo=aNCx0r0U+0VAH59^famZG_^uLbj5=&8QpGLVkr;D65Fj$z=(VQ1A;+ zt?2!^el-%rrGNK9Hm0v84Cth`G?h0BN`x{bpRTtKr^SDw13jPGrc@y()AQ7ST0oE( zz^~RUlpm}V7lp1{$qk|dG~)CAgmac^CsAz{kNl*Gn#1C#?_J;MZBZhj*wpVEKVcF$ z4XGrbjsg@9Rlmfcu>{YMIa;M~xj@y-_>IHK08L7~Nq?QB8`oKEYin?8DEvOsuQ0^k z;8qio>N08&Ym1NH0dEPuSCU%^o#84})?BbW97EW^MQO#={98gQ!p|wJf;uRkb}#f26tX zJm3K8x__zyVM+~`pCmcNJFRoj+_~Zy!(p0+hB`w8MC6jNNYleTZKCCe)eOU63=MEqv&ic*OCh9;tT1yi z^|8x319wKi0#RM61i}4=motmbLl`c8y&Ie}Wq(7DH{5FMC>wYUAe(TeO1Xyx4_Pk7 z=>n4}RL)YgHg+;t;fDN-(3=n1<;qa4_>c#j;1POE*2+a1AZKr8O&%2}zxvQLY}%{$ z^4aQVyX>!*3kbbaB0SN}J3b=rgJf@Ly^s?rmiyCXac5D12(q~iY{@HoBpUeU*uF63 zntvQW48t*u^BHT z>*B9Kj}Z9Zp3$S~G+_%2OCgTsu`epZ@_+utlX3V$cR&s}KBDxqrir^$2DGWo5j2Zk z0v{91ng-lLRPyHu<>_UdJeu^WS{1I`(T6?M(HWMif2x?* z-D%Aml|jG)g!`oq$wl>4~Iz`g%Pkr>xX>+pi{UE!R^I6mR@0jN5C$%*$lo&9(?I4a}eg) zUdF9*;Yfn`qS|&thkICBdU|;1_U}9)kz+V%Iu%}Zk(TS~hfEHV&8Sif&IvUqsjilf z-q7=dRXtFvk@WZ80YPHlAzq1*c7NZHt4#dMRIJ~}nq)czUT1obE<~F7h^#f)K^bKBwq$OYXyPz07Jl1`MX3!l1vgFdgCk=8r!s% zsA>~k>F%~ochKKXdq)cUwRxFUb3}Z9HC3fgZ=i-icYu6B=K}S7;l%zpFSZV_cD>DX z$&bb4(fIH~G3x42ZgA%flz&6LZuk9p#-JEtFXS*YmuW%}K7UyZxzUxJGw}WW^rZ^e z{RpyI+BmUz?L;G$vmAcru{7y>Ygk|I%a+4#wfJWtNxM|p?!?OS4bN1b8^xprVKBXU zt7Jh3-px(#@$b~{d$v}_S~!RFQO?(x47e^TVl%w@JO?b;5qM7uM1Oumr#rQSvAdzL zDQd`^V@g` z!)|`b`P<_2*Sq-fG_ff3>HDX{;`-{`2T+yU`4x^TkJ@=Iv3*C%)`&+}d)+TOdW|VI zp!j>w@~p4}Ov{a@O@G%0t2$$z1Nu~}m*ITMZf&D??|*os-&U9T2r z&GmVuVoVAN7l3bB`NpovCxCP5px8K!@dj)((+hNE_OvT<@H@ETaZlv7AioM73DVWNq3f0Qn0RRcGz4d44wQfE;^J&+smb31YCq7AqT2dE1R%B|Mqt18x#fXdoJA89eNj;Wl_@) z$)T)(<9})TX?!goO5Y?AtOvgY$H#$&>q5m|{glH~Kr9Sa;3e z{(mo`-&Bl75W#^nW~M>x;13#BC_N|YIqgpX8Af$!z_xC9nC8M3RV%X3UDT{crQe$t zBk7P4#pQQmG|Z)c>xl!$|a-;EXCY zxhY|5kyL<vOHK~79KszSRvO@;i3m|>3>ZF&6H*n0$01S#bwk9MA(>X4?~8ZdldT|5 zna?-(QhvQY^M-BC65@%emL@yPve9)AcVKU5l5NehxN7JzXZcoHnVOz`F%r$Dt0p9Ry&7Bo2Hbe{Ur%972tBWYH{f8{+{qxr)zsq`L@(-)N@vBQ z7I39I^O#wZB|yJOQdo}XN4=pL-mmWYwsF?=C7Z9_hkh$OQI2MK>|izgh8C$`()!#r zw#D!rm>oOYnLhQ$g*#Rn3`YGT-%Lx0T-(yve$kl%CW-#qP?;LO8-IOJL1*uGxMu73 z?+l~xs$6SJKQY*b7l$v6tg{iHaT9{(sMqM$U^S!g+kb5l6X++sk7Y*` znhxOA$uwef;urD!=AutIv6+tr%@qY&8bXRRn-bWMvG+}{L zi1U2ut#{{C8@MZ0W@rBGg75~BA@E0G8v>;_?HDNJO}XWtaT61Nv15a}LCJ8H@H>Fb zws=??Mz;+=_K#a!iXCxVTsp@2x%KbZ9MsIYU%MMy(*Yp~y$<~q4KonG8~~y;@oeWo zW6=?QhLu-q5HD5Js4Oq+ zsd^QGESpCltYuLz-#^4~uEIs>t9$t1_?LZa;lnaD!kEZrt2+L%A-;J-!xLsG4u1{g()tZ^}7+%0(xX*Vlh@jk(veE{s z!j9l@mHH%x@JoB?g%V$)RJf)gmnW6TKyMNZuRwnCv+dV8DN#=P3JDhZ2H!j~rHv22 z(0VJl^d{8rGm(88@d>M)4-5yCGGW$`O;&NS<$uTE7NgD-%`7_)7;LpH?^&C4at()L z8%LBO1$J;xDkN!fXs8?YTm0*jDfgSZ3on)(>12rMQJ%XzDw1Vxtk7zWi4#U(>JmUk z46rxI+m-|`rs*9*e7aXp7MRpJQu&1g*qlr?MGen$#Ql(8a{$>N59}LGU~7sM?$R#L z9e?=^b+{F1nP5SV4dPLre2D;wq~jO*!C=rc{P16bt9@SUwB z|9S*yBxyGv`#1a1tYm4RlrH9pzvN?77RgCVVYKrDVZzpa5QQJjYZ4h|L0^yc2gQ-` z8L*0pPrh%l67migMCka{&Ks^7T@*oyDSsta(i*GU2M|AvWi7|I@ue zJT|ky055NWWx)*ciI5ZbUg++C!GLbWEN(r$itX$BCFhX2ziKh#dnKP8#-orXQ`@(y z_vDV}o{&LwEPsG{Z675AeSxM(I%Oah@mR*60*NR&TL|0Ta-G}0=+I23O0h*odw;>9 zl$oC^mr7l+xn1%OoqdK3ChK&Ys@zK}Pa9zv6I$OBSA+ciWWm|EMJ&js#;-ncvjXlw zJi2CmhduS<_{_!JY>Wo+SvyuYG@s!{zlVCd=d7o%b|Dn*3nhE=p+9oiC*>DyY_sr; zk4BQmFV6M^v04#=+?AFXbUa$*Cx5lGzsnsyMB;u}3k`swIsB} ziQJWDt8u@{bgatguozJ@dLDeV_v;Vn8=SzpEviESfqWTOu)F&VVC(dA8&XI%1B{0} zOr?{6wQNXo6skg4)(G26E~ z)kAIDZ0^DZ(Xh4$ zn1cK`M0A&O?>jMR%xkXZDI(1seYIe%A{|mtq%xpC&{17Tuq#?rpf{ z$Ct2Kz1N=y7Sp0}@JC%Qi(V%AyV7Nkksc|#+df=S$whU!;~4V!-BzXc;z_`<7p6#r*MV)3lnjql56R@cse*>?XWoFc?pW4!3KnW zSHfV;$FCFq zWv$%KL8C%Wkyd(lcQ0jL-LED^lwZDcnr5|6GYNBsXlOqu5(%4;a;aC44{+?N5)q^_ zi?Bl@Np*ThGqx$|YZa?sZ!bO@>X%TBjcl#bWO!^UZ$w1vDtX?HYQ%@>sMYobr%LJ? z%{FcC*`yP{JOyMQ<(y*~n1KsdEZaoLl z`#|Gz0-%>MF&A*BM z!TXfe{HH()I)tRdHxv7302miiQ_hsKM~}fI=#u|CIu$lu*!J7)#zj`W&8tSdkI)nP z6jYM)tLuwIs;l<^YS4^`PEepo=ypE3hwl#%>^Bh7v;JpJFf|7FBbcNr>h z0uW^Sc=Jibx}Wqt*8wC>6p}ICIuNzVZ5h)i=X{;!>Oo2HPG!>+XVY?t3gmK!cTA#Y zflU1~!sJ16sB}EnDurbyD^1Do?|($<#0wj}lidu?;fYpL;Zf;EHf4DmrgQoD*gN7! zSmCDL8-G{%WfnR&%f+C0H}%zCVpPYM8eaz>PG2aR&eHd3&9$uIvr)0HZ=4v_Zl$Ta zs|$2lhc4(6K(bLV4W+XryZCpf*(l^AQ@`%95r4t!kuBrQ zHa=h@@OfC2v$Bx%l5xO1pTQyTL8YQ)XU(w(i&|UUkj=;xFjR28?}U!>7po{!?pv$J zYv@OmUjkN+t8CvtKN%8Ny_bU=>Kc{8w2vV#vxOFqp73&>6qGuKQP_G?n#tybOc#6R zQ{MI9KDVa^{JRcJd78%zV}C3ymB)v@;$#aL~%utMsz8jnZjhtUp6hn@vH2Ax6I!LE=WooV}_8$%dv@BPF zB3tcj?q)r3yN~L;AyAem;%aDjmcz9mHL%FPDGw=7t=UPGeBzLP=YPARLab6HE|B{S z9?#Cl@R~VnHP)4)K9P9aJ{PB#X+cp;0Ejj2UuLH5Gdo zkfB9C>bN%<1X|8Rj;>bWT@jHn94Kj<)=V%d(wX3e8FrM83eKexyK8U`-DpBQJ zqB{14vGA!XHv0o{a(~jSKu)qPrFZud-n^EIw9ChA$t}dPEOBl|+b3O`%(a?~YI|3U zE_i&v)vyi8GomW{$pQgZt1zX_Hhx)&2ycihS^B=%lGblqoAmD=yg4=}#Q$A8K&f{29VL&dtqA6j81 z_Y58^^vrJ!n9hU4T3LL)yGl$bNjPnes}cKGYuB4mmSBtkp7oZ~d(u(H8?s^qA{kyC zgN{?2A$(mPwG!fuRtwQQxX%nUj#?3^PmB>_zbjD41fC*BdYumIi2#w{NQazua?=fh}#MMcw-71cQ9tqZb5QT{{28M zY7@uvAp|`Cbjptp;2g4_f>36oQt5nW!UDLM!Zrbjoy(P@S^73<7;CD~lfCcE0gFs{ z-iLOiG=BmJ8z-xBbxWGpB_b{#M7<6)jMCEW08sJUDOn>R^_8UFuf?;7{%4Y3!Zyb; z4B4Pkhu{)M-+6Ni{}I6(CghVPMiE#fFUnKgK52SeGb{DaIgZ%o) zwO*6qr_J@fG{57;)(Oo!s9R|lvRhKIj5WV7M}LGmd?2~g>&_^W>H06GP47nd{c~Y) z5GoKkZ%tv8R{VF@NS*$suuPyMG$t4`vWtY43m93Vin&NDGKzldAH$jN3{Yh5!Z0c0 zMTe^StDNDgQdG&&;>ur}23LaaSw+5mT*S=APr;_kKWcOB&?7ItzK^ z6K4&0Pkor}9i9UiF?`%JU;u757d6_UT`4dh_xR8TE_`mluri!NfDNSc`3CtP%-JOV)l1OoTO`&`J5=6^-_qr@ejL2dxIjt8O}9E=TvoZn6{mI-w|c4P{A zQwgfYZDI!jzU&iLS{{E_4pCqt7Joua{=Grs zG*J#8!ecC*&#^N2I*WmC^xLTTxqHcLSW1oI;jYRv>Vl3GT~C?DLZXRbke~`?g3I}7%uWo1zm1@@#2}%POeRue!~~a%GAlMZqDji)_L26>M9vL-7NFAYvy`^=BE zoe#CWIJzz;5>r%ipn?9YE5K~(6GW3ablKALEjS1mBLMtNcw~I33cxvMoU2%*N(K)_ zq0e^+jnR#K!Xv;g{@nOMc_I4u?&g;?8hgf3JeOx-aZ^uI$ls4M@qe0p&;a0V?c@nA z*-GVz3o4puBxdAsh_mkPzf%ZLj;q}C@uWk}IV0VA_aMeGu*6QscgV0jK22V@`=g}G zao@u6KFaqCaIq8gdL=`Tm3cV_J;P+wupmdkH|Zsf#vM9QgEz(Fi(a9N+Fu_RXj8zo z#pcLUs=sm{;W5_7XMcDD+F>Uw2Njympq>rh-vZ|)Mi)CbzrP~7IwymOf$zSn!wzAR z8_B3l`!H;t8~hO)t+gmW=J`Ce{8x{1>|J58Jqw5uND>7Tib^~h&zR6;3JF@OIQ~+} zC;;6dec#f$)o~!au%(oy2MGV~rAvLO&><#dRUpCboH5rpUw@_xQN{EvPZ1Cd&*&kZ z?9pS4bo@cmnji=8As5$;zt$9$9w;6=NO}!t(zY%EnfKvQ2AI$5$5+8H-d%skQYV|! z`FS}8{rN?~Mz%|15u$_(a>m#CfxjMSAlTh>&3n}QL+BPC(N3x^bne!e!XENk9NAM} z)G&k9=kI!7w|_m_T)b*_>^qhj$6S{m@l1Ph14Ha69(*e+qk&cP%^Z>zLx4w7dS1e3 z&ty;{_~8e!Seafxo@)qAWrNk7LZ58o-?qY(r?D{?j$vkeI8V+!$Ju4m(%RDBoQDA2 z3;p{Rk6rlIf~))MBh}Y?r&0+aI!@$0m0w!7hUGV`ZGWTYE9llgG~n;azwsmr_OUxk z(UQNRFdXHPC0KgXpSB{)PxsRN39uIpq)It}IbLTigjwj1LJ!egX)dt9n^r3mQSvNH zh_wd+a1loJb)T)8|DL_7FYszYQ)hajFab++3(+8;IYTTfn&aP#e3M+f{wqH7?}M_X zQ5ECV_CdW>h2_kU}^__X^ryWtXfUF|I-Buzz)g zlm!w9&73Xf)@Y0Vd>WA{$SCI81IThQNd7L~)_DyAToSY8uePp&(a1Gzy9&y6PvOO&DORCeUJ2ADmjb zS{q;=UEWu2Y+!DZ{GukX7N2|;50)akwq$}*oO>ArF%7lW{AEE^YbO#>{5Wt^1kjUu z*MHyM+LYW6RtD^h+7@d0+0^}0vUjo%7daFrL<-V$lhM{*&}6tqB!gBo{lKq*ZY1;m zd>K}@KZ18Pyw&7vWwTw#(@s4r8&yJT3-BoclmPk7uj*8Yz2-F|Y=}T=pCU#!;{qr* z!UB={5bh@J7@wjS#N0}~kq4UVGz!8{@_)|s{^r>oQQFI)IR*IxzH15qM?kp0rD9vXNf8mw{*ZC2SvxC@7O_fnbgAO`laI$+QUJOv zT!(*(5n!`)i2l9VYghQYq|Zsa;xT$1MsIj>+p!fV)XSi==FPqGGsK;U{pxRW@msmqFgiGwGkm{ZY14SO=q)!}?1 z;VE8QtfU#bvc|>A(DHN>D`MWnX(WQSmRQV=)0RuOx?xY0Q*YsT{$8xZQOgxxhV*|m zoqI0|-rNU4CEjfP^Lx)XI(*$x3l;a&c(s@lwc|utQ^(Y#jjESTlnD=Z7U-C$nr0&5vC&#=WLA4#w}8{7Po>2Zq{HIg5m8rm}7;Gvu^C zB?bgD1VhfB>=baMEtqo}STxx8yE}i6{<~wy#KA7AKRuOVmU*tuO5b_DCm_U4rZYC^ z!v^7dWXxNh^WskNY+k#=Y`OA#>S)@U-B)ag)?tX0Em8!>zw2yWe{Xw$gYD?Ccm;phF(_VU z6*b~ZXG_AJ;*SYiWFgdA?I%ycPW1k!8WgF9adQM&bYiQxjk6d5_Csl2s3dyg9L0#j06Hm-X%x$ zaGzgIto7*FK#u_u-}$Yw>YIOOHy;9nn((zX*To6KHI4xS644CwWGe#NA5JQ6?OC$kmz?G1nrzF5yaza=WfpEyUU%uCT`f<{ z#){1#x3$jDtUUqd4325?m1GW2E%5=XdJ5mUU z=!Ik79(##7;>TT-x-2aIT=`U?-ABpU41Kb!LE?LxU~tqJ8Q*_*(hn>(Fd&)q)S@n} zj&64U3b2aL^%EJh-TO&)u)}$@?_$|XAN>S&3jFHdPbY?NIpz3U&}wYhErc`A((n@X zuy{GV2vcis0)X0rICd-hAB888cNK7#`!u|Bj@k-DdQQ+y93q0U{z8T*zaKZ#_W&7k zM^bnyE55pBRsw&aDk=binG8t7;W`f4ZfIHdYeDdJ%9pF(K9}xHO>^FA%$4wyWWr&&!fPsl=C>uLy5hFjA1Ga)t05A| z^)=AVj0k?j6uhz7rw~+m(V1q|UH>&p6WR;4C8Y*+#*u%H^25Vs3)`Mg%Gg040SnB9G_I+X=kmy=~It;;z5Rk+Mz=8qv0!R`wkxw@adu`SmS87{HqtHq)%TVJpU2uL$ zy8WzUr?Y>acyL=>Zh^rx_b9+{@s!c1{CvV{N*JPjcKUTN9@_~VVEDTUKIm9*Cpzp0 zb%61u5uY}NKc>nYR`8)Mm1<;8Y`gNsHu!8v<}2Wb839{iA;)uojue;Bv+^*+4CI!1 zV|Nu=1!9EU!9>H4{6Jh8?>XA3(>X^~exxw2TAF_}+chn~!18@6|Y zD9>x-v4*W`I23-dISumYGZ;ueq>G}Jx&{>s+`?K5A^%)Gjo6K0l-VCYfIx`~O-|1g z-+eAG(fZE$bw^$t#Z+7dmkstKjbhk<NOkth?og5*B&OfF5L1~hQF}IIEUVHiSfmtbn2&PQ9z{#qHrWOGQpEq>$ ziia8h@3oyreP!qJ+2?eKkH+Q7LoCEs{}CR~{x;EK?%nWvx{eX@NMMwiHMwPqOo2WX z_hEIw4OxlhXqVb#<3~`oH8K!ycyQF9$0O1x+9$$-xZxNv;L16>jWNm(ajCoH&k{gs z8m_n6?$Ct-l2D-xtH5HWzqwK2KHkTYx#r9ILT1^qWo54LQ^?;$RFT>GC?9{*Q|`C? zOny~m{8B%;3OvW<@#3v_fYb*2AppW820_ok6!Z7v&<1%(U){nVpr7A}L+52*h^_Fi zSfIhF{&ly8%Nb7Ps7saNxvWMtIuk^W-ZUleS_RgUI2|)J0L$c~4WO0Hkj1~v-6JkcwC5RHNrt0OH z4ZngjUiyT+0`G6%%9-n&t`HcU`;cFV*qJ{=`C|Ys;@pMCK5S;KP2-I?I zp(@M$LhP6G?_v`XqNEwO#wpr_Yrt>u@+(sd8yp>u{T{T)Gp2Sp)J1<$Gi#(zS>QE@ zZ)8gu(1JXKC*~h@@_reBvqnvnZjAvqq8K0J_PKB`a)JJ3#|YpdE3_WO_^(qG%Lb6B zS37{ax9VAtn7Ww1r02AgdOyz590_XYGVQ*{bq{5Se}itY;&CbGsw-FKNxH^{0u0H+$t+Z~*Ooe|tMv<9;!TKHYxeL@@f5z$4}E83wjT0P*&QcQdxw z^5!2=s1+?(G2-ufPi|5R@3)^y!|CT_dN~w0`FN+@^mVlysI9*3TJ{jUz5Sc;jBTxV zeEwu3Op-zAXoG(uJO^`Xdv;}skBVf>>R`PnYle? zz=z17GvWA#$#`~pRmjAo_y@DbN_KrpRJ|_AhcwkWY#S8-Nga|Ka)RQhbzGM`+;0Z< zUmVKW26p^K??7*E&qs4U`zF1|WQDB-5=|Sg4SGEEz~H zV)GHrG}g%OSxcKY>OmWy2z{)#%JG$ItNO(M)` zg$1e!Ec_cgKNcQ|I}=t6m=N0i@*a`cIysdg>lbVV3JyKU)iGv*uu$z6ja-qfsdA@P zud}6NWf5>D>ALK!A=)D$f~P!0 zF{zERmnm427SIx&@??j<5@K?bEo)adjclLm@~B=NBRGuV8(!Z1YQ zHjzt&&0cjTw}@=JA#$@zpjJ6{(KRWTLEXa$xHUSt-dT%6fH_z#u1KSYEsHfl(yn)| z(aBS?=PT@&GfQ*n)4r6O;br#pOq5YG2;zTvBjK)=76!)KjW4EKM-xxxVn!b3%esBT ziX0Dm$C(dC&+*n8fvg2@-V#m|w(sfmZeQOEuL@x^z7bMX=`1l5JUpXdh!Ys9ir-@z zX(e$O2tSOiZrS%hZN}D10(1}kF8F(b`~nV>>wadD>bmSJ$KpLTBkQGs?2ymjePDkl zno3(`(g!vj8`wwA2jF_fqPTL5J5Gv47&1u{E5^x$VZMe5$AqwflbZ;h>>9FxL$D7* zkou3x#E$h_j6I9~_6$vT!1+1Mx`vUg?snM&w!RL<3S@kl(q3$w%A-5Z-gZGZn~nu^ z@nsmR1qYef^f$A4o+l!qDf%WLcL{${6lL2Mm%Am2%OhCH8OC6uS?+`_?*=c(b6?%) z6dEG@Lb*~r8q0t#Bf@ADP836BD(`H=ZturFoscMD_l-@LvOZ|jAin@D5U*$aqC$+F zmh$E*Jf{>de^3ObiHK?8#eR-x%N%`U0M1kDui*n$BM(V%Z72;`&TSgv89skUUupG{ z+sa!j3U1O+Nnf7z0P7gVna*9!)pD)a^mW@-%5e$R#xrvZ${sNty6mFcPFch}Av!$q z?}0d}BkA!#y3WIB!74JM@d-wG zwF%l=JdvLP>>G8@V<_I5{&IiuTWB+Dhf8j9ztsZ=Df~DV3_7odJsMbiml<0v;&BDgrrY}ruzaAbdgrGgqETe_np;Cyc_0x&2%4H z{_u@gWqr%~#W}Pzc!Zjk7(Tz@;9@D4Lqj=4Sk^*@k1xn!miOs?;TwO=(gY`jNnDqN zdWPS0HG8Svsr@0rgLw`fQnfJ;S$;D3_}F$2S-}WjUd8%ILYTAX30g_PZc1-Mi8tjU zfRFlCQm^Pz;lPr!Q-lrP9)z7g?hCRqXdLToq?ROZ?IO`dix_}_kTiHz8&~;`C~{E2z7tRZ&W5-vy$ooOUWqT$Pj2auPv651m%ybkc6}P(wUaar?G(T zSFbGX}R^ML@x2VUiCP;5wTJo4DZsv-XU}f*5lc#zm)`J4`Tb88XWOO2}g- zbY#LfHK~$$l?-bri}XF*4IOQv=_=xz_Yx&QQg6)WL6DdKOyII}+hOF`pg;O#eqv+D zD1@RC>93D7f&iJQd zHnW8&(L+JF+U9|Tp->p4QQ3@yqVURb_y=9w1K~tdG(7tlNniPUK<6PT$IOUImWF~w z)TLJr;H7_&pG%x{U@#^j%PWQNlt^dgP4eapBWO|Kk=cir=#Kb}vD-ie1V5&M*}{>I zcYY}v5GL^8`GbzCiRb`iASB}&{4FhWZxglJKvISvIXZ&RrFGx`d|eDunt z`=cuj93b#x1{@U{9f#8Ebl29k!%ZBnR{)GE_zaN>Vl=}g>}sP7wNfk}d{ajPm+7_F z@;NNZU$FkcEi{7mT_`~E!m$L!+Mk5lEWo}9vV6CUO~J0K4z>jLCHn$bh!>bBGhy?f zZ_ z;AhiCX_7b0HtuTKk#&+h0_lXyAu~N;`i+x7oVbkRAkG-sykGtXIHl9?#p_YYcTnQv zQ7E-O0mF$mt+))lufezsBj4g9>eMFyn4^D~Axb1{79Kr`M(jItiXx=I)QeTe3!=1c zd1xuF!6~n>n3CYrAP+`{2PRs#|!$;KIH;c07Xh*)?hip{=Zk&pv;j zAp!~U@b8yueq7jzKVj(KYWdMj83NZAT#{?a!>wrq1!JpyO;j?Me z)_cGPsZ@s5SxWANlnGEw)%1^9f+ks|pRFD4>g|+=bntyxe~t0YFexfRIazaeIwuCaf}Li8`%|EW3(fyT<$?sEcV<~6PffKlp0367xl zDbmf`_!n^RH?yOf!k1e-^v;+H?;DkJIMZWlsVkt#9O-Qj1;ysMhdSo+b31W4cmY5< z=b}KeD}~2-1DkY|25kz)h%@d8v(Jgm>~sNHI@Jp!rzQ8han7&7+EaV4zIcBgF7hzQ zRIR5dPHK=Q_}mM9l_3~dOB{ov26)4%dORVas1qWo12nH6dGtLZg569eO(l}-B_9K< zEQ%L%kR{X&qF}Sed$)}_jKfs@ z)bgGY`G$(fwAQQsGWDFz%`AV=bKt`odlfV1qh5>vCp-mvZNZ_juxLyc>cHY=BebFf zhQqKc>!BF@$v{_57BHjajsA$kC~FX90sWkLhVA_!ABUr0_8(~&lT&KqX_B|TB5;{=6N&S2k$dR|jdHbAIeDQw(?{Ix(in1FK zYG-*r54#g~>6<%TxkGn{pJEs@8w2dy`>o&Kp<#eO|ID$@89o9IY0gueZ>3QPKcWK; z+IA|-;fIANqUSe|iW=Y-Pq3fmF;!=lYidy#bxwCIeP6r;#$SAXBPT(t#)h zzz>gN)|#r}#7o#Pkmy_gHSuUzJj2rt=NZVPd<7LV;E_5j;7M<;%3M*AGK0EA%%x7z zW7LJ=aj1pg-|8E-0eUxvjCt=+fxl~7C6m<(h^FvMv!>qyN*8~?L)c`YEKDUiL{Vrn zNL{p4%AOA}7v-4~C6o*k_>`mWY!8X}>C}f_Q5i6S*lLOl?BNT9`Sy+d_}p+q5XEnI zgiE|tkC{n456f4YWqy>VVVuBFeiTWb-`-|tl+1QaE(4!?))FL-b8t1T--0ShyIe>K z)JNx?Nw|Icmw11InxrTi#IuKytVtIZW4030yrVH>Y$4+H&!_$F zM2X?_CM1}^K9#ncst-(yud(G9zX=k7ev^HTo=Wf3;ZE2|$oh2;A08@g3mEUr3o!>A zvBRhIBs^Vh&wd;rofi|PvP~>c=gIA|5olYd&UQE@dC7k*I<&_3S8cChi0cQNF(6f_ z>qxo%#^mrksFtWd=$meCc>%i*-JT{^D6lLe`GYuDx31=ZVjbjt0o<~Z*v_v6wl~DH zTfh(-$nbCH8+cHFKI;hu3n9-CyI#ExrSQ4lr!M<3*%R+X)qp6ZJ|wiT^vovIr) zsQ?F2J_>(_k^!N6J)HI_fVTWh1{uq$Y+6I08E=<{Tv>fCOdK9O-OtPXpxnPuqaI+r*;K2m|wXajK`kWAfqT_!=av=q1V6puBZT&aLfv^&!r4isQ z%>?^qU0f{dZNk{AmNLo`%DX-e{r^Adu?yC>8rFEKBUG zDE`jW$pW1da$jW326^JYVt8PgJ8p3ZE{(SRvUkqt(a+HfJNay;l zL->pyNw8=l3IhHyPiiY#t;|cjA;eUElPge7|3X&}4uM;$Ox%KEc31DWW3}0-vkHII z#gk!Fxl59x1sD2&=iox6opHaqKb8KN!Iy}R{zUT=$j z2*Dllg;N~e1NK~lRh55)eKL<#TrGc)MAbsB$q=)<3CX(30>0Scz^LQQUilrByM#OA zo1r;+>f%tT6y>mPH-OEDLr%z4LN+N?!&y zyJ8SNupIae9CU-!;3F$K3!Q(s?P)rxWap^LS#1gM1eNgD*R82R8wY598I}r?f(+go zeOdRTQ4`D{Q0M0$m={Nzj149q(OpQ`Rwhx1-M?`Y8bi3yLx6$M8Y!u5wf)3dG$zQj|9>E?d{!+jqp$#UeU z(o*}uQ5V0s-L=LsT@VI1$QF~gq7>$#D~dnCHV)ccT33=s)*;Xt|Dkz8p(u5v1k@%F z5)i+!kv3;%K7}dS^-Ln6xWWFiy1)2nCv5qufs^0zg9mbzF~hW1H2u7immsHdjf4|2 zP*PM+fw(odJ=O&)5z+y^Im_RXElAJ;EAX1p zQ;8J?U0%^{l732LITzt_OLI^2swkkQ%gYv*`%KM!+BTFhhvQ|pH`CwdK2CMeE|R2= zm;2B&12z3CJYBki_B&u^M<3^+77WS?U{tjMX1)4X6{;dUR4so(>k_v{fH$Yl!PAgM zg(M*w4gZ8_pa8$TznhDw7M8pv|7-FNt3&oI851fhHCN8)7_6= zou8CGglC=9C@|B@0nZt_EjK>2B|wu~+kf34xb&}&{c*6^3p)|h6wEIdB<)-6PVH6% z`OI5Jo9B~0d?0^ceFGkU`;jIb5HIae<$5S3ay?J9JMHP3Em36TJJz2VORb`YQoa2) zDsAHQ4q8R0Z^KYF^a|<*Dd1r&lCUeH8@^P>}iDu@JTtt z`0G-gl>uj*?GF?WTEuJxcd*i5? zk<|~ot4&HbX~7KnhZP}bqb>X*+_QscE6q$ZRl91bq?0qc;e!-BjmTwU&b!9RCs~j zKL8IIq%X)YOvQYG;y{0!Q?y5B9XXsQ_0xWJiTCdf(#Qf914+25jAKMuO!-MD8p5C0U!{a{Qfb{{HPQHnEZ{AZJEKZ6E;PAo3 zZ6v!R8>y4Ok9uV`16HTF9284%R!0cECAx>D#alyFiw$^Dt$JgAU! ziVQ73O)3zgkzj?WOOIAVc$lxKDc{h}-4vj!;;6kpX`vqWH}o?cq7!agxK5Xc-W`9w z>t@Z_s$f7#gS5Du8YuEWD7FVpU+fF{zfZVVBEG=6Bt_3LnW1C%Pp$Ln&y;T8hZZSc zwTG&PZyEF!W?Xhu$w}-#cN3y&UpkeQRq=EM3buY{4}|<*sk;^)(5UvNrh-z!cu|Q7 zk^@KKf4fEWa=V37HU-4|Dy)ITq#=LTfpo2ajBz1YDkWC+h4q}m;^M2mgjRVypn1}Z z%fDUyuvH5CO_7NfE&~1lE3&6ln9;iy0ewhS4eiS0Su>lceW`A_P3aHb49iXyalj|H znEezcK!oq>R^n}z)~tYiLR56`}PU${N;c8sySMF z>aEO9>)qZ?E#rcVW3SD=L!`Mccxh_-gt2NIiM{r^O#|`@ey142`J+m^DN%*hOl@my(J zvhXqBJEY1Fc{8_A#*%GB?ECaz^y0VJth55khgp&)fPLBMv$N(;)Lj_7QG@-v8O=D! z7J5Gby4aGZYI0n?25~I~;x`yJ)onjtvESD=qAUNwO*ngt9>vUsABumM7PWdwr@&`m zu=`0tT82^lE<<@RqFR=0csRu^Vh3>K0=_I0RSjF@c*2SD+pNKedx7Ahu4Q2zNh7}m zKzS}e(m|%$Wwc=oX45h9_f+K^Ct6Gc%dc*Cwa_x5UZm%ouF8I1LHV}O%7TMDtce+z z;l8KI+-(Jw>qrTeu4sR}0RY;seEwdpMPA^<8#c99>>4kDXkH`=_{n>t>!F251gHJn z3>jPbuD*u>?4yuBMDtNO8~VO&<6*KDAtu*DUIk3!y|kjxbNufwWm_3(T|@IK zLI}RYIiue&D8nbG($bY91A3aFp$$w^(T3#fd=Q>lL@yJ)V19qdf!Y2DX!c`$j4yNM zo-YWTgWkEjbC+j8kbm(h{~)vdx^P|!0oZ7#9xDVqms`|teWb-OzQ)45L8QZLL*%-b z-K=xlDR*6|d_!~&@soa9W=m*NJPIp`+mAM1KbQoVu5iaK#;M7^3yjKHn8JDT&i%pQV>l|Wy6GL~#er@5_^=q0g@(R|K_EV4$ z{yaQDKba@46!IgdZ4AmK{<>EkpBz6hc0tE|yb`~rNsE8X%W|8YCet%ktNm8|s?iF- zoCHBrWF!M{f@`H`BFR)-;@9-?-SlwEQ1$Ai%}8gwLzBgd%uSDD7)&cYWj zdbb$3O$xQgclfSEkz^|l->?ruh;Myp10f+EC=U}1xYbp@Q|v{xGGMA)Z3wy&Q=N!i zxUOFx6)u19m-%ushyIU0OR5=`VfM6}JbxErcy2tEZa8@$^Aiw)I&fh0+>QiP>R58t z1qmm9dYtsZ$ki&p(}^#SU&Yk+CWnbG>w8nNM<`6sU=$a{x)&cfyGGzEvq5L&U?e3V zkaK+NNXkG;Cg2Tqt*+na(9AJ4jWe$j7-~THsg-}k<%&s&bN`_^MB1ZDbwA))CGTJw z3|fEXs=E!j_V5ozDXuz19y#gaGA`BDj26&hV&2xndlzH;+Xv#pLuyK4U)-XZ9V_KXz z`i_5uujFER&Hq#-L|%bdid;NERZ1+r=->N-PMbc%Pa_Z-`gB#Xg#L=ZOHrj1z>D$k zeV;>yaNt+6gr{z`=1}%*yyzvqRIzbxzw&TpqKyPbXt;CEUsUJ6clp8|fg3(Q`Lw*j z(Sl-j7Fge0$Q~r4z;|^VHXhpee(29nRzrU$nc4f-Az6%|^)`^hJfI!2PtEyBLS+O! z&=U7@2Lcglp`2v*mA(+|8|^66 z?r+PBInMg7RVF_Q6R$U(i4K!cw_>lu_TX!7*+)?4>cstHHgp$}o(hAD0Mff2*>Hc@ zOId!{_s2J(QGeW{L*<1Uad^f_8G@s73_kSH`Mc+laab{Z6AH;5^zLqpN@yr%t@rv{ zpB7WD;qqJCIHb}b&$M@~8}D>ZBeY4>xbVjk>;%7?R`~Vv=~05Vm-MuI@)ovIoAZ5> ze<*B+yDeHDK=M_5?#Y0g5S#@joQQueWHYrPfOYD7sLLBqFV(b_bg3;w^lu-s4O=U6 z83+UuO-KVVKWz-JoeLsklDjjKjZWd5G;8m%NPb>)+&iWd8itaM(5Venf-x-qxu0q)d-pxO)`9uk9e*SuNnacaNnl7i}C5_H}_*A5R!b zH#)-t=fm7thot;#R6f#IGJg?>y^$^85)nM%_xg9g8G(LhYv0o8LVcBE0amwqQd}pba^%>dq_6H)GR6*#*6Yglrk{BKn z7%s=O3maw9-Hob5RDQa&Yg+<^jBwAwf`}chM*R^u;*f)r0ECpxQ5$~>PY1;g1nuxP z4d5uQD35zm_dr056U-GolYj101Zt;(mMjjFSm%Pe#Y!l$a4y zpi=z4KgCL|KU`l_878-?7-5 zGH%>)CA!Jq#R7!6`Fr(%*1+`wU7tG~7Evw)lDO_j@O3hTUk{u#dALD9!A>fo8z`h|xSUjYAD;PijSe|R9fKDwibp}bQ> z2204MCWVl{{Wnt6LfQIUkzWbI?}F~Lxt*Q!E~gO64%rJfAA39J67%5|NTGbgLWK0` zf}4;Dk-(T2*h_iHGBqD|`f2z3_e$t)?TCOD?OpfOaO(bruj|{AlmXI;%ipfScfK>; zS)`;Ao@|yGhp~S)3h-<~hKt~>bkx>P+xytef!W%GbqbmLF4p9yg>dyvk&_?qyzfeo zkKBPGd5+a#E=@aE7Og*Pu?BBkYVXMt374#$or(S{3z{VFV5 za1VK7bqas9Ep=`xV_VUu1LBhrRG}~Fd0sw-yJ>|u91sIRawZEyAWG4A$;7|g#r}QP z#=8)Wep~C@K5mTh4O!l9t~stQdzphMQ^s-Fi@k`5d<|r3;K_sb2=JN-QS|=HqlOD) zM~w*;*Y{dkVL0&d-ZsAp0C@9@^Cs#GDbJfKM}vRe;ED}HpBJWN(-dNW8O+10#E{g` zSlZK9g$aySuxB`PCxx`9mRv|f3xvS+jB?^Uy~Z}a&o1W3wPxu-z>oA&`;TzmH1?BL z$(;J+v<~o%+3lfz^VYk#q{d3%2DGuPQc->i-RKZvX=lz?N9fl+Z|yMas{y>chP6>c3?f%O==-Y2M+dwHXcHNTgQ8I$z9nq45U6^dj3yCIiC(ifGFQ5@r= zy(jaBGa*hoAAu`Ir2TmImJF^VT(`e`S1inWj!c`W!QIYXT_&hsfLbA<%c#o;@DuA zue!r%n25ki^_~Jtj4e2l)e-%=^DSg^liwG4md$E(K8bsvUEy$=T($>(R`Lr>_i4LO zI{chZo3jZbMZZ@jVVm{vF}Te|!+btKXSy+VFF%20neIt_#&?VwP5q_6AXmtDsY@ss7rkycUD)fL2HzW`YDhuV zL6!s%@;tk0CTWmr3Fc9#j*hH}qYti~6* z6PG8&DF{zz1-yhWOf~W+1Mc zP}I&H=HnR7`Yv`*qJQa>ox5a%Y&hdfs_(c0d^s}LLlF%5IxR=P4}EipPLvh`F$+0@ z?${x|AVnhd|Dwzw5|V#Od#rJ}Ui+maMvmM9 zC|_+ZzTGfoqfG5(-gLd`V2{TE4mp68wHs={FnH2?q-~n6WNHw0kBJ>rJz)JEn@rB0 zs)1FCVyMwVyF2%Lu8PHQe1DyvY<%zf6aB5QK5caQRKI1=DnrRWvQ20N&mv3l19*P! zY6BAx?2=>IUc7&{jA5|WgJ92pm6a`hpN}bN*s~Jsm>?`#$r>U3wx-O0n0_6e&3zQB zdHOl~-EN5j+2n&Xjq9gnBYtt7?MKT5_9S<26#BqmFM9R*#o?p%@*XQ(eMfR$Np@`Z zl2`AXk_y$Mb8Ki=I}E9A=(ff}a?Z4imHv!Q>29?B3$uSd{&EQ6wzPpeAxWSXqz_*d zX}fp?6I2;%cMu?~LzCkxA+xi;N%peOhm&7ZE@buIYAY?~9|4 zPU;?hW^f(QQ8s1<4pSDs7cZC<hxeqn#wra+pgWZawu41980YL(Jf@nl)8 z8px7#RPC1NPiNG$Xh>)vD zxNH^!r)jKr(Tb}y5wJ>AQ!8@>6<$3G1~`9dA7IcNKpKISVJ6}7MuD9b@L}CQ+XT03 z?0CZqldC1(X@AGOJ4ZY67S-r)CRaJ_Kvo(jbuV;pgdwo$1FAgh>JU~*@A3Qu!a>r? z7Z$*$fqo6xr4?I7;TF_L?-n0vqtifSMOJlO|*$R-))E?Pbeb9rI=R+r~ z?E@O~Wt=^2ByGi*2lGh*zP%o?WoIK!Co$st@RW$KDYKoV)KtF1Hc@XLQ<#6$KkTfp zvRBmGtst6{3eDN~#`LV!QgnW820>ho`wtxeJOV;N#+0!WNcP0J=<|Ca=)kEkW}XiL zQq-Xv@(q{mH-EiN!};|`<@=yr*vi@0r^+maCN0MZvhk_jzBkIgV)UK8=76C9fU#?0 zX6HRQ#?inep1dSiJK(ph!@Yl{19`nzGe{>iclDX(ZR1`P%$#Nn_UwNbHHf>XtM-OM z(Ua9k*4zy{W5WPAz1RiZKS=-}ji+11E)M+EM3y5XD$PZ%T`Hs~v$;Ts0)wG?v@ zb=132GFI+ArdOo$$zqggJ{vEfy2X?S^`nsN>2W;J;t!rRkG+$#0tA0FOOWPz;#K*5 z01kNuL(+^qCTaVbjGNiTlyVf5iH|(d+ytO}l!0`RGX|GXR6sE^4jHf@>`x;o`$-E( zW%fW~>uJA#kt%kI`ay41y2_j~pJ#sTv^6k!8;ODFQOx-oi#fAVr7cbXtE1*_qbEvj zE8et=c&@`_syR>J8&ZD*WFn4Lk*pKOa8K|5MN9|_~s3PR|o_?`2ChI~*})rhWnAjVq@HaoYfn--gK zG3P^gU&04*@?a>#WWk8AOJw@dWwiGk{mkzlV4y`IC^H>}LSTPk$Y3QP&+Vg(8EKHz zFJ6!^%?J?czxJ&&JMm;~Z%y?{`E{%1l8t5ualmKsOEA~=-r8qiqcdZ0hT>ToiR8PD zKeEnGeOSTnP9KYBE|8d+4AD3398r2;>{TnY5wF#q7txfJK={G%bL0Wir)TVX;|nX# z5oDMPXa&DHY=7q`(nS6yGF7`#G2=R`DS0s)E;!z1bKDdH}ZjXlo$4>EoB1&}h3& zD5AeLtbyWNXs&qQ=Ai$ax?1&YTH{kt%8uq^P>WlOo?L(2rk+UfnB_@Mdt1xT{=F~L zYxUJ|w(97>ZAHH2T8uQJ;-wN3AJtyb?xrIn`xU$bZGv8Cay^XG1|rbHDIsTC>u0f` z!gkRUlu#$sN@s5uB6;~V(~^Kkgm6(CLILJ&+~iME{(SOvT%T~AY?AVt5SyxBXsyNO z@e7Z$-Y9>FyP}S(2CMtcTS6;^C^*F3)@X087YuMmX()BbK~I2n+5(1LNu19>1*F|&m%sBfSR-uzCKkhhAfo9MCv1# zec86@Dbdi!6(;xZsu;px{(e0!;l1%iUg)tt|&?xEG|9Q{nRf~w>F2?+6ycANN&F+#Xh$bdYG1LmOflfr~( zar8}z9>>xMWJU6iIddYw+Zb>JG@;PyM4HGaT!j;rH3OgD_uR*co%SKfy;M$v+sA~h z1~`9=QS7eJUm{3Z;q8Ac?E_32K97rDd8>8YtZ`63%Hw>9*MJhB-|+G?_86xerMTKw zlP4yeTE2t8*0VL)vlpQq-5Rin(_>N156-lj@aD4)9c;H+z%zT7{(yo@U%|JfRiF4| zKld0BQxEyGhAyFr!xmR2=Akz!bj2>`b_&idd~t1C5x>{Wv1+Z(&nZASn)o0S6X)hnPe42$Qh z+-LT8kRaW^$rqxl>*C9MQCZhsw`*Gb!wekj6QG*esi=bS#fbH#H(fiY?kb1L4YPkp z;2IvBrF^&R;x4)|nDuv%8pHCCcvIeZGM$&^WhfEMmpW#s2r%HDi}r_J9k2nyz_rlP z?GyDD;P_K>eDUghN3i9{+@_fnAJIG-L^wzYVVv(=|0;t8B_98LQpwJ5e|6^_6|*Bq z)kX~wpZx^yIJJ`G9$U(wO^74ZOd~iFBQI7so=? z4cnjXb5hu*$2zM)_V?$F2vF`n;0kVT3fACoghf_}Of4Q_gvojtKArh7YVjvGHN*f0 z8ARjGSHLJs)C3+Ka!PB1{V+b8saxnvK8!KZ2CQMgexQI$B%ybf;gn-@`-^{esCm4s zaWefhNcN`ZgAzf8Lb@jm-i6xP4@M?F+42G-A~&Z3H-8hF10*l?N@*MW?b^E3be8@5 z8XU^M{W(r=sfZc$lb?(W=KS{g<}$yw=IY&i>dtyL&nG=;gJOTpOOl-Nd~*c-HmX>H zqLmf-(+2I|lp{H$=~)TbMO}YXaMO526@<9qS``0*D1IvXU!j<;@e`?4_}Yt^5c^#p z>kG1h@AtaYb+m3Fx9Pn(E3bV6vq+J3LX_+9&xX{K;t=QuzV&4m3P~t5HI2_C5la3L z7Q@5D(B#^a-BQfjD&GV)$G(*G9Bd8Gcc8kkvPUK(5G|Pi5Ius?`yzi{*edyn@RiY0 zGfGt+(zCOA7~VH5AyeNhqrfe#ST5&*Lz$OW=$0&uVhs}e(E1s`4P*t#Y>=a&9*EFG zGG`%DzpoV)0fGt7eDO79sQhveJ4}>cPC6+5vh?qKpbe-K9)&zfvKM#1Jw6YNGeFlD z#jULk=N>aW&45nsD;|G-DPEU^)C00wKnOJG{Vh7_3mLT6hkcI6r#gZhO1FacQ9Ea^ z1!(REg6Pr;Vrv!hXg~+cL^7J%EGc7*~ zi`!@9 zuy@#KuMB;|uk6zF$)#umecSGmcq`++Bqr!AB(@S{v&nrjY@2?YNk5prNP2&2bPN?r7a-^iiBhaYV{zJ^ zK0ehn_G|`orU3hS4u+o#?tXygTbCP(Wr*4LJ6Mm}n`|aGD?b>{rf$u|D!FYZpPE;m z->m`I;Q2CJmdR*axtP$)S3ZK4!oG090s{VkvbHmETJX$E>0wLc#b<$P%DtZ{IO=?Q zJMVTM7B@0~uGeFG0*7@V7 zUH?9dSLJKC*~Uo($dZWW*2&75k14%L+^vj@(N@Hm%88nqI=%G>#ZtBur`T?bRUZgo z+jMHSs|@7ml&{x%26vVk7nHy-?6^6e&HCCAo*`YU3*VrB7#E0Vje;b~)MGaBwy(sX zg-5y$Pjh}!S;1mS!GOmmG%zUw3Nek?Z#c1+?(fccNeW?pJV*|6bf2%l<~1&EEM}Oz z_sdvexhf-&jquhCQ@(%|V_K_Z?h|O^>h^LmLdp=Pu6cNOOliN#T*ZQy?#F69M_`gi zwT{aapW)qqVgw+-3I5?x@5lFrF2E>iM}ZXImws_03c$wqsxbQR++&KRH@HlF&or5e z%84N={byqOH2dzKS*?@+tpcD2$xD}9%B_`e?=ei z-(E*Re1_5;$61Xr1*!Wk4em(6n`)`VE#X%TflTJ&=N|urqZ*@%n=Ch^dvEb_qPmA6CLYxh`&7!M-Ke7uIOh;d!%EuPR=@ z)8024<9)#7yB4PNOT9vW zP$n|QRnHZ@M^&GG*zsT;cZn@kPGoEWjcPWW!8%t9f&LzgFUUZ&c%#GTR&IjVH*7VV z1~sQE3+{Jh>ZYGiVaOf8_)IyLEdfg|rDHU~MOF+A^=~}9y|>>|O#}e9{)(v4o0`-_ zdrdi&4Eto1<;RB<^sA<_)eaGA&oB{xwJ@e)8hxm%9_Ut%F%&6Wp=0lB-^n&Ze5ULb z5CTjrV<1_&B?Nb)cPFo=K40a0!`Y3cMD7z6ZTs`7#Bs4jN%!>-BWUA)=JG>>pg+su zu+Ryxy4URLXxY(@;IX;_K^384Q{#66<+oCLHTozioiuU86c3t)zEIl$N?k#JiMBtH zKky^?g!1Izv;37U-({Al#>d&+)ARK>O zP7WE$I+!l_BWWjJn4^W(RzdPRTtf1^$v_Am>-YO0p71MuyTe>@+%VfHMu*Ux6mp~t zHW8m+2?-f|<9_pMIx@|V4({-Ox<$Q)RL@d_L@OINXHXh$UI+-~4?gCc2G$!6%Nt9` zD!+LY-)S7|+N1c^Ht7cN&E6vc{2X?z>2J~9(GAC6yD43%!q`4MA2Ll>{8$i0Ze{*Z ztyNlMnh6s?9NxX1^7DuY@Iba#r*b4t6%eXKW+Qa-<7K?*Qr=6efr zZ?+$h-$QLBrfbudyw#F;#ARIJwP!Y&3(*G{*BW&whAO z(5El5z17#`U)EhP7)0Ak2w(s~(~YR_er&sjBDxg0N?vX#bV8zrLVuEL?A~PfeQ2mg5!? zC_Y?p#Qoh6NS#rCu{ znLH#)XNK`5Rd{p~)Nt>k0h;9*+b@Uyb=a3(4TYr@k;u(&J#unZVet8M>~GzqA6;qI z3b0$BKKa)aaN_hS_9yfBp1_ZvTeaFy6$|AaK$FTD7@%2y%@8m9N3V6$GL3}$f%tL( zT1fw%&WXQ0O{l!@T0gb4X_`Lf*kaD^9P=;M_uQjO+orUTL%!Z7iqTYHN4&Uym(i>9 zuRcf8>xBrw5>i=sH=77DX>KgU=`7K;RsDO|l4dMOrqIbjm(KC=tib_nYhuL0Yd9z0 zt|NUB;Y@dbUUdC(WL3LegBV7~juwB{*IY0)Oj$B@Cx@UglP#vq^w#`&aF5RnsZF!q zkihqU*Y;`|R6B%Bo3vxud)dl^-MgiV_yR`=4m}m1rcq);p*kjtRVuvKb*~X3d^D_j zgzd;*lS|ZA^D!ex2G{n@4j-IRokEh+10WDOt!g2EA)if@*h}NZF8^v#xz&J1v-j&E zptDBOD|VUuNta7=_BXqT(}^`>bkgTX&GIst3(?9MtY2c=jTPbWb*)(IJ-nk|aZoO4 zM;!o}99}oifT)pa^ooJqKD>M?y2~b%8To9{_O~Wc6Sjn(IGHo-qrN-EGV!+M>K1@B z|M0tiRSPwxbZ@EiVw7(Tj&`rq;U~5G&2{b)-NKR|j;Q-vf@eAZo3rbY1GZsIR{r5W z*^$4cyP;YFY&~y&h;BHW5>Dq5#&I|W2KpHx|E;O}GGV(}O{R|kj;jFA&(-U=q2q=t zBjnQAOqN?mQ>y%sez#uUQ`{5uP53sz-`X~RnYV`l-ou?AlMVMZG2>&LYL&P|lFq(w z{_lWSW1=|X*kw%L$f*_L=-}1o*fwifHi2{QJ`X+}snpMwIv?ijorC9Jh zo8mXz^P7*&6!t&i)dX7f?BeJE6+r60(?#RhY5eox9T;B}n7Cjkk3lZ#TniS5GIqdR zU!i;ZBXWwvd`_6YE2WOa<5=;N$MYZmJStm05ZK6&G*5>oK)D}ZE5~R21f6HY{q*5$ zbG|!d)};O7RpETZ-Vy}1i7S4N`tkUGXmykD4Z#_kZ*DD(J^cwxAq(#ap=CLRsDS=RQR4XW|o#FjXxn5OJGZu#%T^)H;dXCt7JF5`xw`M!&EiW?IX8g^+tQ zQR*!3G#r?SJ4JWw6s-vO0+>z+#*sh2%uSN45(%8iEPW+F!NOd3WJv2>XI{T7z?wxU zL36gofxhQK>aDk`4zAp}gzxu%YE@;cqZ3}eG?C)Gu9?^1UAe|JWKA0B8Y#<2|EV%g zO^-gDSSDbp1+Lhb{rh$md#=QRn`yjgb|tgAO8_1o?2Xt}>e8&E_>j)-3ghy49{1=f zMjO_=0zPvOkLsy3uXyEgQFz*3WrI;@Lr%rIQ?4|J@@ZTeG1zqI6YQaXpkb;V)|FO6 z*>Go=x-<7UenFo-ai#=WDFg|z7?Lt_uAT`YPc5X@(xUFA z%(`O=JowSpuey&`T0xh82IlvSN4H`ih36k5f>2UD)1SE4B?235YfsFf^zSy~ekpd; zm2O$0aYX=RyZda@qf55&QJUN4j-WOpAF%ilqiWsBR@+i&g3)s!Ch1t+as@Q-+W zu|Y%bvV51GpsDeCT( z(J-q%>JZk6M%pV-?|IHQ55BY2fS5}CH&;(&cxV*_s4oYqgK<20N2EH|(I>8*$b4nn-Zu##s9D{s*0Lj*vkcWWVf5S?zc#x}! zHTK8SYOrVLD9`DCRf0ryrL7s7XvODVV2exAGJ;)RTzu#uH%4^9!Nvgb7Z+txZKZfq zos|TlkNu)C&g|re;OZsIOetK^1&Or9)*aN}^0WQm-A}XiAWsaCwjY$Cue&CZHh_*P zY7D#Y_2@0Ivw!D|Z+FUzCENKnghrP8Y;4Wh!uK7h06@Bbq|+F-6*AZgGVMcN`@Di+ z95OI+FhH`h;S4aJXJZ)h@8a}miE*2JA}C#DrO;_{gHVFeVJvW12Qim?K)lNpNR`d#%nVDyG_GuFH1Xvc&ywWemG$sA%6!z- zk>pv+z?zkR`IlD^SG8n+393>O+r!7&FSaG{a<`Z-1I73TUHL;#8ZVy2>UPz-uH*E(!co^ zWcdpwrdQA{capNM$xf3^zC{xl!9oOBJg0wSY-(jvlAX4Xs^k{y>dyI zoq#LFx6moQ_EtCrih4?)+#<75Yh~036p3ypPd(yR?L&$w(QfDk?^uKeIdZ(kAh9`0 zv3FU2`#xaii^C`lgBNo!HZp!l%jOdq5?K!A_IE0L*S#tMXr z1%3fC7I-eTVA5!6VqkA@P~KZSk`6^RB>D+N_N~wUdBal8f$Q?}&^$Nbiz%9w^iShT z-`DWc){?YEh-CR@0VUXVMrSbG*srAbE?#EASXIt{QbGO7-f5I!URS2uw8WHTKt6R^+10PdDqZb~ zw3!gAg~DCw2mMf^#pn>nLqzqbh6G%GihC9I2Tz^^|Dcz&LpIsz4>cq=@Aqdp@dm~1 z>G_tn-N8hkLiAhxezjBNk4xFYaC7#EG2hYjkR?z4dGCiq=&NK_plG1#h;yZX!unX{ zyNP1uBx4C0ZTGE_~x%z2|cRqpSY5bGq}N_n#{^Nv&B^vOBq zM3iUJ(zWMDxu1+{=+jt^hAxQJVpdc5<s{`)hNivTLLfi=aIeAqx zj5te(@2bG$H@?@6A%)*y^eb zh>s3Km)8>&$x05E$zUQVV$Q^9<_S^8l|*`m{s5`Ri*L)sCUgA`QCQl44O%Ze_cOv$ z-ONWXQRQJ0@9zpk@W(i2fJ-j0pqt~xnjf9l!6(qUmA1JJh8_Jxq9HZ28)Ri$h+`lO zZLYyK<|HX2>(WnG0RKZmOjYAM{J5Hi_ zg=XPQ#`4* ztIIUnnjKx)$wL>(lASs(9?MpbA}LISlfUl}PRSFeomldVMnQ$sJc|J8S39K9x7QsR zAn!Pjd#MBuZ6uN`%R-?_b(k>O$T0pQlW*N2F27vy%;jVOV)9iK5n1Km-*4HC0B8yj z=0j4dhFqi=RlbgYynIBO3RM}PZ0Arj$~GDd#h0J@!m(itL!*NN}Qr{A7m)kmL&1B&g6w>gQKl z`PYj08{0+6BDdGKP2QxwJa@~xm_tZZOMS%GXRKC#GE^3ZRYhM#UQm-EJvLnxGpAST zO=om~Jl1e(&z?;nBLX|@!N@~KoO0yeQzOuIG&<0OfOnG763$`2ucsbRl0?elJSBXp zYN@5$fTBTCxRXNT@6_h5K~8r$BkgV-H5$7oWx_4F!d>}TZ7J@vA})D4D5fASmY-my z40Bk22WsaV%7IBU^%m@N2qn^NAkcD;Lizo`#a4%E-1Y+3QY;7`VAIw;Gn7{sP>a_! zFUm9dk1g@fN}{MPO6#cz-*^2gQ}2FzZ#ngq8+>of|Ivzs5g7BQN8}H(Uy=6M~W{GOmDCJ01JZP z@Yv)YLts@5MZy1Ku>XO-Ekqy+5Bn_3KYX*sYcjgU z_0~2Cq35qW^=jK!?QqZ zDNfO*@`cHXc9%x2vEKys7#!U?(6YZeb&t^iIm&b1SVNVYNO(s;kXJqcrI??8247Z2 zIx-~|eY;%=FiaLlS|fQjgx)=d#)1tD7neBx`O^XnQf}Bw!7cn_u3u!pq1DBc}UeF4K{eI&$-+C7z1Iuvm^ zd!J^34@4y>_zfjh2%>xs)?>%szKT56d4j-cW!LBDXDOyTHyQM5> zrbD;`k|e840+IW`@la65RZk!XEkJ;F)Ejpr#1g`vlz35sE2P(Ahs+*-2Z^`JoRh<7 zdPEtod)72rOIZ(G5szwS??|J$Tpm_1@BikQq33LdG>8s|~|8?u_UD)aXxl3BBiZw7KS&DQ;({Eh2}W4a(Af~ebb-p{*{PvRl) zKcss>9d@>BkagoA1fSc4cwY0gtjZffKIfLfQ8AGmB{OJG1)4m6Sz%J~m#SAybEPdT zi7V`}H0tDLUP?_*3Jc()$4!j~X;?H_1edPY(Xc%nNcqut!~WYxL6it9-N)6OZ&@KB z+U%@tdMeQ4spd4$wc!*(*hoC}m$AA#B7!3Yc~WrfFoisuJa&5o0J-c?>0XKFvU ze|@`+6CHmllzE_)up;O8@A&3LO$v~2`pwauj-7yKyZbK=Kc1O?9P|74d^b#xfv>hk z$_fCi{_ncLjL?g2=j_(NasT|s{U85Cpnrn@`QO3nKmU7Pl><9KK}P>o`0|Bf4u$s z@c&$2^^d{GTiRU;p`!vg!N(_~$r{#XtWs%}Lg5Z+qc?{$t&i zsVn~DpZ^8=_rL$K;9q?+7Fja?$3N43+x}lm+o>6U|Kp!SvlYw#z5L(L`sTfRJK_Ic z`u|_gzs@HAYumeETas}tr)7BGE7_Lj`d{Gx3cdf~|N6I;@9ls6e|FXTo4<}B|Hs{X z`-cksk2~n?kbiICzm~m!H>P-ne#-NI{^KaJZCd_Syd<7&|JUaKUwi29_CNpYUsW*{ zOR^PC`9G%dAA7ow+y0OL{T~Pf)Bl3te<9>QVCui&(0_x_e{h2PuYbLNw;t7h{!jl0 zP)i30?CJDgy@6aWYa2mnErJ5HAimIfq$SC8~Sf*pwdl}7K21Wt?I z=}ymro=NZB8@)+-pZxX9ucaQ1c6D)a0c{qlf@DU9IT3M8RsHM#c@Owo*#qO7)m``15nvHo<@zPHi6+W9|Rb|M8FZ|MNfb`aht5y#D*Z{|7Aph5FxyBJwZD|AZn8k^h4IHvqB! zfFt(r1w{UtCHX%tu>XC?V*f8Ai~SE|tAD)y@5sXcui^UNcIOKh^dI1Z{#pEQ+?~{a z>=h-je}6&#tQ!gcdkG`dU$j4O{QJfG&i`L9Qvdn?_ksTRt^0pxkL=j@{{?pp?Ov|` z{`?(LHrUH&^4zv%zE2HNoY+5G|5NRy=@+ZF{KKpNwOPyR?|&`QJ%9bL|7a4N$NK-1rCa&J*#@lXT#zc& z6Z5_d*KY*Bey=L~{UJjf6Tc;|!8@S-slY|-CyaE4Vcq<_^+!eyS~4Tw>zWaI!44d3 zG=FrNU40ltClGHB8jT+l@ygLGw^d)Zsg0+kZPbZz8?^vBE!c9j(Nj?ig7B0(h)#f* zJAa_5p)2+GQLUL(E?exI?`OK_MSj@jSvvL6+wCEr+e)ww!0-!8s8ZdltQ6eJ%q37F zK^>=|Y(wO87Yhp@+ixpd6~H*9BD8_pbB#0A$nL3I;VSm@^>Nda#Vrv{)B{$qbyRq{ z)mnj8zmNrHtt&ORC3;*h4C1QG!`*4{7k_4K8^;Fh&+p0ZkO;9V<&j7da6eUq+^yMi zQG_D@N+>U}&@_-q4k%0tuM7=b)zaMp&5Um2%EH@}JJ`KI)?ID*3WCjN)4W>xnS|a} z+Raw$1>`VKxdi(2b(=uoXu(yOX;RSMx1A|~4~Q$<$y~8zkD0Xn#+Y~_eQ}nThJQPs z?^p3zt7mG05@!aEP>i+9{bGAl>!phMY2+qjY!Dw*aW)Ch^fvg38!;?|Kho7?*qoIzn%Ur>Dnau|rC``-1=p>4)?vYC=iKMh3X645()(ftBi*>})M zvdho}bK4SH!(lap42(4~g@2x@7tnI~z`{*HeJkrW2Ct2|HzFIgu^SbQ$d~c-TNatH z+t^q^M&i0!A%^{OsSwgGRO>m5!_J|nI2!Wy=?~VywDCKE z8JIEp0abX$h>&Btj|ehIe(N5C7NO|jZABr zL1l4|eapb&0$#`i;o1xT5I0XYxl5Bn{4j2zeUIWs^UTeBB|v{|uylX++t9X}c80`< zB@i(rfA+7)%1@b;QmM*h)h?VXut~m?s==U5cKOFyum|Z5^692u&@bCRc-sP!c~Y9n zCHL+rHmi-(v<_kd(tilPR0y5WrWoUC6gj)YAWVRQUSY2tSX_^K@z%tbJcy|d-Vdt+ zoJ|fUr|>0|%uw<h!H6Y1gG_)w+5K;d`Dqq0Qy5`T zE?79ZvEDA--!@dhUH9*}Kk%v6JU|)Pxvs#&JOf;w-s^Kf)X!Ma8aK3~tuKW)nSN7n zh$fK9o`16^vArGxfT?Mzl_=aIZ_}k=euFJc$uXxVhd|bMUnE{JM6}x`Ka{1LV695o z`wM(9KeBsUpnN~g?%YE^8uTLo%Z-9lRx|=_$JxRW4a(3&<0yKAh1T80o+~3SSEPpY6g^q%!FMp6mDE3(x@elCuOKEDR zIbXW3&Y0nY?T>{Lz6}Q4WWPq(I3rv z4adMMn)ual1L;i79u^+)nO2|};ehL168DF9EK3_qjsD^F zY=2m5qVK*flv;rRV=z!el9Z85_bj>7*(wRmjaL_7jxa22&S>xK7{KP(m7)V-MaM=G z^!X_M8T(W#rCa~RnzNm8DIG{kEuuBDk!X!j(i)c>GjaIPAa^R7WQ&Ky)*kXj))?zouG;$*B64_^;~IF`RM(bU$2 z%2)Dg-T_S|bp&GgiU zmA0?9n;>I8tw+kHONT}hGo|EdFqcZH>Cx6k&N6?D1<;rNXyDJD)UEMM`Dj`mqyZ$L z09jvO-k3@1Soh};2ZB7V53!?+UePu~o%6eGj=e@PY};$x3Hh`wF7Cs<^JP*DKtDp( zp?RAEKWV)xNLtzX02&zMBTE&FU{4`pymGLW{p7F zS8a{o#3SU^wLqSekP$gQtGwZ#E;A@J%f{l_NO_0>J#08)2MhK+OOMEoC;NsWIsmA^ zS^a0NN<04m9h?v^?+f}rv|H7tj|?t|s{k)T8eqKVaNY>Wg^$G3&9ytz+JCjk{89($ zF-rNH&Z5SS*2w^+*IAP#XFfX{UJiN>}F7QwfOs^Pvm zT3P;hgLgUINu)z)LOkxKye0OkvY-g`BudtM2%5{5kgWXu5cFsiI}h=W%5a$)3dL9Mkms9L(!3{E(X*V9WQ04Wf1nO{7TfKD zH4+g!&XlA=sD!9ZI`yP?Z=nH9?;GP#4mpb{8A>E}Zz5fLOMj1T?j+GfQ{H7jeL%1b z0?=GZ5oPDJHmoS7ohU(jF2FNjMaL^d86@~&^jQwM8M05Cn0>v?`}K>~>6NIn`dQPx zVR5YT3}f+C6J9(lED!WUM5qA?J9`&4cy+*7fV!4(>cGkZc;&hRHavZ0E06VgkhSN> zdQdD8l7|6u?X)J9(nR+NSOjHb&Oqk{VfW+Z4>8_W;_=htIw)|G!BOpsL?t`|9ZYk z)BTsOq3qp{LmhworJq-dxbVLWNr6_X%r_b9=+%Oyi|oC{^(Ig{+QY&8wc_fBL#Y

    V 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�m&Sp*Vb^7<~{tBiwE5qCW%P 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 z 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 ZeX3+la2i|#%$$~?117@k(gHtW{|92*$sGUy delta 482731 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

    >VK0JSxT2`0&|Q~ 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 <{wEd0uS7Zwf6 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%0DTUFun%p&{GsGuOrM@Qo6Bh1LLwIP^?vYa>9x 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�hwDo=Yr~~O!X5v0! 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ⅅ*GHkhha7D-q`PnloZrb$&F%cxVj){C7U0b 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 _zQJDn-4(y*lj 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

    S@{B*VPh?m)XR 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 From 2628ce87c8896859e68735e848bc5971af8b64a6 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Wed, 30 Jan 2019 13:06:50 +0100 Subject: [PATCH 28/37] Modified blocks to use updated BlockFactory types and methods After https://github.com/robotology/blockfactory/pull/33 some datatypes and interface methods changed --- toolbox/library/src/CentroidalMomentum.cpp | 16 ++-- toolbox/library/src/DiscreteFilter.cpp | 16 ++-- toolbox/library/src/DotJNu.cpp | 16 ++-- toolbox/library/src/ForwardKinematics.cpp | 12 ++- toolbox/library/src/GetLimits.cpp | 9 +-- toolbox/library/src/GetMeasurement.cpp | 7 +- toolbox/library/src/InverseDynamics.cpp | 21 +++-- toolbox/library/src/Jacobian.cpp | 17 ++--- toolbox/library/src/MassMatrix.cpp | 17 ++--- .../src/MinimumJerkTrajectoryGenerator.cpp | 38 +++++----- toolbox/library/src/QpOases.cpp | 76 ++++++++++--------- toolbox/library/src/RealTimeSynchronizer.cpp | 2 +- toolbox/library/src/RelativeTransform.cpp | 11 ++- toolbox/library/src/SetMotorParameters.cpp | 19 +++-- toolbox/library/src/SetReferences.cpp | 7 +- toolbox/library/src/SimulatorSynchronizer.cpp | 2 +- toolbox/library/src/YarpClock.cpp | 7 +- toolbox/library/src/YarpRead.cpp | 17 +++-- toolbox/library/src/YarpWrite.cpp | 8 +- 19 files changed, 155 insertions(+), 163 deletions(-) diff --git a/toolbox/library/src/CentroidalMomentum.cpp b/toolbox/library/src/CentroidalMomentum.cpp index 55565b606..36bd0dcd3 100644 --- a/toolbox/library/src/CentroidalMomentum.cpp +++ b/toolbox/library/src/CentroidalMomentum.cpp @@ -80,20 +80,18 @@ bool CentroidalMomentum::configureSizeAndPorts(BlockInformation* blockInfo) // 1) Vector representing the centroidal momentum (1x6) // - const bool ok = blockInfo->setIOPortsData({ + const bool ok = blockInfo->setPortsInfo( { // Inputs - std::make_tuple(InputIndex::BasePose, std::vector{4, 4}, DataType::DOUBLE), - std::make_tuple( - InputIndex::JointConfiguration, std::vector{dofs}, DataType::DOUBLE), - std::make_tuple(InputIndex::BaseVelocity, std::vector{6}, DataType::DOUBLE), - std::make_tuple(InputIndex::JointVelocity, std::vector{dofs}, DataType::DOUBLE), + {InputIndex::BasePose, Port::Dimensions{4, 4}, Port::Port::DataType::DOUBLE}, + {InputIndex::JointConfiguration, Port::Dimensions{dofs}, Port::Port::DataType::DOUBLE}, + {InputIndex::BaseVelocity, Port::Dimensions{6}, Port::Port::DataType::DOUBLE}, + {InputIndex::JointVelocity, Port::Dimensions{dofs}, Port::Port::DataType::DOUBLE}, }, { // Outputs - std::make_tuple(OutputIndex::CentroidalMomentum, std::vector{6}, DataType::DOUBLE), - }, - }); + {OutputIndex::CentroidalMomentum, Port::Dimensions{6}, Port::Port::DataType::DOUBLE}, + }); if (!ok) { bfError << "Failed to configure input / output ports."; diff --git a/toolbox/library/src/DiscreteFilter.cpp b/toolbox/library/src/DiscreteFilter.cpp index 77fdf0dfa..804a5c131 100644 --- a/toolbox/library/src/DiscreteFilter.cpp +++ b/toolbox/library/src/DiscreteFilter.cpp @@ -109,19 +109,19 @@ bool DiscreteFilter::configureSizeAndPorts(BlockInformation* blockInfo) // 1) The output signal (1xn) // - const bool ok = blockInfo->setIOPortsData({ + const bool ok = blockInfo->setPortsInfo( { // Inputs - std::make_tuple( - InputIndex::InputSignal, std::vector{Signal::DynamicSize}, DataType::DOUBLE), + {InputIndex::InputSignal, + Port::Dimensions{Port::DynamicSize}, + Port::Port::DataType::DOUBLE}, }, { // Outputs - std::make_tuple(OutputIndex::FilteredSignal, - std::vector{Signal::DynamicSize}, - DataType::DOUBLE), - }, - }); + {OutputIndex::FilteredSignal, + Port::Dimensions{Port::DynamicSize}, + Port::Port::DataType::DOUBLE}, + }); if (!ok) { bfError << "Failed to configure input / output ports."; diff --git a/toolbox/library/src/DotJNu.cpp b/toolbox/library/src/DotJNu.cpp index 04ff41bcd..1a4980c41 100644 --- a/toolbox/library/src/DotJNu.cpp +++ b/toolbox/library/src/DotJNu.cpp @@ -109,20 +109,18 @@ bool DotJNu::configureSizeAndPorts(BlockInformation* blockInfo) // 1) Vector representing the \dot{J} \nu vector (1x6) // - const bool ok = blockInfo->setIOPortsData({ + const bool ok = blockInfo->setPortsInfo( { // Inputs - std::make_tuple(InputIndex::BasePose, std::vector{4, 4}, DataType::DOUBLE), - std::make_tuple( - InputIndex::JointConfiguration, std::vector{dofs}, DataType::DOUBLE), - std::make_tuple(InputIndex::BaseVelocity, std::vector{6}, DataType::DOUBLE), - std::make_tuple(InputIndex::JointVelocity, std::vector{dofs}, DataType::DOUBLE), + {InputIndex::BasePose, Port::Dimensions{4, 4}, Port::DataType::DOUBLE}, + {InputIndex::JointConfiguration, Port::Dimensions{dofs}, Port::DataType::DOUBLE}, + {InputIndex::BaseVelocity, Port::Dimensions{6}, Port::DataType::DOUBLE}, + {InputIndex::JointVelocity, Port::Dimensions{dofs}, Port::DataType::DOUBLE}, }, { // Outputs - std::make_tuple(OutputIndex::DotJNu, std::vector{6}, DataType::DOUBLE), - }, - }); + {OutputIndex::DotJNu, Port::Dimensions{6}, Port::DataType::DOUBLE}, + }); if (!ok) { bfError << "Failed to configure input / output ports."; diff --git a/toolbox/library/src/ForwardKinematics.cpp b/toolbox/library/src/ForwardKinematics.cpp index f86d94c66..fcdce0fdb 100644 --- a/toolbox/library/src/ForwardKinematics.cpp +++ b/toolbox/library/src/ForwardKinematics.cpp @@ -104,18 +104,16 @@ bool ForwardKinematics::configureSizeAndPorts(BlockInformation* blockInfo) // 1) Homogeneous transformation between the world and the specified frame (4x4 matrix) // - const bool ok = blockInfo->setIOPortsData({ + const bool ok = blockInfo->setPortsInfo( { // Inputs - std::make_tuple(InputIndex::BasePose, std::vector{4, 4}, DataType::DOUBLE), - std::make_tuple( - InputIndex::JointConfiguration, std::vector{dofs}, DataType::DOUBLE), + {InputIndex::BasePose, Port::Dimensions{4, 4}, Port::DataType::DOUBLE}, + {InputIndex::JointConfiguration, Port::Dimensions{dofs}, Port::DataType::DOUBLE}, }, { // Outputs - std::make_tuple(OutputIndex::Transform, std::vector{4, 4}, DataType::DOUBLE), - }, - }); + {OutputIndex::Transform, Port::Dimensions{4, 4}, Port::DataType::DOUBLE}, + }); if (!ok) { bfError << "Failed to configure input / output ports."; diff --git a/toolbox/library/src/GetLimits.cpp b/toolbox/library/src/GetLimits.cpp index e3922cd09..72a26ff68 100644 --- a/toolbox/library/src/GetLimits.cpp +++ b/toolbox/library/src/GetLimits.cpp @@ -114,16 +114,15 @@ bool GetLimits::configureSizeAndPorts(BlockInformation* blockInfo) // 2) Vector with the max limit (1xDoFs) // - const bool ok = blockInfo->setIOPortsData({ + const bool ok = blockInfo->setPortsInfo( { // Inputs }, { // Outputs - std::make_tuple(OutputIndex::MinLimit, std::vector{dofs}, DataType::DOUBLE), - std::make_tuple(OutputIndex::MaxLimit, std::vector{dofs}, DataType::DOUBLE), - }, - }); + {OutputIndex::MinLimit, Port::Dimensions{dofs}, Port::DataType::DOUBLE}, + {OutputIndex::MaxLimit, Port::Dimensions{dofs}, Port::DataType::DOUBLE}, + }); if (!ok) { bfError << "Failed to configure input / output ports."; diff --git a/toolbox/library/src/GetMeasurement.cpp b/toolbox/library/src/GetMeasurement.cpp index 0715aa96f..850cd2dd5 100644 --- a/toolbox/library/src/GetMeasurement.cpp +++ b/toolbox/library/src/GetMeasurement.cpp @@ -123,15 +123,14 @@ bool GetMeasurement::configureSizeAndPorts(BlockInformation* blockInfo) // 1) Vector with the information asked (1xDoFs) // - const bool ok = blockInfo->setIOPortsData({ + const bool ok = blockInfo->setPortsInfo( { // Inputs }, { // Outputs - std::make_tuple(OutputIndex::Measurement, std::vector{dofs}, DataType::DOUBLE), - }, - }); + {OutputIndex::Measurement, Port::Dimensions{dofs}, Port::DataType::DOUBLE}, + }); if (!ok) { bfError << "Failed to configure input / output ports."; diff --git a/toolbox/library/src/InverseDynamics.cpp b/toolbox/library/src/InverseDynamics.cpp index d618a6bb3..2d2cc80c4 100644 --- a/toolbox/library/src/InverseDynamics.cpp +++ b/toolbox/library/src/InverseDynamics.cpp @@ -98,23 +98,20 @@ bool InverseDynamics::configureSizeAndPorts(BlockInformation* blockInfo) // 1) Vector representing the torques (1x(DoFs+6)) // - const bool ok = blockInfo->setIOPortsData({ + const bool ok = blockInfo->setPortsInfo( { // Inputs - std::make_tuple(InputIndex::BasePose, std::vector{4, 4}, DataType::DOUBLE), - std::make_tuple( - InputIndex::JointConfiguration, std::vector{dofs}, DataType::DOUBLE), - std::make_tuple(InputIndex::BaseVelocity, std::vector{6}, DataType::DOUBLE), - std::make_tuple(InputIndex::JointVelocity, std::vector{dofs}, DataType::DOUBLE), - std::make_tuple(InputIndex::BaseAcceleration, std::vector{6}, DataType::DOUBLE), - std::make_tuple( - InputIndex::JointAcceleration, std::vector{dofs}, DataType::DOUBLE), + {InputIndex::BasePose, Port::Dimensions{4, 4}, Port::DataType::DOUBLE}, + {InputIndex::JointConfiguration, Port::Dimensions{dofs}, Port::DataType::DOUBLE}, + {InputIndex::BaseVelocity, Port::Dimensions{6}, Port::DataType::DOUBLE}, + {InputIndex::JointVelocity, Port::Dimensions{dofs}, Port::DataType::DOUBLE}, + {InputIndex::BaseAcceleration, Port::Dimensions{6}, Port::DataType::DOUBLE}, + {InputIndex::JointAcceleration, Port::Dimensions{dofs}, Port::DataType::DOUBLE}, }, { // Outputs - std::make_tuple(OutputIndex::Torques, std::vector{dofs + 6}, DataType::DOUBLE), - }, - }); + {OutputIndex::Torques, Port::Dimensions{dofs + 6}, Port::DataType::DOUBLE}, + }); if (!ok) { bfError << "Failed to configure input / output ports."; diff --git a/toolbox/library/src/Jacobian.cpp b/toolbox/library/src/Jacobian.cpp index 9dcedba69..d9526e8af 100644 --- a/toolbox/library/src/Jacobian.cpp +++ b/toolbox/library/src/Jacobian.cpp @@ -112,18 +112,17 @@ bool Jacobian::configureSizeAndPorts(BlockInformation* blockInfo) // 1) Matrix representing the Jacobian (6x(DoFs+6)) // - const bool ok = blockInfo->setIOPortsData({ + const bool ok = blockInfo->setPortsInfo( { // Inputs - std::make_tuple(InputIndex::BasePose, std::vector{4, 4}, DataType::DOUBLE), - std::make_tuple( - InputIndex::JointConfiguration, std::vector{dofs}, DataType::DOUBLE), + {InputIndex::BasePose, Port::Dimensions{4, 4}, Port::DataType::DOUBLE}, + + {InputIndex::JointConfiguration, Port::Dimensions{dofs}, Port::DataType::DOUBLE}, }, { // Outputs - std::make_tuple(OutputIndex::Jacobian, std::vector{6, 6 + dofs}, DataType::DOUBLE), - }, - }); + {OutputIndex::Jacobian, Port::Dimensions{6, 6 + dofs}, Port::DataType::DOUBLE}, + }); if (!ok) { bfError << "Failed to configure input / output ports."; @@ -264,8 +263,8 @@ bool Jacobian::output(const BlockInformation* blockInfo) Map jacobianRowMajor = toEigen(pImpl->jacobian); Map jacobianColMajor( output->getBuffer(), - blockInfo->getOutputPortMatrixSize(OutputIndex::Jacobian).first, - blockInfo->getOutputPortMatrixSize(OutputIndex::Jacobian).second); + blockInfo->getOutputPortMatrixSize(OutputIndex::Jacobian).rows, + blockInfo->getOutputPortMatrixSize(OutputIndex::Jacobian).cols); // Forward the buffer to Simulink transforming it to ColMajor jacobianColMajor = jacobianRowMajor; diff --git a/toolbox/library/src/MassMatrix.cpp b/toolbox/library/src/MassMatrix.cpp index dbdf5ddbb..3e48f1ceb 100644 --- a/toolbox/library/src/MassMatrix.cpp +++ b/toolbox/library/src/MassMatrix.cpp @@ -77,19 +77,16 @@ bool MassMatrix::configureSizeAndPorts(BlockInformation* blockInfo) // 1) Matrix representing the mass matrix (DoFs+6)x(DoFs+6) // - const bool ok = blockInfo->setIOPortsData({ + const bool ok = blockInfo->setPortsInfo( { // Inputs - std::make_tuple(InputIndex::BasePose, std::vector{4, 4}, DataType::DOUBLE), - std::make_tuple( - InputIndex::JointConfiguration, std::vector{dofs}, DataType::DOUBLE), + {InputIndex::BasePose, Port::Dimensions{4, 4}, Port::DataType::DOUBLE}, + {InputIndex::JointConfiguration, Port::Dimensions{dofs}, Port::DataType::DOUBLE}, }, { // Outputs - std::make_tuple( - OutputIndex::MassMatrix, std::vector{dofs + 6, dofs + 6}, DataType::DOUBLE), - }, - }); + {OutputIndex::MassMatrix, Port::Dimensions{dofs + 6, dofs + 6}, Port::DataType::DOUBLE}, + }); if (!ok) { bfError << "Failed to configure input / output ports."; @@ -179,8 +176,8 @@ bool MassMatrix::output(const BlockInformation* blockInfo) Map massMatrixRowMajor = toEigen(pImpl->massMatrix); Map massMatrixColMajor( output->getBuffer(), - blockInfo->getOutputPortMatrixSize(OutputIndex::MassMatrix).first, - blockInfo->getOutputPortMatrixSize(OutputIndex::MassMatrix).second); + blockInfo->getOutputPortMatrixSize(OutputIndex::MassMatrix).rows, + blockInfo->getOutputPortMatrixSize(OutputIndex::MassMatrix).cols); // Forward the buffer to Simulink transforming it to ColMajor massMatrixColMajor = massMatrixRowMajor; diff --git a/toolbox/library/src/MinimumJerkTrajectoryGenerator.cpp b/toolbox/library/src/MinimumJerkTrajectoryGenerator.cpp index 6015d81bf..684ad017c 100644 --- a/toolbox/library/src/MinimumJerkTrajectoryGenerator.cpp +++ b/toolbox/library/src/MinimumJerkTrajectoryGenerator.cpp @@ -44,8 +44,8 @@ enum InputIndex // Other optional inputs }; -static int InputIndex_InitialValue = InputIndex::InputSignal; -static int InputIndex_ExtSettlingTime = InputIndex::InputSignal; +static size_t InputIndex_InitialValue = InputIndex::InputSignal; +static size_t InputIndex_ExtSettlingTime = InputIndex::InputSignal; enum OutputIndex { @@ -53,8 +53,8 @@ enum OutputIndex // Other optional outputs }; -static int OutputIndex_FirstDer = OutputIndex::FilteredSignal; -static int OutputIndex_SecondDer = OutputIndex::FilteredSignal; +static size_t OutputIndex_FirstDer = OutputIndex::FilteredSignal; +static size_t OutputIndex_SecondDer = OutputIndex::FilteredSignal; // BLOCK PIMPL // =========== @@ -168,32 +168,36 @@ bool MinimumJerkTrajectoryGenerator::configureSizeAndPorts(BlockInformation* blo OutputIndex_SecondDer = OutputIndex_FirstDer + 1; } - BlockInformation::IOData ioData; - ioData.input.emplace_back( - InputIndex::InputSignal, std::vector{Signal::DynamicSize}, DataType::DOUBLE); - ioData.output.emplace_back( - OutputIndex::FilteredSignal, std::vector{Signal::DynamicSize}, DataType::DOUBLE); + InputPortsInfo inputPortsInfo; + OutputPortsInfo outputPortsInfo; + + inputPortsInfo.push_back( + {InputIndex::InputSignal, Port::Dimensions{Port::DynamicSize}, Port::DataType::DOUBLE}); + outputPortsInfo.push_back( + {OutputIndex::FilteredSignal, Port::Dimensions{Port::DynamicSize}, Port::DataType::DOUBLE}); // Handle optional inputs if (readInitialValue) { - ioData.input.emplace_back(InputIndex_InitialValue, std::vector{1}, DataType::DOUBLE); + inputPortsInfo.push_back( + {InputIndex_InitialValue, Port::Dimensions{1}, Port::DataType::DOUBLE}); } if (readExternalSettlingTime) { - ioData.input.emplace_back( - InputIndex_ExtSettlingTime, std::vector{Signal::DynamicSize}, DataType::DOUBLE); + inputPortsInfo.push_back({InputIndex_ExtSettlingTime, + Port::Dimensions{Port::DynamicSize}, + Port::DataType::DOUBLE}); } // Handle optional outputs if (computeFirstDerivative) { - ioData.output.emplace_back( - OutputIndex_FirstDer, std::vector{Signal::DynamicSize}, DataType::DOUBLE); + outputPortsInfo.push_back( + {OutputIndex_FirstDer, Port::Dimensions{Port::DynamicSize}, Port::DataType::DOUBLE}); } if (computeSecondDerivative) { - ioData.output.emplace_back( - OutputIndex_SecondDer, std::vector{Signal::DynamicSize}, DataType::DOUBLE); + outputPortsInfo.push_back( + {OutputIndex_SecondDer, Port::Dimensions{Port::DynamicSize}, Port::DataType::DOUBLE}); } - if (!blockInfo->setIOPortsData(ioData)) { + if (!blockInfo->setPortsInfo(inputPortsInfo, outputPortsInfo)) { bfError << "Failed to configure input / output ports."; return false; } diff --git a/toolbox/library/src/QpOases.cpp b/toolbox/library/src/QpOases.cpp index 1218e55f9..9328b06c9 100644 --- a/toolbox/library/src/QpOases.cpp +++ b/toolbox/library/src/QpOases.cpp @@ -45,11 +45,11 @@ enum InputIndex // Other optional inputs }; -static int InputIndex_constraints = InputIndex::Gradient; -static int InputIndex_lbA = InputIndex::Gradient; -static int InputIndex_ubA = InputIndex::Gradient; -static int InputIndex_lb = InputIndex::Gradient; -static int InputIndex_ub = InputIndex::Gradient; +static size_t InputIndex_constraints = InputIndex::Gradient; +static size_t InputIndex_lbA = InputIndex::Gradient; +static size_t InputIndex_ubA = InputIndex::Gradient; +static size_t InputIndex_lb = InputIndex::Gradient; +static size_t InputIndex_ub = InputIndex::Gradient; enum OutputIndex { @@ -58,7 +58,7 @@ enum OutputIndex // Other optional inputs }; -static int OutputIndex_objVal = OutputIndex::Status; +static size_t OutputIndex_objVal = OutputIndex::Status; // BLOCK PIMPL // =========== @@ -160,55 +160,57 @@ bool QpOases::configureSizeAndPorts(BlockInformation* blockInfo) // 2) Status of the qp solver (1x1) // 3) Optional: Value of the object function (1x1) - BlockInformation::IOData ioData; + InputPortsInfo inputPortsInfo; + OutputPortsInfo outputPortsInfo; // Inputs - ioData.input.emplace_back(InputIndex::Hessian, - std::vector{Signal::DynamicSize, Signal::DynamicSize}, - DataType::DOUBLE); - ioData.input.emplace_back( - InputIndex::Gradient, std::vector{Signal::DynamicSize}, DataType::DOUBLE); - ioData.output.emplace_back( - OutputIndex::PrimalSolution, std::vector{Signal::DynamicSize}, DataType::DOUBLE); - ioData.output.emplace_back(OutputIndex::Status, std::vector{1}, DataType::DOUBLE); + inputPortsInfo.push_back({InputIndex::Hessian, + Port::Dimensions{Port::DynamicSize, Port::DynamicSize}, + Port::DataType::DOUBLE}); + inputPortsInfo.push_back( + {InputIndex::Gradient, Port::Dimensions{Port::DynamicSize}, Port::DataType::DOUBLE}); + outputPortsInfo.push_back( + {OutputIndex::PrimalSolution, Port::Dimensions{Port::DynamicSize}, Port::DataType::DOUBLE}); + outputPortsInfo.push_back({OutputIndex::Status, Port::Dimensions{1}, Port::DataType::DOUBLE}); // Optional inputs - int numberOfInputs = InputIndex::Gradient; + size_t numberOfInputs = InputIndex::Gradient; if (useLbA || useUbA) { InputIndex_constraints = ++numberOfInputs; - ioData.input.emplace_back(InputIndex_constraints, - std::vector{Signal::DynamicSize, Signal::DynamicSize}, - DataType::DOUBLE); + inputPortsInfo.push_back({InputIndex_constraints, + Port::Dimensions{Port::DynamicSize, Port::DynamicSize}, + Port::DataType::DOUBLE}); } if (useLbA) { InputIndex_lbA = ++numberOfInputs; - ioData.input.emplace_back( - InputIndex_lbA, std::vector{Signal::DynamicSize}, DataType::DOUBLE); + inputPortsInfo.push_back( + {InputIndex_lbA, Port::Dimensions{Port::DynamicSize}, Port::DataType::DOUBLE}); } if (useUbA) { InputIndex_ubA = ++numberOfInputs; - ioData.input.emplace_back( - InputIndex_ubA, std::vector{Signal::DynamicSize}, DataType::DOUBLE); + inputPortsInfo.push_back( + {InputIndex_ubA, Port::Dimensions{Port::DynamicSize}, Port::DataType::DOUBLE}); } if (useLb) { InputIndex_lb = ++numberOfInputs; - ioData.input.emplace_back( - InputIndex_lb, std::vector{Signal::DynamicSize}, DataType::DOUBLE); + inputPortsInfo.push_back( + {InputIndex_lb, Port::Dimensions{Port::DynamicSize}, Port::DataType::DOUBLE}); } if (useUb) { InputIndex_ub = ++numberOfInputs; - ioData.input.emplace_back( - InputIndex_ub, std::vector{Signal::DynamicSize}, DataType::DOUBLE); + inputPortsInfo.push_back( + {InputIndex_ub, Port::Dimensions{Port::DynamicSize}, Port::DataType::DOUBLE}); } // Optional outputs - int numberOfOutputs = OutputIndex::Status; + size_t numberOfOutputs = OutputIndex::Status; if (computeObjVal) { OutputIndex_objVal = ++numberOfOutputs; - ioData.output.emplace_back(OutputIndex_objVal, std::vector{1}, DataType::DOUBLE); + outputPortsInfo.push_back( + {OutputIndex_objVal, Port::Dimensions{1}, Port::DataType::DOUBLE}); } - if (!blockInfo->setIOPortsData(ioData)) { + if (!blockInfo->setPortsInfo(inputPortsInfo, outputPortsInfo)) { bfError << "Failed to configure input / output ports."; return false; } @@ -248,8 +250,8 @@ bool QpOases::initialize(BlockInformation* blockInfo) // Check the hessian size const auto size_H = blockInfo->getInputPortMatrixSize(InputIndex::Hessian); - const auto numberOfVariables = size_H.first; - if (size_H.first != size_H.second) { + const auto numberOfVariables = size_H.rows; + if (size_H.rows != size_H.cols) { bfError << "The Hessian matrix should be square."; return false; } @@ -279,15 +281,15 @@ bool QpOases::initialize(BlockInformation* blockInfo) if (pImpl->useLbA || pImpl->useUbA) { // Check the constraints size const auto size_c = blockInfo->getInputPortMatrixSize(InputIndex_constraints); - numberOfConstraints = size_c.first; - if (size_c.second != numberOfVariables) { + numberOfConstraints = size_c.rows; + if (size_c.cols != numberOfVariables) { bfError << "The column size of the constraints matrix does not match with " << "the Hessian size"; return false; } // Resize the buffer - pImpl->constraints_rowMajor.resize(size_c.first, size_c.second); + pImpl->constraints_rowMajor.resize(size_c.rows, size_c.cols); // Check the constraints' bound size bool ok = true; @@ -371,8 +373,8 @@ bool QpOases::output(const BlockInformation* blockInfo) Map constraints_colMajor( const_cast(constraintsSignal->getBuffer()), - blockInfo->getInputPortMatrixSize(InputIndex_constraints).first, - blockInfo->getInputPortMatrixSize(InputIndex_constraints).second); + blockInfo->getInputPortMatrixSize(InputIndex_constraints).rows, + blockInfo->getInputPortMatrixSize(InputIndex_constraints).cols); pImpl->constraints_rowMajor = constraints_colMajor; // Update the buffer passed to SQProblem diff --git a/toolbox/library/src/RealTimeSynchronizer.cpp b/toolbox/library/src/RealTimeSynchronizer.cpp index 35a7a48d0..fad51c85a 100644 --- a/toolbox/library/src/RealTimeSynchronizer.cpp +++ b/toolbox/library/src/RealTimeSynchronizer.cpp @@ -81,7 +81,7 @@ bool RealTimeSynchronizer::configureSizeAndPorts(BlockInformation* blockInfo) // No outputs // - const bool ok = blockInfo->setIOPortsData({{}, {}}); + const bool ok = blockInfo->setPortsInfo({}, {}); if (!ok) { bfError << "Failed to configure input / output ports."; diff --git a/toolbox/library/src/RelativeTransform.cpp b/toolbox/library/src/RelativeTransform.cpp index c88ba3088..0b44c3152 100644 --- a/toolbox/library/src/RelativeTransform.cpp +++ b/toolbox/library/src/RelativeTransform.cpp @@ -107,17 +107,16 @@ bool RelativeTransform::configureSizeAndPorts(BlockInformation* blockInfo) // 1) Homogeneous transformation between frame1 and frame2 (4x4 matrix) // - const bool ok = blockInfo->setIOPortsData({ + const bool ok = blockInfo->setPortsInfo( { // Inputs - std::make_tuple( - InputIndex::JointConfiguration, std::vector{dofs}, DataType::DOUBLE), + {InputIndex::JointConfiguration, Port::Dimensions{dofs}, Port::DataType::DOUBLE}, }, { // Outputs - std::make_tuple(OutputIndex::Transform, std::vector{4, 4}, DataType::DOUBLE), - }, - }); + {OutputIndex::Transform, Port::Dimensions{4, 4}, Port::DataType::DOUBLE}, + + }); if (!ok) { bfError << "Failed to configure input / output ports."; diff --git a/toolbox/library/src/SetMotorParameters.cpp b/toolbox/library/src/SetMotorParameters.cpp index 55fb4d0b0..79b59e92e 100644 --- a/toolbox/library/src/SetMotorParameters.cpp +++ b/toolbox/library/src/SetMotorParameters.cpp @@ -150,27 +150,30 @@ bool SetMotorParameters::configureSizeAndPorts(BlockInformation* blockInfo) // int numberOfInputs = -1; - BlockInformation::IOData ioData; + InputPortsInfo inputPortsInfo; if (setP) { InputIndex_PGains = ++numberOfInputs; - ioData.input.emplace_back( - InputIndex_PGains, std::vector{Signal::DynamicSize}, DataType::DOUBLE); + inputPortsInfo.push_back({static_cast(InputIndex_PGains), + Port::Dimensions{Port::DynamicSize}, + Port::DataType::DOUBLE}); } if (setI) { InputIndex_IGains = ++numberOfInputs; - ioData.input.emplace_back( - InputIndex_IGains, std::vector{Signal::DynamicSize}, DataType::DOUBLE); + inputPortsInfo.push_back({static_cast(InputIndex_IGains), + Port::Dimensions{Port::DynamicSize}, + Port::DataType::DOUBLE}); } if (setD) { InputIndex_DGains = ++numberOfInputs; - ioData.input.emplace_back( - InputIndex_DGains, std::vector{Signal::DynamicSize}, DataType::DOUBLE); + inputPortsInfo.push_back({static_cast(InputIndex_DGains), + Port::Dimensions{Port::DynamicSize}, + Port::DataType::DOUBLE}); } - if (!blockInfo->setIOPortsData(ioData)) { + if (!blockInfo->setPortsInfo(inputPortsInfo, {})) { bfError << "Failed to configure input / output ports."; return false; } diff --git a/toolbox/library/src/SetReferences.cpp b/toolbox/library/src/SetReferences.cpp index 238d3d370..1d296bff7 100644 --- a/toolbox/library/src/SetReferences.cpp +++ b/toolbox/library/src/SetReferences.cpp @@ -123,15 +123,14 @@ bool SetReferences::configureSizeAndPorts(BlockInformation* blockInfo) // No outputs // - const bool ok = blockInfo->setIOPortsData({ + const bool ok = blockInfo->setPortsInfo( { // Inputs - std::make_tuple(InputIndex::References, std::vector{dofs}, DataType::DOUBLE), + {InputIndex::References, Port::Dimensions{dofs}, Port::DataType::DOUBLE}, }, { // Outputs - }, - }); + }); if (!ok) { bfError << "Failed to configure input / output ports."; diff --git a/toolbox/library/src/SimulatorSynchronizer.cpp b/toolbox/library/src/SimulatorSynchronizer.cpp index ac0c6cc99..f05093b19 100644 --- a/toolbox/library/src/SimulatorSynchronizer.cpp +++ b/toolbox/library/src/SimulatorSynchronizer.cpp @@ -106,7 +106,7 @@ bool SimulatorSynchronizer::configureSizeAndPorts(BlockInformation* blockInfo) // No outputs // - const bool ok = blockInfo->setIOPortsData({{}, {}}); + const bool ok = blockInfo->setPortsInfo({}, {}); if (!ok) { bfError << "Failed to configure input / output ports."; diff --git a/toolbox/library/src/YarpClock.cpp b/toolbox/library/src/YarpClock.cpp index 08126c4dd..5a19c24dc 100644 --- a/toolbox/library/src/YarpClock.cpp +++ b/toolbox/library/src/YarpClock.cpp @@ -50,15 +50,14 @@ bool YarpClock::configureSizeAndPorts(BlockInformation* blockInfo) // 1) The yarp time. In short, it streams yarp::os::Time::now(). // - const bool ok = blockInfo->setIOPortsData({ + const bool ok = blockInfo->setPortsInfo( { // Inputs }, { // Outputs - std::make_tuple(OutputIndex::Clock, std::vector{1}, DataType::DOUBLE), - }, - }); + {OutputIndex::Clock, Port::Dimensions{1}, Port::DataType::DOUBLE}, + }); if (!ok) { bfError << "Failed to configure input / output ports."; diff --git a/toolbox/library/src/YarpRead.cpp b/toolbox/library/src/YarpRead.cpp index 97d002170..6d560a135 100644 --- a/toolbox/library/src/YarpRead.cpp +++ b/toolbox/library/src/YarpRead.cpp @@ -50,8 +50,8 @@ enum OutputIndex // Other optional outputs }; -static int OutputIndex_Timestamp = OutputIndex::Signal; -static int OutputIndex_IsConnected = OutputIndex::Signal; +static size_t OutputIndex_Timestamp = OutputIndex::Signal; +static size_t OutputIndex_IsConnected = OutputIndex::Signal; // BLOCK PIMPL // =========== @@ -157,18 +157,21 @@ bool YarpRead::configureSizeAndPorts(BlockInformation* blockInfo) OutputIndex_IsConnected = OutputIndex_Timestamp + 1; } - BlockInformation::IOData ioData; - ioData.output.emplace_back(OutputIndex::Signal, std::vector{signalSize}, DataType::DOUBLE); + OutputPortsInfo outputPortsInfo; + outputPortsInfo.push_back( + {OutputIndex::Signal, Port::Dimensions{signalSize}, Port::DataType::DOUBLE}); if (readTimestamp) { - ioData.output.emplace_back(OutputIndex_Timestamp, std::vector{2}, DataType::DOUBLE); + outputPortsInfo.push_back( + {OutputIndex_Timestamp, Port::Dimensions{2}, Port::DataType::DOUBLE}); } if (!autoconnect) { // Use double anyway even if it is a bool signal. - ioData.output.emplace_back(OutputIndex_IsConnected, std::vector{1}, DataType::DOUBLE); + outputPortsInfo.push_back( + {OutputIndex_IsConnected, Port::Dimensions{1}, Port::DataType::DOUBLE}); } - if (!blockInfo->setIOPortsData(ioData)) { + if (!blockInfo->setPortsInfo({}, outputPortsInfo)) { bfError << "Failed to configure input / output ports."; return false; } diff --git a/toolbox/library/src/YarpWrite.cpp b/toolbox/library/src/YarpWrite.cpp index ad7e1fdcf..371ed155b 100644 --- a/toolbox/library/src/YarpWrite.cpp +++ b/toolbox/library/src/YarpWrite.cpp @@ -97,16 +97,14 @@ bool YarpWrite::configureSizeAndPorts(BlockInformation* blockInfo) // No outputs // - const bool ok = blockInfo->setIOPortsData({ + const bool ok = blockInfo->setPortsInfo( { // Inputs - std::make_tuple( - InputIndex::Signal, std::vector{Signal::DynamicSize}, DataType::DOUBLE), + {InputIndex::Signal, Port::Dimensions{Port::DynamicSize}, Port::DataType::DOUBLE}, }, { // Outputs - }, - }); + }); if (!ok) { bfError << "Failed to configure input / output ports."; From 0764c0379742da14175cb81d3d69a1d3b34c526b Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Thu, 31 Jan 2019 14:37:39 +0100 Subject: [PATCH 29/37] Removed spaces from Simulink Libraries block names --- .../library/WBToolboxLibrary_repository.mdl | 134 +++++++++--------- matlab/library/exported/WBToolboxLibrary.slx | Bin 545440 -> 545376 bytes matlab/slblocks.m | 2 +- 3 files changed, 68 insertions(+), 68 deletions(-) diff --git a/matlab/library/WBToolboxLibrary_repository.mdl b/matlab/library/WBToolboxLibrary_repository.mdl index e62a19382..920dd57f0 100644 --- a/matlab/library/WBToolboxLibrary_repository.mdl +++ b/matlab/library/WBToolboxLibrary_repository.mdl @@ -1159,7 +1159,7 @@ Library { ZoomFactor "562" Block { BlockType S-Function - Name "Set Motor Parameters" + Name "SetMotorParameters" SID "1847" Ports [1, 1] Position [645, 290, 755, 340] @@ -1175,7 +1175,7 @@ Library { $PropName "MaskObject" $ObjectID 21 $ClassName "Simulink.Mask" - Type "Set Motor Parameters" + Type "SetMotorParameters" Description "This block allows to set motor PIDs and constants such as the motor constant and the back EMF.\n" "\nThe motor constant and the back EMF are set in the block's mask, and their values are applied during the first " "simulation loop. The PIDs values are instead set from the input ports.\n\nAll these vectors should have a size eq" @@ -1378,7 +1378,7 @@ Library { } Block { BlockType SubSystem - Name "Set Motor References" + Name "SetMotorReferences" SID "1791" Ports [1] Position [710, 210, 785, 260] @@ -1389,7 +1389,7 @@ Library { $PropName "MaskObject" $ObjectID 45 $ClassName "Simulink.Mask" - Type "Set Motor References" + Type "SetMotorReferences" Description "This block sets motor references. The type of control mode is specified as a parameter in the b" "lock.\n\nAssuming N as the number of motors (usually equal to internal DoFs):\n\nInput:\n - References: Vector o" "f size N, representing the references to be sent to the robot controlled motors.\n\nParameters:\n - Control Mode" @@ -1470,7 +1470,7 @@ Library { } } System { - Name "Set Motor References" + Name "SetMotorReferences" Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off @@ -1519,7 +1519,7 @@ Library { } Block { BlockType SubSystem - Name "Set References" + Name "SetReferences" SID "1767" Ports [1] Position [605, 210, 680, 260] @@ -1530,7 +1530,7 @@ Library { $PropName "MaskObject" $ObjectID 53 $ClassName "Simulink.Mask" - Type "Set References" + Type "SetReferences" Description "This block sets the references for the robot actuators.\nThe type of control mode is specified " "as a parameter in the block.\n\nAssuming DoFs is the number of internal degrees of freedom configured in the asso" "ciated Config block:\n\nInput:\n - References: Vector of size DoFs, representing the references to be sent to th" @@ -1651,7 +1651,7 @@ Library { } } System { - Name "Set References" + Name "SetReferences" Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off @@ -1770,7 +1770,7 @@ Library { ZoomFactor "330" Block { BlockType SubSystem - Name "Centroidal Momentum" + Name "CentroidalMomentum" SID "1694" Ports [4, 1] Position [475, 101, 660, 164] @@ -1780,7 +1780,7 @@ Library { $PropName "MaskObject" $ObjectID 67 $ClassName "Simulink.Mask" - Type "Centroidal Momentum" + Type "CentroidalMomentum" Description "This block computed the 6 element centroidal momentum, as defined in:\n\n\"Centroidal dynamics of a hu" "manoid robot\" - DE Orin, A Goswami, SH Lee\nAutonomous Robots 35 (2-3), 161-176\n\nAssuming DoFs is the number of i" "nternal degrees of freedom of the robot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transforma" @@ -1829,7 +1829,7 @@ Library { } } System { - Name "Centroidal Momentum" + Name "CentroidalMomentum" Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off @@ -1896,7 +1896,7 @@ Library { } Block { BlockType Outport - Name "Centroidal Momentum" + Name "CentroidalMomentum" SID "1700" Position [315, 73, 345, 87] ZOrder 25 @@ -1906,7 +1906,7 @@ Library { ZOrder 1 SrcBlock "S-Function" SrcPort 1 - DstBlock "Centroidal Momentum" + DstBlock "CentroidalMomentum" DstPort 1 } Line { @@ -1941,7 +1941,7 @@ Library { } Block { BlockType SubSystem - Name "Get Bias Forces" + Name "GetBiasForces" SID "1724" Ports [4, 1] Position [400, 212, 540, 313] @@ -1998,7 +1998,7 @@ Library { } } System { - Name "Get Bias Forces" + Name "GetBiasForces" Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off @@ -2155,7 +2155,7 @@ Library { } Block { BlockType SubSystem - Name "Get Gravity Forces" + Name "GetGravityForces" SID "1733" Ports [2, 1] Position [600, 210, 740, 310] @@ -2210,7 +2210,7 @@ Library { } } System { - Name "Get Gravity Forces" + Name "GetGravityForces" Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off @@ -2355,7 +2355,7 @@ Library { } Block { BlockType S-Function - Name "Inverse Dynamics" + Name "InverseDynamics" SID "1748" Ports [6, 1] Position [190, 199, 355, 331] @@ -2369,7 +2369,7 @@ Library { $PropName "MaskObject" $ObjectID 82 $ClassName "Simulink.Mask" - Type "Inverse Dynamics" + Type "InverseDynamics" Description "This block compute the inverse dynamics of the robot.\n\nAssuming DoFs is the number of internal degre" "es of freedom of the robot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transformation between " "the base frame and the world frame.\n - Joint configuration: Vector of size DoFs, representing the configuration of" @@ -2423,7 +2423,7 @@ Library { } Block { BlockType SubSystem - Name "Mass Matrix" + Name "MassMatrix" SID "1633" Ports [2, 1] Position [250, 104, 390, 171] @@ -2433,11 +2433,11 @@ Library { $PropName "MaskObject" $ObjectID 87 $ClassName "Simulink.Mask" - Type "Mass Matrix" + Type "MassMatrix" Description "This block retrieves the robot mass matrix.\n\nAssuming DoFs is the number of internal degrees of free" "dom of the robot,\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transformation between the base f" "rame and the world frame.\n - Joint configuration: Vector of size DoFs, representing the configuration of the joint" - "s.\n\nOutput:\n - Mass Matrix: a (DoFs + 6) x (DoFs + 6) matrix representing the mass matrix of the robot." + "s.\n\nOutput:\n - MassMatrix: a (DoFs + 6) x (DoFs + 6) matrix representing the mass matrix of the robot." Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" "Toolbox.BlockInitialization(gcb, gcs);\n \n WBTConfigParameters = WBTConfig.getSimulinkParameters;\n clear " "WBTConfig;\ncatch\nend" @@ -2478,7 +2478,7 @@ Library { } } System { - Name "Mass Matrix" + Name "MassMatrix" Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off @@ -2527,7 +2527,7 @@ Library { } Block { BlockType Outport - Name "Mass Matrix" + Name "MassMatrix" SID "1637" Position [245, 48, 275, 62] ZOrder 25 @@ -2537,7 +2537,7 @@ Library { ZOrder 1 SrcBlock "S-Function" SrcPort 1 - DstBlock "Mass Matrix" + DstBlock "MassMatrix" DstPort 1 } Line { @@ -2595,7 +2595,7 @@ Library { ZoomFactor "480" Block { BlockType SubSystem - Name "DotJ Nu" + Name "DotJNu" SID "1683" Ports [4, 1] Position [590, 170, 755, 265] @@ -2605,7 +2605,7 @@ Library { $PropName "MaskObject" $ObjectID 93 $ClassName "Simulink.Mask" - Type "DotJ Nu" + Type "DotJNu" Description "This block computes the product between the time derivative of the Jacobian of the specified frame and" " the state (base and joints) velocity vector.\n\nAssuming DoFs is the number of internal degrees of freedom of the r" "obot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transformation between the the base frame and" @@ -2681,7 +2681,7 @@ Library { } } System { - Name "DotJ Nu" + Name "DotJNu" Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off @@ -2925,7 +2925,7 @@ Library { } Block { BlockType Outport - Name "Forward Kinematics" + Name "ForwardKinematics" SID "1667" Position [245, 48, 275, 62] ZOrder 25 @@ -2935,7 +2935,7 @@ Library { ZOrder 1 SrcBlock "S-Function" SrcPort 1 - DstBlock "Forward Kinematics" + DstBlock "ForwardKinematics" DstPort 1 } Line { @@ -2993,7 +2993,7 @@ Library { ZoomFactor "469" Block { BlockType SubSystem - Name "Forward Kinematics" + Name "ForwardKinematics" SID "1647" Ports [2, 1] Position [360, 103, 510, 167] @@ -3003,11 +3003,11 @@ Library { $PropName "MaskObject" $ObjectID 110 $ClassName "Simulink.Mask" - Type "Forward Kinematics" + Type "ForwardKinematics" Description "This block retrieves the forward kinematics of the specified frame.\n\nAssuming DoFs is the number of " "internal degrees of freedom of the robot:\n\nInput:\n - Base pose: 4x4 matrix representing the homogenous transform" "ation between the the base frame and the world frame.\n - Joint configuration: Vector of size DoFs, representing th" - "e configuration of the joints.\n\nOutput:\n - Forward Kinematics: a 4x4 matrix representing the homogenous transfor" + "e configuration of the joints.\n\nOutput:\n - ForwardKinematics: a 4x4 matrix representing the homogenous transfor" "mation between the specified frame and the world frame.\n\nParameters:\n - Frame name: the name of the frame. It sh" "ould be specified in the URDF model." Initialization "% WBBlock Initialization\n% ======================\n\ntry\n [configBlockAbsName, WBTConfig] = WB" @@ -3076,7 +3076,7 @@ Library { } } System { - Name "Forward Kinematics" + Name "ForwardKinematics" Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off @@ -3125,7 +3125,7 @@ Library { } Block { BlockType Outport - Name "Forward Kinematics" + Name "ForwardKinematics" SID "1651" Position [245, 48, 275, 62] ZOrder 25 @@ -3135,7 +3135,7 @@ Library { ZOrder 1 SrcBlock "S-Function" SrcPort 1 - DstBlock "Forward Kinematics" + DstBlock "ForwardKinematics" DstPort 1 } Line { @@ -3158,7 +3158,7 @@ Library { } Block { BlockType SubSystem - Name "Inverse Kinematics" + Name "InverseKinematics" SID "1754" Ports [3, 2] Position [350, 198, 525, 262] @@ -3173,11 +3173,11 @@ Library { $PropName "MaskObject" $ObjectID 118 $ClassName "Simulink.Mask" - Type "Forward Kinematics" + Type "ForwardKinematics" Description "This block retrieves the forward kinematics of the specified frame.\n\nAssuming DoFs is the number of " "internal degrees of freedom of the robot,\nInput:\n- Base pose: 4x4 matrix representing the homogenous transformatio" "n between\n the the base frame and the world frame.\n- Joint configuration: Vector of size DoFs, represe" - "nting the configuration \n of the joints.\n\nOutput:\n- Forward Kinematics: a 4x4 matrix repre" + "nting the configuration \n of the joints.\n\nOutput:\n- ForwardKinematics: a 4x4 matrix repre" "senting the homogenous transformation between\n the specified frame and the world frame.\n\nParameters:\n" "- Frame name: the name of the frame. It should be specified in the URDF model.\n\n- Robot Port Name: Name of the por" "ts opened by the robot. (e.g. icub).\n Set an empty string ('') to use the name specified in the \n" @@ -3344,7 +3344,7 @@ Library { } } System { - Name "Inverse Kinematics" + Name "InverseKinematics" Location [0, 23, 1280, 744] Open off PortBlocksUseCompactNotation off @@ -3456,7 +3456,7 @@ Library { } Block { BlockType SubSystem - Name "Relative Transform" + Name "RelativeTransform" SID "1799" Ports [1, 1] Position [565, 198, 715, 262] @@ -3466,7 +3466,7 @@ Library { $PropName "MaskObject" $ObjectID 139 $ClassName "Simulink.Mask" - Type "Relative Transform" + Type "RelativeTransform" Description "This block calculates the relative transform between two frames.\n\nAssuming DoFs is the number of int" "ernal degrees of freedom of the robot:\n\nInput:\n - Joint configuration: Vector of size DoFs, representing the con" "figuration of the joints.\n\nOutput:\n - Transform: a 4x4 matrix representing the homogenous transformation between" @@ -3552,7 +3552,7 @@ Library { } } System { - Name "Relative Transform" + Name "RelativeTransform" Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off @@ -3592,7 +3592,7 @@ Library { } Block { BlockType Outport - Name "Relative Transform" + Name "RelativeTransform" SID "1803" Position [225, 48, 255, 62] ZOrder 25 @@ -3602,7 +3602,7 @@ Library { ZOrder 4 SrcBlock "S-Function" SrcPort 1 - DstBlock "Relative Transform" + DstBlock "RelativeTransform" DstPort 1 } Line { @@ -3616,7 +3616,7 @@ Library { } Block { BlockType SubSystem - Name "Remote Inverse Kinematics" + Name "RemoteInverseKinematics" SID "1761" Ports [2, 1] Position [560, 105, 720, 165] @@ -3631,11 +3631,11 @@ Library { $PropName "MaskObject" $ObjectID 149 $ClassName "Simulink.Mask" - Type "Forward Kinematics" + Type "ForwardKinematics" Description "This block retrieves the forward kinematics of the specified frame.\n\nAssuming DoFs is the number of " "internal degrees of freedom of the robot,\nInput:\n- Base pose: 4x4 matrix representing the homogenous transformatio" "n between\n the the base frame and the world frame.\n- Joint configuration: Vector of size DoFs, represe" - "nting the configuration \n of the joints.\n\nOutput:\n- Forward Kinematics: a 4x4 matrix repre" + "nting the configuration \n of the joints.\n\nOutput:\n- ForwardKinematics: a 4x4 matrix repre" "senting the homogenous transformation between\n the specified frame and the world frame.\n\nParameters:\n" "- Frame name: the name of the frame. It should be specified in the URDF model.\n\n- Robot Port Name: Name of the por" "ts opened by the robot. (e.g. icub).\n Set an empty string ('') to use the name specified in the \n" @@ -3744,7 +3744,7 @@ Library { } } System { - Name "Remote Inverse Kinematics" + Name "RemoteInverseKinematics" Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off @@ -3862,7 +3862,7 @@ Library { ZoomFactor "696" Block { BlockType SubSystem - Name "Get Limits" + Name "GetLimits" SID "1690" Ports [0, 2] Position [345, 225, 460, 260] @@ -3873,7 +3873,7 @@ Library { $PropName "MaskObject" $ObjectID 162 $ClassName "Simulink.Mask" - Type "Get Limits" + Type "GetLimits" Description "This block provides the joint limits gathering data from either the Robot's Control Board or UR" "DF model.\n\nOutput:\n - Max: 1xDoFs vector containing the maximum limit\n - Min: 1xDoFs vector containing the" " maximum limit\n\nUnit of measurement:\n - Position: rad\n - Velocity: rad/sec" @@ -3989,7 +3989,7 @@ Library { } } System { - Name "Get Limits" + Name "GetLimits" Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off @@ -4055,7 +4055,7 @@ Library { } Block { BlockType SubSystem - Name "Get Measurement" + Name "GetMeasurement" SID "1671" Ports [0, 1] Position [290, 158, 385, 192] @@ -4066,7 +4066,7 @@ Library { $PropName "MaskObject" $ObjectID 172 $ClassName "Simulink.Mask" - Type "Get Measurement" + Type "GetMeasurement" Description "This block gathers the measurement of the specified type.\n\nAssuming DoFs is the number of deg" "rees of freedom of the robot,\n\nOutput:\n - References: Vector of size DoFs, representing the requested measure" "ment.\n\nParameters:\n - Control Mode: The control mode. Choose one of the supplied mode.\n\nUnit of measurement" @@ -4146,7 +4146,7 @@ Library { } } System { - Name "Get Measurement" + Name "GetMeasurement" Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off @@ -4195,7 +4195,7 @@ Library { } Block { BlockType SubSystem - Name "Get Motor Measurement" + Name "GetMotorMeasurement" SID "1796" Ports [0, 1] Position [410, 158, 505, 192] @@ -4206,7 +4206,7 @@ Library { $PropName "MaskObject" $ObjectID 180 $ClassName "Simulink.Mask" - Type "Get Measurement" + Type "GetMeasurement" Description "This block gathers the measurement of the specified type.\n\nAssuming DoFs is the number of deg" "rees of freedom of the robot,\n\nOutput:\n - References: Vector of size DoFs, representing the requested measure" "ment.\n\nParameters:\n - Control Mode: The control mode. Choose one of the supplied mode.\n\nUnit of measurement" @@ -4291,7 +4291,7 @@ Library { } } System { - Name "Get Motor Measurement" + Name "GetMotorMeasurement" Location [0, 27, 1920, 1080] Open off PortBlocksUseCompactNotation off @@ -4854,7 +4854,7 @@ Library { $PropName "MaskObject" $ObjectID 214 $ClassName "Simulink.Mask" - Type "Discrete Filter" + Type "DiscreteFilter" Description "This block wraps the Filter, FirstOrderLowPassFilter, and MedianFilter from iCub::ctrl." Initialization "filterDataStruct = struct;\nfilterDataStruct.Fc = Fc;\nfilterDataStruct.Ts = Ts;\nfilterDataS" "truct.MedianOrder = orderMedianFilter;\nfilterDataStruct.FilterType = filterType;\nfilterDataStruct.NumCoeffs = n" @@ -5053,7 +5053,7 @@ Library { } Block { BlockType SubSystem - Name "Match Signal Sizes" + Name "MatchSignalSizes" SID "1818" Ports [2, 1] Position [440, 297, 525, 353] @@ -5063,7 +5063,7 @@ Library { $PropName "MaskObject" $ObjectID 238 $ClassName "Simulink.Mask" - Type "Match Signal Sizes" + Type "MatchSignalSizes" Description "It can happen on particular cases that the Simulink engine cannot propagate the right sizes fro" "m blocks of the toolbox. If you encounter such problems you can try using this blocks which introducing a minimal" " overhead assigns to input Signal the same size of input Reference and outputs Signal.\n\nCurrently it supports o" @@ -5073,7 +5073,7 @@ Library { RunInitForIconRedraw "off" } System { - Name "Match Signal Sizes" + Name "MatchSignalSizes" Location [548, 183, 3416, 1872] Open off PortBlocksUseCompactNotation off @@ -5166,7 +5166,7 @@ Library { } Block { BlockType S-Function - Name "Minimum Jerk Trajectory Generator" + Name "MinimumJerkTrajectoryGenerator" SID "1747" Ports [1, 3] Position [470, 93, 625, 147] @@ -5181,7 +5181,7 @@ Library { $PropName "MaskObject" $ObjectID 239 $ClassName "Simulink.Mask" - Type "Minimum Jerk Trajectory Generator" + Type "MinimumJerkTrajectoryGenerator" Description "This block wraps the minJerkTrajGen class from iCub::ctrl::minJerkTrajGen.\n\nThe Minimum Jerk " "Trajectory Generator is approximated using a 3rd order LTI dynamical system (for more details see [1]).\n\nPositi" "on, velocity and acceleration trajectories are computed.\n\nThe main advantage with respect to the standard polyn" @@ -5837,7 +5837,7 @@ Library { } Block { BlockType S-Function - Name "Yarp Read" + Name "YarpRead" SID "1632" Ports [0, 2] Position [90, 94, 150, 141] @@ -5936,7 +5936,7 @@ Library { } Block { BlockType S-Function - Name "Yarp Write" + Name "YarpWrite" SID "1659" Ports [1] Position [230, 96, 290, 144] @@ -5957,7 +5957,7 @@ Library { "specified, the first parameter become the\nname of the target port to which the data will be stramed, \ne.g. like" " \"yarp write ... /destinationPort\"\n" SelfModifiable "on" - Display "disp('Yarp Write')" + Display "disp('YarpWrite')" RunInitForIconRedraw "off" Array { Type "Simulink.MaskParameter" diff --git a/matlab/library/exported/WBToolboxLibrary.slx b/matlab/library/exported/WBToolboxLibrary.slx index a7e0a6ef4d131f97091bb4ab7ece5ba34b140aaa..50e76ba3131c5527a19edeef1494cf20b4a75db5 100644 GIT binary patch delta 89099 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

    ozs2ma0TF|Hi%|loaart>k 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

    A& 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 bPOtD)5@FyJ7Z@0tqM#1OL2gk2zuNu>C3d8- diff --git a/matlab/slblocks.m b/matlab/slblocks.m index 97931bede..f62a7e71b 100644 --- a/matlab/slblocks.m +++ b/matlab/slblocks.m @@ -6,7 +6,7 @@ % Name of the .mdl file Browser.Library = 'WBToolboxLibrary'; -Browser.Name = 'Whole Body Toolbox'; +Browser.Name = 'WholeBodyToolbox'; Browser.IsFlat = 0; blkStruct.Browser = Browser; From 99fc2c38c0a90f9702033a7ae10e0e5b090b4145 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Wed, 30 Jan 2019 17:30:54 +0100 Subject: [PATCH 30/37] Temporary CI fix --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 0d2c8ec47..c7467d2a9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -73,6 +73,8 @@ before_script: --env-file "$TRAVIS_BUILD_DIR/.ci/env-file" \ $DOCKER_IMAGE_NAME \ bash + # Fix Travis only for this PR + - docker exec -it -w /projects/robotology-superbuild/build ci make BlockFactory script: - docker exec ci ./.ci/script.sh From 10096e7c8982cfc818b8f76d36df180848e8313d Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Thu, 31 Jan 2019 16:35:55 +0100 Subject: [PATCH 31/37] Updated deploy stage Removed leftover --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c7467d2a9..b95466f09 100644 --- a/.travis.yml +++ b/.travis.yml @@ -215,8 +215,6 @@ jobs: - python3-pip - python3-setuptools - python3-wheel - - <<: *deploy_template - if: fork = false AND branch = "devel" AND type != pull_request # notifications: # email: From f3d64b09fe1c0a5d4108dbf92d50e872e58c1cbf Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Wed, 30 Jan 2019 17:30:54 +0100 Subject: [PATCH 32/37] Revert "Temporary CI fix" This reverts commit 99fc2c38c0a90f9702033a7ae10e0e5b090b4145. --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index b95466f09..031c9a3ba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -73,8 +73,6 @@ before_script: --env-file "$TRAVIS_BUILD_DIR/.ci/env-file" \ $DOCKER_IMAGE_NAME \ bash - # Fix Travis only for this PR - - docker exec -it -w /projects/robotology-superbuild/build ci make BlockFactory script: - docker exec ci ./.ci/script.sh From 83224b8c06f88dd8e0ab6e730048a2c3039c11be Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Thu, 31 Jan 2019 21:39:14 +0100 Subject: [PATCH 33/37] Cleaned export_library.m --- matlab/export_library.m | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/matlab/export_library.m b/matlab/export_library.m index a06fd2059..8f5d01312 100644 --- a/matlab/export_library.m +++ b/matlab/export_library.m @@ -24,14 +24,10 @@ set_param(libraryName, 'Lock', 'on'); end - % Export the library + % Export the library. It must be in slx otherwise it will not show up in fprintf('\nExporting for 2014b\n'); save_system(libraryName, 'WBToolboxLibrary', 'ExportToVersion', 'R2014B_SLX'); movefile('WBToolboxLibrary.slx', 'library/exported/WBToolboxLibrary.slx'); - % TODO: Check if mdl support is still required - % fprintf('\nExporting for 2012a\n'); - % save_system(libraryName, 'WBToolboxLibrary', 'ExportToVersion', 'R2012A_MDL'); - % movefile('WBToolboxLibrary.mdl', 'library/exported/WBToolboxLibrary.mdl'); % Unload the library close_system(libraryName); From 7f473e4a2a48565780f7c9d91b15394b1e7b8b7f Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Fri, 1 Feb 2019 17:34:43 +0100 Subject: [PATCH 34/37] Updated release template --- doc/release/template.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/release/template.md b/doc/release/template.md index a39f578e8..5e07833fe 100644 --- a/doc/release/template.md +++ b/doc/release/template.md @@ -8,13 +8,13 @@ ### `WBToolboxBase` -### `WBToolboxLibrary` +### `WBToolbox` ## Bug Fixes ### `WBToolboxBase` -### `WBToolboxLibrary` +### `WBToolbox` ## Contributors From 9d39501b117819f4361c4ac6c7e53bc292a1a4b8 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Fri, 1 Feb 2019 17:35:09 +0100 Subject: [PATCH 35/37] Release notes for v5 release --- doc/release/v5.md | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/doc/release/v5.md b/doc/release/v5.md index 452ec7b8e..4bc6d69f2 100644 --- a/doc/release/v5.md +++ b/doc/release/v5.md @@ -1,30 +1,23 @@ # Whole-Body Toolbox (YYYY-MM-DD) Release Notes {[`#v5`](https://github.com/robotology/wb-toolbox/releases/tag/v5)} -The `v5` release of Whole-Body Toolbox brings a big change in the architecture: the core of the toolbox became a standalone repository hosted at [robotology/blockfactory](https://github.com/robotology/blockfactory). This repository will only host the plugin library containing the classes of the blocks. +The `v5` release of Whole-Body Toolbox brings a big change in the architecture: the core of the toolbox became a standalone repository hosted at [robotology/blockfactory](https://github.com/robotology/blockfactory). This repository will only provide a BlockFactory plugin. -More in detail, this repository now contains only the `WBToolboxBase` and `WBToolboxLibrary` components. +More in detail, starting with this release `WBT` will contain only the following components: + +- `WBToolboxBase` provides the base classes that simplify the interfacing with iDynTree and YARP libraries. +- `WBToolbox` is the real BlockFactory plugin, and it contains all the implementations of the `blockfactory::core::Block` interface. ## Important Changes - The Core, Mex and Coder components have been removed - New dependency: [robotology/blockfactory](https://github.com/robotology/blockfactory) -- It does not depend anymore (neither optionally) from Simulink - -## New Features - -### `WBToolboxBase` - -### `WBToolboxLibrary` - -## Bug Fixes - -### `WBToolboxBase` - -### `WBToolboxLibrary` +- If Matlab is found, the Simulink Library that wraps the block classes is installed ## Contributors -This is a list of people that contributed to this release (generated from the git history using `git shortlog -ens --no-merges vW.X..vY.Z`): +This is a list of people that contributed to this release (generated from the git history using `git shortlog -ens --no-merges v4..v5`): ``` +38 Diego Ferigo + 1 Silvio Traversaro ``` From 0679bfad3a8829be84899299e20e4127f2e3f354 Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Sat, 2 Feb 2019 11:40:23 +0100 Subject: [PATCH 36/37] Minor edit in a comment --- matlab/export_library.m | 1 + 1 file changed, 1 insertion(+) diff --git a/matlab/export_library.m b/matlab/export_library.m index 8f5d01312..2e36e2185 100644 --- a/matlab/export_library.m +++ b/matlab/export_library.m @@ -25,6 +25,7 @@ end % Export the library. It must be in slx otherwise it will not show up in + % the Simulink Library browser. fprintf('\nExporting for 2014b\n'); save_system(libraryName, 'WBToolboxLibrary', 'ExportToVersion', 'R2014B_SLX'); movefile('WBToolboxLibrary.slx', 'library/exported/WBToolboxLibrary.slx'); From e72ede99f87f6e9e65ed084f38d1b86b78af756a Mon Sep 17 00:00:00 2001 From: Diego Ferigo Date: Sat, 2 Feb 2019 11:43:07 +0100 Subject: [PATCH 37/37] Updated v5 contributors --- doc/release/v5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/release/v5.md b/doc/release/v5.md index 4bc6d69f2..0e4cf0d53 100644 --- a/doc/release/v5.md +++ b/doc/release/v5.md @@ -18,6 +18,6 @@ More in detail, starting with this release `WBT` will contain only the following This is a list of people that contributed to this release (generated from the git history using `git shortlog -ens --no-merges v4..v5`): ``` -38 Diego Ferigo +42 Diego Ferigo 1 Silvio Traversaro ```