拖拽示教与轨迹记录回放

头文件:include/tl_interface.h

1. set_darg_mode - 设置拖拽示教的拖拽方式

方法:set_darg_mode(SOCKETFD socketFd, int mode);

功能描述:配置机械臂拖拽示教执行模式,可选择力矩柔顺拖拽、位置锁定拖拽、3D鼠标操控等不同拖动方式,适配现场不同示教操作需求。

参数:

  • socketFd:已连接的句柄。
  • mode:拖拽模式 0-无 1-3D鼠标 2-力矩模式 3-位置。

返回值:

  • 0:成功
  • 非 0:失败

使用示例:

Python
# mode: 0=无  1=力矩模式  2=位置

print_title("测试2: set_darg_mode(1) 力矩模式")

ret = set_darg_mode(sock, 1)

if ret == SUCCESS:

    print_ok("set_darg_mode(1) 力矩模式已开启")

    pass_count += 1

else:

    print_fail("set_darg_mode(1)", ret)

    fail_count += 1

2. set_teach_type - 设置示教模式类型

方法:set_teach_type(SOCKETFD socketFd, int type);

功能描述:设置机器人本地示教操作类型,可切换为点动单轴微调模式或力矩拖拽直接拖动模式,满足点位精细校准与快速示教两种作业需求。

参数:

  • socketFd:已连接的句柄。
  • type :0 点动 1 拖拽。

返回值:

  • 0:成功
  • 非 0:失败

使用示例:

Python
print_title("测试2b: set_teach_type(1) 切换到拖拽")

ret = set_teach_type(sock, 1)

if ret == SUCCESS:

    print_ok("已切换到拖拽模式")

else:

    print_fail("set_teach_type(1)", ret)

3. get_teach_type - 查询示教模式类型

方法:get_teach_type(SOCKETFD socketFd, int& type);

功能描述:查询示教模式下是何种操作类型。

参数:

  • socketFd:已连接的句柄。
  • type :0 点动 1 拖拽。

返回值:

  • 0:成功
  • 非 0:失败

使用示例:

Python
# 确认

teach_type = -1

ret, teach_type = get_teach_type(sock, teach_type)

if ret == SUCCESS:

    name = {0: "点动", 1: "拖拽"}.get(teach_type, "未知")

    print_ok("确认: teach_type=%d (%s)" % (teach_type, name))

4. set_current_teach_sensitivity - 设置电流环拖动示教灵敏度

方法:set_current_teach_sensitivity(SOCKETFD socketFd, const std::vector<double>& friction_offsets);

功能描述:用于配置拖动示教模式下各关节电流环力矩触发阈值,调节手动拖拽示教时关节柔顺度与外力感知灵敏度**。**

参数:

  • socketFd:已连接的句柄。
  • friction_offsets:包含6个关节电流环拖动示教灵敏度参数的向量,顺序为J1-J6,范围应在0-3之间。

返回值:

  • 0:成功
  • 非 0:失败

使用示例:

Python
import tl_interface as tl

# 建立连接

socket_fd = tl.connect_robot("192.168.1.13", "6001")

friction_offsets = tl.VectorDouble()

friction_offsets.append(1)   # J1

friction_offsets.append(1)   # J2

friction_offsets.append(1)   # J3

friction_offsets.append(1)   # J4

friction_offsets.append(1)   # J5

friction_offsets.append(1)   # J6

ret = tl.set_current_teach_sensitivity(socket_fd, friction_offsets)

if ret == 0:

    print("[INFO] 设置电流环拖动示教灵敏度成功")

else:

    print(f"[ERROR] 设置电流环拖动示教灵敏度失败,错误码: {ret}")

5. get_current_teach_sensitivity - 获取电流环拖动示教灵敏度

方法:get_current_teach_sensitivity(SOCKETFD socketFd,std::vector<double>& friction_offsets);

功能描述:读取拖动示教模式下各轴电流环力矩检测阈值,获取当前手动拖拽柔顺度与外力触发灵敏度配置参数。

参数:

  • socketFd:已连接的句柄。
  • friction_offsets:输出参数,用于接收6个关节电流环拖动示教灵敏度参数的向量,顺序为J1-J6。

返回值:

  • 0:成功
  • 非 0:失败

使用示例:

Python
import tl_interface as tl

# 建立连接

socket_fd = tl.connect_robot("192.168.1.13", "6001")

friction_offsets = tl.VectorDouble()

ret = tl.get_current_teach_sensitivity(socket_fd, friction_offsets)

if ret == 0:

    print("[INFO] 各关节电流环拖动示教灵敏度: ", end="")

    for i in range(len(friction_offsets)):

        print("J" + str(i + 1) + "=" + str(friction_offsets[i]) + " ", end="")

    print("")

else:

    print(f"[ERROR] 获取电流环拖动示教灵敏度失败,错误码: {ret}")

6. get_drag_thread_is_end - 查询拖拽是否结束

方法:get_drag_thread_is_end(SOCKETFD socketFd, bool& endFlag);

功能描述:查询拖拽是否已经结束。

参数:

  • socketFd:已连接的句柄。
  • endFlag:拖拽结束标志位,True 结束 False 未结束。

返回值:

  • 0:成功
  • 非 0:失败

使用示例:

Python
# 查询拖拽线程是否结束(绑定返回 [ret, endFlag] 列表)

ret, drag_finished = get_drag_thread_is_end(sock, False)

if ret != SUCCESS:

    print("[ERROR] 查询拖拽结束状态失败! ret = " + str(ret))

    break

if drag_finished:

    print("\n[INFO] 检测到拖拽已结束")

    break

7. track_record_start - 轨迹记录开始

方法:track_record_start(SOCKETFD socketFd, double maxSamplingNum, double samplingInterval);

功能描述:启动机器人运动轨迹采集任务,配置最大采样总点数与点位采样时间间隔,用于记录拖拽示教过程中的连续运动路径。

参数:

  • socketFd:已连接的句柄。
  • maxSamplingNum:最大采样点数200,12000200,12000。
  • samplingInterval:采样间隔0.03,10.03,1。

返回值:

  • 0:成功
  • 非 0:失败

使用示例:

Python
MAX_SAMPLES = 500

SAMPLE_INTERVAL = 1

ret = track_record_start(sock, MAX_SAMPLES, SAMPLE_INTERVAL)

if ret != SUCCESS:

    print_fail("track_record_start", ret)

8. get_track_record_status - 轨迹记录开启状态查询

方法:get_track_record_status(SOCKETFD socketFd, bool& recordStart);

功能描述:查询轨迹录制功能当前运行状态,通过出参返回轨迹记录是否处于开启采集状态。

参数:

  • socketFd:已连接的句柄。
  • recordStart:记录状态 true 开启 false 关闭。

返回值:

  • 0:成功
  • 非 0:失败

使用示例:

Python
# 查询轨迹记录状态

print_title("测试1: 查询初始记录状态")

recordStart = False

ret, recordStart = get_track_record_status(sock, recordStart)

if ret == SUCCESS:

    print_ok("初始状态: %s (ret=%d)" % ("记录中" if recordStart else "未记录", ret))

else:

    print_fail("get_track_record_status", ret)

9. track_record_stop - 轨迹记录关闭

方法:track_record_stop(SOCKETFD socketFd);

功能描述:终止机器人连续运动轨迹采样录制。

参数:

  • socketFd:已连接的句柄。

返回值:

  • 0:成功
  • 非 0:失败

使用示例:

Python
ret = track_record_stop(sock)

if ret == SUCCESS:

    print_ok("track_record_stop")

else:

    print_fail("track_record_stop", ret)

10. track_record_save - 保存拖动示教轨迹

方法:track_record_save(SOCKETFD socketFd, std::string trajName);

功能描述:将已采集完成的拖拽示教轨迹以指定名称存储至控制器,实现轨迹文件持久化留存以便后续调用回放。

参数:

  • socketFd:已连接的句柄。
  • trajName:保存名字。

返回值:

  • 0:成功
  • 非 0:失败

使用示例:

Python
print_title("测试5: 保存轨迹")

# 按示教器格式生成轨迹名

TRAJ_NAME = time.strftime("轨迹名-%m月%d日%H时%M分%S", time.localtime())

ret = track_record_save(sock, TRAJ_NAME)

if ret == SUCCESS:

    print_ok("轨迹已保存为: %s" % TRAJ_NAME)

else:

    print_fail("track_record_save('%s')" % TRAJ_NAME, ret)

11. track_record_playback - 轨迹回放

方法:track_record_playback(SOCKETFD socketFd, int vel);

功能描述:调用已录制完成的轨迹文件进行复现运行,可通过传入速度参数设定轨迹回放的整体运行速率。

参数:

  • socketFd:已连接的句柄。
  • vel:速度。

返回值:

  • 0:成功
  • 非 0:失败

使用示例:

Python
print("\n  [用例A] 低速回放 (vel=20)")

ret = track_record_playback(sock, 20)

if ret == SUCCESS:

    print_ok("低速回放已开始,等待完成...")

    if wait_playback_done(sock, timeout=120):

        print_ok("低速回放完成")

    else:

        print("  [WARN] 低速回放等待超时")

12. track_record_delete - 轨迹清除

方法:track_record_delete(SOCKETFD socketFd);

功能描述:清空控制器内缓存的当前录制轨迹数据,释放轨迹占用存储空间。

参数:

  • socketFd:已连接的句柄。

返回值:

  • 0:成功
  • 非 0:失败

使用示例:

Python
print_title("测试8: 清除轨迹数据")

ret = track_record_delete(sock)

if ret == SUCCESS:

    print_ok("track_record_delete")

else:

    print_fail("track_record_ delete", ret)