$search
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 # for transform_name in self._config_dict["before_chain"]: 00063 # print "transform_name: ", transform_name 00064 # for transform_name2 in robot_params.transforms: 00065 # print "transform_name2: ", transform_name2 00066 before_chain_Ts = [robot_params.transforms[transform_name] for transform_name in self._config_dict["before_chain"]] 00067 # if self._config_dict["chain_id"] == 'NULL': 00068 if self._config_dict["chain_id"] == None: 00069 chain = None 00070 dh_link_num = None 00071 else: 00072 # print "self._config_dict[chain_id] ", self._config_dict["chain_id"] 00073 chain = robot_params.dh_chains[ self._config_dict["chain_id"] ] 00074 dh_link_num = self._config_dict["dh_link_num"] 00075 after_chain_Ts = [robot_params.transforms[transform_name] for transform_name in self._config_dict["after_chain"]] 00076 self.calc_block.update_config(before_chain_Ts, chain, dh_link_num, after_chain_Ts) 00077 00078 class FullChainCalcBlock: 00079 def update_config(self, before_chain_Ts, chain, dh_link_num, after_chain_Ts): 00080 self._before_chain_Ts = before_chain_Ts 00081 self._chain = chain 00082 self._dh_link_num = dh_link_num 00083 self._after_chain_Ts = after_chain_Ts 00084 00085 def fk(self, chain_state): 00086 pose = matrix(numpy.eye(4)) 00087 00088 # Apply the 'before chain' transforms 00089 for before_chain_T in self._before_chain_Ts: 00090 pose = pose * before_chain_T.transform 00091 00092 # Apply the DH Chain 00093 if self._chain is not None: 00094 dh_T = self._chain.fk(chain_state, self._dh_link_num) 00095 pose = pose * dh_T 00096 00097 # Apply the 'after chain' transforms 00098 for after_chain_T in self._after_chain_Ts: 00099 pose = pose * after_chain_T.transform 00100 00101 return pose