JointSplineTrajectoryGenerator.cpp
Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2010, Robot Control and Pattern Recognition Group, Warsaw University of Technology.
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions are met:
00007  *
00008  *     * Redistributions of source code must retain the above copyright
00009  *       notice, this list of conditions and the following disclaimer.
00010  *     * Redistributions in binary form must reproduce the above copyright
00011  *       notice, this list of conditions and the following disclaimer in the
00012  *       documentation and/or other materials provided with the distribution.
00013  *     * Neither the name of the Robot Control and Pattern Recognition Group,
00014  *       Warsaw University of Technology nor the names of its contributors may
00015  *       be used to endorse or promote products derived from this software
00016  *       without specific prior written permission.
00017  *
00018  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00019  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00020  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00021  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00022  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00023  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00024  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00025  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00026  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00027  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00028  * POSSIBILITY OF SUCH DAMAGE.
00029  */
00030 
00031 /*
00032  * JointSplineTrajectoryGenerator.cpp
00033  *
00034  *  Created on: 22-09-2010
00035  *      Author: Konrad Banachowicz
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 //  if(command_period_port_.read(dt_) != RTT::NewData)
00101 //    return false;
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      // setpoint_.setpoints[i].velocity = velProfile_[i].Vel(time * dt);
00123      // setpoint_.setpoints[i].acceleration = velProfile_[i].Acc(time * dt);
00124      
00125      //RTT::Logger::log(RTT::Logger::Debug) << "time = " << time_ << " joint [" << i << "] pos : " << des_jnt_pos_[i] << RTT::endlog();
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       //  RTT::Logger::log(RTT::Logger::Debug) << "old : p: " << trajectory_old_.positions[0] << " v: " << trajectory_old_.velocities[0] << " new : p: " << trajectory_new_.positions[0] << " v: " << trajectory_new_.velocities[0] << RTT::endlog();
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         //RTT::Logger::log(RTT::Logger::Debug)  << "trajectory_ready_ = true buffer_ready = " << buffer_ready_ << RTT::endlog();
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; //servo.setpoints[i].velocity;
00198         trajectory_old_.accelerations[i] = 0.0; // servo.setpoints[i].acceleration;
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   //  RTT::Logger::log(RTT::Logger::Debug)      << "trajectory_ready_ = false buffer_ready = " << buffer_ready_ << RTT::endlog();
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 )


joint_spline_trajectory_generator
Author(s): Konrad Banachowicz
autogenerated on Mon Oct 6 2014 03:10:11