【IKFast】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
### 关于ROS2中集成和使用IKFast进行逆运动学计算 #### 集成过程概述 在ROS2环境中集成并使用IKFast进行逆运动学(IK)计算涉及几个关键步骤。由于MoveIt!框架已部分迁移到ROS2版本,称为MoveIt 2,在此环境下利用IKFast成为可能[^1]。 对于希望采用IKFast作为其机器人项目的一部分开发者而言,首先需确保安装了最新版的MoveIt 2以及相关依赖项。之后,可以按照特定流程创建适用于目标机器人的IKFast插件,并将其配置到MoveIt 2环境之中以便执行高效的逆向运动学求解操作[^3]。 #### 创建IKFast插件 为了使自定义机器人能够利用IKFast的优势,必须先基于该机器人的几何结构生成对应的IKFast解决方案。这通常涉及到准备描述机器人连杆系统的文件(如COLLADA或OpenRAVE XML),并通过官方提供的脚本自动化完成C++源代码的编写工作[^4]。 一旦获得了针对指定机械臂优化后的IKFast库,则可通过如下命令行指令来构建相应的MoveIt Kinematics Plugin: ```bash cd your_robot_moveit_config_package_directory rosrun moveit_kinematics create_ikfast_moveit_plugin.py \ your_robot_name manipulator plugin_package_name base_link end_effector_link path_to_generated_ikfast_code.cpp ``` 上述命令假设读者已经拥有由`openravepy.ikfast`生成的有效CPP实现文件,并且了解如何定位至存储这些资源的位置。此外,“plugin_package_name”应替换为你打算用于容纳新创建插件的实际包名;而其他参数则依据具体应用场景调整设置。 #### 插入到MoveIt 2配置 成功编译好新的kinematics solver后,下一步就是修改现有的MoveIt 2配置以启用这个定制化的IKFast实例。主要任务集中在编辑YAML格式的配置文档,指明所选solver的具体路径及其初始化所需的各项参数。例如: ```yaml manipulator: kinematics_solver: my_custom_namespace::MyCustomIKFastPlugin kinematics_solver_search_resolution: 0.005 kinematics_solver_timeout: 0.05 ``` 以上片段展示了怎样通过更改`kinematics_solver`字段指向先前开发好的类名称,从而让系统知晓应当调用哪个组件来进行后续的任务处理。同时,还可以设定诸如搜索分辨率(`search_resolution`)及时限(`timeout`)之类的选项来微调性能表现[^2]。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值