00001 /********************************************************************* 00002 * Software License Agreement (BSD License) 00003 * 00004 * Copyright (c) 2009, Willow Garage, Inc. 00005 * All rights reserved. 00006 * 00007 * Redistribution and use in source and binary forms, with or without 00008 * modification, are permitted provided that the following conditions 00009 * are met: 00010 * 00011 * * Redistributions of source code must retain the above copyright 00012 * notice, this list of conditions and the following disclaimer. 00013 * * Redistributions in binary form must reproduce the above 00014 * copyright notice, this list of conditions and the following 00015 * disclaimer in the documentation and/or other materials provided 00016 * with the distribution. 00017 * * Neither the name of the Willow Garage nor the names of its 00018 * contributors may be used to endorse or promote products derived 00019 * from this software without specific prior written permission. 00020 * 00021 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00022 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00023 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 00024 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 00025 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 00026 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 00027 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00028 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00029 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00030 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 00031 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00032 * POSSIBILITY OF SUCH DAMAGE. 00033 *********************************************************************/ 00034 00037 #include "control_toolbox/sinusoid.h" 00038 #include <cmath> 00039 #include <iostream> 00040 00041 using namespace std; 00042 00043 namespace control_toolbox 00044 { 00045 00046 Sinusoid::Sinusoid(double offset, double amplitude, double frequency, double phase): 00047 offset_(offset), 00048 amplitude_(amplitude), 00049 frequency_(frequency), 00050 phase_(phase) 00051 { 00052 } 00053 00054 bool Sinusoid::initXml(TiXmlElement *ti_xml_element) 00055 { 00056 const char* attr; 00057 attr = ti_xml_element->Attribute("offset"); 00058 offset_ = attr ? atof(attr) : 0.0; 00059 attr = ti_xml_element->Attribute("amplitude"); 00060 amplitude_ = attr ? atof(attr) : 0.0; 00061 attr = ti_xml_element->Attribute("frequency"); 00062 frequency_ = attr ? atof(attr) : 0.0; 00063 attr = ti_xml_element->Attribute("phase"); 00064 phase_ = attr ? atof(attr) : 0.0; 00065 return true; // does not fail for now, we assume a default of 0 for all params 00066 } 00067 00068 Sinusoid::~Sinusoid() 00069 { 00070 } 00071 00072 Sinusoid::Sinusoid() 00073 { 00074 } 00075 00076 double Sinusoid::update(double time, double& qd, double& qdd) 00077 { 00078 double angular_frequency = 2.0*M_PI*frequency_; 00079 double p = phase_ + angular_frequency*time; 00080 double sin_p = sin(p); 00081 double cos_p = cos(p); 00082 double q = offset_ + amplitude_*sin_p; 00083 qd = angular_frequency*amplitude_*cos_p; 00084 qdd = -angular_frequency*angular_frequency*amplitude_*sin_p; 00085 return q; 00086 } 00087 00088 void Sinusoid::debug() 00089 { 00090 cout << "offset=" << offset_ << " amplitude=" << amplitude_ << " phase=" << phase_ << " frequency=" << frequency_ << endl; 00091 } 00092 00093 } // namespace control_toolbox