虽然5/6关的场景代码确实有很多可以改进的地方,但这里还真没问题。结论是你应该抓的不够紧,导致松不开。下面我将具体解释原因。 
首先观察相关代码,位于task05场景的talos脚本代码,299行左右: 
- --read cup position
 
 -     Cy_RH = sim.getObjectPosition(HighPillar,RH)
 
 -     --print(Cy_RH[1], battle_flag)
 
 -     --print(sim.getObjectPosition(HighPillar,-1)[1]-sim.getObjectPosition(RH,-1)[1])
 
 -     if ((Cy_RH[1] < -0.007) and (battle_flag == 0))
 
 -     then
 
 -         battle_flag = 1
 
 -     end
 
  
-     if ((Cy_RH[1] > -0.007) and (battle_flag == 1) ) -- x
 
 -     then
 
 -     
 
 -         battle_flag = 2
 
 -         sim.setObjectParent(Join_P,RAD4,true)
 
 -     end
 
 -     print(position_34[1], sim.getJointPosition(rightArmJoint[4])*180/math.pi ) --输出语句是我加的
 
 -     if ((position_34[1]>0.008) and(battle_flag == 2))
 
 -     then
 
 -         battle_flag = 3
 
 -     end
 
 -     if((position_34[1]<0.008) and(battle_flag == 3))
 
 -     then
 
 -         battle_flag = 4
 
 -         sim.setObjectParent(Join_P,-1,true)
 
 -     end
 
  复制代码 当杯子被“抓”住时,有battle_flag=2. 一系列操作后可达battle_flag=4,此时杯子脱落。 
观察相关条件,发现battle_flag的变化取决于position_34[1]. position_34源于前文约279行处: 
-     position_34 = sim.getObjectPosition(RAB3,RAD4)--pan duan shouzhua zhanghe
 
  复制代码 也就是“大拇指”和手爪另一部分的相对位置。根据几何关系观察,猜测position[1]相对手爪张角递减。 
经过测试,发现在position_34[1]=0.008附近确实如此,其对应关系为position_34[1]=0.008大约对应手爪张角29°. 
 
那么结合前面代码可知控制杯子脱落的方法是先保证手爪角度<29°,在张开至>29°. 由于测的不是很准,你应当动作大些,留有余裕。你做到这一点了吗? 
 
如果确实是这个原因,你可能会想:这设置有些不合理。我怎么知道需要“穿过两次”(即先小于再大于)的角度是29°呢? 
这确实有些不合理,但仔细想想不合理的点可能和你想的有些不同。 
朴素地想,控制脱落只要判断张角是否够大就行,为什么要先小再大呢? 
确实是这样,但判断先小再大其实是有合理性的。在于如果你考虑抓取再脱落的整个过程,就会意识到判断是否抓住的条件应当包含抓角够小,这样才抓紧了。(虽然最好用摩擦仿真,但判断抓角够小作为一种魔法是比较合理的) 
所以问题大概在于判断抓取的张角条件和判断脱落的条件数值不一致。也就是说,你本该看见你没抓住,这样你会意识到爪子张角不够小。 
那么前面判断抓取的条件是什么角度呢?答案是根本没判断。那个条件还有些更抽象的问题,这里不谈。 
 
那么如何改进,使场景设置更合理?可以把判小的那句删掉,但更合理的方法是将其移动到判断抓取的条件中。 
当然,我强烈建议直接去掉这里使用的魔法,直接靠摩擦力就能把瓶子抓起来,我实验过是可以的,这样最合理。 
 
注:我的行数标记可能和你的略有区别,因为我的场景代码有些修改,所以行号不一致。 
 |