【CoppeliaSim打怪升级之路】2. 学习SimIK库的简易方法

227 阅读3分钟

@Project : Coppeliasim-IK-Learning
@Author :Lucio.YipengLi@outlook.com
@Date :2025/02/13
@CoppeliaSim Version: 4.9.0


CoppeliaSim简单使用simIK库来解决机械臂逆解问题

1.问题背景

在机械臂控制中,IK/FK是跨不过去的两个重要命题,在仿真软件中FK非常好解决,而IK问题则需要进一步研究。一般我们在机械臂IK问题上都在自己推参数写控制代码,这样其实在仿真环境下来说效率比较低。好在CoppeliaSim官方提供simIK库,可以方便快速地让我们解决IK问题。

2.问题分析

在coppeliaSim官方教程中有关于如何使用simIK库的一个例程,本文基于例程对simIK库进行讲解,例程中提供了简易方法和精细方法两种实现,而目前我还未解决精细方法的移植问题(例程跑通了,但是换自己的机械臂就不动了)。

3.解决方案

在CoppeliaSim软件中按照官方例程打开例程场景,可以看到它已经帮你设定好一些,你只需要运行过程中改变mainpSphere小球的位置,可以看到机械臂就跟着一起跑啦。

一、讲解代码

注:原本官方的例程注释较少,想要详细完整注释的可以邮件我或者在我github中自取。

关于simIK库的组织结构在用户手册已经写的很详细,在此不再赘述,我们直接看代码。

下面这段代码其实就是指定IK组三要素:基座、末端、目标。基座直接指定机械臂整体模型,末端则是额外加一个Dummy在机械臂的末端,而后插入到末端模型的子层即可,目标则是我们需要移动的目标,可以直接是一个球也可以在球嵌一个Dummy。

#sysCall_init
# 简单方式
simBase = sim.getObject("/arm1")  #  指定基座
simTip = sim.getObject("/tip1")  #  指定机械臂末端
simTarget = sim.getObject("/target1")  #  指定IK目标

下面这段代码是创建一个IK计算组并指定一些规则,添加三元素进去

ikEnv = simIK.createEnvironment()  # 创建IK计算环境
ikGroup_ud = simIK.createGroup(ikEnv)  # 创建IK组
simIK.setGroupCalculation(ikEnv,ikGroup_ud,simIK.method_pseudo_inverse,0,6)  # 设置组计算规则
simIK.addElementFromScene(ikEnv, ikGroup_ud, simBase, simTip, simTarget, simIK.constraint_pose)  # 添加元素到组

这段代码和上面类似,其实就是计算规则不一样,上面是伪逆法,下面是阻尼法,两种计算互相补充

ikGroup_d = simIK.createGroup(ikEnv)
simIK.setGroupCalculation(ikEnv, ikGroup_d, simIK.method_damped_least_squares, 1, 99)
simIK.addElementFromScene(ikEnv, ikGroup_d, simBase, simTip, simTarget, simIK.constraint_pose)

下面这段是在sysCall_actuation的内容,简单来说就是运行IK计算,同步位置

res, *_ = simIK.handleGroup(ikEnv, ikGroup_ud, {'syncWorlds': True})
if res != simIK.result_success:
    simIK.handleGroup(ikEnv, ikGroup_d, {'syncWorlds': True})
    sim.addLog(sim.verbosity_scriptwarnings, "IK solver failed.")

至此已经完成所有的简单方式的代码编写,启动即可。精细方法只是在三元素的基础上规定了更多的元素在计算组,目前没有感觉两种方法在实际仿真中有什么不同。不过精细方法可以调的参数变多了。

二、相关链接

我的Github

CoppeliaSim用户手册 --- CoppeliaSim User Manual