roch_hardware.cpp
Go to the documentation of this file.
1 
33 #include <boost/assign/list_of.hpp>
34 #include <float.h>
35 
36 
37 namespace
38 {
39  const uint8_t LEFT = 0, RIGHT = 1;
40 };
41 namespace roch_base
42 {
43 
47  rochHardware::rochHardware(ros::NodeHandle nh, ros::NodeHandle private_nh, double target_control_freq)
48  :
49  nh_(nh),
50  private_nh_(private_nh),
51  system_status_task_(roch_status_msg_),
52  power_status_task_(roch_status_msg_),
53  safety_status_task_(roch_status_msg_),
54  software_status_task_(roch_status_msg_, target_control_freq)
55  {
56  private_nh_.param<double>("wheel_diameter", wheel_diameter_, 0.095);
57  private_nh_.param<double>("max_accel", max_accel_, 5.0);
58  private_nh_.param<double>("max_speed", max_speed_, 0.45);
59  private_nh_.param<double>("polling_timeout_", polling_timeout_, 20.0);
60  private_nh_.param<double>("cliff_hegiht", cliff_height_, 0.1); //how tall can scan(meter)
61  private_nh_.param<double>("ult_length", ult_length_, 0.1); //how far can scan(meter)
62  private_nh_.param<double>("psd_length", PSD_length_, 0.1); //how far can scan(meter)
63  private_nh_.param<std::string>("imu_link_frame", gyro_link_frame_, "imu_link");
64 
65  std::string port;
66  private_nh_.param<std::string>("port", port, "/dev/ttyUSB0");
67 
68  core::connect(port);
69  core::configureLimits(max_speed_, max_accel_);
73  }
74 
79  {
83  if (enc)
84  {
85  for (int i = 0; i < 2; i++)
86  {
87  joints_[i].position_offset = linearToAngular(enc->getTravel(i % 2));
88  ROS_DEBUG_STREAM("joints_["<<i<<"].position_offset:"<<joints_[i].position_offset<<" .");
89  }
90  }
91  else
92  {
93  ROS_ERROR("Could not get encoder data to calibrate travel offset");
94  }
95 
96  //add imu data from IMU
100  if(imuRateData){
101  ROS_DEBUG_STREAM("Received imu rate data information (Angle:" << imuRateData->getAngle() << " Angle rate:" << imuRateData->getAngleRate() << ")");
102  ROS_DEBUG_STREAM("Received imu rate data information, angle_offset:"<<imuRateData->getAngle()<<" .");
103  sixGyro.angle_offset = imuRateData->getAngle();
104  }
105  else{
106  ROS_ERROR("Could not get imu data to calibrate rate offset");
107  }
110  publishRawData();
111  if(getPlatformAccData){
112 
113  ROS_DEBUG_STREAM("Received acc_x:"<<getPlatformAccData->getX()<<", acc_y:"<<getPlatformAccData->getY()<<", acc_z:"<<getPlatformAccData->getZ()<<".");
114 
115  sixGyro.acc.X_Offset = getPlatformAccData->getX();
116  sixGyro.acc.Y_Offset = getPlatformAccData->getY();
117  sixGyro.acc.Z_Offset = getPlatformAccData->getZ();
118 
122  }
123  else{
124  ROS_ERROR("Could not get Gyro data to calibrate Acceleration offset");
125  }
126  }
127 
129  {
132  publishRawData();
133  if(rangefinderData){
134  ROS_DEBUG_STREAM("Received rangefinder Data, counts:"<<(int)rangefinderData->getRangefinderCount()<<", data[0]:"<<rangefinderData->getDistance(0)<<" , data[1]:"<<rangefinderData->getDistance(1)<<", data[2]:"<<rangefinderData->getDistance(2)<<" , data[3]:"<<rangefinderData->getDistance(3)<<", data[4]:"<<rangefinderData->getDistance(4)<<".");
135 
136  publishCliffEvent(rangefinderData->getDistance(6),rangefinderData->getDistance(7));
137  publishUltEvent(rangefinderData->getDistance(0),rangefinderData->getDistance(1),rangefinderData->getDistance(2));
138  publishPSDEvent(rangefinderData->getDistance(3),rangefinderData->getDistance(4),rangefinderData->getDistance(5));
139  }
140 
143  publishRawData();
144  if(rangefinderDataAndTime){
145  ROS_DEBUG_STREAM("Received rangefinder Data and time, counts:"<<(int)rangefinderDataAndTime->getRangefinderCount()<<
146  ", data[0]:"<<rangefinderDataAndTime->getDistance(0)<<", time[0]:"<<rangefinderDataAndTime->getAcquisitionTime(0)<<
147  ", data[1]:"<<rangefinderDataAndTime->getDistance(0)<<", time[1]:"<<rangefinderDataAndTime->getAcquisitionTime(0)<<
148  ", data[2]:"<<rangefinderDataAndTime->getDistance(0)<<", time[2]:"<<rangefinderDataAndTime->getAcquisitionTime(0)<<
149  ", data[3]:"<<rangefinderDataAndTime->getDistance(0)<<", time[3]:"<<rangefinderDataAndTime->getAcquisitionTime(0)<<
150  ", data[4]:"<<rangefinderDataAndTime->getDistance(0)<<", time[4]:"<<rangefinderDataAndTime->getAcquisitionTime(0)<<".");
151  }
152  }
153 
155  {
156 
159  publishRawData();
160  if(getPlatformAccData){
161 
162  ROS_DEBUG_STREAM("Received acc_x:"<<getPlatformAccData->getX()<<", acc_y:"<<getPlatformAccData->getY()<<", acc_z:"<<getPlatformAccData->getZ()<<".");
163 
164  sixGyro.acc.X = getPlatformAccData->getX() - sixGyro.acc.X_Offset;
165  sixGyro.acc.Y = getPlatformAccData->getY() - sixGyro.acc.Y_Offset;
166  sixGyro.acc.Z = getPlatformAccData->getZ() - sixGyro.acc.Z_Offset;
167 
172  }
173 
174  }
175 
177  {
180  publishRawData();
181 
182  if(getPlatformName){
183  ROS_DEBUG_STREAM("Received platform name:"<<getPlatformName->getName());
184  }
185 
186  }
187 
189  {
190 
193  publishRawData();
194  if(getDifferentControlConstantData){
195  ROS_DEBUG_STREAM("Received Data of Differential Control Data, Left_P:"<<getDifferentControlConstantData->getLeftP()<<", Left_I:"<<getDifferentControlConstantData->getLeftI()<<", Left_D:"<<getDifferentControlConstantData->getLeftD()<<
196  ",right_P:"<<getDifferentControlConstantData->getRightP()<<", right_I:"<<getDifferentControlConstantData->getRightI()<<", right_D:"<<getDifferentControlConstantData->getRightD()<<".");
197 
198  }
199 
200  }
201 
202 
207  {
210  if(info){
211  std::ostringstream hardware_id_stream;
212  hardware_id_stream << "roch " << info->getModel() << "-" << info->getSerial();
213  diagnostic_updater_.setHardwareID(hardware_id_stream.str());
218  }
219  diagnostic_publisher_ = nh_.advertise<roch_msgs::RochStatus>("status", 10);
220  raw_data_command_publisher_ = nh_.advertise<std_msgs::String>("debug/raw_data_command",100);
221 
222  //Obstacle detection publish
223  cliff_event_publisher_ = nh_.advertise < roch_msgs::CliffEvent > ("events/cliff", 100);
224  psd_event_publisher_ = nh_.advertise < roch_msgs::PSDEvent > ("events/psd", 100);
225  ult_event_publisher_ = nh_.advertise < roch_msgs::UltEvent > ("events/ult", 100);
226  sensor_state_publisher_ = nh_.advertise < roch_msgs::SensorState > ("core_sensors", 100);
227  }
228 
229 
234  {
235  ros::V_string joint_names = boost::assign::list_of("front_left_wheel")
236  ("front_right_wheel");
237  imuMsgData.name="roch_sensor_controller/imu/data";
239 
240  orientation_covariance[0] = 0.001*0.001;
241  orientation_covariance[1] = 0;
242  orientation_covariance[2] = 0;
243  orientation_covariance[3] = 0;
244  orientation_covariance[4] = 0.001*0.001;
245  orientation_covariance[5] = 0;
246  orientation_covariance[6] = 0;
247  orientation_covariance[7] = 0;
248  orientation_covariance[8] = 0.001*0.001;
249 
250  angular_velocity_covariance[0] = 0.001*0.001;
254  angular_velocity_covariance[4] = 0.001*0.001;
258  angular_velocity_covariance[8] = 0.001*0.001;
259 
260  linear_acceleration_covariance[0] = 0.001*0.001;
264  linear_acceleration_covariance[4] = 0.001*0.001;
268  linear_acceleration_covariance[8] = 0.001*0.001;
269 
270  geometry_msgs::Quaternion orien = tf::createQuaternionMsgFromRollPitchYaw(0.0, 0.0, sixGyro.angle);
271  orientation[0] = orien.y;
272  orientation[1] = orien.x;
273  orientation[2] = orien.z;
274  orientation[3] = orien.w;
279  angular_velocity[0] = 0.0;
280  angular_velocity[1] = 0.0;
283 
287 
289  for (unsigned int i = 0; i < joint_names.size(); i++)
290  {
291  hardware_interface::JointStateHandle joint_state_handle(joint_names[i],
292  &joints_[i].position, &joints_[i].velocity,
293  &joints_[i].effort);
294  joint_state_interface_.registerHandle(joint_state_handle);
295 
296  hardware_interface::JointHandle joint_handle(
297  joint_state_handle, &joints_[i].velocity_command);
299  std::cout<<"Received joint_names["<<i<<"]:"<<joint_names[i]<<std::endl;
300  ROS_DEBUG_STREAM("Received joint["<<i<<"].position:"<<joints_[i].position<<", joint["<<i<<"].velocity:"<<joints_[i].velocity<<", joint["<<i<<"].effort:"<<joints_[i].effort<<".");
301  }
303 
304  imu_sensor_interface_.registerHandle(imu_sensor_handle);
308  }
309 
314  {
316  roch_status_msg_.header.stamp = ros::Time::now();
318  }
319 
320 
325  {
326 
327  for(int i=0;i<2;i++){
328  ROS_DEBUG_STREAM("Received joint["<<i<<"].position:"<<joints_[i].position<<", joint["<<i<<"].velocity:"<<joints_[i].velocity<<", joint["<<i<<"].effort:"<<joints_[i].effort<<".");
329  }
330 
333  publishRawData();
334 
335  if (enc)
336  {
337  ROS_DEBUG_STREAM("Received travel information (L:" << enc->getTravel(LEFT) << " R:" << enc->getTravel(RIGHT) << ")");
338  for (int i = 0; i < 2; i++)
339  {
340  double delta = linearToAngular(enc->getTravel(i % 2)) - joints_[i].position - joints_[i].position_offset;
341  // detect suspiciously large readings, possibly from encoder rollover
342  if (std::abs(delta) < 2.0)
343  {
344  joints_[i].position += delta;
345  ROS_DEBUG_STREAM("jiounts_["<<i<<"].postion:"<<joints_[i].position<<",delta:"<<delta<<".");
346  }
347  else
348  {
349  // suspicious! drop this measurement and update the offset for subsequent readings
350  joints_[i].position_offset += delta;
351  ROS_DEBUG_STREAM("jiounts_["<<i<<"].position_offset:"<<joints_[i].position_offset<<",delta:"<<delta<<".");
352  }
353  }
354 
355  }
358  publishRawData();
359  if (speed)
360  {
361  ROS_DEBUG_STREAM("Received linear speed information (L:" << speed->getLeftSpeed() << " R:" << speed->getRightSpeed() << ")");
362  for (int i = 0; i < 2; i++)
363  {
364  if (i % 2 == LEFT)
365  {
366  joints_[i].velocity = linearToAngular(speed->getLeftSpeed());
367  ROS_DEBUG_STREAM("jiounts_["<<i<<"].velocity:"<<joints_[i].velocity<<".");
368  }
369  else
370  { // assume RIGHT
371  ROS_DEBUG_STREAM("jiounts_["<<i<<"].velocity:"<<joints_[i].velocity<<".");
372  joints_[i].velocity = linearToAngular(speed->getRightSpeed());
373  }
374  }
375  }
378  publishRawData();
379  if (overallspeed)
380  {
381  ROS_DEBUG_STREAM("Received speed information (speed:" << overallspeed->getTranslational() << " Rotational:" << overallspeed->getRotational()<<" Acceleration:"<<overallspeed->getTransAccel() << ")");
382  }
383 
386  publishRawData();
387  if(imuRateData){
388  ROS_DEBUG_STREAM("Received imu rate data information (Angle:" << imuRateData->getAngle() << " Angle rate:" << imuRateData->getAngleRate() << ")");
389  sixGyro.angle = imuRateData->getAngle() - sixGyro.angle_offset;
390  sixGyro.angle_rate = imuRateData->getAngleRate();
391 
392  geometry_msgs::Quaternion orien = tf::createQuaternionMsgFromRollPitchYaw(0.0, 0.0, sixGyro.angle);
393  orientation[0] = orien.x;
394  orientation[1] = orien.y;
395  orientation[2] = orien.z;
396  orientation[3] = orien.w;
398  ROS_DEBUG_STREAM("Received imu msg data, orientation.x:"<<imuMsgData.orientation[0]<<", orientation.y:"<<imuMsgData.orientation[1]<<", orientation.z:"<<imuMsgData.orientation[2]<<", orientation.w:"<<imuMsgData.orientation[3]<<".");
399 
400  angular_velocity[0] = 0.0;
401  angular_velocity[1] = 0.0;
404  }
405  getPlatAccData();
408  getPlatformName();
409  }
410 
415  {
416  double diff_speed_left = angularToLinear(joints_[LEFT].velocity_command);
417  double diff_speed_right = angularToLinear(joints_[RIGHT].velocity_command);
418 
419  ROS_DEBUG_STREAM("diff_speed_left:"<<diff_speed_left<<",joints_[LEFT].velocity_command:"<<joints_[LEFT].velocity_command<<".");
420  ROS_DEBUG_STREAM("diff_speed_right:"<<diff_speed_left<<",joints_[RIGHT].velocity_command:"<<joints_[RIGHT].velocity_command<<".");
421 
422  limitDifferentialSpeed(diff_speed_left, diff_speed_right);
423  core::controlSpeed(diff_speed_left, diff_speed_right, max_accel_, max_accel_);
424  publishRawData();
425 
427  }
428 
433  {
434  double diff_speed_left = angularToLinear(joints_[LEFT].velocity_command);
435  double diff_speed_right = angularToLinear(joints_[RIGHT].velocity_command);
436  limitDifferentialSpeed(diff_speed_left, diff_speed_right);
437  publishRawData();
438  core::controloverallSpeed(diff_speed_left, diff_speed_right, max_accel_, max_accel_);
439  publishRawData();
440  }
441 
443  {
444  if ( raw_data_command_publisher_.getNumSubscribers() > 0 ) { // do not do string processing if there is no-one listening.
445  std::ostringstream ostream;
447  ostream << "{ " ;
448  ostream << std::setfill('0') << std::uppercase;
449  for (unsigned int i=0; i < data.length; i++)
450  ostream << std::hex << std::setw(2) << static_cast<unsigned int>(data.data[i]) << " " << std::dec;
451  ostream << "}";
452  std_msgs::StringPtr msg(new std_msgs::String);
453  msg->data = ostream.str();
454  if (ros::ok())
455  {
457  }
458  }
459  }
460 
461  void rochHardware::publishCliffEvent(const double &left, const double &right)
462  {
464  if(left>cliff_height_)
466  else
468  leftcliffevent.leftbottom = left;
469 
471  if(right>cliff_height_)
473  else
475  rightcliffevent.rightbottom = right;
476 
478  {
479  roch_msgs::CliffEventPtr msg(new roch_msgs::CliffEvent);
480  switch(leftcliffevent.state) {
481  case(CliffEvent::Floor) : { msg->leftState = roch_msgs::CliffEvent::FLOOR; break; }
482  case(CliffEvent::Cliff) : { msg->leftState = roch_msgs::CliffEvent::CLIFF; break; }
483  default: break;
484  }
485  switch(rightcliffevent.state) {
486  case(CliffEvent::Floor) : { msg->rightState = roch_msgs::CliffEvent::FLOOR; break; }
487  case(CliffEvent::Cliff) : { msg->rightState = roch_msgs::CliffEvent::CLIFF; break; }
488  default: break;
489  }
490  msg->leftSensor = roch_msgs::CliffEvent::LEFT;
491  msg->rightSensor = roch_msgs::CliffEvent::RIGHT;
492  msg->leftBottom = leftcliffevent.leftbottom;
493  msg->rightBottom = rightcliffevent.rightbottom;
495  }
496  }
497 
498  void rochHardware::publishUltEvent(const double &left, const double &center, const double &right){
499 
501  if(left<ult_length_)
503  else
505  leftultevent.leftbottom = left;
506 
508  if(center<ult_length_)
510  else
512  centerultevent.centerbottom = center;
513 
515  if(right<ult_length_)
517  else
519  rightultevent.rightbottom = right;
520 
522  {
523  roch_msgs::UltEventPtr msg(new roch_msgs::UltEvent);
524  switch(leftultevent.state) {
525  case(UltEvent::Normal) : { msg->leftState = roch_msgs::UltEvent::NORMAL; break; }
526  case(UltEvent::Near) : { msg->leftState = roch_msgs::UltEvent::NEAR; break; }
527  default: break;
528  }
529  switch(centerultevent.state) {
530  case(UltEvent::Normal) : { msg->centerState = roch_msgs::UltEvent::NORMAL; break; }
531  case(UltEvent::Near) : { msg->centerState = roch_msgs::UltEvent::NEAR; break; }
532  default: break;
533  }
534  switch(rightultevent.state) {
535  case(UltEvent::Normal) : { msg->rightState = roch_msgs::UltEvent::NORMAL; break; }
536  case(UltEvent::Near) : { msg->rightState = roch_msgs::UltEvent::NEAR; break; }
537  default: break;
538  }
539  msg->leftSensor = roch_msgs::UltEvent::LEFT;
540  msg->centerSensor = roch_msgs::UltEvent::CENTER;
541  msg->rightSensor = roch_msgs::UltEvent::RIGHT;
542  msg->leftBottom = leftultevent.leftbottom;
543  msg->centerBottom = centerultevent.centerbottom;
544  msg->rightBottom = rightultevent.rightbottom;
546  }
547  }
548 
549 
550  /*****************************************************************************
551  ** Publish Sensor Stream Workers
552  *****************************************************************************/
554  {
556  cliffbottom.clear();
557  ultbottom.clear();
558  psdbottom.clear();
559  roch_msgs::SensorState statecore;
560  statecore.header.stamp = ros::Time::now();
561  statecore.leftcliff = leftcliffevent.state;
562  statecore.rightcliff = rightcliffevent.state;
563  statecore.leftult = leftultevent.state;
564  statecore.centerult = centerultevent.state;
565  statecore.rightult = rightultevent.state;
566  statecore.leftpsd = leftpsdevent.state;
567  statecore.centerpsd = centerpsdevent.state;
568  statecore.rightpsd = rightpsdevent.state;
569 
572 
573  ultbottom.push_back(leftultevent.leftbottom);
576 
577  psdbottom.push_back(leftpsdevent.leftbottom);
580  statecore.cliffbottom = cliffbottom;
581  statecore.ultbottom = ultbottom;
582  statecore.psdbottom = psdbottom;
583  sensor_state_publisher_.publish(statecore);
584  }
585  }
586 
587  void rochHardware::publishPSDEvent(const double& left, const double& center, const double& right)
588  {
589 
591  if(left<PSD_length_)
593  else
595  leftpsdevent.leftbottom = left;
596 
598  if(center<PSD_length_)
600  else
602  centerpsdevent.centerbottom = center;
603 
605  if(right<PSD_length_)
607  else
609  rightpsdevent.rightbottom = right;
610 
612  {
613  roch_msgs::PSDEventPtr msg(new roch_msgs::PSDEvent);
614  switch(leftpsdevent.state) {
615  case(PSDEvent::Normal) : { msg->leftState = roch_msgs::PSDEvent::NORMAL; break; }
616  case(PSDEvent::Near) : { msg->leftState = roch_msgs::PSDEvent::NEAR; break; }
617  default: break;
618  }
619  switch(centerpsdevent.state) {
620  case(PSDEvent::Normal) : { msg->centerState = roch_msgs::PSDEvent::NORMAL; break; }
621  case(PSDEvent::Near) : { msg->centerState = roch_msgs::PSDEvent::NEAR; break; }
622  default: break;
623  }
624  switch(rightpsdevent.state) {
625  case(PSDEvent::Normal) : { msg->rightState = roch_msgs::PSDEvent::NORMAL; break; }
626  case(PSDEvent::Near) : { msg->rightState = roch_msgs::PSDEvent::NEAR; break; }
627  default: break;
628  }
629  msg->leftSensor = roch_msgs::PSDEvent::LEFT;
630  msg->centerSensor = roch_msgs::PSDEvent::CENTER;
631  msg->rightSensor = roch_msgs::PSDEvent::RIGHT;
632  msg->leftBottom = leftpsdevent.leftbottom;
633  msg->centerBottom = centerpsdevent.centerbottom;
634  msg->rightBottom = rightpsdevent.rightbottom;
636  }
637  }
638 
643  {
645  }
646 
650  void rochHardware::limitDifferentialSpeed(double &diff_speed_left, double &diff_speed_right)
651  {
652  double large_speed = std::max(std::abs(diff_speed_left), std::abs(diff_speed_right));
653 
654  if (large_speed > max_speed_)
655  {
656  diff_speed_left *= max_speed_ / large_speed;
657  diff_speed_right *= max_speed_ / large_speed;
658  }
659  }
660 
664  double rochHardware::linearToAngular(const double &travel) const
665  {
666  return travel / wheel_diameter_ * 2;
667  }
668 
672  double rochHardware::angularToLinear(const double &angle) const
673  {
674  return angle * wheel_diameter_ / 2;
675  }
676 
677 
678 } // namespace roch_base
msg
void publishPSDEvent(const double &left, const double &center, const double &right)
hardware_interface::JointStateInterface joint_state_interface_
ros::Publisher raw_data_command_publisher_
rochSoftwareDiagnosticTask software_status_task_
ros::Publisher diagnostic_publisher_
void reportLoopDuration(const ros::Duration &duration)
void publishUltEvent(const double &left, const double &center, const double &right)
void publish(const boost::shared_ptr< M > &message) const
double linearToAngular(const double &travel) const
ros::Publisher ult_event_publisher_
void limitDifferentialSpeed(double &travel_speed_left, double &travel_speed_right)
hardware_interface::VelocityJointInterface velocity_joint_interface_
roch_driver::RawData getdata()
Definition: Transport.h:103
void setHardwareID(const std::string &hwid)
static Transport & instance()
Definition: Transport.cpp:129
void updateControlFrequency(double frequency)
ros::Publisher cliff_event_publisher_
void add(const std::string &name, TaskFunction f)
std::vector< double > psdbottom
data
double angularToLinear(const double &angle) const
double angular_velocity_covariance[9]
Definition: roch_hardware.h:97
ros::Publisher psd_event_publisher_
struct roch_base::rochHardware::SixAxisGyro sixGyro
double linear_acceleration_covariance[9]
Definition: roch_hardware.h:98
roch_msgs::RochStatus roch_status_msg_
std::string gyro_link_frame_
enum roch_base::rochHardware::PSDEvent::State state
rochHardwareDiagnosticTask< sawyer::DataPowerSystem > power_status_task_
std::vector< std::string > V_string
void writeOverallSpeedCommandsToHardware()
diagnostic_updater::Updater diagnostic_updater_
std::vector< double > ultbottom
rochHardwareDiagnosticTask< sawyer::DataSystemStatus > system_status_task_
bool param(const std::string &param_name, T &param_val, const T &default_val) const
double orientation_covariance[9]
Definition: roch_hardware.h:96
ROSCPP_DECL bool ok()
void connect(std::string port)
void publishCliffEvent(const double &left, const double &right)
void controloverallSpeed(double speed_left, double speed_right, double accel_left, double accel_right)
void controlSpeed(double speed_left, double speed_right, double accel_left, double accel_right)
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
ros::Publisher sensor_state_publisher_
enum roch_base::rochHardware::CliffEvent::Sensor sensor
#define ROS_DEBUG_STREAM(args)
void registerHandle(const JointStateHandle &handle)
hardware_interface::ImuSensorHandle::Data imuMsgData
Definition: roch_hardware.h:94
ros::NodeHandle private_nh_
hardware_interface::ImuSensorInterface imu_sensor_interface_
uint32_t getNumSubscribers() const
unsigned char data[MAX_MSG_LENGTH]
Definition: serial.h:62
rochHardwareDiagnosticTask< sawyer::DataSafetySystemStatus > safety_status_task_
enum roch_base::rochHardware::PSDEvent::Sensor sensor
void configureLimits(double max_speed, double max_accel)
enum roch_base::rochHardware::UltEvent::State state
enum roch_base::rochHardware::UltEvent::Sensor sensor
static geometry_msgs::Quaternion createQuaternionMsgFromRollPitchYaw(double roll, double pitch, double yaw)
static Time now()
std::vector< double > cliffbottom
static Ptr requestData(double timeout)
Definition: core_wrapper.h:98
#define ROS_ERROR(...)
struct roch_base::rochHardware::Joint joints_[2]
rochHardware(ros::NodeHandle nh, ros::NodeHandle private_nh, double target_control_freq)
enum roch_base::rochHardware::CliffEvent::State state


roch_base
Author(s): Mike Purvis , Paul Bovbel , Chen
autogenerated on Mon Jun 10 2019 14:41:14