Skip to content

Commit d754599

Browse files
committed
experiment ral (first session)
1 parent 0d4265a commit d754599

File tree

5 files changed

+254
-106
lines changed

5 files changed

+254
-106
lines changed

effort_controller_base/include/effort_controller_base/effort_controller_base.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,8 @@ class EffortControllerBase : public controller_interface::ControllerInterface {
196196
std::string m_end_effector_link;
197197
std::string m_compliance_ref_link;
198198
std::string m_robot_base_link;
199+
KDL::JntArray m_upper_pos_limits;
200+
KDL::JntArray m_lower_pos_limits;
199201
std::vector<std::reference_wrapper<hardware_interface::LoanedStateInterface>>
200202
m_joint_state_pos_handles;
201203
std::vector<std::reference_wrapper<hardware_interface::LoanedStateInterface>>
@@ -225,6 +227,7 @@ class EffortControllerBase : public controller_interface::ControllerInterface {
225227
bool m_initialized = {false};
226228
bool m_configured = {false};
227229
bool m_active = {false};
230+
int m_rate;
228231
// joint velocity filter
229232
const double m_dotq_alpha = 0.3;
230233
// Dynamic parameters

effort_controller_base/src/effort_controller_base.cpp

Lines changed: 48 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ EffortControllerBase::on_init() {
9393
auto executor =
9494
std::make_shared<rclcpp::executors::SingleThreadedExecutor>();
9595
executor->add_node(robot_description_listener);
96-
while (!robot_description_listener->m_description_received_) {
96+
while (!robot_description_listener->m_description_received_ &&
97+
rclcpp::ok()) {
9798
executor->spin_some();
9899
RCLCPP_INFO_THROTTLE(get_node()->get_logger(), *get_node()->get_clock(),
99100
1000, "Waiting for robot description");
@@ -117,7 +118,8 @@ EffortControllerBase::on_configure(
117118
// Get kinematics specific configuration
118119
urdf::Model robot_model;
119120
KDL::Tree robot_tree;
120-
121+
m_rate = get_node()->get_parameter("update_rate").as_int();
122+
RCLCPP_INFO(get_node()->get_logger(), "Rate: %d Hz", m_rate);
121123
m_robot_base_link = get_node()->get_parameter("robot_base_link").as_string();
122124
if (m_robot_base_link.empty()) {
123125
RCLCPP_ERROR(get_node()->get_logger(), "robot_base_link is empty");
@@ -187,8 +189,9 @@ EffortControllerBase::on_configure(
187189
m_joint_effort_limits.resize(m_joint_number);
188190

189191
// Parse joint limits
190-
KDL::JntArray upper_pos_limits(m_joint_number);
191-
KDL::JntArray lower_pos_limits(m_joint_number);
192+
m_upper_pos_limits.resize(m_joint_number);
193+
m_lower_pos_limits.resize(m_joint_number);
194+
192195
for (size_t i = 0; i < m_joint_number; ++i) {
193196
if (!robot_model.getJoint(m_joint_names[i])) {
194197
RCLCPP_ERROR(get_node()->get_logger(),
@@ -199,18 +202,25 @@ EffortControllerBase::on_configure(
199202
}
200203
if (robot_model.getJoint(m_joint_names[i])->type ==
201204
urdf::Joint::CONTINUOUS) {
202-
upper_pos_limits(i) = std::nan("0");
203-
lower_pos_limits(i) = std::nan("0");
205+
m_upper_pos_limits(i) = std::nan("0");
206+
m_lower_pos_limits(i) = std::nan("0");
204207
m_joint_effort_limits(i) = std::nan("0");
205208
} else {
206209
// Non-existent urdf limits are zero initialized
207-
upper_pos_limits(i) =
210+
m_upper_pos_limits(i) =
208211
robot_model.getJoint(m_joint_names[i])->limits->upper;
209-
lower_pos_limits(i) =
212+
m_lower_pos_limits(i) =
210213
robot_model.getJoint(m_joint_names[i])->limits->lower;
211214
m_joint_effort_limits(i) =
212215
robot_model.getJoint(m_joint_names[i])->limits->effort;
213216
}
217+
218+
// print limits
219+
RCLCPP_INFO_STREAM(get_node()->get_logger(),
220+
"Joint " << m_joint_names[i] << ": "
221+
<< "lower: " << m_lower_pos_limits(i)
222+
<< ", upper: " << m_upper_pos_limits(i)
223+
<< ", effort: " << m_joint_effort_limits(i));
214224
}
215225

216226
// Initialize solvers
@@ -224,7 +234,7 @@ EffortControllerBase::on_configure(
224234
m_ik_solver_vel.reset(new KDL::ChainIkSolverVel_pinv(m_robot_chain));
225235

226236
m_ik_solver.reset(new KDL::ChainIkSolverPos_NR_JL(
227-
m_robot_chain, lower_pos_limits, upper_pos_limits, *m_fk_solver,
237+
m_robot_chain, m_lower_pos_limits, m_upper_pos_limits, *m_fk_solver,
228238
*m_ik_solver_vel, 100, 1e-6));
229239

230240
// m_ik_solver.reset(new KDL::ChainIkSolverPos_LMA(m_robot_chain, 1e-4, 1000,
@@ -326,15 +336,15 @@ EffortControllerBase::on_activate(
326336

327337
// Get command handles.
328338
// Position
329-
if (!controller_interface::get_ordered_interfaces(
330-
command_interfaces_, m_joint_names,
331-
hardware_interface::HW_IF_POSITION, m_joint_cmd_pos_handles)) {
332-
RCLCPP_ERROR(get_node()->get_logger(),
333-
"Expected %zu '%s' command interfaces, got %zu.",
334-
m_joint_number, hardware_interface::HW_IF_POSITION,
335-
m_joint_cmd_pos_handles.size());
336-
return CallbackReturn::ERROR;
337-
}
339+
if (!controller_interface::get_ordered_interfaces(
340+
command_interfaces_, m_joint_names,
341+
hardware_interface::HW_IF_POSITION, m_joint_cmd_pos_handles)) {
342+
RCLCPP_ERROR(get_node()->get_logger(),
343+
"Expected %zu '%s' command interfaces, got %zu.",
344+
m_joint_number, hardware_interface::HW_IF_POSITION,
345+
m_joint_cmd_pos_handles.size());
346+
return CallbackReturn::ERROR;
347+
}
338348
RCLCPP_INFO(get_node()->get_logger(), "Finished getting command interfaces");
339349
// Get state handles.
340350
// Position
@@ -371,9 +381,27 @@ EffortControllerBase::on_activate(
371381

372382
void EffortControllerBase::writeJointEffortCmds(
373383
ctrl::VectorND &target_joint_positions) {
374-
for (size_t i = 0; i < m_joint_number; ++i) {
375-
m_joint_cmd_pos_handles[i].get().set_value(target_joint_positions(i));
384+
const double max_velocity = 2 * 0.001309; // rad/s
385+
const double eps = 1e-4;
386+
for (size_t i = 0; i < m_joint_number; ++i) {
387+
// enforce joint limits
388+
if (target_joint_positions(i) + 2 * max_velocity > m_upper_pos_limits(i)) {
389+
// set equal to current
390+
target_joint_positions(i) = m_upper_pos_limits(i) - 2 * max_velocity - eps;
391+
// RCLCPP_INFO(get_node()->get_logger(),
392+
// "Joint %s target is out of limits, setting to %f",
393+
// m_joint_names[i].c_str(), m_joint_positions(i));
394+
} else if (target_joint_positions(i) - 2 * max_velocity <
395+
m_lower_pos_limits(i)) {
396+
// set equal to current
397+
target_joint_positions(i) = m_lower_pos_limits(i) + 2 * max_velocity + eps;
398+
// RCLCPP_INFO(get_node()->get_logger(),
399+
// "Joint %s target is out of limits, setting to %f",
400+
// m_joint_names[i].c_str(), m_joint_positions(i));
376401
}
402+
403+
m_joint_cmd_pos_handles[i].get().set_value(target_joint_positions(i));
404+
}
377405
}
378406

379407
void EffortControllerBase::computeIKSolution(

kuka_cartesian_impedance_controller/CMakeLists.txt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,8 @@ option(LOGGING "Enable logging" ON)
1111
add_compile_options(${ADDITIONAL_COMPILE_OPTIONS})
1212

1313
# Build in release mode if not specified
14-
if(NOT CMAKE_BUILD_TYPE)
15-
set(CMAKE_BUILD_TYPE Release)
16-
endif()
14+
set(CMAKE_BUILD_TYPE Release)
15+
1716

1817
find_package(Eigen3 3.3 REQUIRED NO_MODULE)
1918
add_definitions(-DEIGEN_MPL2_ONLY)

kuka_cartesian_impedance_controller/include/kuka_cartesian_impedance_controller/kuka_cartesian_impedance_controller.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class KukaCartesianImpedanceController
6363

6464
ctrl::VectorND computeTorque();
6565
void computeTargetPos();
66+
void filterMaximumForce();
6667

6768
using Base = effort_controller_base::EffortControllerBase;
6869

@@ -87,6 +88,8 @@ class KukaCartesianImpedanceController
8788
rclcpp::Subscription<geometry_msgs::msg::PoseStamped>::SharedPtr
8889
m_target_frame_subscriber;
8990
rclcpp::Publisher<debug_msg::msg::Debug>::SharedPtr m_data_publisher;
91+
rclcpp::Publisher<geometry_msgs::msg::WrenchStamped>::SharedPtr
92+
m_wrench_publisher;
9093
KDL::Frame m_target_frame, m_filtered_frame;
9194
ctrl::VectorND m_target_joint_position;
9295
#if LOGGING
@@ -102,9 +105,12 @@ class KukaCartesianImpedanceController
102105
ctrl::VectorND m_q_starting_pose;
103106
double m_max_linear_velocity;
104107
double m_max_angular_velocity;
108+
double m_max_impedance_force;
105109
double m_vel_old = 0.0;
106110
double current_acc_j0 = 0.0;
107111
bool m_compensate_dJdq = false;
112+
bool m_received_target_frame = false;
113+
geometry_msgs::msg::WrenchStamped m_wrench_msg;
108114

109115
double m_last_time;
110116

0 commit comments

Comments
 (0)