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
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
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
00083
00084 switch(this->getState())
00085 {
00086 case ZyonzChlorophyllMeterDriver::CLOSED:
00087
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
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
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 }