00001 /* 00002 * Copyright (c) 2014, ISR, University of Coimbra 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 Clearpath Robotics, Inc. nor the names of its 00014 * contributors may be used to endorse or promote products derived from 00015 * this software without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00018 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00019 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00020 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00021 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00022 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00023 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00024 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00025 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00026 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00027 * POSSIBILITY OF SUCH DAMAGE. 00028 * 00029 * Author: Goncalo Cabrita 00030 * Gazebo plugin for the FSR Husky Mine Detection Arm with th goal of solving 00031 * the <mimic> joint tag limitations in Gazebo 00032 */ 00033 00034 #include <gazebo_mimic_plugin/mimic_plugin.h> 00035 00036 using namespace gazebo; 00037 00038 MimicPlugin::MimicPlugin() 00039 { 00040 kill_sim = false; 00041 00042 joint_.reset(); 00043 mimic_joint_.reset(); 00044 } 00045 00046 MimicPlugin::~MimicPlugin() 00047 { 00048 event::Events::DisconnectWorldUpdateBegin(this->updateConnection); 00049 00050 kill_sim = true; 00051 } 00052 00053 void MimicPlugin::Load(physics::ModelPtr _parent, sdf::ElementPtr _sdf ) 00054 { 00055 this->model_ = _parent; 00056 this->world_ = this->model_->GetWorld(); 00057 00058 00059 joint_name_ = "joint"; 00060 if (_sdf->HasElement("joint")) 00061 joint_name_ = _sdf->GetElement("joint")->Get<std::string>(); 00062 00063 mimic_joint_name_ = "mimicJoint"; 00064 if (_sdf->HasElement("mimicJoint")) 00065 mimic_joint_name_ = _sdf->GetElement("mimicJoint")->Get<std::string>(); 00066 00067 multiplier_ = 1.0; 00068 if (_sdf->HasElement("multiplier")) 00069 multiplier_ = _sdf->GetElement("multiplier")->Get<double>(); 00070 00071 00072 // Get the name of the parent model 00073 std::string modelName = _sdf->GetParent()->Get<std::string>("name"); 00074 00075 // Listen to the update event. This event is broadcast every 00076 // simulation iteration. 00077 this->updateConnection = event::Events::ConnectWorldUpdateBegin( 00078 boost::bind(&MimicPlugin::UpdateChild, this)); 00079 gzdbg << "Plugin model name: " << modelName << "\n"; 00080 00081 joint_ = model_->GetJoint(joint_name_); 00082 mimic_joint_ = model_->GetJoint(mimic_joint_name_); 00083 } 00084 00085 void MimicPlugin::UpdateChild() 00086 { 00087 #if GAZEBO_MAJOR_VERSION >= 4 00088 mimic_joint_->SetPosition(0, joint_->GetAngle(0).Radian()*multiplier_); 00089 #else 00090 mimic_joint_->SetAngle(0, joint_->GetAngle(0).Radian()*multiplier_); 00091 #endif 00092 } 00093 00094 GZ_REGISTER_MODEL_PLUGIN(MimicPlugin);