文章目录
参考
- kinetic version: IKFast Kinematics Solver
- UR5-配置MoveIt!运动学插件IKFAST
- ROS回顾学习(4): URDF的学习以及与Xacro的比较–机器人模型描述
- 这不会替换 URDF,并且不是 URDF 的扩展。这是一种表示有关机器人结构的语义信息的格式。此机器人也必须存在 URDF 文件,其中定义了所引用的关节和链接
- MOVEIT配置IKFast运动学插件-安装注意事项-亲自安装过程介绍-超级详细-亲测
- ABB–配置MoveIt!运动学插件IKFAST
Fast of All
不得不吐槽在开源精神下就很容易有工作协同的问题, moveit的教程中的谬误之多在IKFast配置的过程中体现的淋漓尽致,索性moveit是一个开源平台,可以在出错的过程中通过源码去解决它.
- 首先认真阅读官方教程
其实还有要注意的是在moveit_resources下也存在panda_moveit_config建议一并删除之后再安装!
有时候有问题大多数仅仅是因为忘记了source ~/.bashrc
环境
- ROS kinetic/melodic
- Franka emika Panda
什么是IKFast
摘自Wikipedia:机器人运动学编译器IKFast是Rosen Diankov的OpenRAVE运动计划软件中提供的功能强大的逆运动学求解器。 与大多数逆运动学求解器不同,IKFast可以解析地求解任何复杂运动学链的运动学方程,并生成特定于语言的文件(如C ++)供以后使用。 最终结果是极其稳定的解决方案,在最新的处理器上可以运行高达5微秒的速度。
MoveIt! IKFast是使用OpenRAVE生成的cpp文件为MoveIt生成IKFast运动学插件的工具。 本教程将逐步指导您设置机器人,以利用IKFast的强大功能。 MoveIt! IKFast在带有Catkin的ROS Kinetic上使用OpenRAVE 0.8和6DOF和7DOF机械臂操纵器进行了测试。 虽然理论上可行,但当前IKFast插件生成器工具不适用于自由度大于7的臂。
安装openRave相关
简断节说melodic version官方给的不能用,直接上参考:
如果你的ros是源码安装,那么openrave在下载的过程中会将boost的引用关系打乱,之后就不能再对ros源码进行catkin build了。
Create Collada File For Use With OpenRAVE
为了方便增加了很多环境变量,可以开始一次性导入,其中含义如名所示:
用全局变量虽说有好处,但是也有很多意想不到的劣势比如这里的MYROBOT_NAME就需要和你的moveit_config pkg中的完全一样.
export MYROBOT_NAME="panda"
export IKFAST_PRECISION="5"
export PLANNING_GROUP="panda_arm"
export BASE_LINK="0"
export EEF_LINK="8"
export FREE_INDEX="1"
export IKFAST_OUTPUT_PATH=`pwd`/ikfast61_"$PLANNING_GROUP".cpp
//下面一条在对应步骤时再选择执行!
export MOVEIT_IK_PLUGIN_PKG="$MYROBOT_NAME"_ikfast_"$PLANNING_GROUP"_plugin
COLLADA文件也就是DAE文件,3D模型文件的一种,dae文件的生成是要用于OpenRAVE。
首先找到自己机器人的xacro文件(franka_ros),通过一下指令将它转为urdf文件。
rosrun xacro xacro --inorder -o "$MYROBOT_NAME".urdf "$MYROBOT_NAME".urdf.xacro
然后将urdf文件(其中的rpy角是绕xyz轴的顺序)转为dae文件
rosrun collada_urdf urdf_to_collada "$MYROBOT_NAME".urdf "$MYROBOT_NAME".dae
将 URDF 文件转换为 Collada 文件时通常会出现浮点问题,因此已创建一个脚本来将 .dae 文件中的所有数字舍入到 x 小数位。如果您最初跳过此步骤,看看 IKFast 能否生成具有默认值的解决方案,但如果生成器需要的时间超过一小时,请尝试以下操作:
export IKFAST_PRECISION="5"
cp "$MYROBOT_NAME".dae "$MYROBOT_NAME".backup.dae # create a backup of your full precision dae.
rosrun moveit_kinematics round_collada_numbers.py "$MYROBOT_NAME".dae "$MYROBOT_NAME".dae "$IKFAST_PRECISION"
根据经验,我们建议使用 5 位小数,但如果 OpenRAVE IKFast 生成器需要很长时间才能找到解决方案,则降低小数位数会有所帮助。
查看新生成的 Collada 文件中的链接
您可能需要安装包 libsoqt4 -dev 才能使显示器正常工作:
openrave-robot.py "$MYROBOT_NAME".dae --info links
如果您有一个 7 dof 臂,并且需要填写一个 +freeindex 参数,这非常有用,稍后将讨论。
要在 OpenRAVE 中测试新生成的 Collada 文件:
openrave "$MYROBOT_NAME".dae
这里和官方教程显示的有出入,因为各个关节都不在零位上,在检查urdf中转换关系后发现,其实并没有差别。
Create IKFast Solution CPP File
一旦你有一个数字四舍五入的Colada文件的时间C++.h头文件,其中包含分析IK解决方案的机器人。
你需要选择你想要哪种我知道。有关详细信息,请参阅此页面。最常见的 IK 类型是转换 6d。
设置规划组、baselink、工具link以及冗余关节。
export PLANNING_GROUP="panda_arm"
export BASE_LINK="0"
export EEF_LINK="8"
export FREE_INDEX="1"//这里的index应该是可以自己选择的“an alphabetical list, such as one printed at the back of a book showing which page a subject, name, etc. is on”
//但是这里最好用官方配置的,因为笔者大概试了一下0和2两个参数,发现都会存在解不出来的问题.
若要在 6DOF 臂的操纵器底座和工具框架之间生成 IK 解决方案,请使用以下命令格式。我们建议您在"ikfast61__$PLANNING".cpp" .cpp
export IKFAST_OUTPUT_PATH= ikfast61_"$PLANNING_GROUP".cpp
之后都和教程一样了.
这个过程的速度和成功将取决于你的机器人的复杂性。典型的 6 DOF 操纵器,底部或手腕有 3 个相交轴,只需几分钟即可生成 IK。已知问题 =freeindex 参数已知有一个错误,它不能正确处理树索引。说 [baselink]=2 =eelink=16,链接索引从 3 到 9 与当前规划组链无关。在这种情况下,[自由指数将预期索引 2 作为链接 2, 但索引 3 作为链接 10 …索引 9 作为链接 16。
生成代码所耗时间:50分钟左右
验证
->这里有一个隐藏链接
首先我们用KDL逆解算法求出如下所示姿态的姿态和关节角度作为参考:
将目标位姿和freeJoint(注意freeJoint对应的是哪个!)带入ikfast,得到了在该freeJoint下的两组逆解.
从仿真验证
当freeJoint确定时,是否真的只有两组解答?(todo)将之带入matlab仿真程序中验证。
从结果验证
其中第一组解:
目标姿态也和target有误差(todo)
其中第二组解和上述target相似但是存在误差!(todo)
精度问题可能是和arm.setGoalJointTolerance(xxx)有关?
生成插件
创建包含 IK 插件的包。我们建议您将包名称为MYROBOT_NAME_ikfast_PLANNING_GROUP_plugin
export MOVEIT_IK_PLUGIN_PKG="$MYROBOT_NAME"_ikfast_"$PLANNING_GROUP"_plugin
cd ~/catkin_ws/src
catkin_create_pkg "$MOVEIT_IK_PLUGIN_PKG"
生成工作区,以便检测到新包(可以是"roscd"):
catkin build
创建插件源代码:
rosrun moveit_kinematics create_ikfast_moveit_plugin.py "$MYROBOT_NAME" "$PLANNING_GROUP" "$MOVEIT_IK_PLUGIN_PKG" "$IKFAST_OUTPUT_PATH"
或者直接用python执行
python /path/to/create_ikfast_moveit_plugin.py "$MYROBOT_NAME" "$PLANNING_GROUP" "$MOVEIT_IK_PLUGIN_PKG" "$IKFAST_OUTPUT_PATH"
kinetic可以直接按照教程来生成,但melodic需要根据提示加入对应的BASE_LINK和EEF_LINK两个参数!
这里只在kinetic中进行了验证,生成效果如下:
按照官方教程安装即可,
生成之后记得再
catkin build
一下(大概需要2-3min), 然后插件就可以使用了,并且在能够正常运行的情况下对应的kinematics.yaml已经直接修改为了
<planning_group>:
kinematics_solver: <myrobot_name>_<planning_group>_kinematics/IKFastKinematicsPlugin
-INSTEAD OF-
kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin
效果
直接运行对应moveit_config pkg里的demo.launch.
这里我们可以看到,对应的逆解器已经更替为刚刚生成的:<myrobot_name>_<planning_group>_kinematics/IKFastKinematicsPlugin 太长没有显示完全.
拖动rviz小球,规划成功.
问题
- moveit中IKFast的最优解是如何自动选取的?
- urdf导入的模型构型是怎么确定的?
- 生成的插件用在默认的panda-moveit-config尝试?
- 出现报错:
[ERROR] [1611213123.793135735]: Semantic description is not specified for the same robot as the URDF