Skip to content

Commit ffe3fac

Browse files
committed
added a twist controller
1 parent dae64a8 commit ffe3fac

File tree

9 files changed

+359
-25
lines changed

9 files changed

+359
-25
lines changed

lbr_bringup/lbr_bringup/ros2_control.py

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ def arg_ctrl() -> DeclareLaunchArgument:
3535
"lbr_joint_position_command_controller",
3636
"lbr_torque_command_controller",
3737
"lbr_wrench_command_controller",
38+
"twist_controller",
3839
],
3940
)
4041

lbr_fri_ros2/include/lbr_fri_ros2/ft_estimator.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class FTEstimator {
4444
cart_array_t f_ext_th_;
4545

4646
// kinematics
47-
std::unique_ptr<Kinematics> kinematics_;
47+
std::unique_ptr<Kinematics> kinematics_ptr_;
4848

4949
// force estimation
5050
Eigen::Matrix<double, KUKA::FRI::LBRState::NUMBER_OF_JOINTS, Kinematics::CARTESIAN_DOF>

lbr_fri_ros2/src/ft_estimator.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ namespace lbr_fri_ros2 {
44
FTEstimator::FTEstimator(const std::string &robot_description, const std::string &chain_root,
55
const std::string &chain_tip, const_cart_array_t_ref f_ext_th)
66
: f_ext_th_(f_ext_th) {
7-
kinematics_ = std::make_unique<Kinematics>(robot_description, chain_root, chain_tip);
7+
kinematics_ptr_ = std::make_unique<Kinematics>(robot_description, chain_root, chain_tip);
88
reset();
99
}
1010

@@ -13,12 +13,12 @@ void FTEstimator::compute(const_jnt_pos_array_t_ref measured_joint_position,
1313
const double &damping) {
1414
tau_ext_ = Eigen::Map<const Eigen::Matrix<double, KUKA::FRI::LBRState::NUMBER_OF_JOINTS, 1>>(
1515
external_torque.data());
16-
auto jacobian = kinematics_->compute_jacobian(measured_joint_position);
16+
auto jacobian = kinematics_ptr_->compute_jacobian(measured_joint_position);
1717
jacobian_inv_ = pinv(jacobian.data, damping);
1818
f_ext_ = jacobian_inv_.transpose() * tau_ext_;
1919

2020
// rotate into chain tip frame
21-
auto chain_tip_frame = kinematics_->compute_fk(measured_joint_position);
21+
auto chain_tip_frame = kinematics_ptr_->compute_fk(measured_joint_position);
2222
f_ext_.topRows(3) = Eigen::Matrix3d::Map(chain_tip_frame.M.data) * f_ext_.topRows(3);
2323
f_ext_.bottomRows(3) = Eigen::Matrix3d::Map(chain_tip_frame.M.data) * f_ext_.bottomRows(3);
2424

lbr_ros2_control/CMakeLists.txt

+14-11
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ endif()
1616

1717
find_package(ament_cmake REQUIRED)
1818
find_package(controller_interface REQUIRED)
19+
find_package(eigen3_cmake_module REQUIRED)
20+
find_package(Eigen3)
1921
find_package(FRIClient REQUIRED)
2022
find_package(hardware_interface REQUIRED)
23+
find_package(kinematics_interface REQUIRED)
2124
find_package(lbr_fri_idl REQUIRED)
2225
find_package(lbr_fri_ros2 REQUIRED)
23-
find_package(kinematics_interface REQUIRED)
2426
find_package(pluginlib REQUIRED)
2527
find_package(rclcpp REQUIRED)
2628
find_package(realtime_tools REQUIRED)
@@ -33,6 +35,7 @@ add_library(
3335
src/controllers/lbr_torque_command_controller.cpp
3436
src/controllers/lbr_wrench_command_controller.cpp
3537
src/controllers/lbr_state_broadcaster.cpp
38+
src/controllers/twist_controller.cpp
3639
src/system_interface.cpp
3740
)
3841

@@ -47,16 +50,21 @@ target_include_directories(
4750
)
4851

4952
# Link against dependencies
50-
ament_target_dependencies(
51-
${PROJECT_NAME}
53+
set(AMENT_DEPENDENCIES
5254
controller_interface
55+
Eigen3
5356
hardware_interface
57+
kinematics_interface
5458
lbr_fri_idl
5559
lbr_fri_ros2
5660
pluginlib
5761
rclcpp
5862
realtime_tools
5963
)
64+
ament_target_dependencies(
65+
${PROJECT_NAME}
66+
${AMENT_DEPENDENCIES}
67+
)
6068

6169
target_link_libraries(${PROJECT_NAME}
6270
FRIClient::FRIClient
@@ -71,16 +79,11 @@ ament_export_targets(
7179
)
7280

7381
ament_export_dependencies(
74-
controller_interface
7582
FRIClient
76-
hardware_interface
77-
lbr_fri_idl
78-
lbr_fri_ros2
79-
pluginlib
80-
rclcpp
81-
realtime_tools
83+
${AMENT_DEPENDENCIES}
84+
eigen3_cmake_module
8285
)
83-
86+
8487
install(
8588
DIRECTORY include/
8689
DESTINATION include

lbr_ros2_control/config/lbr_controllers.yaml

+14-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
type: position_controllers/JointGroupPositionController
2424

2525
# LBR ROS 2 control controllers
26+
admittance_controller:
27+
type: lbr_ros2_control/AdmittanceController
28+
2629
lbr_joint_position_command_controller:
2730
type: lbr_ros2_control/LBRJointPositionCommandController
2831

@@ -32,8 +35,8 @@
3235
lbr_wrench_command_controller:
3336
type: lbr_ros2_control/LBRWrenchCommandController
3437

35-
admittance_controller:
36-
type: lbr_ros2_control/AdmittanceController
38+
twist_controller:
39+
type: lbr_ros2_control/TwistController
3740

3841
# ROS 2 control broadcasters
3942
/**/force_torque_broadcaster:
@@ -89,3 +92,12 @@
8992
/**/lbr_wrench_command_controller:
9093
ros__parameters:
9194
robot_name: lbr
95+
96+
/**/twist_controller:
97+
ros__parameters:
98+
robot_name: lbr
99+
chain_root: lbr_link_0
100+
chain_tip: lbr_link_ee
101+
damping: 0.2 # damping factor for the pseudo-inverse of the Jacobian
102+
max_linear_velocity: 0.1 # maximum linear velocity
103+
max_angular_velocity: 0.1 # maximum linear acceleration
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#ifndef LBR_ROS2_CONTROL__LBR_TWIST_CONTROLLER_HPP_
2+
#define LBR_ROS2_CONTROL__LBR_TWIST_CONTROLLER_HPP_
3+
4+
#include <algorithm>
5+
#include <array>
6+
#include <functional>
7+
#include <memory>
8+
#include <stdexcept>
9+
#include <string>
10+
#include <vector>
11+
12+
#include "controller_interface/controller_interface.hpp"
13+
#include "eigen3/Eigen/Core"
14+
#include "geometry_msgs/msg/twist.hpp"
15+
#include "hardware_interface/loaned_state_interface.hpp"
16+
#include "hardware_interface/types/hardware_interface_type_values.hpp"
17+
#include "rclcpp/rclcpp.hpp"
18+
#include "realtime_tools/realtime_buffer.h"
19+
20+
#include "friLBRState.h"
21+
22+
#include "lbr_fri_ros2/kinematics.hpp"
23+
#include "lbr_fri_ros2/pinv.hpp"
24+
#include "lbr_ros2_control/system_interface_type_values.hpp"
25+
26+
namespace lbr_ros2_control {
27+
struct TwistParameters {
28+
std::string chain_root;
29+
std::string chain_tip;
30+
double damping;
31+
double max_linear_velocity;
32+
double max_angular_velocity;
33+
};
34+
35+
class TwistImpl {
36+
public:
37+
TwistImpl(const std::string &robot_description, const TwistParameters &parameters);
38+
39+
void compute(const geometry_msgs::msg::Twist::SharedPtr &twist_target,
40+
lbr_fri_ros2::Kinematics::const_jnt_pos_array_t_ref q,
41+
lbr_fri_ros2::Kinematics::jnt_pos_array_t &dq);
42+
43+
protected:
44+
TwistParameters parameters_;
45+
46+
lbr_fri_ros2::Kinematics::jnt_pos_array_t q_;
47+
std::unique_ptr<lbr_fri_ros2::Kinematics> kinematics_ptr_;
48+
Eigen::Matrix<double, KUKA::FRI::LBRState::NUMBER_OF_JOINTS,
49+
lbr_fri_ros2::Kinematics::CARTESIAN_DOF>
50+
jacobian_inv_;
51+
Eigen::Matrix<double, lbr_fri_ros2::Kinematics::CARTESIAN_DOF, 1> twist_target_;
52+
};
53+
54+
class TwistController : public controller_interface::ControllerInterface {
55+
public:
56+
TwistController();
57+
58+
controller_interface::InterfaceConfiguration command_interface_configuration() const override;
59+
60+
controller_interface::InterfaceConfiguration state_interface_configuration() const override;
61+
62+
controller_interface::CallbackReturn on_init() override;
63+
64+
controller_interface::return_type update(const rclcpp::Time &time,
65+
const rclcpp::Duration &period) override;
66+
67+
controller_interface::CallbackReturn
68+
on_configure(const rclcpp_lifecycle::State &previous_state) override;
69+
70+
controller_interface::CallbackReturn
71+
on_activate(const rclcpp_lifecycle::State &previous_state) override;
72+
73+
controller_interface::CallbackReturn
74+
on_deactivate(const rclcpp_lifecycle::State &previous_state) override;
75+
76+
protected:
77+
bool reference_state_interfaces_();
78+
void clear_state_interfaces_();
79+
void reset_command_buffer_();
80+
void configure_joint_names_();
81+
void configure_twist_impl_();
82+
83+
// joint veloctiy computation
84+
std::unique_ptr<TwistImpl> twist_impl_ptr_;
85+
lbr_fri_ros2::Kinematics::jnt_pos_array_t q_, dq_;
86+
87+
// interfaces
88+
std::array<std::string, KUKA::FRI::LBRState::NUMBER_OF_JOINTS> joint_names_;
89+
std::vector<std::reference_wrapper<hardware_interface::LoanedStateInterface>>
90+
joint_position_state_interfaces_;
91+
std::unique_ptr<std::reference_wrapper<hardware_interface::LoanedStateInterface>>
92+
sample_time_state_interface_;
93+
std::unique_ptr<std::reference_wrapper<hardware_interface::LoanedStateInterface>>
94+
session_state_interface_;
95+
96+
// real-time twist command topic
97+
realtime_tools::RealtimeBuffer<geometry_msgs::msg::Twist::SharedPtr> rt_twist_ptr_;
98+
rclcpp::Subscription<geometry_msgs::msg::Twist>::SharedPtr twist_subscription_ptr_;
99+
};
100+
} // namespace lbr_ros2_control
101+
#endif // LBR_ROS2_CONTROL__LBR_TWIST_CONTROLLER_HPP_

lbr_ros2_control/package.xml

+8-1
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,25 @@
88
<license>Apache-2.0</license>
99

1010
<buildtool_depend>ament_cmake</buildtool_depend>
11+
<buildtool_depend>eigen3_cmake_module</buildtool_depend>
12+
13+
<build_depend>eigen</build_depend>
1114

1215
<depend>fri_client_sdk</depend>
16+
<depend>geometry_msgs</depend>
1317
<depend>lbr_fri_idl</depend>
1418
<depend>lbr_fri_ros2</depend>
1519
<depend>pluginlib</depend>
1620
<depend>rclcpp</depend>
1721
<depend>realtime_tools</depend>
1822
<depend>ros2_control</depend>
19-
23+
2024
<exec_depend>lbr_description</exec_depend>
2125
<exec_depend>ros2_controllers</exec_depend>
2226

27+
<buildtool_export_depend>eigen3_cmake_module</buildtool_export_depend>
28+
<build_export_depend>eigen</build_export_depend>
29+
2330
<export>
2431
<build_type>ament_cmake</build_type>
2532
</export>

lbr_ros2_control/plugin_description_files/controllers.xml

+14-7
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
<?xml version="1.0"?>
22
<library path="lbr_ros2_control">
3-
<!-- LBR state broadcaster plugin -->
4-
<class name="lbr_ros2_control/LBRStateBroadcaster" type="lbr_ros2_control::LBRStateBroadcaster"
3+
<!-- Admittance controller plugin -->
4+
<class name="lbr_ros2_control/AdmittanceController"
5+
type="lbr_ros2_control::AdmittanceController"
56
base_class_type="controller_interface::ControllerInterface">
6-
<description>Broadcaster for LBRState messages, see lbr_fri_idl/msg/LBRState.msg.</description>
7+
<description>A simple admittance controller.</description>
78
</class>
89

910
<!-- LBR forward position command controller plugin -->
@@ -14,6 +15,12 @@
1415
lbr_fri_idl/msg/LBRJointPositionCommand.msg.</description>
1516
</class>
1617

18+
<!-- LBR state broadcaster plugin -->
19+
<class name="lbr_ros2_control/LBRStateBroadcaster" type="lbr_ros2_control::LBRStateBroadcaster"
20+
base_class_type="controller_interface::ControllerInterface">
21+
<description>Broadcaster for LBRState messages, see lbr_fri_idl/msg/LBRState.msg.</description>
22+
</class>
23+
1724
<!-- LBR forward torque command controller plugin -->
1825
<class name="lbr_ros2_control/LBRTorqueCommandController"
1926
type="lbr_ros2_control::LBRTorqueCommandController"
@@ -30,10 +37,10 @@
3037
lbr_fri_idl/msg/LBRWrenchCommand.msg.</description>
3138
</class>
3239

33-
<!-- Admittance controller plugin -->
34-
<class name="lbr_ros2_control/AdmittanceController"
35-
type="lbr_ros2_control::AdmittanceController"
40+
<!-- Twist controller plugin -->
41+
<class name="lbr_ros2_control/TwistController"
42+
type="lbr_ros2_control::TwistController"
3643
base_class_type="controller_interface::ControllerInterface">
37-
<description>A simple admittance controller.</description>
44+
<description>A simple twist controller.</description>
3845
</class>
3946
</library>

0 commit comments

Comments
 (0)