00001 # Software License Agreement (BSD License) 00002 # 00003 # Copyright (c) 2008, Willow Garage, Inc. 00004 # All rights reserved. 00005 # 00006 # Redistribution and use in source and binary forms, with or without 00007 # modification, are permitted provided that the following conditions 00008 # are met: 00009 # 00010 # * Redistributions of source code must retain the above copyright 00011 # notice, this list of conditions and the following disclaimer. 00012 # * Redistributions in binary form must reproduce the above 00013 # copyright notice, this list of conditions and the following 00014 # disclaimer in the documentation and/or other materials provided 00015 # with the distribution. 00016 # * Neither the name of Willow Garage, Inc. nor the names of its 00017 # contributors may be used to endorse or promote products derived 00018 # from this software without specific prior written permission. 00019 # 00020 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00021 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00022 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 00023 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 00024 # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 00025 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 00026 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00027 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00028 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00029 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 00030 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00031 # POSSIBILITY OF SUCH DAMAGE. 00032 00033 # author: Vijay Pradeep 00034 00035 # A convenience object that wraps a dh_chain, along with transforms 00036 # before and after the chain. 00037 # 00038 # The transforms can be thought of as follows: 00039 # 00040 # before_chain_T[0] ... before_chain_T[N] -- chain -- after_chain_T[0] ... after_chain_T[N] 00041 # / 00042 # root 00043 00044 from sensor_msgs.msg import JointState 00045 from numpy import matrix 00046 import numpy 00047 00048 00049 class FullChainRobotParams: 00050 00051 # Initialize with dictionary of the current configuration. 00052 # Dictionary should have the following: 00053 # - before_chain: List of transform ids to apply before the chain 00054 # - chain_id: Chain ID for the dh_chain 00055 # - dh_link_num: Specifies which dh elem should be the last one to apply. 00056 # - after_chain: List of transform ids to apply after the chain 00057 def __init__(self, config_dict): 00058 self._config_dict = config_dict 00059 self.calc_block = FullChainCalcBlock() 00060 00061 def update_config(self, robot_params): 00062 before_chain_Ts = [robot_params.transforms[transform_name] for transform_name in self._config_dict["before_chain"]] 00063 chain = robot_params.dh_chains[ self._config_dict["chain_id"] ] 00064 dh_link_num = self._config_dict["dh_link_num"] 00065 after_chain_Ts = [robot_params.transforms[transform_name] for transform_name in self._config_dict["after_chain"]] 00066 self.calc_block.update_config(before_chain_Ts, chain, dh_link_num, after_chain_Ts) 00067 00068 class FullChainCalcBlock: 00069 def update_config(self, before_chain_Ts, chain, dh_link_num, after_chain_Ts): 00070 self._before_chain_Ts = before_chain_Ts 00071 self._chain = chain 00072 self._dh_link_num = dh_link_num 00073 self._after_chain_Ts = after_chain_Ts 00074 00075 def fk(self, chain_state): 00076 pose = matrix(numpy.eye(4)) 00077 00078 # Apply the 'before chain' transforms 00079 for before_chain_T in self._before_chain_Ts: 00080 pose = pose * before_chain_T.transform 00081 00082 # Apply the DH Chain 00083 dh_T = self._chain.fk(chain_state, self._dh_link_num) 00084 pose = pose * dh_T 00085 00086 # Apply the 'after chain' transforms 00087 for after_chain_T in self._after_chain_Ts: 00088 pose = pose * after_chain_T.transform 00089 00090 return pose