实际上这几天一直在学习baxter的基本操作方法,发现baxter真的是一款很好的机器人,官方给提前配置好了很多东西,使用起来很方便。虽然如此,但是在对其进行ikfast插件配置的过程中仍然艰辛满满,其实还是手生。
这几天的摸索流程是这样的
- 按照官方教程http://sdk.rethinkrobotics.com/wiki/MoveIt_Tutorial指导的,对baxter直接进行了ikfast的配置,实际上主要是修改了/home/zzurobotics/baxter_ws/src/moveit_robots/baxter/baxter_moveit_config/config路径下的kinematics.yaml文件,通过屏蔽和选择不同的解算器来达到了选择ikfast解算器的目的,当时以为挺简单的,实际上官方已经把几乎所有的文件都配置好了,你直接用就成,但是我一直不知道到底怎样才算是确定当前改变后是用了ikfast的解算器,这里说明一下我看了YouTube上的相关视频,发现,当yaml文件等一些列设置好之后,moveit rviz插件面板中不会有任何提示,还是会显示ompl库,在面板中还是显示原来的算法,但是实际上已经变成了ikfast。
- 查找过程中发现http://sdk.rethinkrobotics.com/wiki/Custom_IKFast_for_your_Baxter可根据自己的baxter定制一个ikfast插件,我就又对着教程搞了一遍,这个教程很好,在做自己的ikfast插件的时候也可以参考这个教程进行配置。但是这个过程确实很麻烦,计算ikfast_solver的时候很慢,一条胳膊的计算时间大约2个小时左右,很麻烦。配置来配置去还总是报错,这里再提一下,自动生成的baxter_right_arm_ikfast_solver.cpp、baxter_left_arm_ikfast_solver.cpp这两个文件里的#include“ikfast.h”会报错找不到,需要把具体路径填进去,而且,里面还需要手动为两个变量添加空间前缀std::才能够编译成功,否侧会报错,这个问题按下不表。
- 最后折腾来折腾去,想着算了,先用默认的kdl吧,然后就改回来原来的配置想着先用着,重头戏来了,结果拖拽末端执行器总是规划失败提示错误completed listing of explantions for invalid states。查来查去,终于解决了,记录一下方法。
这个问题出现的原因是moveit在执行规划的时候会考虑baxter的碰撞问题,包括自碰撞和障碍物碰撞,由于一些参数的配置问题导致moveit认为规划的结果总是会导致自碰撞。原因是在考虑碰撞的时候会考虑模型建立不准确啥的原因,会在模型周围多出一定距离进行碰撞检测。而我遇到的问题原因猜测是因为两只手都安装了电动夹具,夹具的两个夹柱可能会认为自碰撞。这个参数查了之后参考http://groups.google.com/forum/#!topic/moveit-users/tMOL-GmwCGw (可能要翻墙)说修改/home/zzurobotics/baxter_ws/src/moveit_robots/baxter/baxter_moveit_config\config路径下的ompl_planning.yaml文件
打开之后
planner_configs:
SBLkConfigDefault:
type: geometric::SBL
LBKPIECEkConfigDefault:
type: geometric::LBKPIECE
RRTkConfigDefault:
type: geometric::RRT
//range:.2 //参考链接中甚至指出添加这条语句(planner_configs到left_arm之间每块都加)目的是为了产生更小的step,但是我没有添加,也能正常使用
RRTConnectkConfigDefault:
type: geometric::RRTConnect
LazyRRTkConfigDefault:
type: geometric::LazyRRT
ESTkConfigDefault:
type: geometric::EST
KPIECEkConfigDefault:
type: geometric::KPIECE
RRTStarkConfigDefault:
type: geometric::RRTstar
BKPIECEkConfigDefault:
type: geometric::BKPIECE
left_arm:
default_planner_config: RRTConnectkConfigDefault
planner_configs:
- SBLkConfigDefault
- LBKPIECEkConfigDefault
- RRTkConfigDefault
- RRTConnectkConfigDefault
- ESTkConfigDefault
- KPIECEkConfigDefault
- BKPIECEkConfigDefault
- RRTStarkConfigDefault
projection_evaluator: joints(left_s0,left_s1)
longest_valid_segment_fraction: 0.05 //这里和下面的0.05修改为0.02
right_arm:
default_planner_config: RRTConnectkConfigDefault
planner_configs:
- SBLkConfigDefault
- LBKPIECEkConfigDefault
- RRTkConfigDefault
- RRTConnectkConfigDefault
- ESTkConfigDefault
- KPIECEkConfigDefault
- BKPIECEkConfigDefault
- RRTStarkConfigDefault
projection_evaluator: joints(right_s0,right_s1)
longest_valid_segment_fraction: 0.05 //修改为0.02
both_arms:
default_planner_config: RRTConnectkConfigDefault //注意这个,修改的话就可以自定义默认的算法,
planner_configs: //就不用每次都手动选择修改了。
- SBLkConfigDefault
- LBKPIECEkConfigDefault
- RRTkConfigDefault
- RRTConnectkConfigDefault
- ESTkConfigDefault
- KPIECEkConfigDefault
- BKPIECEkConfigDefault
- RRTStarkConfigDefault
projection_evaluator: joints(right_s0,right_s1)
longest_valid_segment_fraction: 0.05 //修改为0.02
left_hand:
default_planner_config: RRTConnectkConfigDefault
planner_configs:
- SBLkConfigDefault
- LBKPIECEkConfigDefault
- RRTkConfigDefault
- RRTConnectkConfigDefault
- ESTkConfigDefault
- KPIECEkConfigDefault
- BKPIECEkConfigDefault
- RRTStarkConfigDefault
right_hand:
default_planner_config: RRTConnectkConfigDefault
planner_configs:
- SBLkConfigDefault
- LBKPIECEkConfigDefault
- RRTkConfigDefault
- RRTConnectkConfigDefault
- ESTkConfigDefault
- KPIECEkConfigDefault
- BKPIECEkConfigDefault
- RRTStarkConfigDefault
猜测是夹爪两根柱本身就很近,大约5cm也就是0.05,所有很有可能会产生误判,修改为检测范围2cm即0.02,就不会误以为碰撞了。
太晚了,准备睡觉,再说一下默认使用的RRTConnectkConfigDefault感觉很挺好用的,结算时间在0.006s之类的范围,几乎是瞬解,先用着这个。详细的以后再补充吧