zyonz_chlorophyll_meter_driver.cpp
Go to the documentation of this file.
00001 #include "zyonz_chlorophyll_meter_driver.h"
00002 
00003 ZyonzChlorophyllMeterDriver::ZyonzChlorophyllMeterDriver(void):
00004 motor_(),
00005 baudrate_(1000000),
00006 bus_id_(0),
00007 servo_id_(255),
00008 max_angle_(-25),
00009 min_angle_(-46),
00010 effort_(10.0)
00011 {
00012 }
00013 
00014 bool ZyonzChlorophyllMeterDriver::openDriver(void)
00015 {
00016     std::string motor_name="chlorophill_meter_motor";
00017 
00018     std::cout << "opening ..." << std::endl;
00019     //setDriverId(driver string id);
00020     if(this->servo_id_==255)
00021     {
00022         ROS_INFO("No servo identifier has been set");
00023         return false;  
00024     }
00025 
00026     try
00027     {
00028         // configure the motor
00029         this->motor_ = boost::shared_ptr<CDynamixelMotor>(new CDynamixelMotor(motor_name, bus_id_, baudrate_, servo_id_));
00030         this->motor_->enable();
00031         this->motor_->set_max_torque(effort_);
00032         this->motor_->set_limit_torque(effort_);
00033     }
00034     catch(CDynamixelMotorException &e)
00035     {
00036         ROS_INFO("%s",e.what().c_str());
00037         return false;
00038     }
00039 
00040     ROS_INFO("Chlorophyll Meter is ready");
00041 
00042     TDynamixel_info info;
00043     motor_->get_servo_info(info);
00044 
00045     ROS_INFO("Motor Model  : %s", info.model.c_str());
00046     ROS_INFO("Firmware Ver.: %d", info.firmware_ver);
00047     ROS_INFO("Gear Ratio   : %d", info.gear_ratio);
00048     ROS_INFO("Encoder Res. : %d", info.encoder_resolution);
00049     ROS_INFO("PID Control  : %d", info.pid_control);
00050     ROS_INFO("Max. Angle   : %f", info.max_angle);
00051     ROS_INFO("Center Angle : %f", info.center_angle);
00052     ROS_INFO("Max. Speed   : %f", info.max_speed);
00053     ROS_INFO("Bus ID.      : %s", info.bus_id.c_str());
00054     ROS_INFO("Baudrate     : %u", info.baudrate);
00055     ROS_INFO("Servo ID.    : %d", info.id);
00056 
00057     return true;
00058 }
00059 
00060 bool ZyonzChlorophyllMeterDriver::closeDriver(void)
00061 {
00062     std::cout << "closing ..." << std::endl;
00063     return true;
00064 }
00065 
00066 bool ZyonzChlorophyllMeterDriver::startDriver(void)
00067 {
00068     std::cout << "starting ..." << std::endl;
00069     return true;
00070 }
00071 
00072 bool ZyonzChlorophyllMeterDriver::stopDriver(void)
00073 {
00074     std::cout << "stoping ..." << std::endl;
00075     return true;
00076 }
00077 
00078 void ZyonzChlorophyllMeterDriver::config_update(Config& new_cfg, uint32_t level)
00079 {
00080     this->lock();
00081 
00082     // depending on current state
00083     // update driver with new_cfg data
00084     switch(this->getState())
00085     {
00086         case ZyonzChlorophyllMeterDriver::CLOSED:
00087             // save the new values into the class
00088             this->servo_id_  = new_cfg.servo_id;
00089             this->bus_id_    = new_cfg.bus_id;
00090             this->baudrate_  = new_cfg.baudrate;
00091             this->max_angle_ = new_cfg.max_angle;
00092             this->min_angle_ = new_cfg.min_angle;
00093             this->effort_    = new_cfg.effort;
00094             break;
00095 
00096         case ZyonzChlorophyllMeterDriver::OPENED:
00097             break;
00098 
00099         case ZyonzChlorophyllMeterDriver::RUNNING:
00100             try{
00101                 this->motor_->set_max_torque(new_cfg.effort);
00102                 this->motor_->set_limit_torque(new_cfg.effort);
00103                 // save the new values into the class
00104                 this->max_angle_ = new_cfg.max_angle;
00105                 this->min_angle_ = new_cfg.min_angle;
00106                 this->effort_    = new_cfg.effort;
00107             }catch(CException &e){
00108                 ROS_ERROR("%s",e.what().c_str());
00109                 new_cfg.max_angle=this->max_angle_;
00110                 new_cfg.min_angle=this->min_angle_;
00111                 new_cfg.effort=this->effort_;
00112             }
00113             break;
00114     }
00115 
00116     // save the current configuration
00117     this->config_=new_cfg;
00118 
00119     this->unlock();
00120 }
00121 
00122 bool ZyonzChlorophyllMeterDriver::open_meter(void)
00123 {
00124     return move_gripper(max_angle_);
00125 }
00126 
00127 bool ZyonzChlorophyllMeterDriver::close_meter(void)
00128 {
00129     return move_gripper(min_angle_);
00130 }
00131 
00132 void ZyonzChlorophyllMeterDriver::stop_meter(void)
00133 {
00134     if (this->getState() != ZyonzChlorophyllMeterDriver::CLOSED)
00135     {
00136         try
00137         {
00138             this->motor_->stop();
00139             this->motor_->disable();
00140         }
00141         catch (CDynamixelMotorException &e)
00142         {
00143             ROS_ERROR("%s", e.what().c_str());
00144         }
00145     }
00146 }
00147 
00148 float ZyonzChlorophyllMeterDriver::get_current_effort()
00149 {
00150     return this->motor_->get_current_effort();
00151 }
00152 
00153 float ZyonzChlorophyllMeterDriver::get_max_effort(void)
00154 {
00155     return this->effort_;
00156 }
00157 
00158 float ZyonzChlorophyllMeterDriver::get_current_angle(void)
00159 {
00160     return this->motor_->get_current_angle();
00161 }
00162 
00163 float ZyonzChlorophyllMeterDriver::get_max_angle()
00164 {
00165     return this->max_angle_;
00166 }
00167 
00168 float ZyonzChlorophyllMeterDriver::get_min_angle()
00169 {
00170     return this->min_angle_;
00171 }
00172 
00173 bool ZyonzChlorophyllMeterDriver::is_at_max_angle()
00174 {
00175     float error;
00176     error = abs(this->get_current_angle() - this->get_max_angle());
00177     return (error <= 5.0f);
00178 }
00179 
00180 bool ZyonzChlorophyllMeterDriver::is_at_min_angle()
00181 {
00182     float error;
00183     error = abs(this->get_current_angle() - this->get_min_angle());
00184     return (error <= 5.0f);
00185 }
00186 
00187 void ZyonzChlorophyllMeterDriver::set_baudrate(int baudrate)
00188 {
00189     this->baudrate_ = baudrate;
00190 }
00191 
00192 void ZyonzChlorophyllMeterDriver::set_bus_id(int bus_id)
00193 {
00194     this->bus_id_ = bus_id;
00195 }
00196 
00197 void ZyonzChlorophyllMeterDriver::set_servo_id(unsigned char servo_id)
00198 {
00199     this->servo_id_ = servo_id;
00200 }
00201 
00202 void ZyonzChlorophyllMeterDriver::set_max_angle(double max_angle)
00203 {
00204     this->max_angle_ = max_angle;
00205 }
00206 
00207 void ZyonzChlorophyllMeterDriver::set_min_angle(double min_angle)
00208 {
00209     this->min_angle_ = min_angle;
00210 }
00211 
00212 void ZyonzChlorophyllMeterDriver::set_effort(double effort)
00213 {
00214     this->effort_ = effort;
00215 }
00216 
00217 bool ZyonzChlorophyllMeterDriver::move_gripper(const double position_in_radians)
00218 {
00219     if (this->getState() == ZyonzChlorophyllMeterDriver::CLOSED) {
00220         ROS_WARN("[ZyonzChlorophyllMeterDriver::move_gripper] moving not possible -> driver is CLOSED");
00221         return false;
00222     }
00223 
00224     try
00225     {
00226         this->motor_->stop();
00227         ROS_INFO("Moving the gripper to: %f", position_in_radians);
00228         this->motor_->move_absolute_angle(position_in_radians, 100.0f);
00229     }
00230     catch (CDynamixelMotorException &e)
00231     {
00232         ROS_ERROR("%s", e.what().c_str());
00233         return false;
00234     }
00235 
00236     return true;
00237 }
00238 
00239 ZyonzChlorophyllMeterDriver::~ZyonzChlorophyllMeterDriver(void)
00240 {
00241 }


zyonz_chlorophyll_meter
Author(s): Sergi Hernandez Juan
autogenerated on Fri Dec 6 2013 20:05:20