Skip to content

Commit 5610422

Browse files
author
Thibault Poignonec
committed
squash previous:
- fix CMakeLists - add inertia to VIC state msg - add "has_valid_wrench" flag to VIC state msg - various fixes - add verbose
1 parent f8fccc4 commit 5610422

File tree

9 files changed

+243
-15
lines changed

9 files changed

+243
-15
lines changed

cartesian_control_msgs/msg/VicControllerState.msg

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ std_msgs/String control_mode # admittance / impedance
55
# Cartesian compliance reference
66
geometry_msgs/Pose desired_pose
77
geometry_msgs/Twist desired_velocity
8-
geometry_msgs/Accel desired_acceleration # optional
8+
geometry_msgs/Accel desired_acceleration # optional, set to null by default
9+
geometry_msgs/Wrench desired_wrench # optional, set to null by default
910

1011
std_msgs/Float64MultiArray desired_inertia
1112
std_msgs/Float64MultiArray desired_damping
@@ -15,6 +16,7 @@ std_msgs/Float64MultiArray desired_stiffness
1516
geometry_msgs/Pose pose
1617
geometry_msgs/Twist velocity
1718
geometry_msgs/Accel acceleration # optional
19+
bool has_valid_wrench
1820
geometry_msgs/Wrench wrench
1921

2022
std_msgs/Float64MultiArray rendered_inertia # optional

cartesian_vic_controller/CMakeLists.txt

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ foreach(Dependency IN ITEMS ${DEPENDENCIES})
3535
find_package(${Dependency} REQUIRED)
3636
endforeach()
3737

38+
# Main VIC controller library
39+
# ---------------------------------
3840
generate_parameter_library(cartesian_vic_controller_parameters
3941
src/cartesian_vic_controller_parameters.yaml
4042
)
@@ -46,11 +48,6 @@ add_library(cartesian_vic_controller SHARED
4648
src/cartesian_vic_state.cpp
4749
src/compliance_frame_trajectory.cpp
4850
src/utils.cpp
49-
# Vanilla VIC rules (basic admittance / impedance control laws)
50-
src/rules/vanilla_cartesian_admittance_rule.cpp
51-
src/rules/vanilla_cartesian_impedance_rule.cpp
52-
# Impedance control for Force Dimension Haptic Interfaces
53-
src/rules/fd_impedance_rule.cpp
5451
)
5552
target_compile_features(cartesian_vic_controller PUBLIC cxx_std_17)
5653
target_include_directories(cartesian_vic_controller PUBLIC
@@ -67,6 +64,24 @@ ament_target_dependencies(cartesian_vic_controller PUBLIC ${DEPENDENCIES})
6764
target_compile_definitions(cartesian_vic_controller PRIVATE "CARTESIAN_VIC_CONTROLLER_BUILDING_DLL")
6865

6966
pluginlib_export_plugin_description_file(controller_interface cartesian_vic_controller.xml)
67+
68+
# VIC rules library
69+
add_library(cartesian_vic_rules SHARED
70+
# Vanilla VIC rules (basic admittance / impedance control laws)
71+
src/rules/vanilla_cartesian_admittance_rule.cpp
72+
src/rules/vanilla_cartesian_impedance_rule.cpp
73+
# Impedance control for Force Dimension Haptic Interfaces
74+
src/rules/fd_impedance_rule.cpp
75+
)
76+
target_compile_features(cartesian_vic_rules PUBLIC cxx_std_17)
77+
target_include_directories(cartesian_vic_rules PUBLIC
78+
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
79+
$<INSTALL_INTERFACE:include/cartesian_vic_controller>
80+
)
81+
target_link_libraries(cartesian_vic_rules PUBLIC
82+
cartesian_vic_controller
83+
)
84+
ament_target_dependencies(cartesian_vic_rules PUBLIC ${DEPENDENCIES})
7085
pluginlib_export_plugin_description_file(cartesian_vic_controller cartesian_vic_rules.xml)
7186

7287
if(BUILD_TESTING)
@@ -95,7 +110,10 @@ if(BUILD_TESTING)
95110
test/test_cartesian_vic_controller.cpp
96111
${CMAKE_CURRENT_SOURCE_DIR}/test/test_params.yaml
97112
)
98-
target_link_libraries(test_controller cartesian_vic_controller)
113+
target_link_libraries(test_controller
114+
cartesian_vic_controller
115+
cartesian_vic_rules
116+
)
99117
ament_target_dependencies(test_controller
100118
control_msgs
101119
controller_interface
@@ -109,7 +127,11 @@ install(
109127
DESTINATION include/cartesian_vic_controller
110128
)
111129

112-
install(TARGETS cartesian_vic_controller cartesian_vic_controller_parameters
130+
install(
131+
TARGETS
132+
cartesian_vic_controller
133+
cartesian_vic_controller_parameters
134+
cartesian_vic_rules
113135
EXPORT export_cartesian_vic_controller
114136
RUNTIME DESTINATION bin
115137
ARCHIVE DESTINATION lib

cartesian_vic_controller/cartesian_vic_rules.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<library path="cartesian_vic_controller">
1+
<library path="cartesian_vic_rules">
22
<class name="cartesian_vic_controller/VanillaCartesianAdmittanceRule"
33
type="cartesian_vic_controller::VanillaCartesianAdmittanceRule"
44
base_class_type="cartesian_vic_controller::CartesianVicRule">

cartesian_vic_controller/include/cartesian_vic_controller/cartesian_vic_rule.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,9 @@ class CartesianVicRule
203203
/// Filtered wrench expressed in robot base frame
204204
Eigen::Matrix<double, 6, 1> wrench_base_;
205205

206+
/// Jacobian pre-allocation (used to compute cartesian inertia matrix)
207+
Eigen::Matrix<double, 6, Eigen::Dynamic> J_private_;
208+
206209
/// Filtered external torques
207210
Eigen::VectorXd filtered_external_torques_;
208211
};

cartesian_vic_controller/include/cartesian_vic_controller/cartesian_vic_state.hpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,22 @@ class VicInputData
5252
joint_state_velocity = Eigen::VectorXd::Zero(num_joints);
5353
joint_state_external_torques_ = Eigen::VectorXd::Zero(num_joints);
5454

55+
natural_joint_space_inertia = \
56+
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(num_joints, num_joints);
57+
5558
// Allocate nullspace parameters
5659
nullspace_desired_joint_positions = Eigen::VectorXd::Zero(num_joints);
5760
nullspace_joint_inertia = Eigen::VectorXd::Zero(num_joints);
5861
nullspace_joint_stiffness = Eigen::VectorXd::Zero(num_joints);
5962
nullspace_joint_damping = Eigen::VectorXd::Zero(num_joints);
6063

61-
// Allocate cartesian state
62-
/*
64+
// Reset cartesian state
65+
robot_current_velocity.setZero();
66+
robot_estimated_acceleration.setZero();
67+
robot_current_wrench_at_ft_frame_.setZero();
6368
natural_joint_space_inertia = \
6469
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(num_joints, num_joints);
65-
*/
70+
6671
// Reset data availability
6772
has_ft_sensor_ = false;
6873
has_external_torque_sensor_ = false;
@@ -150,10 +155,11 @@ class VicInputData
150155
// Cartesian state (control frame w.r.t. robot base frame)
151156
Eigen::Isometry3d robot_current_pose;
152157
Eigen::Matrix<double, 6, 1> robot_current_velocity;
158+
Eigen::Matrix<double, 6, 1> robot_estimated_acceleration;
153159

154160
/// Natural inertia matrix (from dynamic model)
155-
// Eigen::Matrix<double, 6, 6> natural_cartesian_inertia;
156-
// Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> natural_joint_space_inertia;
161+
Eigen::Matrix<double, 6, 6> natural_cartesian_inertia;
162+
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> natural_joint_space_inertia;
157163

158164
protected:
159165
Eigen::VectorXd joint_state_external_torques_;
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
// Copyright 2024, ICube Laboratory, University of Strasbourg
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
16+
//-----------------------------------------------------------------------------
17+
/*!\file vic_msg_utils.hpp
18+
*
19+
* \author thibault Poignonec <tpoignonec@unistra.fr>
20+
* \date 2024/08/07
21+
*/
22+
//-----------------------------------------------------------------------------
23+
24+
#ifndef CARTESIAN_VIC_CONTROLLER__VIC_MSGS_UTILS_HPP_
25+
#define CARTESIAN_VIC_CONTROLLER__VIC_MSGS_UTILS_HPP_
26+
27+
28+
// Misc.
29+
#include <Eigen/Dense>
30+
#include <Eigen/Geometry>
31+
32+
#include <string>
33+
#include <memory>
34+
35+
#include "tf2_eigen/tf2_eigen.hpp"
36+
#include "tf2_kdl/tf2_kdl.hpp"
37+
38+
#include <rclcpp/rclcpp.hpp>
39+
40+
// Custom msgs
41+
#include "cartesian_control_msgs/msg/vic_controller_state.hpp"
42+
#include "cartesian_control_msgs/msg/cartesian_trajectory.hpp"
43+
#include "cartesian_control_msgs/msg/compliant_frame_trajectory.hpp"
44+
#include "cartesian_vic_controller/utils.hpp"
45+
46+
47+
namespace cartesian_vic_controller
48+
{
49+
50+
// Read VIC state message
51+
52+
bool get_robot_pose(
53+
const cartesian_control_msgs::msg::VicControllerState & vic_state_msg,
54+
Eigen::Affine3d & pose)
55+
{
56+
tf2::fromMsg(vic_state_msg.pose, pose);
57+
return true;
58+
}
59+
60+
bool get_robot_velocity(
61+
const cartesian_control_msgs::msg::VicControllerState & vic_state_msg,
62+
Eigen::Matrix<double, 6, 1> & twist)
63+
{
64+
tf2::fromMsg(vic_state_msg.velocity, twist);
65+
return true;
66+
}
67+
68+
bool get_robot_acceleration(
69+
const cartesian_control_msgs::msg::VicControllerState & vic_state_msg,
70+
Eigen::Matrix<double, 6, 1> & acceleration)
71+
{
72+
acceleration[0] = vic_state_msg.acceleration.linear.x;
73+
acceleration[1] = vic_state_msg.acceleration.linear.y;
74+
acceleration[2] = vic_state_msg.acceleration.linear.z;
75+
acceleration[3] = vic_state_msg.acceleration.angular.x;
76+
acceleration[4] = vic_state_msg.acceleration.angular.y;
77+
acceleration[5] = vic_state_msg.acceleration.angular.z;
78+
return true;
79+
}
80+
81+
bool get_robot_wrench(
82+
const cartesian_control_msgs::msg::VicControllerState & vic_state_msg,
83+
Eigen::Matrix<double, 6, 1> & wrench)
84+
{
85+
wrench[0] = vic_state_msg.wrench.force.x;
86+
wrench[1] = vic_state_msg.wrench.force.y;
87+
wrench[2] = vic_state_msg.wrench.force.z;
88+
wrench[3] = vic_state_msg.wrench.torque.x;
89+
wrench[4] = vic_state_msg.wrench.torque.y;
90+
wrench[5] = vic_state_msg.wrench.torque.z;
91+
return true;
92+
}
93+
94+
bool get_desired_robot_pose(
95+
const cartesian_control_msgs::msg::VicControllerState & vic_state_msg,
96+
Eigen::Affine3d & desired_pose)
97+
{
98+
tf2::fromMsg(vic_state_msg.desired_pose, desired_pose);
99+
return true;
100+
}
101+
bool get_desired_robot_velocity(
102+
const cartesian_control_msgs::msg::VicControllerState & vic_state_msg,
103+
Eigen::Matrix<double, 6, 1> & desired_twist)
104+
{
105+
tf2::fromMsg(vic_state_msg.desired_velocity, desired_twist);
106+
return true;
107+
}
108+
bool get_desired_robot_acceleration(
109+
const cartesian_control_msgs::msg::VicControllerState & vic_state_msg,
110+
Eigen::Matrix<double, 6, 1> & desired_acceleration)
111+
{
112+
desired_acceleration[0] = vic_state_msg.desired_acceleration.linear.x;
113+
desired_acceleration[1] = vic_state_msg.desired_acceleration.linear.y;
114+
desired_acceleration[2] = vic_state_msg.desired_acceleration.linear.z;
115+
desired_acceleration[3] = vic_state_msg.desired_acceleration.angular.x;
116+
desired_acceleration[4] = vic_state_msg.desired_acceleration.angular.y;
117+
desired_acceleration[5] = vic_state_msg.desired_acceleration.angular.z;
118+
return true;
119+
}
120+
bool get_desired_robot_wrench(
121+
const cartesian_control_msgs::msg::VicControllerState & vic_state_msg,
122+
Eigen::Matrix<double, 6, 1> & desired_wrench)
123+
{
124+
desired_wrench[0] = vic_state_msg.desired_wrench.force.x;
125+
desired_wrench[1] = vic_state_msg.desired_wrench.force.y;
126+
desired_wrench[2] = vic_state_msg.desired_wrench.force.z;
127+
desired_wrench[3] = vic_state_msg.desired_wrench.torque.x;
128+
desired_wrench[4] = vic_state_msg.desired_wrench.torque.y;
129+
desired_wrench[5] = vic_state_msg.desired_wrench.torque.z;
130+
return true;
131+
}
132+
133+
bool get_current_impedance_profile(
134+
const cartesian_control_msgs::msg::VicControllerState & vic_state_msg,
135+
Eigen::Matrix<double, 6, 6> & M,
136+
Eigen::Matrix<double, 6, 6> & K,
137+
Eigen::Matrix<double, 6, 6> & D)
138+
{
139+
bool success = fromMsg(vic_state_msg.rendered_inertia, M);
140+
success &= fromMsg(vic_state_msg.rendered_stiffness, K);
141+
success &= fromMsg(vic_state_msg.rendered_damping, D);
142+
return success;
143+
}
144+
145+
bool get_desired_impedance_profile(
146+
const cartesian_control_msgs::msg::VicControllerState & vic_state_msg,
147+
Eigen::Matrix<double, 6, 6> & M_d,
148+
Eigen::Matrix<double, 6, 6> & K_d,
149+
Eigen::Matrix<double, 6, 6> & D_d)
150+
{
151+
bool success = fromMsg(vic_state_msg.desired_inertia, M_d);
152+
success &= fromMsg(vic_state_msg.desired_stiffness, K_d);
153+
success &= fromMsg(vic_state_msg.desired_damping, D_d);
154+
return success;
155+
}
156+
157+
bool get_natural_robot_inertia(
158+
const cartesian_control_msgs::msg::VicControllerState & vic_state_msg,
159+
Eigen::Matrix<double, 6, 6> & M_natural)
160+
{
161+
bool success = fromMsg(vic_state_msg.natural_inertia, M_natural);
162+
return success;
163+
}
164+
165+
166+
} // namespace cartesian_vic_controller
167+
168+
#endif // CARTESIAN_VIC_CONTROLLER__VIC_MSGS_UTILS_HPP_

cartesian_vic_controller/src/cartesian_vic_rule.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ CartesianVicRule::configure(
9090
return controller_interface::return_type::ERROR;
9191
}
9292

93+
// Allocate temporary matrices
94+
J_private_ = \
95+
Eigen::Matrix<double, 6, Eigen::Dynamic>::Zero(6, num_joints);
96+
9397
return controller_interface::return_type::OK;
9498
}
9599

@@ -437,7 +441,24 @@ CartesianVicRule::update_input_data(
437441
measurement_data.get_joint_state()
438442
);
439443

444+
// Retrieve inertia matrices
445+
success &= dynamics_->calculate_inertia(
446+
vic_state_.input_data.joint_state_position,
447+
vic_state_.input_data.natural_joint_space_inertia
448+
);
449+
success &= dynamics_->calculate_jacobian(
450+
vic_state_.input_data.joint_state_position,
451+
vic_state_.input_data.control_frame,
452+
J_private_
453+
);
454+
vic_state_.input_data.natural_cartesian_inertia = (J_private_ * \
455+
vic_state_.input_data.natural_joint_space_inertia.inverse() * \
456+
J_private_.transpose()).inverse();
457+
440458
if (!success) {
459+
RCLCPP_ERROR(
460+
logger_,
461+
"update_input_data(): failed to update input data!");
441462
return controller_interface::return_type::ERROR;
442463
}
443464
return controller_interface::return_type::OK;

cartesian_vic_controller/src/cartesian_vic_state.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ VicState::to_msg(cartesian_control_msgs::msg::VicControllerState & vic_state_msg
6060
vic_state_msg.desired_pose = Eigen::toMsg(desired_frame_0.pose);
6161
vic_state_msg.desired_velocity = Eigen::toMsg(desired_frame_0.velocity);
6262
vic_state_msg.desired_acceleration = AccelToMsg(desired_frame_0.acceleration);
63+
vic_state_msg.desired_wrench = WrenchToMsg(desired_frame_0.wrench);
6364
matrixEigenToMsg(desired_frame_0.inertia, vic_state_msg.desired_inertia);
6465
matrixEigenToMsg(desired_frame_0.stiffness, vic_state_msg.desired_stiffness);
6566
matrixEigenToMsg(desired_frame_0.damping, vic_state_msg.desired_damping);
@@ -68,16 +69,18 @@ VicState::to_msg(cartesian_control_msgs::msg::VicControllerState & vic_state_msg
6869
vic_state_msg.pose = Eigen::toMsg(input_data.robot_current_pose);
6970
vic_state_msg.velocity = Eigen::toMsg(input_data.robot_current_velocity);
7071
if (input_data.has_ft_sensor()) {
72+
vic_state_msg.has_valid_wrench = true;
7173
vic_state_msg.wrench = WrenchToMsg(input_data.get_ft_sensor_wrench());
7274
} else {
75+
vic_state_msg.has_valid_wrench = false;
7376
vic_state_msg.wrench.force.x = 0.0;
7477
vic_state_msg.wrench.force.y = 0.0;
7578
vic_state_msg.wrench.force.z = 0.0;
7679
vic_state_msg.wrench.torque.x = 0.0;
7780
vic_state_msg.wrench.torque.y = 0.0;
7881
vic_state_msg.wrench.torque.z = 0.0;
7982
}
80-
// matrixEigenToMsg(input_data.natural_cartesian_inertia, vic_state_msg.natural_inertia);
83+
matrixEigenToMsg(input_data.natural_cartesian_inertia, vic_state_msg.natural_inertia);
8184

8285
// Fill rendered impedance
8386
matrixEigenToMsg(command_data.inertia, vic_state_msg.rendered_inertia);

cartesian_vic_controller/src/utils.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ geometry_msgs::msg::Wrench WrenchToMsg(const Eigen::Matrix<double, 6, 1> & in)
4545

4646
bool fromMsg(const std_msgs::msg::Float64MultiArray & m, Eigen::Matrix<double, 6, 6> & e)
4747
{
48+
if (m.data.size() != 36) {
49+
return false;
50+
}
4851
/*
4952
// TODO(tpoignonec): check layout validity !!! (could be flattened or not...)
5053
size_t size_in_msg = m.layout.dim[0].size;

0 commit comments

Comments
 (0)