Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include <ocl/Component.hpp>
00039
00040 #include <exception>
00041
00042 #include "JointSplineTrajectoryGenerator.h"
00043
00044 JointSplineTrajectoryGenerator::JointSplineTrajectoryGenerator(const std::string& name) : RTT::TaskContext(name, PreOperational), number_of_joints_prop_("number_of_joints", "number of joints used", 0)
00045 {
00046 this->ports()->addPort("trajectory_point", trajectory_point_port_);
00047 this->ports()->addPort("buffer_ready", buffer_ready_port_);
00048 this->ports()->addPort("JointPositionCommand", jnt_pos_port_);
00049 this->ports()->addPort("DesiredJointPosition", cmd_jnt_pos_port_);
00050 this->ports()->addPort("trajectory_compleat", trajectory_compleat_port_);
00051 this->ports()->addEventPort("CommandPeriod", command_period_port_);
00052
00053 this->addProperty(number_of_joints_prop_);
00054
00055 return;
00056 }
00057
00058 JointSplineTrajectoryGenerator::~JointSplineTrajectoryGenerator()
00059 {
00060 return;
00061 }
00062
00063 bool JointSplineTrajectoryGenerator::configureHook()
00064 {
00065 try
00066 {
00067 if ((number_of_joints_ = number_of_joints_prop_.get()) <= 0)
00068 throw std::logic_error("number of joints must be positive");
00069
00070 trajectory_old_.positions.reserve(number_of_joints_);
00071 trajectory_old_.velocities.reserve(number_of_joints_);
00072 trajectory_old_.accelerations.reserve(number_of_joints_);
00073
00074 trajectory_new_.positions.reserve(number_of_joints_);
00075 trajectory_new_.velocities.reserve(number_of_joints_);
00076 trajectory_new_.accelerations.reserve(number_of_joints_);
00077
00078 vel_profile_.resize(number_of_joints_);
00079
00080 des_jnt_pos_.resize(number_of_joints_);
00081 jnt_pos_port_.setDataSample(des_jnt_pos_);
00082
00083 return true;
00084 }
00085 catch (std::exception &e)
00086 {
00087 RTT::Logger::log(RTT::Logger::Error) << e.what() << RTT::endlog();
00088 return false;
00089 }
00090 catch (...)
00091 {
00092 RTT::Logger::log(RTT::Logger::Error) << "unknown exception !!!" << RTT::endlog();
00093 return false;
00094 }
00095 }
00096
00097 bool JointSplineTrajectoryGenerator::startHook()
00098 {
00099
00100
00101
00102
00103 time_ = 0;
00104 trajectory_ready_ = false;
00105 buffer_ready_ = true;
00106
00107 buffer_ready_port_.write(buffer_ready_);
00108
00109 return true;
00110 }
00111
00112 void JointSplineTrajectoryGenerator::updateHook()
00113 {
00114
00115 command_period_port_.read(dt_);
00116
00117 if (trajectory_ready_)
00118 {
00119 for (unsigned int i = 0; i < number_of_joints_; i++)
00120 {
00121 des_jnt_pos_[i] = vel_profile_[i].Pos(dt_ * time_);
00122
00123
00124
00125
00126
00127 }
00128
00129 jnt_pos_port_.write(des_jnt_pos_);
00130
00131 if (time_++ >= end_time_)
00132 {
00133 if (!buffer_ready_)
00134 {
00135 RTT::Logger::log(RTT::Logger::Debug) << "processing trajectory point [trajectory_ready = true]" << RTT::endlog();
00136
00137
00138
00139 for (unsigned int j = 0; j < number_of_joints_; ++j)
00140 {
00141 if (trajectory_old_.accelerations.size() > 0 && trajectory_new_.accelerations.size() > 0)
00142 {
00143 vel_profile_[j].SetProfileDuration(
00144 trajectory_old_.positions[j], trajectory_old_.velocities[j], trajectory_old_.accelerations[j],
00145 trajectory_new_.positions[j], trajectory_new_.velocities[j], trajectory_new_.accelerations[j],
00146 trajectory_new_.time_from_start.toSec());
00147 }
00148 else if (trajectory_old_.velocities.size() > 0 && trajectory_new_.velocities.size() > 0)
00149 {
00150 vel_profile_[j].SetProfileDuration(
00151 trajectory_old_.positions[j], trajectory_old_.velocities[j],
00152 trajectory_new_.positions[j], trajectory_new_.velocities[j],
00153 trajectory_new_.time_from_start.toSec());
00154 }
00155 else
00156 {
00157 vel_profile_[j].SetProfileDuration(trajectory_old_.positions[j], trajectory_new_.positions[j], trajectory_new_.time_from_start.toSec());
00158 }
00159 }
00160
00161 end_time_ = trajectory_new_.time_from_start.toSec()/dt_;
00162 time_ = 0;
00163 trajectory_old_ = trajectory_new_;
00164 buffer_ready_ = true;
00165
00166 buffer_ready_port_.write(buffer_ready_);
00167 }
00168 else
00169 {
00170 RTT::Logger::log(RTT::Logger::Debug) << "generator : trajectory compleat" << RTT::endlog();
00171 trajectory_ready_ = false;
00172 trajectory_compleat_port_.write(true);
00173 }
00174 }
00175 }
00176 else
00177 {
00178 if (!buffer_ready_)
00179 {
00180 RTT::Logger::log(RTT::Logger::Debug) << "processing trajectory point [trajectory_ready = false]" << RTT::endlog();
00181 std::vector<double> servo;
00182 cmd_jnt_pos_port_.read(servo);
00183
00184 trajectory_old_.positions.resize(number_of_joints_);
00185 trajectory_old_.velocities.resize(number_of_joints_);
00186 trajectory_old_.accelerations.resize(number_of_joints_);
00187
00188 if(servo.size() != number_of_joints_)
00189 {
00190 std::cout << "servo.states size : " << servo.size() << " expected : " << number_of_joints_ << std::endl;
00191 return ;
00192 }
00193
00194 for (unsigned int i = 0; i < number_of_joints_; i++)
00195 {
00196 trajectory_old_.positions[i] = servo[i];
00197 trajectory_old_.velocities[i] = 0.0;
00198 trajectory_old_.accelerations[i] = 0.0;
00199 }
00200
00201 for (unsigned int j = 0; j < number_of_joints_; ++j)
00202 {
00203 if (trajectory_old_.accelerations.size() > 0 && trajectory_new_.accelerations.size() > 0)
00204 {
00205 RTT::Logger::log(RTT::Logger::Debug) << "pos " << j << " old : " << trajectory_old_.positions[j] << " new : " << trajectory_new_.positions[j] << RTT::endlog();
00206 RTT::Logger::log(RTT::Logger::Debug) << "vel " << j << " old : " << trajectory_old_.velocities[j] << " new : " << trajectory_new_.velocities[j] << RTT::endlog();
00207 RTT::Logger::log(RTT::Logger::Debug) << "acc " << j << " old : " << trajectory_old_.accelerations[j] << " new : " << trajectory_new_.accelerations[j] << RTT::endlog();
00208 vel_profile_[j].SetProfileDuration(
00209 trajectory_old_.positions[j], trajectory_old_.velocities[j], trajectory_old_.accelerations[j],
00210 trajectory_new_.positions[j], trajectory_new_.velocities[j], trajectory_new_.accelerations[j],
00211 trajectory_new_.time_from_start.toSec());
00212 }
00213 else if (trajectory_old_.velocities.size() > 0 && trajectory_new_.velocities.size() > 0)
00214 {
00215 RTT::Logger::log(RTT::Logger::Debug) << "pos " << j << " old : " << trajectory_old_.positions[j] << " new : " << trajectory_new_.positions[j] << RTT::endlog();
00216 RTT::Logger::log(RTT::Logger::Debug) << "vel " << j << " old : " << trajectory_old_.velocities[j] << " new : " << trajectory_new_.velocities[j] << RTT::endlog();
00217 vel_profile_[j].SetProfileDuration(
00218 trajectory_old_.positions[j], trajectory_old_.velocities[j],
00219 trajectory_new_.positions[j], trajectory_new_.velocities[j],
00220 trajectory_new_.time_from_start.toSec());
00221 }
00222 else
00223 {
00224 RTT::Logger::log(RTT::Logger::Debug) << "pos " << j << " old : " << trajectory_old_.positions[j] << " new : " << trajectory_new_.positions[j] << RTT::endlog();
00225 vel_profile_[j].SetProfileDuration(trajectory_old_.positions[j], trajectory_new_.positions[j], trajectory_new_.time_from_start.toSec());
00226 }
00227 }
00228
00229 RTT::Logger::log(RTT::Logger::Debug) << "time : " << trajectory_new_.time_from_start.toSec() << RTT::endlog();
00230
00231 trajectory_old_ = trajectory_new_;
00232 end_time_ = trajectory_new_.time_from_start.toSec()/dt_;
00233 time_ = 0;
00234 trajectory_ready_ = true;
00235 buffer_ready_ = true;
00236 }
00237
00238 buffer_ready_port_.write(buffer_ready_);
00239
00240 }
00241
00242 if (trajectory_point_port_.read(trajectory_new_) == RTT::NewData)
00243 {
00244 RTT::Logger::log(RTT::Logger::Debug) << "Trajectory point received " << RTT::endlog();
00245
00246 if (!buffer_ready_)
00247 RTT::Logger::log(RTT::Logger::Warning) << "Trajectory point buffer not empty overwriteing " << RTT::endlog();
00248
00249 if (trajectory_new_.positions.size() != number_of_joints_)
00250 {
00251 RTT::Logger::log(RTT::Logger::Error) << "Received trajectory point positions size invalid (received: "
00252 << trajectory_new_.positions.size()
00253 << " expected: "
00254 << number_of_joints_
00255 << ") " << RTT::endlog();
00256 }
00257 else if ((trajectory_new_.velocities.size() != number_of_joints_) && (trajectory_new_.velocities.size() > 0))
00258 {
00259 RTT::Logger::log(RTT::Logger::Error) << "Received trajectory point velocities size invalid (received: "
00260 << trajectory_new_.velocities.size()
00261 << " expected: "
00262 << number_of_joints_
00263 << " or 0) " << RTT::endlog();
00264 }
00265 else if ((trajectory_new_.accelerations.size() != number_of_joints_) && (trajectory_new_.accelerations.size() > 0))
00266 {
00267 RTT::Logger::log(RTT::Logger::Error) << "Received trajectory point accelerations size invalid (received: "
00268 << trajectory_new_.accelerations.size()
00269 << " expected: "
00270 << number_of_joints_
00271 << " or 0) " << RTT::endlog();
00272 }
00273 else if (trajectory_new_.time_from_start.toSec() < 0)
00274 {
00275 RTT::Logger::log(RTT::Logger::Error) << "Received trajectory point time_from_start invalid (<0) " << RTT::endlog();
00276 }
00277 else
00278 {
00279 buffer_ready_ = false;
00280 buffer_ready_port_.write(buffer_ready_);
00281 }
00282 }
00283
00284 return;
00285 }
00286
00287 ORO_CREATE_COMPONENT( JointSplineTrajectoryGenerator )