Skip to content

Commit 7c8121a

Browse files
authored
Merge pull request #170 from lbr-stack/dev-humble-cart-vel-demo
Additional demos
2 parents 036b23b + 60bc813 commit 7c8121a

27 files changed

+834
-260
lines changed

README.md

+9-5
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,14 @@ If you enjoyed using this repository for your work, we would really appreciate
8080
```
8181

8282
## Acknowledgements
83-
<img src="https://medicalengineering.org.uk/wp-content/themes/aalto-child/_assets/images/medicalengineering-logo.svg" alt="wellcome" height="45" width="65" align="left">
83+
We would like to acknowledge all open source contributors 🚀!
8484

85-
This work was supported by core and project funding from the Wellcome/EPSRC [WT203148/Z/16/Z; NS/A000049/1; WT101957; NS/A000027/1].
85+
We would further like to acknowledge following supporters:
8686

87-
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Flag_of_Europe.svg/1920px-Flag_of_Europe.svg.png" alt="eu_flag" height="45" width="65" align="left" >
88-
89-
This project has received funding from the European Union's Horizon 2020 research and innovation programme under grant agreement No 101016985 (FAROS project).
87+
| Logo | Notes |
88+
|:--:|:---|
89+
| <img src="https://medicalengineering.org.uk/wp-content/themes/aalto-child/_assets/images/medicalengineering-logo.svg" alt="wellcome" width="200" align="left"> | This work was supported by core and project funding from the Wellcome/EPSRC [WT203148/Z/16/Z; NS/A000049/1; WT101957; NS/A000027/1]. |
90+
| <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Flag_of_Europe.svg/1920px-Flag_of_Europe.svg.png" alt="eu_flag" width="200" align="left"> | This project has received funding from the European Union's Horizon 2020 research and innovation programme under grant agreement No 101016985 (FAROS project). |
91+
| <img src="https://rvim.online/author/avatar_hu8970a6942005977dc117387facf47a75_62303_270x270_fill_lanczos_center_2.png" alt="RViMLab" width="200" align="left"> | Built at [RViMLab](https://rvim.online/). |
92+
| <img src="https://avatars.githubusercontent.com/u/75276868?s=200&v=4" alt="King's College London" width="200" align="left"> | Built at [CAI4CAI](https://cai4cai.ml/). |
93+
| <img src="https://upload.wikimedia.org/wikipedia/commons/1/14/King%27s_College_London_logo.svg" alt="King's College London" width="200" align="left"> | Built at [King's College London](https://www.kcl.ac.uk/). |

lbr_demos/lbr_demos_fri_ros2_advanced_cpp/CMakeLists.txt

+59-8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ endif()
1313
find_package(ament_cmake REQUIRED)
1414
find_package(fri_vendor REQUIRED)
1515
find_package(FRIClient REQUIRED)
16+
find_package(geometry_msgs REQUIRED)
1617
find_package(kdl_parser REQUIRED)
1718
find_package(lbr_fri_ros2 REQUIRED)
1819
find_package(lbr_fri_msgs REQUIRED)
@@ -30,8 +31,7 @@ target_include_directories(admittance_control_component
3031
PRIVATE src
3132
)
3233

33-
ament_target_dependencies(
34-
admittance_control_component
34+
ament_target_dependencies(admittance_control_component
3535
kdl_parser
3636
lbr_fri_ros2
3737
lbr_fri_msgs
@@ -45,19 +45,70 @@ target_link_libraries(admittance_control_component
4545
)
4646

4747
rclcpp_components_register_node(admittance_control_component
48-
PLUGIN lbr_fri_ros2::AdmittanceControlNode
49-
EXECUTABLE admittance_control_node
48+
PLUGIN lbr_demos::AdmittanceControlNode
49+
EXECUTABLE admittance_control
5050
)
5151

52+
# pose planning node
53+
add_library(pose_planning_component
54+
SHARED
55+
src/pose_planning_node.cpp
56+
)
57+
58+
target_include_directories(pose_planning_component
59+
PRIVATE src
60+
)
61+
62+
ament_target_dependencies(pose_planning_component
63+
geometry_msgs
64+
rclcpp
65+
rclcpp_components
66+
)
67+
68+
rclcpp_components_register_node(pose_planning_component
69+
PLUGIN lbr_demos::PosePlanningNode
70+
EXECUTABLE pose_planning
71+
)
72+
73+
# pose contol node
74+
add_library(pose_control_component
75+
SHARED
76+
src/pose_control_node.cpp
77+
)
78+
79+
target_include_directories(pose_control_component
80+
PRIVATE src
81+
)
82+
83+
ament_target_dependencies(pose_control_component
84+
fri_vendor
85+
geometry_msgs
86+
kdl_parser
87+
lbr_fri_msgs
88+
orocos_kdl_vendor
89+
rclcpp
90+
rclcpp_components
91+
)
92+
93+
target_link_libraries(pose_control_component
94+
FRIClient::FRIClient
95+
)
96+
97+
rclcpp_components_register_node(pose_control_component
98+
PLUGIN lbr_demos::PoseControlNode
99+
EXECUTABLE pose_control
100+
)
101+
102+
# install
52103
install(
53-
TARGETS admittance_control_component
104+
TARGETS admittance_control_component pose_planning_component pose_control_component
54105
LIBRARY DESTINATION lib
55-
RUNTIME DESTINATION lib/lbr_demos_fri_ros2_advanced_cpp
106+
RUNTIME DESTINATION lib/${PROJECT_NAME}
56107
)
57108

58109
install(
59-
DIRECTORY config launch
60-
DESTINATION share/lbr_demos_fri_ros2_advanced_cpp
110+
DIRECTORY config
111+
DESTINATION share/${PROJECT_NAME}
61112
)
62113

63114
ament_package()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
admittance_control:
2+
ros__parameters:
3+
base_link: "link_0"
4+
end_effector_link: "link_ee"
5+
f_ext_th: [2., 2., 2., 0.5, 0.5, 0.5]
6+
dq_gains: [20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0]
7+
dx_gains: [0.1, 0.1, 0.1, 0.1, 0.1, 0.1]
8+
exp_smooth: 0.95

lbr_demos/lbr_demos_fri_ros2_advanced_cpp/config/admittance_control_node.yaml

-7
This file was deleted.

lbr_demos/lbr_demos_fri_ros2_advanced_cpp/doc/lbr_demos_fri_ros2_advanced_cpp.rst

+45-2
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,53 @@ Admittance Controller
1414

1515
.. thumbnail:: ../../doc/img/applications_lbr_server.png
1616

17-
#. Launch the `admittance_control_node <https://github.com/lbr-stack/lbr_fri_ros2_stack/blob/humble/lbr_demos/lbr_demos_fri_ros2_advanced_cpp/src/admittance_control_node.cpp>`_:
17+
#. Launch the robot driver:
1818

1919
.. code-block:: bash
2020
21-
ros2 launch lbr_demos_fri_ros2_advanced_cpp admittance_control_node.launch.py model:=iiwa7 # [iiwa7, iiwa14, med7, med14]
21+
ros2 launch lbr_bringup bringup.launch.py \
22+
sim:=false \
23+
ctrl:=forward_lbr_position_command_controller \
24+
model:=iiwa7 # [iiwa7, iiwa14, med7, med14]
25+
26+
#. Launch the `admittance_control <https://github.com/lbr-stack/lbr_fri_ros2_stack/blob/humble/lbr_demos/lbr_demos_fri_ros2_advanced_cpp/src/admittance_control_node.cpp>`_:
27+
28+
.. code-block:: bash
29+
30+
ros2 run lbr_demos_fri_ros2_advanced_cpp admittance_control --ros-args \
31+
-r __ns:=/lbr \
32+
--params-file `ros2 pkg prefix lbr_demos_fri_ros2_advanced_cpp`/share/lbr_demos_fri_ros2_advanced_cpp/config/admittance_control.yaml
2233
2334
#. Now gently move the robot at the end-effector.
35+
36+
Pose Controller
37+
---------------
38+
This demo uses ``KDL`` to calculate forward kinematics and inverse
39+
kinematics to move the robot's end-effector along the z-axis in Cartesian space.
40+
41+
#. .. dropdown:: Launch the ``LBRServer`` application on the ``KUKA smartPAD``
42+
43+
.. thumbnail:: ../../doc/img/applications_lbr_server.png
44+
45+
#. Launch the robot driver:
46+
47+
.. code-block:: bash
48+
49+
ros2 launch lbr_bringup bringup.launch.py \
50+
sim:=false \
51+
ctrl:=forward_lbr_position_command_controller \
52+
model:=iiwa7 # [iiwa7, iiwa14, med7, med14]
53+
54+
#. Launch the pose control
55+
56+
.. code-block:: bash
57+
58+
ros2 run lbr_demos_fri_ros2_advanced_cpp pose_control --ros-args \
59+
-r __ns:=/lbr
60+
61+
#. Launch the path planning
62+
63+
.. code-block:: bash
64+
65+
ros2 run lbr_demos_fri_ros2_advanced_cpp pose_planning --ros-args \
66+
-r __ns:=/lbr

lbr_demos/lbr_demos_fri_ros2_advanced_cpp/launch/admittance_control_node.launch.py

-47
This file was deleted.

lbr_demos/lbr_demos_fri_ros2_advanced_cpp/package.xml

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
<exec_depend>lbr_description</exec_depend>
1313

1414
<depend>fri_vendor</depend>
15+
<depend>geometry_msgs</depend>
1516
<depend>kdl_parser</depend>
1617
<depend>lbr_fri_ros2</depend>
1718
<depend>lbr_fri_msgs</depend>
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,72 @@
1-
#include <algorithm>
21
#include <vector>
32

43
#include "rclcpp/rclcpp.hpp"
54

6-
#include "lbr_fri_msgs/msg/lbr_position_command.hpp"
75
#include "lbr_fri_msgs/msg/lbr_state.hpp"
8-
#include "lbr_fri_ros2/app.hpp"
96

107
#include "admittance_controller.hpp"
8+
#include "lbr_base_position_command_node.hpp"
119

12-
namespace lbr_fri_ros2 {
13-
class AdmittanceControlNode : public rclcpp::Node {
10+
namespace lbr_demos {
11+
class AdmittanceControlNode : public LBRBasePositionCommandNode {
1412
public:
1513
AdmittanceControlNode(const rclcpp::NodeOptions &options)
16-
: rclcpp::Node("admittance_control_node", options) {
17-
this->declare_parameter<std::string>("robot_description");
14+
: LBRBasePositionCommandNode("admittance_control", options) {
1815
this->declare_parameter<std::string>("base_link", "link_0");
1916
this->declare_parameter<std::string>("end_effector_link", "link_ee");
2017
this->declare_parameter<std::vector<double>>("f_ext_th", {2., 2., 2., 0.5, 0.5, 0.5});
21-
this->declare_parameter<std::vector<double>>("dq_gains", {0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8});
22-
this->declare_parameter<std::vector<double>>("dx_gains", {4.0, 4.0, 4.0, 40., 40., 40.});
18+
this->declare_parameter<std::vector<double>>("dq_gains", {20., 20., 20., 20., 20., 20., 20.});
19+
this->declare_parameter<std::vector<double>>("dx_gains", {0.1, 0.1, 0.1, 0.1, 0.1, 0.1});
20+
this->declare_parameter<double>("exp_smooth", 0.95);
2321

24-
admittance_controller_ =
25-
std::make_unique<AdmittanceController>(this->get_parameter("robot_description").as_string(),
26-
this->get_parameter("base_link").as_string(),
27-
this->get_parameter("end_effector_link").as_string(),
28-
this->get_parameter("f_ext_th").as_double_array(),
29-
this->get_parameter("dq_gains").as_double_array(),
30-
this->get_parameter("dx_gains").as_double_array());
22+
exp_smooth_ = this->get_parameter("exp_smooth").as_double();
23+
if (exp_smooth_ < 0. || exp_smooth_ > 1.) {
24+
throw std::runtime_error("Invalid exponential smoothing factor.");
25+
}
3126

32-
lbr_position_command_pub_ =
33-
create_publisher<lbr_fri_msgs::msg::LBRPositionCommand>("/lbr/command/joint_position", 1);
34-
lbr_state_sub_ = create_subscription<lbr_fri_msgs::msg::LBRState>(
35-
"/lbr/state", 1,
36-
std::bind(&AdmittanceControlNode::on_lbr_state, this, std::placeholders::_1));
27+
admittance_controller_ = std::make_unique<AdmittanceController>(
28+
this->robot_description_, this->get_parameter("base_link").as_string(),
29+
this->get_parameter("end_effector_link").as_string(),
30+
this->get_parameter("f_ext_th").as_double_array(),
31+
this->get_parameter("dq_gains").as_double_array(),
32+
this->get_parameter("dx_gains").as_double_array());
3733
}
3834

3935
protected:
40-
void on_lbr_state(const lbr_fri_msgs::msg::LBRState::SharedPtr lbr_state) {
36+
void on_lbr_state_(const lbr_fri_msgs::msg::LBRState::SharedPtr lbr_state) override {
4137
if (!lbr_state) {
4238
return;
4339
}
4440

45-
smooth_lbr_state_(lbr_state, 0.95);
41+
smooth_lbr_state_(lbr_state);
4642

47-
auto lbr_command = admittance_controller_->update(lbr_state_);
43+
auto lbr_command = admittance_controller_->update(lbr_state_, dt_);
4844
lbr_position_command_pub_->publish(lbr_command);
4945
};
5046

51-
void smooth_lbr_state_(const lbr_fri_msgs::msg::LBRState::SharedPtr lbr_state, double alpha) {
47+
void smooth_lbr_state_(const lbr_fri_msgs::msg::LBRState::SharedPtr lbr_state) {
5248
if (!init_) {
5349
lbr_state_ = *lbr_state;
5450
init_ = true;
5551
return;
5652
}
5753

5854
for (int i = 0; i < 7; i++) {
59-
lbr_state_.measured_joint_position[i] = lbr_state->measured_joint_position[i] * (1 - alpha) +
60-
lbr_state_.measured_joint_position[i] * alpha;
61-
lbr_state_.external_torque[i] =
62-
lbr_state->external_torque[i] * (1 - alpha) + lbr_state_.external_torque[i] * alpha;
55+
lbr_state_.measured_joint_position[i] =
56+
lbr_state->measured_joint_position[i] * (1 - exp_smooth_) +
57+
lbr_state_.measured_joint_position[i] * exp_smooth_;
58+
lbr_state_.external_torque[i] = lbr_state->external_torque[i] * (1 - exp_smooth_) +
59+
lbr_state_.external_torque[i] * exp_smooth_;
6360
}
6461
}
6562

63+
double exp_smooth_;
6664
bool init_{false};
6765
lbr_fri_msgs::msg::LBRState lbr_state_;
6866

69-
rclcpp::Publisher<lbr_fri_msgs::msg::LBRPositionCommand>::SharedPtr lbr_position_command_pub_;
70-
rclcpp::Subscription<lbr_fri_msgs::msg::LBRState>::SharedPtr lbr_state_sub_;
71-
7267
std::unique_ptr<AdmittanceController> admittance_controller_;
7368
};
74-
} // end of namespace lbr_fri_ros2
69+
} // end of namespace lbr_demos
7570

7671
#include "rclcpp_components/register_node_macro.hpp"
77-
78-
RCLCPP_COMPONENTS_REGISTER_NODE(lbr_fri_ros2::AdmittanceControlNode)
72+
RCLCPP_COMPONENTS_REGISTER_NODE(lbr_demos::AdmittanceControlNode)

0 commit comments

Comments
 (0)