cob_frame_tracker.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2017 Fraunhofer Institute for Manufacturing Engineering and Automation (IPA)
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 
18 #include <string>
19 #include <algorithm>
20 #include <math.h>
21 #include <ros/ros.h>
22 
23 #include <geometry_msgs/Twist.h>
24 #include <sensor_msgs/JointState.h>
26 #include <cob_frame_tracker/FrameTrackingAction.h>
27 
29 #include <kdl/chainiksolvervel_pinv.hpp>
30 #include <kdl/chainfksolvervel_recursive.hpp>
31 #include <kdl/jntarray.hpp>
32 #include <kdl/jntarrayvel.hpp>
33 
34 
36 {
37  ros::NodeHandle nh_;
38  ros::NodeHandle nh_tracker("frame_tracker");
39  ros::NodeHandle nh_twist("twist_controller");
40 
42  if (nh_tracker.hasParam("update_rate"))
43  { nh_tracker.getParam("update_rate", update_rate_); }
44  else
45  { update_rate_ = 50.0; } // hz
46 
47  if (nh_.hasParam("chain_base_link"))
48  {
49  nh_.getParam("chain_base_link", chain_base_link_);
50  }
51  else
52  {
53  ROS_ERROR("No chain_base_link specified. Aborting!");
54  return false;
55  }
56 
57  if (nh_.hasParam("chain_tip_link"))
58  {
59  nh_.getParam("chain_tip_link", chain_tip_link_);
60  }
61  else
62  {
63  ROS_ERROR("No chain_tip_link specified. Aborting!");
64  return false;
65  }
66 
67  if (!nh_.getParam("joint_names", joints_))
68  {
69  ROS_ERROR("Parameter 'joint_names' not set");
70  return false;
71  }
72 
73  KDL::Tree tree;
74  if (!kdl_parser::treeFromParam("/robot_description", tree))
75  {
76  ROS_ERROR("Failed to construct kdl tree");
77  return false;
78  }
79 
81  if (chain_.getNrOfJoints() == 0)
82  {
83  ROS_ERROR("Failed to initialize kinematic chain");
84  return false;
85  }
86 
87  // initialize variables and current joint values and velocities
91 
92  if (nh_tracker.hasParam("movable_trans"))
93  { nh_tracker.getParam("movable_trans", movable_trans_); }
94  else
95  { movable_trans_ = true; }
96  if (nh_tracker.hasParam("movable_rot"))
97  { nh_tracker.getParam("movable_rot", movable_rot_); }
98  else
99  { movable_rot_ = true; }
100 
101  if (nh_tracker.hasParam("max_vel_lin"))
102  { nh_tracker.getParam("max_vel_lin", max_vel_lin_); }
103  else
104  { max_vel_lin_ = 0.1; } // m/sec
105 
106  if (nh_tracker.hasParam("max_vel_rot"))
107  { nh_tracker.getParam("max_vel_rot", max_vel_rot_); }
108  else
109  { max_vel_rot_ = 0.1; } // rad/sec
110 
111  // Load PID Controller using gains set on parameter server
112  pid_controller_trans_x_.init(ros::NodeHandle(nh_tracker, "pid_trans_x"));
114  pid_controller_trans_y_.init(ros::NodeHandle(nh_tracker, "pid_trans_y"));
116  pid_controller_trans_z_.init(ros::NodeHandle(nh_tracker, "pid_trans_z"));
118 
119  pid_controller_rot_x_.init(ros::NodeHandle(nh_tracker, "pid_rot_x"));
121  pid_controller_rot_y_.init(ros::NodeHandle(nh_tracker, "pid_rot_y"));
123  pid_controller_rot_z_.init(ros::NodeHandle(nh_tracker, "pid_rot_z"));
125 
126  tracking_ = false;
127  tracking_goal_ = false;
128  lookat_ = false;
131  lookat_focus_frame_ = "lookat_focus_frame";
132 
133  // ABORTION CRITERIA:
141 
142  cart_distance_ = 0.0;
143  rot_distance_ = 0.0;
144 
147 
148  abortion_counter_ = 0;
149  max_abortions_ = update_rate_; // if tracking fails for 1 second
150 
151  reconfigure_server_.reset(new dynamic_reconfigure::Server<cob_frame_tracker::FrameTrackerConfig>(reconfig_mutex_, nh_tracker));
152  reconfigure_server_->setCallback(boost::bind(&CobFrameTracker::reconfigureCallback, this, _1, _2));
153 
154  reconfigure_client_ = nh_twist.serviceClient<dynamic_reconfigure::Reconfigure>("set_parameters");
155 
156  jointstate_sub_ = nh_.subscribe("joint_states", 1, &CobFrameTracker::jointstateCallback, this);
157  twist_pub_ = nh_twist.advertise<geometry_msgs::TwistStamped> ("command_twist_stamped", 1);
158  error_pub_ = nh_twist.advertise<geometry_msgs::TwistStamped> ("controller_errors", 1);
159 
162  stop_server_ = nh_tracker.advertiseService("stop", &CobFrameTracker::stopCallback, this);
163 
164  action_name_ = "tracking_action";
165  as_.reset(new SAS_FrameTrackingAction_t(nh_tracker, action_name_, false));
166  as_->registerGoalCallback(boost::bind(&CobFrameTracker::goalCB, this));
167  as_->registerPreemptCallback(boost::bind(&CobFrameTracker::preemptCB, this));
168  as_->start();
169 
171  timer_.start();
172 
173  return true;
174 }
175 
177 {
178  ros::Duration period = event.current_real - event.last_real;
179 
180  if (tracking_ || tracking_goal_ || lookat_)
181  {
182  if (tracking_goal_) // tracking on action goal.
183  {
184  int status = checkStatus();
185 
186  if (status > 0)
187  {
188  action_success();
189  }
190  else if (status < 0)
191  {
192  action_abort();
193  }
194  else
195  {
196  // action still active - publish feedback
197  if (as_->isActive()) { as_->publishFeedback(action_feedback_); }
198  }
199  }
200  else // tracking/lookat on service call
201  {
202  int status = checkServiceCallStatus();
203  if (status < 0)
204  {
205  this->publishHoldTwist(period);
206  }
207 
208  ht_.hold = abortion_counter_ >= max_abortions_; // only for service call in case of action ht_.hold = false. What to do with actions?
209  }
210 
211  publishTwist(period, !ht_.hold); // if not publishing then just update data!
212  }
213 }
214 
215 bool CobFrameTracker::getTransform(const std::string& from, const std::string& to, tf::StampedTransform& stamped_tf)
216 {
217  bool transform = false;
218 
219  try
220  {
222  tf_listener_.lookupTransform(from, to, ros::Time(0), stamped_tf);
223  transform = true;
224  }
225  catch (tf::TransformException& ex)
226  {
227  ROS_ERROR("CobFrameTracker::getTransform: \n%s", ex.what());
228  }
229 
230  return transform;
231 }
232 
234 {
235  // publish zero Twist for stopping
236  geometry_msgs::TwistStamped twist_msg;
237  ros::Time now = ros::Time::now();
238  twist_msg.header.frame_id = tracking_frame_;
239  twist_msg.header.stamp = now;
240  twist_pub_.publish(twist_msg);
241 }
242 
243 void CobFrameTracker::publishTwist(ros::Duration period, bool do_publish)
244 {
245  tf::StampedTransform transform_tf;
246  bool success = this->getTransform(tracking_frame_, target_frame_, transform_tf);
247 
248  geometry_msgs::TwistStamped twist_msg, error_msg;
249  ros::Time now = ros::Time::now();
250  twist_msg.header.frame_id = tracking_frame_;
251  twist_msg.header.stamp = now;
252  error_msg.header.frame_id = tracking_frame_;
253  error_msg.header.stamp = now;
254 
255  if (!success)
256  {
257  ROS_WARN("publishTwist: failed to getTransform");
258  return;
259  }
260 
261  double error_trans_x = transform_tf.getOrigin().x();
262  double error_trans_y = transform_tf.getOrigin().y();
263  double error_trans_z = transform_tf.getOrigin().z();
264  double error_rot_x = transform_tf.getRotation().x();
265  double error_rot_y = transform_tf.getRotation().y();
266  double error_rot_z = transform_tf.getRotation().z();
267 
268  error_msg.twist.linear.x = error_trans_x;
269  error_msg.twist.linear.y = error_trans_y;
270  error_msg.twist.linear.z = error_trans_z;
271  error_msg.twist.angular.x = error_rot_x;
272  error_msg.twist.angular.y = error_rot_y;
273  error_msg.twist.angular.z = error_rot_z;
274 
275  if (movable_trans_)
276  {
277  twist_msg.twist.linear.x = pid_controller_trans_x_.computeCommand(error_trans_x, period);
278  twist_msg.twist.linear.y = pid_controller_trans_y_.computeCommand(error_trans_y, period);
279  twist_msg.twist.linear.z = pid_controller_trans_z_.computeCommand(error_trans_z, period);
280  }
281 
282  if (movable_rot_)
283  {
286 
287  twist_msg.twist.angular.x = pid_controller_rot_x_.computeCommand(error_rot_x, period);
288  twist_msg.twist.angular.y = pid_controller_rot_y_.computeCommand(error_rot_y, period);
289  twist_msg.twist.angular.z = pid_controller_rot_z_.computeCommand(error_rot_z, period);
290  }
291 
293 
315  // eukl distance
316  cart_distance_ = sqrt(pow(transform_tf.getOrigin().x(), 2) + pow(transform_tf.getOrigin().y(), 2) + pow(transform_tf.getOrigin().z(), 2));
317  rot_distance_ = sqrt(pow(transform_tf.getRotation().x(), 2) + pow(transform_tf.getRotation().y(), 2) + pow(transform_tf.getRotation().z(), 2));
318 
319  // rot distance
320  // // TODO: change to cartesian rot
321  // rot_distance_ = 2* acos(transform_msg.transform.rotation.w);
322 
323  // get target_twist
324  target_twist_.vel.x(twist_msg.twist.linear.x);
325  target_twist_.vel.y(twist_msg.twist.linear.y);
326  target_twist_.vel.z(twist_msg.twist.linear.z);
327  target_twist_.rot.x(twist_msg.twist.angular.x);
328  target_twist_.rot.y(twist_msg.twist.angular.y);
329  target_twist_.rot.z(twist_msg.twist.angular.z);
330 
331  if (do_publish)
332  {
333  twist_pub_.publish(twist_msg);
334  error_pub_.publish(error_msg);
335  }
336 }
337 
339 {
340  tf::StampedTransform transform_tf;
341  bool success = this->getTransform(chain_base_link_, tracking_frame_, transform_tf);
342 
343  geometry_msgs::TwistStamped twist_msg, error_msg;
344  ros::Time now = ros::Time::now();
345  twist_msg.header.frame_id = tracking_frame_;
346  twist_msg.header.stamp = now;
347  error_msg.header.frame_id = tracking_frame_;
348  error_msg.header.stamp = now;
349 
350  if (!this->ht_.hold)
351  {
352  ROS_ERROR_STREAM_THROTTLE(1, "Abortion active: Publishing zero twist");
353  ht_.hold = success;
354  ht_.transform_tf = transform_tf;
355  }
356  else
357  {
358  if (success)
359  {
360  ROS_ERROR_STREAM_THROTTLE(1, "Abortion active: Publishing hold posture twist");
361 
362  double error_trans_x = ht_.transform_tf.getOrigin().x() - transform_tf.getOrigin().x();
363  double error_trans_y = ht_.transform_tf.getOrigin().y() - transform_tf.getOrigin().y();
364  double error_trans_z = ht_.transform_tf.getOrigin().z() - transform_tf.getOrigin().z();
365  double error_rot_x = ht_.transform_tf.getRotation().x() - transform_tf.getRotation().x();
366  double error_rot_y = ht_.transform_tf.getRotation().y() - transform_tf.getRotation().y();
367  double error_rot_z = ht_.transform_tf.getRotation().z() - transform_tf.getRotation().z();
368 
369  error_msg.twist.linear.x = error_trans_x;
370  error_msg.twist.linear.y = error_trans_y;
371  error_msg.twist.linear.z = error_trans_z;
372  error_msg.twist.angular.x = error_rot_x;
373  error_msg.twist.angular.y = error_rot_y;
374  error_msg.twist.angular.z = error_rot_z;
375 
376  twist_msg.twist.linear.x = pid_controller_trans_x_.computeCommand(error_trans_x, period);
377  twist_msg.twist.linear.y = pid_controller_trans_y_.computeCommand(error_trans_y, period);
378  twist_msg.twist.linear.z = pid_controller_trans_z_.computeCommand(error_trans_z, period);
379 
380  twist_msg.twist.angular.x = pid_controller_rot_x_.computeCommand(error_rot_x, period);
381  twist_msg.twist.angular.y = pid_controller_rot_y_.computeCommand(error_rot_y, period);
382  twist_msg.twist.angular.z = pid_controller_rot_z_.computeCommand(error_rot_z, period);
383  }
384  }
385 
386  twist_pub_.publish(twist_msg);
387  error_pub_.publish(error_msg);
388 }
389 
390 bool CobFrameTracker::startTrackingCallback(cob_srvs::SetString::Request& request, cob_srvs::SetString::Response& response)
391 {
392  if (tracking_)
393  {
394  std::string msg = "CobFrameTracker: StartTracking denied because Tracking already active";
395  ROS_ERROR_STREAM(msg);
396  response.success = false;
397  response.message = msg;
398  }
399  else if (tracking_goal_)
400  {
401  std::string msg = "CobFrameTracker: StartTracking denied because TrackingAction is active";
402  ROS_ERROR_STREAM(msg);
403  response.success = false;
404  response.message = msg;
405  }
406  else if (lookat_)
407  {
408  std::string msg = "CobFrameTracker: StartTracking denied because Lookat is active";
409  ROS_ERROR_STREAM(msg);
410  response.success = false;
411  response.message = msg;
412  }
413  else
414  {
415  // check whether given target frame exists
416  if (!tf_listener_.frameExists(request.data))
417  {
418  std::string msg = "CobFrameTracker: StartTracking denied because target frame '" + request.data + "' does not exist";
419  ROS_ERROR_STREAM(msg);
420  response.success = false;
421  response.message = msg;
422  }
423  else
424  {
425  std::string msg = "CobFrameTracker: StartTracking started with CART_DIST_SECURITY MONITORING enabled";
426  ROS_INFO_STREAM(msg);
427  response.success = true;
428  response.message = msg;
429 
430  tracking_ = true;
431  tracking_goal_ = false;
432  lookat_ = false;
434  target_frame_ = request.data;
435  }
436  }
437  return true;
438 }
439 
440 bool CobFrameTracker::startLookatCallback(cob_srvs::SetString::Request& request, cob_srvs::SetString::Response& response)
441 {
442  if (tracking_)
443  {
444  std::string msg = "CobFrameTracker: StartLookat denied because Tracking active";
445  ROS_ERROR_STREAM(msg);
446  response.success = false;
447  response.message = msg;
448  }
449  else if (tracking_goal_)
450  {
451  std::string msg = "CobFrameTracker: StartLookat denied because TrackingAction is active";
452  ROS_ERROR_STREAM(msg);
453  response.success = false;
454  response.message = msg;
455  }
456  else if (lookat_)
457  {
458  std::string msg = "CobFrameTracker: StartLookat denied because Lookat is already active";
459  ROS_ERROR_STREAM(msg);
460  response.success = false;
461  response.message = msg;
462  }
463  else
464  {
465  // check whether given target frame exists
466  if (!tf_listener_.frameExists(request.data))
467  {
468  std::string msg = "CobFrameTracker: StartLookat denied because target frame '" + request.data + "' does not exist";
469  ROS_ERROR_STREAM(msg);
470  response.success = false;
471  response.message = msg;
472  }
473  else
474  {
475  dynamic_reconfigure::Reconfigure srv;
476  dynamic_reconfigure::IntParameter int_param;
477  int_param.name = "kinematic_extension";
478  int_param.value = 4; // LOOKAT
479  srv.request.config.ints.push_back(int_param);
480 
481  bool success = reconfigure_client_.call(srv);
482  ROS_DEBUG_STREAM("srv.request: " << srv.request << ", srv.response: " << srv.response);
483 
484  if (success)
485  {
486  success = false;
487  for (std::vector<dynamic_reconfigure::IntParameter>::iterator it = srv.response.config.ints.begin() ; it != srv.response.config.ints.end(); ++it)
488  {
489  if (it->name == int_param.name && it->value == int_param.value)
490  {
491  success = true;
492  break;
493  }
494  }
495 
496  if (success)
497  {
498  std::string msg = "CobFrameTracker: StartLookat started with CART_DIST_SECURITY MONITORING enabled";
499  ROS_INFO_STREAM(msg);
500  response.success = true;
501  response.message = msg;
502 
503  tracking_ = false;
504  tracking_goal_ = false;
505  lookat_ = true;
507  target_frame_ = request.data;
508  }
509  else
510  {
511  std::string msg = "CobFrameTracker: StartLookat denied because DynamicReconfigure failed to set vaulues";
512  ROS_ERROR_STREAM(msg);
513  response.success = false;
514  response.message = msg;
515  }
516  }
517  else
518  {
519  std::string msg = "CobFrameTracker: StartLookat denied because DynamicReconfigure failed to call service";
520  ROS_ERROR_STREAM(msg);
521  response.success = false;
522  response.message = msg;
523  }
524  }
525  }
526  return true;
527 }
528 
529 bool CobFrameTracker::stopCallback(std_srvs::Trigger::Request& request, std_srvs::Trigger::Response& response)
530 {
531  if (tracking_goal_)
532  {
533  std::string msg = "CobFrameTracker: Stop denied because TrackingAction is active";
534  ROS_ERROR_STREAM(msg);
535  response.success = false;
536  response.message = msg;
537  }
538  else if (tracking_ || lookat_)
539  {
540  if (lookat_)
541  {
542  // disable LOOKAT in dynamic_reconfigure server
543  dynamic_reconfigure::Reconfigure srv;
544  dynamic_reconfigure::IntParameter int_param;
545  int_param.name = "kinematic_extension";
546  int_param.value = 0; // NO_EXTENSION
547  srv.request.config.ints.push_back(int_param);
548 
549  if (!reconfigure_client_.call(srv))
550  {
551  std::string msg = "CobFrameTracker: Stop failed to disable LOOKAT_EXTENSION. Stopping anyway!";
552  ROS_ERROR_STREAM(msg);
553  }
554  }
555 
556  std::string msg = "CobFrameTracker: Stop successful";
557  ROS_INFO_STREAM(msg);
558  response.success = true;
559  response.message = msg;
560 
561  tracking_ = false;
562  tracking_goal_ = false;
563  lookat_ = false;
566 
568  }
569  else
570  {
571  std::string msg = "CobFrameTracker: Stop failed because nothing was tracked";
572  ROS_ERROR_STREAM(msg);
573  response.success = false;
574  response.message = msg;
575  }
576  return true;
577 }
578 
580 {
581  ROS_INFO("Received a new goal");
582  if (as_->isNewGoalAvailable())
583  {
585 
586  if (tracking_ || lookat_)
587  {
588  // Goal should not be accepted
589  ROS_ERROR_STREAM("CobFrameTracker: Received ActionGoal while tracking/lookat Service is active!");
590  }
591  else if (!tf_listener_.frameExists(goal_->tracking_frame))
592  {
593  // Goal should not be accepted
594  ROS_ERROR_STREAM("CobFrameTracker: Received ActionGoal but target frame '" << goal_->tracking_frame << "' does not exist");
595  }
596  else
597  {
598  target_frame_ = goal_->tracking_frame;
599  tracking_duration_ = goal_->tracking_duration;
600  stop_on_goal_ = goal_->stop_on_goal;
601  tracking_ = false;
602  tracking_goal_ = true;
603  lookat_ = false;
604  abortion_counter_ = 0;
606  }
607  }
608 }
609 
611 {
612  ROS_WARN("Received a preemption request");
613  action_result_.success = true;
614  action_result_.message = "Action has been preempted";
615  as_->setPreempted(action_result_);
616  tracking_ = false;
617  tracking_goal_ = false;
618  lookat_ = false;
621 
623 }
624 
626 {
627  ROS_INFO("Goal succeeded!");
628  as_->setSucceeded(action_result_, action_result_.message);
629 
630  tracking_ = false;
631  tracking_goal_ = false;
632  lookat_ = false;
635 
637 }
638 
640 {
641  ROS_WARN("Goal aborted");
642  as_->setAborted(action_result_, action_result_.message);
643 
644  tracking_ = false;
645  tracking_goal_ = false;
646  lookat_ = false;
649 
651 }
652 
654 {
655  int status = 0;
656 
658  {
659  abortion_counter_ = 0;
660  return status;
661  }
662 
664  {
665  action_result_.success = true;
666  action_result_.message = std::string("Successfully tracked goal for %f seconds", tracking_duration_);
667  status = 1;
668  }
669 
670  bool infinitesimal_twist = checkInfinitesimalTwist(current_twist_);
671  bool distance_violation = checkCartDistanceViolation(cart_distance_, rot_distance_);
672  bool twist_violation = checkTwistViolation(current_twist_, target_twist_);
673 
674  if (stop_on_goal_)
675  {
677  if (infinitesimal_twist && !distance_violation && !twist_violation)
678  {
679  action_result_.success = true;
680  action_result_.message = "Successfully reached goal";
681  status = 2;
682  }
683  }
684 
685  if (distance_violation || twist_violation)
686  {
687  ROS_ERROR_STREAM("distance_violation || twist_violation");
689  }
690 
692  {
693  action_result_.success = false;
694  action_result_.message = "Constraints violated. Action aborted";
695  status = -1;
696  }
697 
698  return status;
699 }
700 
701 
703 {
704  int status = 0;
705 
707  {
708  abortion_counter_ = 0;
709  return status;
710  }
711 
712  bool distance_violation = checkCartDistanceViolation(cart_distance_, rot_distance_);
713 
714  if (distance_violation)
715  {
717  }
718  else
719  {
721  }
722 
724  {
726  status = -1;
727  }
728 
729  return status;
730 }
731 
732 
733 void CobFrameTracker::jointstateCallback(const sensor_msgs::JointState::ConstPtr& msg)
734 {
735  KDL::JntArray q_temp = last_q_;
736  KDL::JntArray q_dot_temp = last_q_dot_;
737  int count = 0;
738  for (unsigned int j = 0; j < dof_; j++)
739  {
740  for (unsigned int i = 0; i < msg->name.size(); i++)
741  {
742  if (strcmp(msg->name[i].c_str(), joints_[j].c_str()) == 0)
743  {
744  q_temp(j) = msg->position[i];
745  q_dot_temp(j) = msg->velocity[i];
746  count++;
747  break;
748  }
749  }
750  }
751  if (count == joints_.size())
752  {
753  last_q_ = q_temp;
754  last_q_dot_ = q_dot_temp;
756  KDL::FrameVel FrameVel;
759  int ret = jntToCartSolver_vel_->JntToCart(jntArrayVel, FrameVel, -1);
760  if (ret >= 0)
761  {
762  KDL::Twist twist = FrameVel.GetTwist();
763  current_twist_ = twist;
764  }
765  else
766  {
767  ROS_ERROR("ChainFkSolverVel failed!");
768  }
770  }
771 }
772 
773 void CobFrameTracker::reconfigureCallback(cob_frame_tracker::FrameTrackerConfig& config, uint32_t level)
774 {
775  enable_abortion_checking_ = config.enable_abortion_checking;
776  cart_min_dist_threshold_lin_ = config.cart_min_dist_threshold_lin;
777  cart_min_dist_threshold_rot_ = config.cart_min_dist_threshold_rot;
778  twist_dead_threshold_lin_ = config.twist_dead_threshold_lin;
779  twist_dead_threshold_rot_ = config.twist_dead_threshold_rot;
780  twist_deviation_threshold_lin_ = config.twist_deviation_threshold_lin;
781  twist_deviation_threshold_rot_ = config.twist_deviation_threshold_rot;
782 }
783 
786 {
787  if (fabs(current.vel.x()) > twist_dead_threshold_lin_)
788  {
789  return false;
790  }
791  if (fabs(current.vel.y()) > twist_dead_threshold_lin_)
792  {
793  return false;
794  }
795  if (fabs(current.vel.z()) > twist_dead_threshold_lin_)
796  {
797  return false;
798  }
799  if (fabs(current.rot.x()) > twist_dead_threshold_rot_)
800  {
801  return false;
802  }
803  if (fabs(current.rot.y()) > twist_dead_threshold_rot_)
804  {
805  return false;
806  }
807  if (fabs(current.rot.z()) > twist_dead_threshold_rot_)
808  {
809  return false;
810  }
811 
813  return true;
814 }
815 
817 bool CobFrameTracker::checkCartDistanceViolation(const double dist, const double rot)
818 {
819  if (dist > cart_min_dist_threshold_lin_)
820  {
821  return true;
822  }
824  {
825  return true;
826  }
827 
829  return false;
830 }
831 
834 {
835  if (fabs(current.vel.x() - target.vel.x()) > twist_deviation_threshold_lin_)
836  {
837  return true;
838  }
839  if (fabs(current.vel.y() - target.vel.y()) > twist_deviation_threshold_lin_)
840  {
841  return true;
842  }
843  if (fabs(current.vel.z() - target.vel.z()) > twist_deviation_threshold_lin_)
844  {
845  return true;
846  }
847  if (fabs(current.rot.x() - target.rot.x()) > twist_deviation_threshold_rot_)
848  {
849  return true;
850  }
851  if (fabs(current.rot.y() - target.rot.y()) > twist_deviation_threshold_rot_)
852  {
853  return true;
854  }
855  if (fabs(current.rot.z() - target.rot.z()) > twist_deviation_threshold_rot_)
856  {
857  return true;
858  }
859 
861  return false;
862 }
ServiceClient serviceClient(const std::string &service_name, bool persistent=false, const M_string &header_values=M_string())
std::string chain_tip_link_
static Twist Zero()
std::string chain_base_link_
double twist_dead_threshold_rot_
void publish(const boost::shared_ptr< M > &message) const
KDL::Twist target_twist_
bool getTransform(const std::string &from, const std::string &to, tf::StampedTransform &stamped_tf)
ros::Time tracking_start_time_
KDL::JntArray last_q_dot_
actionlib::SimpleActionServer< cob_frame_tracker::FrameTrackingAction > SAS_FrameTrackingAction_t
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
Vector vel
std::string tracking_frame_
boost::shared_ptr< KDL::ChainFkSolverVel_recursive > jntToCartSolver_vel_
bool call(MReq &req, MRes &res)
ros::ServiceServer start_tracking_server_
IMETHOD Twist GetTwist() const
void start()
boost::shared_ptr< dynamic_reconfigure::Server< cob_frame_tracker::FrameTrackerConfig > > reconfigure_server_
ros::ServiceServer stop_server_
void jointstateCallback(const sensor_msgs::JointState::ConstPtr &msg)
void run(const ros::TimerEvent &event)
control_toolbox::Pid pid_controller_rot_z_
cob_frame_tracker::FrameTrackingResult action_result_
double twist_dead_threshold_lin_
void reconfigureCallback(cob_frame_tracker::FrameTrackerConfig &config, uint32_t level)
ServiceServer advertiseService(const std::string &service, bool(T::*srv_func)(MReq &, MRes &), T *obj)
#define ROS_WARN(...)
double twist_deviation_threshold_lin_
KDL::Twist current_twist_
double z() const
boost::recursive_mutex reconfig_mutex_
bool waitForTransform(const std::string &target_frame, const std::string &source_frame, const ros::Time &time, const ros::Duration &timeout, const ros::Duration &polling_sleep_duration=ros::Duration(0.01), std::string *error_msg=NULL) const
double twist_deviation_threshold_rot_
TFSIMD_FORCE_INLINE const tfScalar & x() const
bool init(const ros::NodeHandle &n, const bool quiet=false)
unsigned int abortion_counter_
bool checkInfinitesimalTwist(const KDL::Twist current)
control_toolbox::Pid pid_controller_trans_z_
control_toolbox::Pid pid_controller_rot_y_
TFSIMD_FORCE_INLINE const tfScalar & z() const
cob_frame_tracker::FrameTrackingFeedback action_feedback_
Vector rot
double y() const
double computeCommand(double error, ros::Duration dt)
#define ROS_INFO(...)
double x() const
tf::TransformListener tf_listener_
TFSIMD_FORCE_INLINE const tfScalar & y() const
tf::StampedTransform transform_tf
Timer createTimer(Rate r, Handler h, Obj o, bool oneshot=false, bool autostart=true) const
boost::shared_ptr< SAS_FrameTrackingAction_t > as_
bool checkCartDistanceViolation(const double dist, const double rot)
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
unsigned int getNrOfJoints() const
INLINE Rall1d< T, V, S > sqrt(const Rall1d< T, V, S > &arg)
void publishHoldTwist(const ros::Duration &period)
#define ROS_DEBUG_STREAM(args)
TFSIMD_FORCE_INLINE Vector3 & getOrigin()
void lookupTransform(const std::string &target_frame, const std::string &source_frame, const ros::Time &time, StampedTransform &transform) const
bool checkTwistViolation(const KDL::Twist current, const KDL::Twist target)
KDL::Chain chain_
KDL Conversion.
INLINE Rall1d< T, V, S > pow(const Rall1d< T, V, S > &arg, double m)
bool stopCallback(std_srvs::Trigger::Request &request, std_srvs::Trigger::Response &response)
std::string target_frame_
bool getChain(const std::string &chain_root, const std::string &chain_tip, Chain &chain) const
bool startLookatCallback(cob_srvs::SetString::Request &request, cob_srvs::SetString::Response &response)
KDL_PARSER_PUBLIC bool treeFromParam(const std::string &param, KDL::Tree &tree)
std::string lookat_focus_frame_
#define ROS_INFO_STREAM(args)
std::vector< std::string > joints_
Quaternion getRotation() const
KDL::JntArray last_q_
double cart_min_dist_threshold_lin_
bool getParam(const std::string &key, std::string &s) const
void publishTwist(ros::Duration period, bool do_publish=true)
ros::Publisher error_pub_
control_toolbox::Pid pid_controller_trans_y_
bool startTrackingCallback(cob_srvs::SetString::Request &request, cob_srvs::SetString::Response &response)
void goalCB()
Action interface.
static Time now()
int checkStatus()
ABORTION CRITERIA:
unsigned int max_abortions_
control_toolbox::Pid pid_controller_trans_x_
ros::Subscriber jointstate_sub_
bool hasParam(const std::string &key) const
#define ROS_ERROR_STREAM(args)
ros::ServiceClient reconfigure_client_
#define ROS_ERROR_STREAM_THROTTLE(rate, args)
#define ROS_ERROR(...)
control_toolbox::Pid pid_controller_rot_x_
bool frameExists(const std::string &frame_id_str) const
std::string action_name_
Action interface.
ros::ServiceServer start_lookat_server_
ros::Publisher twist_pub_
double cart_min_dist_threshold_rot_


cob_frame_tracker
Author(s): Felix Messmer
autogenerated on Thu Apr 8 2021 02:39:38