Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Saturation Joint Limiter that uses clamping method #971

Merged
merged 75 commits into from
Jul 4, 2024
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
5d81a98
Added controller parameters structures and movement interfaces.
destogl Sep 17, 2021
aa004a3
Added joint limiter plugins.
destogl Sep 18, 2021
bbd9d59
Debug Ruckig JointLimiter.
destogl Sep 24, 2021
ee7faf2
Modify simple joint limiting plugin (same as changes to moveit2 filte…
destogl Feb 9, 2023
a07c7ac
Remove all Ruckig-limiter files.
destogl Mar 16, 2023
5260724
Merge branch 'master' into add-simple-joint-limiter
destogl Mar 16, 2023
6675e7d
Merge branch 'master' into add-simple-joint-limiter
destogl Mar 23, 2023
ceb3beb
Merge branch 'master' into add-simple-joint-limiter
destogl Apr 13, 2023
f939193
Apply suggestions from code review
destogl Apr 13, 2023
d7db070
Remove definition of movement interface because the concept is not us…
destogl Apr 13, 2023
4054b04
Polish out some stuff using "GH Programming"
destogl Apr 13, 2023
456c715
Polish out some stuff using "GH Programming"
destogl Apr 13, 2023
8b33153
Add SimpleJointLimiter as plugin into controllers.
destogl Apr 24, 2023
cbfc06a
Version with deceleration for simple joint limiter.
destogl May 4, 2023
2777c61
Merge branch 'master' into add-simple-joint-limiter
destogl May 9, 2023
b401169
Formatting and comment to check.
destogl May 12, 2023
e6f52d7
Added test of joint_limiter
gwalck Jun 7, 2023
7bfc94e
Fixed deceleration limit application
gwalck Jun 7, 2023
c338b8c
Updated authorship
gwalck Jun 9, 2023
6e0e6c5
Split test, apply review changes, add future tests
gwalck Jun 9, 2023
cfc8fe5
Applied review comment, added 2 tests & fixed typo
gwalck Jun 12, 2023
186c66e
Improved close to limit trigger
gwalck Jun 12, 2023
d6db2a1
Merge branch 'master' into add-simple-joint-limiter
destogl Jun 13, 2023
1e393f3
Merge branch 'master' into add-simple-joint-limiter
destogl Jun 27, 2023
1749f6d
Update joint_limits/src/simple_joint_limiter.cpp
destogl Jun 27, 2023
e254294
Fix formatting.
destogl Jun 29, 2023
21944b3
Added temporary pseudo-code
gwalck Jul 7, 2023
7530ba8
Updated pseudo-code
gwalck Jul 7, 2023
27e3304
Refactored to match pseudo-code
gwalck Jul 7, 2023
d5892e8
Adapted tests
gwalck Jul 7, 2023
d848a7d
lint
gwalck Jul 7, 2023
8c771cf
Cleanup debug helpers
gwalck Jul 7, 2023
7e8e4cd
Removed pseudo-code
gwalck Jul 7, 2023
c7fdd46
Merge branch 'master' into add-simple-joint-limiter
destogl Jul 13, 2023
098a431
Merge branch 'master' into add-simple-joint-limiter
destogl Aug 3, 2023
c184da8
Merge branch 'master' into add-simple-joint-limiter
destogl Aug 30, 2023
345370a
Apply suggestions from code review
destogl Sep 4, 2023
c99eb86
Apply suggestions from code review
destogl Sep 4, 2023
5a9985c
Unify how joints were limits are reached are stored.
destogl Sep 4, 2023
9c2bba7
Fix formatting.
destogl Sep 4, 2023
6ca6594
Fix unstable limiter because velocity is caculated from position when…
destogl Sep 12, 2023
40228d9
fix formatting.
destogl Sep 12, 2023
d6b0628
Merge branch 'master' into add-simple-joint-limiter
destogl Nov 1, 2023
5d164b1
Fix unstable limiter because velocity is caculated from position when…
destogl Sep 12, 2023
e99fca2
Make acceleration more stable in limiter.
destogl Sep 14, 2023
96bed7c
Enable dynamic update of limits from parameters.
destogl Nov 1, 2023
47389fd
Fix formatting.
destogl Nov 1, 2023
af5e004
Debug position limiting in the simiple joint limiter.
destogl Nov 16, 2023
4f868b1
Update tests after changes.
destogl Nov 21, 2023
72b1ea7
Merge branch 'master' into add-simple-joint-limiter
destogl Nov 21, 2023
47d073d
Merge branch 'master' into add-simple-joint-limiter
destogl Nov 30, 2023
94da997
Fixup shadowing variable.
destogl Dec 7, 2023
9ed9b01
Merge branch 'master' into add-simple-joint-limiter
destogl Dec 7, 2023
bcf42aa
rename to JointSaturationLimiter
mamueluth Dec 8, 2023
fde4814
rename files as well
mamueluth Dec 11, 2023
15b9255
add effort limits
mamueluth Dec 13, 2023
8e032f4
if move limit efforts to seperate function
mamueluth Dec 14, 2023
5d4e7e4
Merge branch 'master' into add-simple-joint-limiter
destogl Dec 18, 2023
0c75f46
Merge branch 'master' into add-simple-joint-limiter
destogl Dec 18, 2023
9a40a75
add generic enforce method
mamueluth Jan 8, 2024
92d0468
Merge branch 'master' into add-simple-joint-limiter
destogl Jan 13, 2024
18f0ec0
Merge branch 'master' into add-simple-joint-limiter
destogl Jan 17, 2024
7e27edc
Interface cleanup and small optimizations from reviewers' comments.
destogl Jan 18, 2024
bd25f6e
Merge branch 'master' into add-simple-joint-limiter
destogl Jan 18, 2024
56dd00f
Added package to CI
destogl Jan 22, 2024
5c50bd6
Merge branch 'master' into add-simple-joint-limiter
destogl Jan 22, 2024
ed2f374
Merge branch 'master' into add-simple-joint-limiter
destogl Jan 25, 2024
fdc4e05
Merge branch 'master' into add-simple-joint-limiter
destogl Jan 25, 2024
f96f8da
Merge branch 'master' into add-simple-joint-limiter
destogl Feb 8, 2024
284437a
Correct sorting of packages.
destogl Feb 8, 2024
d3838fd
Small fixes of calculation when differnet set of inputs are provided.
destogl Feb 8, 2024
f097085
Merge remote-tracking branch 'origin/master' into add-simple-joint-li…
destogl Jun 11, 2024
271b6ba
Merge branch 'master' into add-simple-joint-limiter
bmagyar Jun 17, 2024
e18fb05
Merge branch 'master' into add-simple-joint-limiter
destogl Jul 3, 2024
33860f9
Update the year in license.
destogl Jul 3, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions controller_interface/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ set(THIS_PACKAGE_INCLUDE_DEPENDS
)

find_package(ament_cmake REQUIRED)
find_package(backward_ros REQUIRED)
destogl marked this conversation as resolved.
Show resolved Hide resolved
foreach(Dependency IN ITEMS ${THIS_PACKAGE_INCLUDE_DEPENDS})
find_package(${Dependency} REQUIRED)
endforeach()
Expand Down
1 change: 1 addition & 0 deletions controller_interface/package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

<buildtool_depend>ament_cmake</buildtool_depend>

<build_depend>backward_ros</build_depend>
destogl marked this conversation as resolved.
Show resolved Hide resolved
<build_depend>hardware_interface</build_depend>
<build_depend>rclcpp_lifecycle</build_depend>
<build_depend>sensor_msgs</build_depend>
Expand Down
1 change: 1 addition & 0 deletions hardware_interface/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ set(THIS_PACKAGE_INCLUDE_DEPENDS
)

find_package(ament_cmake REQUIRED)
find_package(backward_ros REQUIRED)
destogl marked this conversation as resolved.
Show resolved Hide resolved
foreach(Dependency IN ITEMS ${THIS_PACKAGE_INCLUDE_DEPENDS})
find_package(${Dependency} REQUIRED)
endforeach()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
#ifndef HARDWARE_INTERFACE__TYPES__HARDWARE_INTERFACE_TYPE_VALUES_HPP_
#define HARDWARE_INTERFACE__TYPES__HARDWARE_INTERFACE_TYPE_VALUES_HPP_

#include <vector>

namespace hardware_interface
{
/// Constant defining position interface
destogl marked this conversation as resolved.
Show resolved Hide resolved
Expand All @@ -25,6 +27,11 @@ constexpr char HW_IF_VELOCITY[] = "velocity";
constexpr char HW_IF_ACCELERATION[] = "acceleration";
/// Constant defining effort interface
constexpr char HW_IF_EFFORT[] = "effort";

destogl marked this conversation as resolved.
Show resolved Hide resolved
// TODO(destogl): use "inline static const"-type when switched to C++17
/// Definition of standard names for movement interfaces
const std::vector<const char *> MOVEMENT_INTERFACES = {
HW_IF_POSITION, HW_IF_VELOCITY, HW_IF_ACCELERATION, HW_IF_EFFORT};
} // namespace hardware_interface

#endif // HARDWARE_INTERFACE__TYPES__HARDWARE_INTERFACE_TYPE_VALUES_HPP_
1 change: 1 addition & 0 deletions hardware_interface/package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

<buildtool_depend>ament_cmake</buildtool_depend>

<depend>backward_ros</depend>
destogl marked this conversation as resolved.
Show resolved Hide resolved
<depend>control_msgs</depend>
<depend>lifecycle_msgs</depend>
<depend>pluginlib</depend>
Expand Down
48 changes: 47 additions & 1 deletion joint_limits/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,14 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)")
endif()

set(THIS_PACKAGE_INCLUDE_DEPENDS
pluginlib
rclcpp
rclcpp_lifecycle
trajectory_msgs
)

find_package(ament_cmake REQUIRED)
find_package(backward_ros REQUIRED)
foreach(Dependency IN ITEMS ${THIS_PACKAGE_INCLUDE_DEPENDS})
find_package(${Dependency} REQUIRED)
endforeach()
Expand All @@ -23,10 +26,41 @@ target_include_directories(joint_limits INTERFACE
)
ament_target_dependencies(joint_limits INTERFACE ${THIS_PACKAGE_INCLUDE_DEPENDS})

add_library(joint_limiter_interface SHARED
src/joint_limiter_interface.cpp
)
target_compile_features(joint_limiter_interface PUBLIC cxx_std_17)
target_include_directories(joint_limiter_interface PUBLIC
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include/joint_limits>
)
ament_target_dependencies(joint_limiter_interface PUBLIC ${THIS_PACKAGE_INCLUDE_DEPENDS})
# Causes the visibility macros to use dllexport rather than dllimport,
# which is appropriate when building the dll but not consuming it.
target_compile_definitions(joint_limiter_interface PRIVATE "JOINT_LIMITS_BUILDING_DLL")


add_library(simple_joint_limiter SHARED
src/simple_joint_limiter.cpp
)
target_compile_features(simple_joint_limiter PUBLIC cxx_std_17)
target_include_directories(simple_joint_limiter PUBLIC
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include/joint_limits>
)
ament_target_dependencies(simple_joint_limiter PUBLIC ${THIS_PACKAGE_INCLUDE_DEPENDS})
# Causes the visibility macros to use dllexport rather than dllimport,
# which is appropriate when building the dll but not consuming it.
target_compile_definitions(simple_joint_limiter PRIVATE "JOINT_LIMITS_BUILDING_DLL")

pluginlib_export_plugin_description_file(joint_limits joint_limiters.xml)

if(BUILD_TESTING)
find_package(ament_cmake_gtest REQUIRED)
find_package(ament_cmake_gmock REQUIRED)
find_package(launch_testing_ament_cmake REQUIRED)
find_package(pluginlib REQUIRED)
find_package(rclcpp REQUIRED)

ament_add_gtest_executable(joint_limits_rosparam_test test/joint_limits_rosparam_test.cpp)
target_link_libraries(joint_limits_rosparam_test joint_limits)
Expand All @@ -40,13 +74,25 @@ if(BUILD_TESTING)
FILES test/joint_limits_rosparam.yaml
DESTINATION share/joint_limits/test
)

ament_add_gmock(test_simple_joint_limiter test/test_simple_joint_limiter.cpp)
target_include_directories(test_simple_joint_limiter PRIVATE include)
target_link_libraries(test_simple_joint_limiter joint_limiter_interface)
ament_target_dependencies(
test_simple_joint_limiter
pluginlib
rclcpp
destogl marked this conversation as resolved.
Show resolved Hide resolved
)
endif()

install(
DIRECTORY include/
DESTINATION include/joint_limits
)
install(TARGETS joint_limits
install(TARGETS
joint_limits
joint_limiter_interface
simple_joint_limiter
EXPORT export_joint_limits
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
Expand Down
94 changes: 94 additions & 0 deletions joint_limits/include/joint_limits/joint_limiter_interface.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
// Copyright (c) 2021, Stogl Robotics Consulting UG (haftungsbeschränkt)
destogl marked this conversation as resolved.
Show resolved Hide resolved
//
// 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
//
// 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.

/// \author Denis Stogl

#ifndef JOINT_LIMITS__JOINT_LIMITER_INTERFACE_HPP_
#define JOINT_LIMITS__JOINT_LIMITER_INTERFACE_HPP_

#include <string>
#include <vector>

#include "joint_limits/joint_limits.hpp"
#include "joint_limits/visibility_control.h"
#include "rclcpp/node.hpp"
#include "trajectory_msgs/msg/joint_trajectory_point.hpp"

namespace joint_limits
{
template <typename LimitsType>
class JointLimiterInterface
{
public:
JOINT_LIMITS_PUBLIC JointLimiterInterface() = default;

JOINT_LIMITS_PUBLIC virtual ~JointLimiterInterface() = default;

/// Initialization of every JointLimiter.
/**
* Initialization of JointLimiter for defined joints with their names.
* Robot description topic provides a topic name where URDF of the robot can be found.
* This is needed to use joint limits from URDF (not implemented yet!).
* Override this method only if Initialization and reading joint limits should be adapted.
destogl marked this conversation as resolved.
Show resolved Hide resolved
* Otherwise, initialize your custom limiter in `on_limit` method.
*
* \param[in] joint_names names of joints where limits should be applied.
* \param[in] node shared pointer to the node where joint limit parameters defined.
* \param[in] robot_description_topic string of a topic where robot description is accessible.
*
*/
JOINT_LIMITS_PUBLIC virtual bool init(
const std::vector<std::string> joint_names, const rclcpp::Node::SharedPtr & node,
destogl marked this conversation as resolved.
Show resolved Hide resolved
const std::string & robot_description_topic = "/robot_description");

JOINT_LIMITS_PUBLIC virtual bool configure(
const trajectory_msgs::msg::JointTrajectoryPoint & current_joint_states)
{
// TODO(destogl): add checks for position
return on_configure(current_joint_states);
}

JOINT_LIMITS_PUBLIC virtual bool enforce(
trajectory_msgs::msg::JointTrajectoryPoint & current_joint_states,
destogl marked this conversation as resolved.
Show resolved Hide resolved
trajectory_msgs::msg::JointTrajectoryPoint & desired_joint_states, const rclcpp::Duration & dt)
destogl marked this conversation as resolved.
Show resolved Hide resolved
{
// TODO(destogl): add checks if sizes of vectors and number of limits correspond.
return on_enforce(current_joint_states, desired_joint_states, dt);
}

// TODO(destogl): Make those protected?
destogl marked this conversation as resolved.
Show resolved Hide resolved
// Methods that each limiter implementation has to implement
destogl marked this conversation as resolved.
Show resolved Hide resolved
JOINT_LIMITS_PUBLIC virtual bool on_init() { return true; }

JOINT_LIMITS_PUBLIC virtual bool on_configure(
const trajectory_msgs::msg::JointTrajectoryPoint & /*current_joint_states*/)
{
return true;
}
destogl marked this conversation as resolved.
Show resolved Hide resolved

JOINT_LIMITS_PUBLIC virtual bool on_enforce(
trajectory_msgs::msg::JointTrajectoryPoint & current_joint_states,
destogl marked this conversation as resolved.
Show resolved Hide resolved
trajectory_msgs::msg::JointTrajectoryPoint & desired_joint_states,
const rclcpp::Duration & dt) = 0;
destogl marked this conversation as resolved.
Show resolved Hide resolved

protected:
destogl marked this conversation as resolved.
Show resolved Hide resolved
size_t number_of_joints_;
std::vector<std::string> joint_names_;
std::vector<LimitsType> joint_limits_;
rclcpp::Node::SharedPtr node_;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't see initialization and/or use of node_. Is it needed?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

indeed not needed --> removed, thanks!

};

} // namespace joint_limits

#endif // JOINT_LIMITS__JOINT_LIMITER_INTERFACE_HPP_
41 changes: 41 additions & 0 deletions joint_limits/include/joint_limits/simple_joint_limiter.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// Copyright (c) 2021, PickNik Inc.
destogl marked this conversation as resolved.
Show resolved Hide resolved
//
// 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
//
// 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.

/// \author Denis Stogl
destogl marked this conversation as resolved.
Show resolved Hide resolved

#ifndef JOINT_LIMITS__SIMPLE_JOINT_LIMITER_HPP_
#define JOINT_LIMITS__SIMPLE_JOINT_LIMITER_HPP_

#include <string>

#include "joint_limits/joint_limiter_interface.hpp"
#include "joint_limits/joint_limits.hpp"

namespace joint_limits
{
template <typename LimitsType>
class SimpleJointLimiter : public JointLimiterInterface<JointLimits>
{
public:
JOINT_LIMITS_PUBLIC SimpleJointLimiter();

JOINT_LIMITS_PUBLIC bool on_enforce(
trajectory_msgs::msg::JointTrajectoryPoint & current_joint_states,
destogl marked this conversation as resolved.
Show resolved Hide resolved
destogl marked this conversation as resolved.
Show resolved Hide resolved
trajectory_msgs::msg::JointTrajectoryPoint & desired_joint_states,
const rclcpp::Duration & dt) override;
};

} // namespace joint_limits

#endif // JOINT_LIMITS__SIMPLE_JOINT_LIMITER_HPP_
49 changes: 49 additions & 0 deletions joint_limits/include/joint_limits/visibility_control.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// Copyright (c) 2021, Stogl Robotics Consulting UG (haftungsbeschränkt)
destogl marked this conversation as resolved.
Show resolved Hide resolved
//
// 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
//
// 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 JOINT_LIMITS__VISIBILITY_CONTROL_H_
#define JOINT_LIMITS__VISIBILITY_CONTROL_H_

// This logic was borrowed (then namespaced) from the examples on the gcc wiki:
// https://gcc.gnu.org/wiki/Visibility

#if defined _WIN32 || defined __CYGWIN__
#ifdef __GNUC__
#define JOINT_LIMITS_EXPORT __attribute__((dllexport))
#define JOINT_LIMITS_IMPORT __attribute__((dllimport))
#else
#define JOINT_LIMITS_EXPORT __declspec(dllexport)
#define JOINT_LIMITS_IMPORT __declspec(dllimport)
#endif
#ifdef JOINT_LIMITS_BUILDING_DLL
#define JOINT_LIMITS_PUBLIC JOINT_LIMITS_EXPORT
#else
#define JOINT_LIMITS_PUBLIC JOINT_LIMITS_IMPORT
#endif
#define JOINT_LIMITS_PUBLIC_TYPE JOINT_LIMITS_PUBLIC
#define JOINT_LIMITS_LOCAL
#else
#define JOINT_LIMITS_EXPORT __attribute__((visibility("default")))
#define JOINT_LIMITS_IMPORT
#if __GNUC__ >= 4
#define JOINT_LIMITS_PUBLIC __attribute__((visibility("default")))
#define JOINT_LIMITS_LOCAL __attribute__((visibility("hidden")))
#else
#define JOINT_LIMITS_PUBLIC
#define JOINT_LIMITS_LOCAL
#endif
#define JOINT_LIMITS_PUBLIC_TYPE
#endif

#endif // JOINT_LIMITS__VISIBILITY_CONTROL_H_
9 changes: 9 additions & 0 deletions joint_limits/joint_limiters.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<library path="simple_joint_limiter">
<class name="joint_limits/SimpleJointLimiter"
type="joint_limits::SimpleJointLimiter&lt;joint_limits::JointLimits&gt;"
base_class_type="joint_limits::JointLimiterInterface&lt;joint_limits::JointLimits&gt;">
<description>
Simple joint limiter using clamping approach.
destogl marked this conversation as resolved.
Show resolved Hide resolved
</description>
</class>
</library>
10 changes: 7 additions & 3 deletions joint_limits/package.xml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<package format="3">
<name>joint_limits</name>
<version>3.9.1</version>
<description>Interfaces for handling of joint limits for controllers or hardware.</description>
<description>Package for with interfaces for handling of joint limits for use in controllers or in hardware. The package also implements a simple, default joint limit strategy by clamping the values.</description>
destogl marked this conversation as resolved.
Show resolved Hide resolved

<maintainer email="[email protected]">Bence Magyar</maintainer>
<maintainer email="denis@stogl.de">Denis Štogl</maintainer>
<maintainer email="denis.stogl@stoglrobotics.de">Denis Štogl</maintainer>

<license>Apache License 2.0</license>

Expand All @@ -14,11 +14,15 @@

<buildtool_depend>ament_cmake</buildtool_depend>

<depend>backward_ros</depend>
<depend>pluginlib</depend>
<depend>rclcpp</depend>
<depend>rclcpp_lifecycle</depend>
<depend>trajectory_msgs</depend>

<test_depend>launch_testing_ament_cmake</test_depend>
<test_depend>ament_cmake_gmock</test_depend>
<test_depend>ament_cmake_gtest</test_depend>
<test_depend>launch_testing_ament_cmake</test_depend>

<export>
<build_type>ament_cmake</build_type>
Expand Down
Loading