1.首先说一下怎么将MoveIt的默认求解器换成常用的Trac_IK或者IKFast.
(1)插件安装
1)Trac_IK安装
这个比较简单,参考官网:Bitbucket中的代码;(我的ROS时Kinetic)
sudo apt-get install ros-kinetic-trac-ik
一行搞定。
2)IKFast安装
这个巨繁琐,而且BUG花样百出,不过基本流程可以参考官网:IKFast安装
(2)换掉KDL(以aubo机械臂的功能包、更换Trac_IK求解器为例,其他机械臂思路类似。)
在aubo_robot功能包下找到目录src/aubo_i5_moveit_config/config/kinematics.yaml文件,打开它,在manipulator_i5:下面一行,把kdl那一行注释掉,仿写Trac_IK的求解器,结果如下图所示,这样就更换完了,运行自己的程序试一下就行。
注:具体的修改问题,如果是你自己编写的机械臂功能包,那有可能部分配置文件中没有编写共享参数的代码,因为节点之间的变量空间是不相同的,所以如果不连接到该变量空间,就会出现可能rviz中,gazebo中和现实机械臂的规划器使用的不是一个规划器的问题。
解决:在aubo_robot功能包下找到目录src/aubo_i5_moveit_config/launch,其中我的aubo机械臂的文件是moveit_planning_execution.launch
打开后查看我用到了哪些东西:
这里看到我们用到了ROS-I、MoveIt和Rviz三个插件。
这里因为我使用了ROS-I和MoveIt!(Rviz只是可视化,真正的运动还是靠MoveIt实现,所以不用管它),所以要确保这两个都用到了Trac_IK插件,所以都应该有下面代码段(Block):
1.ROS-I插件,即planning_context.launch文件中。
2.MoveIt插件,即move_group.launch文件中。
到此就所有的配置完毕了,用下面这行命令查询ROS下kinematics运行的参数叫啥:
rosparam list | grep kinematics
可以看到我的工程中求解器的参数叫这个名字:
然后用rosparam get命令看一下三个求解器,得到的结果能看到是我们需要的Trac_IK了。
下面讨论一个小问题:
[Info] Using solver type Speed. 问题
在launch文件启动时,有这么一句话:
很明显,这表明我当前使用的求解器用的类型时Speed型,即保证关节空间的连续与精确。
当你翻读Trac_IK的源码的时候在trac_ik/trac_ik_kinematics_pligin/trac_ik_kinematics_pligin.cpp文件里,有这么一段代码:
可以看到,Trac_IK求解器提供了四种类型的求解方案,Manipulation1、Manipulation2、Distance、还有默认的Speed,所以你要改变上述问题,让我们的求解方案不使用Speed的方法有两个:
1)直接改Trac_IK的源码,把默认的Speed改成你想用的就行;
2)(还在探索)首先,了解一下这个源码的145-149行:
可以看到,他这里时获取了group_name(就是上面提到的xml文本里面加入的group标签名字,修改他的solve_type参数,如果没改就显示Speed),通过阅读launch文件运行后的提示发现,parameter里面没有solve_type这个参数,而且知道它是在common namspace,找了很久,硬是没找到这个parameter,在ros开启的param一栏里也没找到这个,只提示这是一个common namspace的变量,而且试了下自己创建,由于源码里面148行代码的缘故,也检测不出来是不是改了,所以我选择方法一!!!