diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 0000000000..af89265f98 --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,75 @@ +name: Windows + +on: + push: + branches: + - master + pull_request: + paths: + - 'tesseract**' + - '.github/workflows/windows.yml' + - '.github/workflows/windows_dependencies.repos' + schedule: + - cron: '0 5 * * *' + +jobs: + ci: + name: ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [windows-2019, windows-2022] + steps: + - uses: actions/checkout@v3 + with: + path: workspace/src/tesseract_planning + + - name: vcpkg build + uses: johnwason/vcpkg-action@v4 + with: + pkgs: >- + fcl bullet3[multithreading,double-precision,rtti] octomap + console-bridge eigen3 yaml-cpp benchmark tinyxml2 assimp orocos-kdl pcl + lapack-reference boost-dll boost-filesystem boost-serialization + boost-program-options boost-graph urdfdom ccd[double-precision] gtest + ompl taskflow jsoncpp flann benchmark + triplet: x64-windows-release + extra-args: --clean-after-build + token: ${{ github.token }} + cache-key: ci-${{ matrix.os }} + revision: master + + - name: install-depends + shell: cmd + run: | + python -m pip install vcstool -q + python -m pip install colcon-common-extensions -q + python -m pip install ninja -q + + - name: configure-msvc + uses: ilammy/msvc-dev-cmd@v1 + with: + arch: x64 + + - name: build-workspace + working-directory: workspace + shell: cmd + run: | + set PATH=%PATH%;%GITHUB_WORKSPACE%\vcpkg\installed\x64-windows-release\bin + set CMAKE_PREFIX_PATH=%GITHUB_WORKSPACE%\vcpkg\installed\x64-windows-release + vcs import --input "${{ github.workspace }}/workspace/src/tesseract_planning/.github/workflows/windows_dependencies.repos" src/ + if %ERRORLEVEL% GEQ 1 exit 1 + colcon build --event-handlers console_direct+ --cmake-args -G "Ninja" -DVCPKG_TARGET_TRIPLET=x64-windows-release -DCMAKE_BUILD_TYPE=Release -DTESSERACT_ENABLE_TESTING=ON -DBUILD_IPOPT=OFF -DBUILD_SNOPT=OFF + if %ERRORLEVEL% GEQ 1 exit 1 + + - name: run-test + working-directory: workspace + shell: cmd + run: | + call ./install/setup.bat + set PATH=%PATH%;%GITHUB_WORKSPACE%\vcpkg\installed\x64-windows-release\bin + colcon test --event-handlers console_direct+ --return-code-on-test-failure --packages-select tesseract_command_language tesseract_motion_planners tesseract_task_composer tesseract_time_parameterization + if %ERRORLEVEL% GEQ 1 exit 1 + colcon test-result --verbose + if %ERRORLEVEL% GEQ 1 exit 1 diff --git a/.github/workflows/dependencies_windows_build.repos b/.github/workflows/windows_dependencies.repos similarity index 84% rename from .github/workflows/dependencies_windows_build.repos rename to .github/workflows/windows_dependencies.repos index d979b38d02..16513fbafd 100644 --- a/.github/workflows/dependencies_windows_build.repos +++ b/.github/workflows/windows_dependencies.repos @@ -2,18 +2,14 @@ local-name: ros_industrial_cmake_boilerplate uri: https://github.com/ros-industrial/ros_industrial_cmake_boilerplate.git version: 0.4.5 -- git: - local-name: tesseract_ext - uri: https://github.com/ros-industrial-consortium/tesseract_ext.git - version: master - git: local-name: tesseract uri: https://github.com/ros-industrial-consortium/tesseract.git - version: 0.17.0 + version: master - git: local-name: trajopt uri: https://github.com/ros-industrial-consortium/trajopt_ros.git - version: 0.5.2 + version: master - git: local-name: descartes_light uri: https://github.com/swri-robotics/descartes_light.git diff --git a/.github/workflows/windows_noetic_build.yml b/.github/workflows/windows_noetic_build.yml deleted file mode 100644 index ef01139a49..0000000000 --- a/.github/workflows/windows_noetic_build.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: Windows-Noetic-Build - -on: - push: - branches: - - master - pull_request: - schedule: - - cron: '0 5 * * *' - -jobs: - windows_ci: - name: Noetic - runs-on: windows-2019 - env: - ROS_DISTRO: noetic - steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - path: src/tesseract_planning - - name: Build - shell: cmd - run: | - choco sources add -n=roswin -s https://aka.ms/ros/public --priority 1 - choco install ros-%ROS_DISTRO%-desktop_full -y --no-progress - - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64 - call "C:\opt\ros\%ROS_DISTRO%\x64\setup.bat" - - rosdep update - - vcs import --input "${{ github.workspace }}/src/tesseract_planning/ci/dependencies_windows_build.repos" src/ - - rosdep install -q --from-paths . --ignore-src -y - - catkin_make_isolated --install --use-nmake --force-cmake --only-pkg-with-deps tesseract_command_language tesseract_motion_planners tesseract_task_composer tesseract_time_parameterization --cmake-args -DCMAKE_BUILD_TYPE=Release -DINSTALL_OMPL=ON -DINSTALL_OMPL_TAG=main -DBUILD_IPOPT=OFF -DBUILD_SNOPT=OFF -DINSTALL_FCL=ON -DINSTALL_BULLET=ON - call "D:\a\tesseract\tesseract\install_isolated\setup.bat" - catkin_make_isolated --install --use-nmake --force-cmake --pkg tesseract_command_language tesseract_motion_planners tesseract_task_composer tesseract_time_parameterization --cmake-args -DCMAKE_BUILD_TYPE=Release -DTESSERACT_ENABLE_TESTING=ON -DINSTALL_OMPL=ON -DINSTALL_OMPL_TAG=main -DBUILD_IPOPT=OFF -DBUILD_SNOPT=OFF -DINSTALL_FCL=ON -DINSTALL_BULLET=ON - - install_isolated\setup.bat - cmd /c "cd build_isolated\tesseract_command_language\install\test && ctest -C Release" - cmd /c "cd build_isolated\tesseract_motion_planners\install\test && ctest -C Release" - cmd /c "cd build_isolated\tesseract_task_composer\install\test && ctest -C Release" - cmd /c "cd build_isolated\tesseract_time_parameterization\install\test && ctest -C Release" diff --git a/tesseract_examples/src/glass_upright_example.cpp b/tesseract_examples/src/glass_upright_example.cpp index 2220e8504a..de738379e2 100644 --- a/tesseract_examples/src/glass_upright_example.cpp +++ b/tesseract_examples/src/glass_upright_example.cpp @@ -25,7 +25,7 @@ */ #include TESSERACT_COMMON_IGNORE_WARNINGS_PUSH -#include +#include #include TESSERACT_COMMON_IGNORE_WARNINGS_POP diff --git a/tesseract_examples/src/pick_and_place_example.cpp b/tesseract_examples/src/pick_and_place_example.cpp index b2ccca6b2c..4e79dff657 100644 --- a/tesseract_examples/src/pick_and_place_example.cpp +++ b/tesseract_examples/src/pick_and_place_example.cpp @@ -25,7 +25,7 @@ */ #include TESSERACT_COMMON_IGNORE_WARNINGS_PUSH -#include +#include #include TESSERACT_COMMON_IGNORE_WARNINGS_POP diff --git a/tesseract_task_composer/config/task_composer_plugins_no_trajopt_ifopt.yaml b/tesseract_task_composer/config/task_composer_plugins_no_trajopt_ifopt.yaml new file mode 100644 index 0000000000..f40fff3bf2 --- /dev/null +++ b/tesseract_task_composer/config/task_composer_plugins_no_trajopt_ifopt.yaml @@ -0,0 +1,840 @@ +task_composer_plugins: + search_paths: + - /usr/local/lib + search_libraries: + - tesseract_task_composer_factories + - tesseract_task_composer_planning_factories + - tesseract_task_composer_taskflow_factories + executors: + default: TaskflowExecutor + plugins: + TaskflowExecutor: + class: TaskflowTaskComposerExecutorFactory + config: + threads: 5 + tasks: + plugins: + DescartesFPipeline: + class: PipelineTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + nodes: + DoneTask: + class: DoneTaskFactory + config: + conditional: false + ErrorTask: + class: ErrorTaskFactory + config: + conditional: false + MinLengthTask: + class: MinLengthTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + DescartesMotionPlannerTask: + class: DescartesFMotionPlannerTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + format_result_as_input: false + DiscreteContactCheckTask: + class: DiscreteContactCheckTaskFactory + config: + conditional: true + inputs: [output_data] + IterativeSplineParameterizationTask: + class: IterativeSplineParameterizationTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + edges: + - source: MinLengthTask + destinations: [ErrorTask, DescartesMotionPlannerTask] + - source: DescartesMotionPlannerTask + destinations: [ErrorTask, DiscreteContactCheckTask] + - source: DiscreteContactCheckTask + destinations: [ErrorTask, IterativeSplineParameterizationTask] + - source: IterativeSplineParameterizationTask + destinations: [ErrorTask, DoneTask] + terminals: [ErrorTask, DoneTask] + DescartesDPipeline: + class: PipelineTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + nodes: + DoneTask: + class: DoneTaskFactory + config: + conditional: false + ErrorTask: + class: ErrorTaskFactory + config: + conditional: false + MinLengthTask: + class: MinLengthTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + DescartesMotionPlannerTask: + class: DescartesDMotionPlannerTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + format_result_as_input: false + DiscreteContactCheckTask: + class: DiscreteContactCheckTaskFactory + config: + conditional: true + inputs: [output_data] + IterativeSplineParameterizationTask: + class: IterativeSplineParameterizationTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + edges: + - source: MinLengthTask + destinations: [ErrorTask, DescartesMotionPlannerTask] + - source: DescartesMotionPlannerTask + destinations: [ErrorTask, DiscreteContactCheckTask] + - source: DiscreteContactCheckTask + destinations: [ErrorTask, IterativeSplineParameterizationTask] + - source: IterativeSplineParameterizationTask + destinations: [ErrorTask, DoneTask] + terminals: [ErrorTask, DoneTask] + DescartesFNPCPipeline: + class: PipelineTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + nodes: + DoneTask: + class: DoneTaskFactory + config: + conditional: false + ErrorTask: + class: ErrorTaskFactory + config: + conditional: false + MinLengthTask: + class: MinLengthTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + DescartesMotionPlannerTask: + class: DescartesFMotionPlannerTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + format_result_as_input: false + IterativeSplineParameterizationTask: + class: IterativeSplineParameterizationTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + edges: + - source: MinLengthTask + destinations: [ErrorTask, DescartesMotionPlannerTask] + - source: DescartesMotionPlannerTask + destinations: [ErrorTask, IterativeSplineParameterizationTask] + - source: IterativeSplineParameterizationTask + destinations: [ErrorTask, DoneTask] + terminals: [ErrorTask, DoneTask] + DescartesDNPCPipeline: + class: PipelineTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + nodes: + DoneTask: + class: DoneTaskFactory + config: + conditional: false + ErrorTask: + class: ErrorTaskFactory + config: + conditional: false + MinLengthTask: + class: MinLengthTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + DescartesMotionPlannerTask: + class: DescartesDMotionPlannerTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + format_result_as_input: false + IterativeSplineParameterizationTask: + class: IterativeSplineParameterizationTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + edges: + - source: MinLengthTask + destinations: [ErrorTask, DescartesMotionPlannerTask] + - source: DescartesMotionPlannerTask + destinations: [ErrorTask, IterativeSplineParameterizationTask] + - source: IterativeSplineParameterizationTask + destinations: [ErrorTask, DoneTask] + terminals: [ErrorTask, DoneTask] + OMPLPipeline: + class: PipelineTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + nodes: + DoneTask: + class: DoneTaskFactory + config: + conditional: false + ErrorTask: + class: ErrorTaskFactory + config: + conditional: false + MinLengthTask: + class: MinLengthTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + OMPLMotionPlannerTask: + class: OMPLMotionPlannerTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + format_result_as_input: false + DiscreteContactCheckTask: + class: DiscreteContactCheckTaskFactory + config: + conditional: true + inputs: [output_data] + IterativeSplineParameterizationTask: + class: IterativeSplineParameterizationTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + edges: + - source: MinLengthTask + destinations: [ErrorTask, OMPLMotionPlannerTask] + - source: OMPLMotionPlannerTask + destinations: [ErrorTask, DiscreteContactCheckTask] + - source: DiscreteContactCheckTask + destinations: [ErrorTask, IterativeSplineParameterizationTask] + - source: IterativeSplineParameterizationTask + destinations: [ErrorTask, DoneTask] + terminals: [ErrorTask, DoneTask] + TrajOptPipeline: + class: PipelineTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + nodes: + DoneTask: + class: DoneTaskFactory + config: + conditional: false + ErrorTask: + class: ErrorTaskFactory + config: + conditional: false + MinLengthTask: + class: MinLengthTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + TrajOptMotionPlannerTask: + class: TrajOptMotionPlannerTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + format_result_as_input: false + DiscreteContactCheckTask: + class: DiscreteContactCheckTaskFactory + config: + conditional: true + inputs: [output_data] + IterativeSplineParameterizationTask: + class: IterativeSplineParameterizationTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + edges: + - source: MinLengthTask + destinations: [ErrorTask, TrajOptMotionPlannerTask] + - source: TrajOptMotionPlannerTask + destinations: [ErrorTask, DiscreteContactCheckTask] + - source: DiscreteContactCheckTask + destinations: [ErrorTask, IterativeSplineParameterizationTask] + - source: IterativeSplineParameterizationTask + destinations: [ErrorTask, DoneTask] + terminals: [ErrorTask, DoneTask] + CartesianPipeline: + class: PipelineTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + nodes: + DoneTask: + class: DoneTaskFactory + config: + conditional: false + ErrorTask: + class: ErrorTaskFactory + config: + conditional: false + MinLengthTask: + class: MinLengthTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + DescartesMotionPlannerTask: + class: DescartesFMotionPlannerTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + format_result_as_input: true + TrajOptMotionPlannerTask: + class: TrajOptMotionPlannerTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + format_result_as_input: false + DiscreteContactCheckTask: + class: DiscreteContactCheckTaskFactory + config: + conditional: true + inputs: [output_data] + IterativeSplineParameterizationTask: + class: IterativeSplineParameterizationTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + edges: + - source: MinLengthTask + destinations: [ErrorTask, DescartesMotionPlannerTask] + - source: DescartesMotionPlannerTask + destinations: [ErrorTask, TrajOptMotionPlannerTask] + - source: TrajOptMotionPlannerTask + destinations: [ErrorTask, DiscreteContactCheckTask] + - source: DiscreteContactCheckTask + destinations: [ErrorTask, IterativeSplineParameterizationTask] + - source: IterativeSplineParameterizationTask + destinations: [ErrorTask, DoneTask] + terminals: [ErrorTask, DoneTask] + FreespacePipeline: + class: PipelineTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + nodes: + DoneTask: + class: DoneTaskFactory + config: + conditional: false + ErrorTask: + class: ErrorTaskFactory + config: + conditional: false + MinLengthTask: + class: MinLengthTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + OMPLMotionPlannerTask: + class: OMPLMotionPlannerTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + format_result_as_input: true + TrajOptMotionPlannerTask: + class: TrajOptMotionPlannerTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + format_result_as_input: false + DiscreteContactCheckTask: + class: DiscreteContactCheckTaskFactory + config: + conditional: true + inputs: [output_data] + IterativeSplineParameterizationTask: + class: IterativeSplineParameterizationTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + edges: + - source: MinLengthTask + destinations: [ErrorTask, OMPLMotionPlannerTask] + - source: OMPLMotionPlannerTask + destinations: [ErrorTask, TrajOptMotionPlannerTask] + - source: TrajOptMotionPlannerTask + destinations: [ErrorTask, DiscreteContactCheckTask] + - source: DiscreteContactCheckTask + destinations: [ErrorTask, IterativeSplineParameterizationTask] + - source: IterativeSplineParameterizationTask + destinations: [ErrorTask, DoneTask] + terminals: [ErrorTask, DoneTask] + RasterFtPipeline: + class: PipelineTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + nodes: + DoneTask: + class: DoneTaskFactory + config: + conditional: false + ErrorTask: + class: ErrorTaskFactory + config: + conditional: false + SimpleMotionPlannerTask: + class: SimpleMotionPlannerTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + format_result_as_input: true + RasterMotionTask: + class: RasterMotionTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + freespace: + task: FreespacePipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + raster: + task: CartesianPipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + transition: + task: FreespacePipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + edges: + - source: SimpleMotionPlannerTask + destinations: [ErrorTask, RasterMotionTask] + - source: RasterMotionTask + destinations: [ErrorTask, DoneTask] + terminals: [ErrorTask, DoneTask] + RasterCtPipeline: + class: PipelineTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + nodes: + DoneTask: + class: DoneTaskFactory + config: + conditional: false + ErrorTask: + class: ErrorTaskFactory + config: + conditional: false + SimpleMotionPlannerTask: + class: SimpleMotionPlannerTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + format_result_as_input: true + RasterMotionTask: + class: RasterMotionTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + freespace: + task: FreespacePipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + raster: + task: CartesianPipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + transition: + task: CartesianPipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + edges: + - source: SimpleMotionPlannerTask + destinations: [ErrorTask, RasterMotionTask] + - source: RasterMotionTask + destinations: [ErrorTask, DoneTask] + terminals: [ErrorTask, DoneTask] + RasterFtOnlyPipeline: + class: PipelineTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + nodes: + DoneTask: + class: DoneTaskFactory + config: + conditional: false + ErrorTask: + class: ErrorTaskFactory + config: + conditional: false + SimpleMotionPlannerTask: + class: SimpleMotionPlannerTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + format_result_as_input: true + RasterMotionTask: + class: RasterOnlyMotionTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + raster: + task: CartesianPipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + transition: + task: FreespacePipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + edges: + - source: SimpleMotionPlannerTask + destinations: [ErrorTask, RasterMotionTask] + - source: RasterMotionTask + destinations: [ErrorTask, DoneTask] + terminals: [ErrorTask, DoneTask] + RasterCtOnlyPipeline: + class: PipelineTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + nodes: + DoneTask: + class: DoneTaskFactory + config: + conditional: false + ErrorTask: + class: ErrorTaskFactory + config: + conditional: false + SimpleMotionPlannerTask: + class: SimpleMotionPlannerTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + format_result_as_input: true + RasterMotionTask: + class: RasterOnlyMotionTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + raster: + task: CartesianPipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + transition: + task: CartesianPipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + edges: + - source: SimpleMotionPlannerTask + destinations: [ErrorTask, RasterMotionTask] + - source: RasterMotionTask + destinations: [ErrorTask, DoneTask] + terminals: [ErrorTask, DoneTask] + RasterFtGlobalPipeline: + class: PipelineTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + nodes: + DoneTask: + class: DoneTaskFactory + config: + conditional: false + ErrorTask: + class: ErrorTaskFactory + config: + conditional: false + SimpleMotionPlannerTask: + class: SimpleMotionPlannerTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + format_result_as_input: true + DescartesMotionPlannerTask: + class: DescartesFMotionPlannerTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + format_result_as_input: true + RasterMotionTask: + class: RasterMotionTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + freespace: + task: FreespacePipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + raster: + task: CartesianPipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + transition: + task: FreespacePipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + edges: + - source: SimpleMotionPlannerTask + destinations: [ErrorTask, DescartesMotionPlannerTask] + - source: DescartesMotionPlannerTask + destinations: [ErrorTask, RasterMotionTask] + - source: RasterMotionTask + destinations: [ErrorTask, DoneTask] + terminals: [ErrorTask, DoneTask] + RasterCtGlobalPipeline: + class: PipelineTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + nodes: + DoneTask: + class: DoneTaskFactory + config: + conditional: false + ErrorTask: + class: ErrorTaskFactory + config: + conditional: false + SimpleMotionPlannerTask: + class: SimpleMotionPlannerTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + format_result_as_input: true + DescartesMotionPlannerTask: + class: DescartesFMotionPlannerTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + format_result_as_input: true + RasterMotionTask: + class: RasterMotionTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + freespace: + task: FreespacePipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + raster: + task: CartesianPipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + transition: + task: CartesianPipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + edges: + - source: SimpleMotionPlannerTask + destinations: [ErrorTask, DescartesMotionPlannerTask] + - source: DescartesMotionPlannerTask + destinations: [ErrorTask, RasterMotionTask] + - source: RasterMotionTask + destinations: [ErrorTask, DoneTask] + terminals: [ErrorTask, DoneTask] + RasterFtOnlyGlobalPipeline: + class: PipelineTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + nodes: + DoneTask: + class: DoneTaskFactory + config: + conditional: false + ErrorTask: + class: ErrorTaskFactory + config: + conditional: false + SimpleMotionPlannerTask: + class: SimpleMotionPlannerTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + format_result_as_input: true + DescartesMotionPlannerTask: + class: DescartesFMotionPlannerTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + format_result_as_input: true + RasterMotionTask: + class: RasterOnlyMotionTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + raster: + task: CartesianPipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + transition: + task: FreespacePipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + edges: + - source: SimpleMotionPlannerTask + destinations: [ErrorTask, DescartesMotionPlannerTask] + - source: DescartesMotionPlannerTask + destinations: [ErrorTask, RasterMotionTask] + - source: RasterMotionTask + destinations: [ErrorTask, DoneTask] + terminals: [ErrorTask, DoneTask] + RasterCtOnlyGlobalPipeline: + class: PipelineTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + nodes: + DoneTask: + class: DoneTaskFactory + config: + conditional: false + ErrorTask: + class: ErrorTaskFactory + config: + conditional: false + SimpleMotionPlannerTask: + class: SimpleMotionPlannerTaskFactory + config: + conditional: true + inputs: [input_data] + outputs: [output_data] + format_result_as_input: true + DescartesMotionPlannerTask: + class: DescartesFMotionPlannerTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + format_result_as_input: true + RasterMotionTask: + class: RasterOnlyMotionTaskFactory + config: + conditional: true + inputs: [output_data] + outputs: [output_data] + raster: + task: CartesianPipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + transition: + task: CartesianPipeline + input_remapping: + input_data: output_data + input_indexing: [output_data] + output_indexing: [output_data] + edges: + - source: SimpleMotionPlannerTask + destinations: [ErrorTask, DescartesMotionPlannerTask] + - source: DescartesMotionPlannerTask + destinations: [ErrorTask, RasterMotionTask] + - source: RasterMotionTask + destinations: [ErrorTask, DoneTask] + terminals: [ErrorTask, DoneTask] diff --git a/tesseract_task_composer/core/include/tesseract_task_composer/core/task_composer_input.h b/tesseract_task_composer/core/include/tesseract_task_composer/core/task_composer_input.h index 934f364a7b..4f6f9eb78d 100644 --- a/tesseract_task_composer/core/include/tesseract_task_composer/core/task_composer_input.h +++ b/tesseract_task_composer/core/include/tesseract_task_composer/core/task_composer_input.h @@ -90,7 +90,7 @@ struct TaskComposerInput * @note If calling within a node you must provide the uuid * @details This accesses the internal process interface class to abort the process */ - void abort(const boost::uuids::uuid& calling_node = boost::uuids::uuid{}); + void abort(const boost::uuids::uuid& calling_node = boost::uuids::uuid()); /** * @brief Abort the process input diff --git a/tesseract_task_composer/core/include/tesseract_task_composer/core/task_composer_pipeline.h b/tesseract_task_composer/core/include/tesseract_task_composer/core/task_composer_pipeline.h index 64a8abd747..b44e90d60e 100644 --- a/tesseract_task_composer/core/include/tesseract_task_composer/core/task_composer_pipeline.h +++ b/tesseract_task_composer/core/include/tesseract_task_composer/core/task_composer_pipeline.h @@ -31,6 +31,7 @@ TESSERACT_COMMON_IGNORE_WARNINGS_PUSH #include #include #include +#include TESSERACT_COMMON_IGNORE_WARNINGS_POP #include diff --git a/tesseract_task_composer/core/include/tesseract_task_composer/core/task_composer_task_plugin_factory.h b/tesseract_task_composer/core/include/tesseract_task_composer/core/task_composer_task_plugin_factory.h new file mode 100644 index 0000000000..fc3de3ee93 --- /dev/null +++ b/tesseract_task_composer/core/include/tesseract_task_composer/core/task_composer_task_plugin_factory.h @@ -0,0 +1,37 @@ +/** + * @file task_composer_task_plugin_factories.h + * @brief Plugin anchor + * + * @author John Wason + * @date June 24. 2023 + * @version TODO + * @bug No known bugs + * + * @copyright Copyright (c) 2023, Wason Technology, LLC + * + * @par License + * Software License Agreement (Apache License) + * @par + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * @par + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef TESSERACT_TASK_COMPOSER_TASK_COMPOSER_TASK_PLUGIN_FACTORIES_H +#define TESSERACT_TASK_COMPOSER_TASK_COMPOSER_TASK_PLUGIN_FACTORIES_H + +#include +#include + +namespace tesseract_planning +{ +TESSERACT_PLUGIN_ANCHOR_DECL(TaskComposerTaskFactoryAnchor) +} // namespace tesseract_planning + +#endif // TESSERACT_TASK_COMPOSER_CHECK_INPUT_TASK_COMPOSER_PLUGIN_FACTORIES_H diff --git a/tesseract_task_composer/core/src/task_composer_task_plugin_factory.cpp b/tesseract_task_composer/core/src/task_composer_task_plugin_factory.cpp index be884fdf18..297b2bd409 100644 --- a/tesseract_task_composer/core/src/task_composer_task_plugin_factory.cpp +++ b/tesseract_task_composer/core/src/task_composer_task_plugin_factory.cpp @@ -24,6 +24,7 @@ * limitations under the License. */ +#include #include #include #include @@ -43,6 +44,8 @@ using StartTaskFactory = TaskComposerTaskFactory; using GraphTaskFactory = TaskComposerTaskFactory; using PipelineTaskFactory = TaskComposerTaskFactory; +TESSERACT_PLUGIN_ANCHOR_IMPL(TaskComposerTaskFactoryAnchor) + } // namespace tesseract_planning namespace tesseract_planning::test_suite diff --git a/tesseract_task_composer/planning/include/tesseract_task_composer/planning/planning_task_composer_plugin_factories.h b/tesseract_task_composer/planning/include/tesseract_task_composer/planning/planning_task_composer_plugin_factories.h new file mode 100644 index 0000000000..eb14e028ec --- /dev/null +++ b/tesseract_task_composer/planning/include/tesseract_task_composer/planning/planning_task_composer_plugin_factories.h @@ -0,0 +1,37 @@ +/** + * @file planning_task_composer_plugin_factories.h + * @brief Plugin anchor + * + * @author John Wason + * @date June 17. 2023 + * @version TODO + * @bug No known bugs + * + * @copyright Copyright (c) 2023, Wason Technology, LLC + * + * @par License + * Software License Agreement (Apache License) + * @par + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * @par + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef TESSERACT_TASK_COMPOSER_PLANNING_TASK_COMPOSER_PLUGIN_FACTORIES_H +#define TESSERACT_TASK_COMPOSER_PLANNING_TASK_COMPOSER_PLUGIN_FACTORIES_H + +#include +#include + +namespace tesseract_planning +{ +TESSERACT_PLUGIN_ANCHOR_DECL(TaskComposerPlanningFactoriesAnchor) +} // namespace tesseract_planning + +#endif // TESSERACT_TASK_COMPOSER_CHECK_INPUT_TASK_COMPOSER_PLUGIN_FACTORIES_H diff --git a/tesseract_task_composer/planning/src/planning_task_composer_plugin_factories.cpp b/tesseract_task_composer/planning/src/planning_task_composer_plugin_factories.cpp index 8f478426ac..3b6482d6c6 100644 --- a/tesseract_task_composer/planning/src/planning_task_composer_plugin_factories.cpp +++ b/tesseract_task_composer/planning/src/planning_task_composer_plugin_factories.cpp @@ -24,6 +24,7 @@ * limitations under the License. */ +#include #include #include @@ -47,7 +48,9 @@ #include #include +#ifdef TESSERACT_TASK_COMPOSER_HAS_TRAJOPT_IFOPT #include +#endif namespace tesseract_planning { @@ -71,7 +74,12 @@ using DescartesDMotionPlannerTaskFactory = TaskComposerTaskFactory>; using TrajOptMotionPlannerTaskFactory = TaskComposerTaskFactory>; using SimpleMotionPlannerTaskFactory = TaskComposerTaskFactory>; +#ifdef TESSERACT_TASK_COMPOSER_HAS_TRAJOPT_IFOPT using TrajOptIfoptMotionPlannerTaskFactory = TaskComposerTaskFactory>; +#endif + +TESSERACT_PLUGIN_ANCHOR_IMPL(TaskComposerPlanningFactoriesAnchor) + } // namespace tesseract_planning // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) @@ -123,6 +131,8 @@ TESSERACT_ADD_TASK_COMPOSER_NODE_PLUGIN(tesseract_planning::TrajOptMotionPlanner // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) TESSERACT_ADD_TASK_COMPOSER_NODE_PLUGIN(tesseract_planning::SimpleMotionPlannerTaskFactory, SimpleMotionPlannerTaskFactory) +#ifdef TESSERACT_TASK_COMPOSER_HAS_TRAJOPT_IFOPT // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) TESSERACT_ADD_TASK_COMPOSER_NODE_PLUGIN(tesseract_planning::TrajOptIfoptMotionPlannerTaskFactory, TrajOptIfoptMotionPlannerTaskFactory) +#endif diff --git a/tesseract_task_composer/taskflow/include/tesseract_task_composer/taskflow/taskflow_task_composer_plugin_factories.h b/tesseract_task_composer/taskflow/include/tesseract_task_composer/taskflow/taskflow_task_composer_plugin_factories.h new file mode 100644 index 0000000000..36b7984c9e --- /dev/null +++ b/tesseract_task_composer/taskflow/include/tesseract_task_composer/taskflow/taskflow_task_composer_plugin_factories.h @@ -0,0 +1,37 @@ +/** + * @file taskflow_task_composer_plugin_factories.h + * @brief Plugin anchor + * + * @author John Wason + * @date June 17. 2023 + * @version TODO + * @bug No known bugs + * + * @copyright Copyright (c) 2023, Wason Technology, LLC + * + * @par License + * Software License Agreement (Apache License) + * @par + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * @par + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef TESSERACT_TASK_COMPOSER_TASKFLOW_TASK_COMPOSER_PLUGIN_FACTORIES_H +#define TESSERACT_TASK_COMPOSER_TASKFLOW_TASK_COMPOSER_PLUGIN_FACTORIES_H + +#include +#include + +namespace tesseract_planning +{ +TESSERACT_PLUGIN_ANCHOR_DECL(TaskComposerTaskflowFactoriesAnchor) +} // namespace tesseract_planning + +#endif // TESSERACT_TASK_COMPOSER_TASKFLOW_TASK_COMPOSER_PLUGIN_FACTORIES_H diff --git a/tesseract_task_composer/taskflow/src/taskflow_task_composer_plugin_factories.cpp b/tesseract_task_composer/taskflow/src/taskflow_task_composer_plugin_factories.cpp index c49a45759c..ef760ebb24 100644 --- a/tesseract_task_composer/taskflow/src/taskflow_task_composer_plugin_factories.cpp +++ b/tesseract_task_composer/taskflow/src/taskflow_task_composer_plugin_factories.cpp @@ -24,13 +24,15 @@ * limitations under the License. */ -#include +#include #include +#include namespace tesseract_planning { using TaskflowTaskComposerExecutorFactory = TaskComposerExecutorFactoryImpl; -} +TESSERACT_PLUGIN_ANCHOR_IMPL(TaskComposerTaskflowFactoriesAnchor) +} // namespace tesseract_planning // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) TESSERACT_ADD_TASK_COMPOSER_EXECUTOR_PLUGIN(tesseract_planning::TaskflowTaskComposerExecutorFactory, diff --git a/tesseract_task_composer/test/CMakeLists.txt b/tesseract_task_composer/test/CMakeLists.txt index a7788bef6c..9945a1aa38 100644 --- a/tesseract_task_composer/test/CMakeLists.txt +++ b/tesseract_task_composer/test/CMakeLists.txt @@ -95,6 +95,9 @@ target_code_coverage( add_gtest_discover_tests(${PROJECT_NAME}_plugin_factories_unit) add_dependencies(run_tests ${PROJECT_NAME}_plugin_factories_unit) add_dependencies(${PROJECT_NAME}_plugin_factories_unit ${PROJECT_NAME}) +if(TESSERACT_BUILD_TRAJOPT_IFOPT) + target_compile_definitions(${PROJECT_NAME}_plugin_factories_unit PUBLIC TESSERACT_TASK_COMPOSER_HAS_TRAJOPT_IFOPT=1) +endif() # Core Tests add_executable(${PROJECT_NAME}_core_unit ${PROJECT_NAME}_core_unit.cpp) diff --git a/tesseract_task_composer/test/tesseract_task_composer_plugin_factories_unit.cpp b/tesseract_task_composer/test/tesseract_task_composer_plugin_factories_unit.cpp index cf56421714..095d26365d 100644 --- a/tesseract_task_composer/test/tesseract_task_composer_plugin_factories_unit.cpp +++ b/tesseract_task_composer/test/tesseract_task_composer_plugin_factories_unit.cpp @@ -70,8 +70,11 @@ void runTaskComposerFactoryTest(TaskComposerPluginFactory& factory, YAML::Node p TaskComposerExecutor::UPtr cm = factory.createTaskComposerExecutor(name); EXPECT_TRUE(cm != nullptr); } - +#ifdef TESSERACT_TASK_COMPOSER_HAS_TRAJOPT_IFOPT EXPECT_EQ(task_plugins.size(), 17); +#else + EXPECT_EQ(task_plugins.size(), 16); +#endif for (auto cm_it = task_plugins.begin(); cm_it != task_plugins.end(); ++cm_it) { auto name = cm_it->first.as(); @@ -108,8 +111,15 @@ void runTaskComposerFactoryTest(TaskComposerPluginFactory& factory, YAML::Node p TEST(TesseractTaskComposerFactoryUnit, LoadAndExportPluginTest) // NOLINT { { // File Path Construction +#ifdef TESSERACT_TASK_COMPOSER_HAS_TRAJOPT_IFOPT tesseract_common::fs::path config_path(std::string(TESSERACT_TASK_COMPOSER_DIR) + "/config/" "task_composer_plugins.yaml"); +#else + tesseract_common::fs::path config_path(std::string(TESSERACT_TASK_COMPOSER_DIR) + "/config/" + "task_composer_plugins_no_" + "trajopt_" + "ifopt.yaml"); +#endif TaskComposerPluginFactory factory(config_path); YAML::Node plugin_config = YAML::LoadFile(config_path.string()); runTaskComposerFactoryTest(factory, plugin_config);