机器人仿真软件CoppliaSim版本问题解决方法并实现机械臂末端自动跟踪目标位置
前言
CoppeliaSim(原Verp)在机器人仿真软件里面以免费开源、轻简为主要优势,但是其版本更新太快,而且不同版本之间差距过大,导致使用过程中遇到些问题,而网上搜到的解决方案、教程并不一定能适用于自己,甚至很多问题就是因为不同版本之间产生的。在此记录本人摸索使用的一些心得。
一、问题描述
因为承接了前人的工作,他使用的是CoppeliaSim4.7所创建的场景以及对应的代码,这里我寻找老版本的CoppeliaSim4.5就有些东西打不开了,为了不从头搭建整个项目,所以无奈只能使用CoppeliaSim4.7,所以本教程适用于不得不使用较新版本的用户。
我想要利用CoppeliaSim自带的逆运动学求解模块(IK),实现给定一个位置就能自动解算机械臂各关节应该移动多少,从而达到末端去自动跟踪目标位置的功能。网上有很多优秀的课程资源如[1,2]等,都有详细介绍该如何使用这个自带的功能,但是我发现我的4.7版本完全就找不到的对应按键功能:
经过本人广泛地查询资料,发现想要重新找到被隐藏的按键也可以[3,4],在下图位置找到usrset.txt,按照下面所示的方法修改,就能够恢复旧版的展示页面功能:
但是个人实际操作中发现,即使显示出了原来旧版的按钮,按照教程里面的方法去搭建,也并不能实现控制机器人末端移动。可能在新版本中也只是徒有其表,里面的功能已经删除了,所以才隐藏掉。
二、问题解决
虽然教程[1,2]里面的计算模块不再起作用,但是搭建如下机器人场景的方法依旧适用,例如tip和target的设置方法,以及关节模式都设置为“Inverse kinematics mode,并勾选Hybrid operation”
我的这个4.7版本虽然关节模式显示括号里的是弃用,但这个关节模式还是能用的。不过有些模式不能用(例如看起来很相似的IK mode、Kinematic mode等),运行仿真之后,机械臂各组件都会散落一地。
然后在创建好机械臂末端tip,和目标位置targe之后,关注它们的链接方式,使用[1]中的Link type为IK已经不再适用了(链接线为红线),这样的链接无法实现tip跟踪target,如下图所示
而且其他的链接模式(Link type),经过尝试发现,都不能实现想要的功能,只有下图所示的这一种可以:
在测试中发现,其实只要链接好这两个点,前面所提到的机械臂关节模式有不少都能用,只要运行起来零件不散落,都能自动跟踪目标点。通过蓝线链接好tip和target之后,就可以按照下面图所示的流程创建IK解算脚本了,这样创建IK脚本后,能实现即使不点仿真运行▶的按键,在场景中拖动,依然能实现机械臂末端跟踪,起到一个线程脚本的作用。

到此为止,已经可以实现tip追踪target的功能了,即使不点击运行,鼠标在场景中拖动tip的位置,机械臂也能立刻跟随。后续上层控制发送的指令,就可以简化为以什么样的速度、加速度去移动这个虚拟的dummy点(target),然后机械臂自动地去跟随此位置变化。
三、功能实现
现在想要实现python脚本控制功能示例,让target在起始位置和终止位置往复移动的功能,编写的脚本代码如下:
import time
import numpy as np
from coppeliasim_zmqremoteapi_client import *
client = RemoteAPIClient()
sim = client.require('sim')
# 获取 target 句柄(根据不同的场景层级调整路径)
target = sim.getObject('/LBRiiwa14R820/target')
# 定义起始点和目标点(世界坐标系下的位置)
start_pos = [-0.5, 0.85, 0.5] # 开始/准备位置
end_pos = [0.25, 1.05, 0.5] # 目标位置
# 速度设置 (m/s)
speed_forward = 0.5 # 从 start 到 end 的速度
speed_backward = 0.4 # 从 end 回到 start 的速度
# 暂停时间 (秒)
pause_forward = 2.0 # 到达 end 后停顿
pause_backward = 3.0 # 回到 start 后停顿
# 插值步长 (秒)
dt = 0.05
def move_target_linear(sim, target_handle, start, end, speed, dt=0.05):
"""
将 target 从 start 线性移动到 end,速度为 speed (m/s)
使用 time.sleep(dt) 进行简单时间控制
"""
start = np.array(start, dtype=float)
end = np.array(end, dtype=float)
direction = end - start
distance = np.linalg.norm(direction)
if distance < 1e-6:
return
duration = distance / speed
steps = int(duration / dt)
for i in range(1, steps + 1):
t = i / steps
current = start + t * direction
sim.setObjectPosition(target_handle, sim.handle_world, current.tolist())
time.sleep(dt)
# 确保最终精确到达终点
sim.setObjectPosition(target_handle, sim.handle_world, end.tolist())
time.sleep(dt) # 再给一点时间让 IK 稳定
def main():
# 启动仿真
sim.startSimulation()
print("Simulation started. Press Ctrl+C to stop.")
time.sleep(0.5) # 等待仿真稳定
# 先将 target 设置到起始位置
sim.setObjectPosition(target, sim.handle_world, start_pos)
time.sleep(0.5)
try:
while True:
# 从 start 移动到 end
print("Moving to target position...")
move_target_linear(sim, target, start_pos, end_pos, speed_forward, dt)
print("Target reached. Pausing 2 seconds...")
time.sleep(pause_forward)
# 从 end 移动回 start
print("Returning to start position...")
move_target_linear(sim, target, end_pos, start_pos, speed_backward, dt)
print("Start reached. Pausing 3 seconds...")
time.sleep(pause_backward)
except KeyboardInterrupt:
print("\nStopping simulation...")
finally:
sim.stopSimulation()
print("Simulation stopped.")
if __name__ == "__main__":
main()
上述代码只需要打开创建好场景的CoppeliaSim即可,并不必须要运行起来仿真,就能实现场景中的机械臂末端在起始位置和终止位置往复运动。
讨论
当然,上述python脚本在CoppeliaSim运行起来仿真也是可以控制的,只不过有时会遇见机械臂中间关节抖振甚至打转的现象,本人目前还没有什么解决方法的头绪。这些现存的问题如果有什么好的解决方法,欢迎评论讨论。
参考资源:
[2] 22-vrep.Coppeliasim计算模块-运动学模块(1)
[4] coppeliasim中的针对usrset的几个好用设置
[5] CoppliaSim原Vrep4.7.0最新版本导入SW零件和基于python的机械臂仿真和逆运动学IK模块控制
[6] vrep/coppeliasim串联机器人散落一地的解决办法
版权声明:本文采用CC BY-NC-SA 4.0协议,转载请注明出处。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)