关于pybullet中invertTransform和multiplyTransforms用法

最近在学pybullet,遇到了一个比较尴尬的问题,就是根据大地坐标位置参数对物体施加力的时候,在转动90度的时候会出现错误,然后就开始找这两个用法,找了半天没啥收获,总结下最近遇道的问题

invertTransform相当于求解逆矩阵,与旋转矩阵求逆是没有本质区别的,但是需要注意一个问题

inv_hand_pos, inv_hand_orn = p.invertTransform(robot_observation[:3],
                                               p.getQuaternionFromEuler(robot_observation[3:6]))

这个invertTransform里面的参数,是相对于基座的位置参数,此时若只有旋转,矩阵中将只有

p.invertTransform((0, 0, 0), p.getBasePositionAndOrientation(robot, 0)[1])

(可以这么理解),当相对于基座存在位移并且有姿态变化时,可以设置为下面这种,invertTransform第二个参数是时刻在改变的,相当于旋转角度theta代入矩阵的数值

inv_hand_pos, inv_hand_orn = p.invertTransform((a, b, c), p.getBasePositionAndOrientation(robot, 0)[1])

然后再用multiplyTransforms计算矩阵的乘法,换句话说是将大地坐标系换算成机器人基座的坐标系下的位置参数,换算方式是后者换算成前者(但通过两次仿真发现,参数后者和前者并不会存在输出值的改变),negative_world_pos是原本的坐标系数值添加负号。

negative_world_pos = [-1 * float(x) for x in p.getBasePositionAndOrientation(robot, 0)[0]]

obj_pos_in_hand, obj_orn_in_hand = p.multiplyTransforms(inv_hand_pos, inv_hand_orn,negative_world_pos,p.getQuaternionFromEuler((0, 0, 0))

也可以反过来用,将大地坐标换算成基座下的坐标,这个在工程上一般用的会多些,利用相机定位获得世界坐标系的参数 在定位到机器人位置参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值