@@ -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
372382void 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
379407void EffortControllerBase::computeIKSolution (
0 commit comments