Skip to content

4.7 궤도 제어

개요

Trajectory 모듈은 오프라인 궤도 실행, Trajectory/path 기록, 변환 및 재생을 위한 전체 주기 인터페이스를 제공하여 복잡한 궤도 사용자 정의 및 재생을 지원합니다.

핵심 기능

  • 오프라인 궤적 파일 설정 및 실행 지원
  • 안전한 속도로 로봇을 오프라인 궤적 시작점까지 이동 지원
  • CSV를 궤적 형식 파일로 변환 지원
  • Trajectory/path 녹화, 재생, 삭제, 관리 지원
  • 궤적 목록 및 시작 위치 획득 지원
  • 경로 플래너 매개변수 구성 및 쿼리 지원
  • 궤적을 따른 모션 지원/paths

사용 사례

  • 복잡한 궤적의 정밀한 재현 구현
  • 로봇 모션 궤적 기록 및 재생
  • 외부 궤적 데이터를 로봇 실행 가능 형식으로 변환
  • 경로 계획 매개변수를 사용자 정의하여 모션 성능 최적화
  • 궤적/path 파일 일괄 관리 및 쿼리

4.7.1 실행할 오프라인 궤적 파일 설정

메서드 이름trajectory.set_offline_trajectory_file( path : str) -> StatusCodeEnum
설명실행할 오프라인 궤적 파일을 설정합니다.
요청 매개변수path : str 오프라인 궤적 파일 이름(형식은 참고 사항 참조).
반환 값StatusCodeEnum: 함수 실행 결과.
메모궤적 파일은 일반 텍스트입니다:
- 라인 1: 6 (축), 0.001 (시간 간격, s), 8093 (포인트 개수).
- 라인 2: 6개 축의 초기 위치.
- 라인 3-8095: 궤적 점 포함 위치/velocity/acceleration/torque 피드포워드/ do_port / do_state .
- do_port 범위 1-24; -1 는 IO 트리거가 없음을 의미합니다. do_port = 1do_state = 1do1 를 ON으로 설정하고, do_state = 0do1 를 OFF로 설정합니다.
호환 로봇 소프트웨어 버전협업(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

4.7.2 안전한 속도로 출발점까지 이동

메서드 이름trajectory.prepare_offline_trajectory() -> StatusCodeEnum
설명안전한 속도로 로봇을 오프라인 궤적의 시작점으로 이동시킵니다.
요청 매개변수없음
반환 값StatusCodeEnum: 함수 실행 결과.
호환 로봇 소프트웨어 버전협업(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

4.7.3 오프라인 궤적 실행 시작

메서드 이름trajectory.execute_offline_trajectory() -> StatusCodeEnum
설명오프라인 궤적 프로그램 실행을 시작합니다.
요청 매개변수없음
반환 값StatusCodeEnum: 함수 실행 결과.
호환 로봇 소프트웨어 버전협업(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

4.7.4 궤적 파일 변환

메서드 이름trajectory.transform_csv_to_trajectory( file_name : str, separator : str = " ", io_flag : str = "2")
설명궤적 CSV 파일을 컨트롤러 궤적 형식으로 변환하고 이를 컨트롤러의 궤적 디렉터리에 저장합니다.
요청 매개변수file_name : str CSV 궤적 파일 이름( .csv 제외).
separator : str 구분 기호(공백 또는 쉼표, 공백 -> .trajectory , 쉼표 -> .csv ).
io_flag : 문자열 IO 소스(1: 기본값 do_port = -1 , do_state = 0 , 2: 사용자 IO).
반환 값str: 변환된 궤적 파일의 경로
StatusCodeEnum: 함수 실행 결과.
호환 로봇 소프트웨어 버전협업(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

4.7.5 궤적 파일 변환 상태 쿼리

메서드 이름trajectory.check_transform_status( file_name : str) -> tuple[TransformStatusEnum, StatusCodeEnum]
설명궤적 파일 변환의 현재 상태를 쿼리합니다.
요청 매개변수file_name : str 궤적 파일 경로( transform_csv_to_trajectory 에서 반환).
반환 값TransformStatusEnum: 변환 상태
StatusCodeEnum: 함수 실행 결과.
호환 로봇 소프트웨어 버전협업(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

예제 코드

trajectory/offline_trajectory.py
py
#!python
"""
Copyright © 2016 Agilebot Robotics Ltd. All rights reserved.
Instruction: 离线轨迹使用示例 / Example of offline trajectory usage
"""

import time

from Agilebot import Arm, RobotStatusEnum, ServoStatusEnum, StatusCodeEnum

# [ZH] 初始化捷勃特机器人
# [EN] Initialize the robot
arm = Arm()
# [ZH] 连接捷勃特机器人
# [EN] Connect to the robot
ret = arm.connect("10.27.1.254")
# [ZH] 检查是否连接成功
# [EN] Check if the connection is successful
if ret == StatusCodeEnum.OK:
    print("机器人连接成功 / Robot connected successfully")
else:
    print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 设置离线轨迹文件
# [EN] Set the offline trajectory file
ret = arm.trajectory.set_offline_trajectory_file("test_torque.trajectory")
if ret == StatusCodeEnum.OK:
    print("设置离线轨迹文件成功 / Set offline trajectory file successful")
else:
    print(f"设置离线轨迹文件失败,错误代码 / Set offline trajectory file failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 准备进行离线轨迹运行
# [EN] Prepare for offline trajectory execution
ret = arm.trajectory.prepare_offline_trajectory()
if ret == StatusCodeEnum.OK:
    print("准备离线轨迹运行成功 / Prepare offline trajectory execution successful")
else:
    print(f"准备离线轨迹运行失败,错误代码 / Prepare offline trajectory execution failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 等待控制器到位
# [EN] Wait for the controller to be ready
while True:
    robot_status, ret = arm.get_robot_status()
    if ret == StatusCodeEnum.OK:
        print("获取机器人状态成功 / Get robot status successful")
    else:
        print(f"获取机器人状态失败,错误代码 / Get robot status failed, error code: {ret.errmsg}")
        arm.disconnect()
        exit(1)
    print(f"robot_status arm: {robot_status}")
    servo_status, ret = arm.get_servo_status()
    if ret == StatusCodeEnum.OK:
        print("获取伺服状态成功 / Get servo status successful")
    else:
        print(f"获取伺服状态失败,错误代码 / Get servo status failed, error code: {ret.errmsg}")
        arm.disconnect()
        exit(1)
    print(f"伺服状态 / Servo status: {servo_status}")
    if robot_status == RobotStatusEnum.ROBOT_IDLE and servo_status == ServoStatusEnum.SERVO_IDLE:
        break
    time.sleep(2)

# [ZH] 执行离线轨迹
# [EN] Execute the offline trajectory
ret = arm.trajectory.execute_offline_trajectory()
if ret == StatusCodeEnum.OK:
    print("执行离线轨迹成功 / Execute offline trajectory successful")
else:
    print(f"执行离线轨迹失败,错误代码 / Execute offline trajectory failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 断开捷勃特机器人连接
# [EN] Disconnect from the robot
arm.disconnect()
print("机器人断开连接成功 / Robot disconnected successfully")

4.7.6 궤적 기록 시작

메서드 이름trajectory.trajectory_record_begin( name : str) -> StatusCodeEnum
설명로봇에게 궤적 기록을 시작하도록 지시합니다.
매개변수name : 궤적 프로그램 이름.
반품StatusCodeEnum: 함수의 실행 결과.
호환 로봇 소프트웨어 버전협업(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

4.7.7 궤적 기록 중지

메서드 이름trajectory.trajectory_record_finish( name : str) -> StatusCodeEnum
설명로봇에게 궤적 기록을 중지하도록 지시합니다.
매개변수name : 궤적 프로그램 이름.
반품StatusCodeEnum: 함수의 실행 결과.
호환 로봇 소프트웨어 버전협업(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

4.7.8 궤적 재생 시작

메서드 이름trajectory.trajectory_replay_start( name : str) -> StatusCodeEnum
설명로봇에게 궤적 재생을 시작하도록 지시합니다.
매개변수name : 궤적 프로그램 이름.
반품StatusCodeEnum: 함수의 실행 결과.
호환 로봇 소프트웨어 버전협업(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

4.7.9 궤적 재생 중지

메서드 이름trajectory.trajectory_replay_stop( name : str) -> StatusCodeEnum
설명로봇에게 궤적 재생을 중지하도록 지시합니다.
매개변수name : 궤적 프로그램 이름.
반품StatusCodeEnum: 함수의 실행 결과.
호환 로봇 소프트웨어 버전협업(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

4.7.10 궤적 삭제

메서드 이름trajectory.trajectory_record_delete( name : str) -> StatusCodeEnum
설명로봇에 저장된 특정 궤적을 삭제합니다.
매개변수name : 궤적 프로그램 이름.
반품StatusCodeEnum: 함수의 실행 결과.
호환 로봇 소프트웨어 버전협업(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

4.7.11 기록된 궤적 목록 가져오기

메서드 이름trajectory.get_trajectory_record_list() -> tuple[list[str], StatusCodeEnum]
설명기록된 궤적 목록을 검색합니다.
매개변수없음
반품[list[str]]: 궤적 프로그램 이름 목록입니다.
StatusCodeEnum: 함수 실행 결과.
호환 로봇 소프트웨어 버전협업(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

4.7.12 기록된 궤적 시작 포즈 가져오기

메서드 이름trajectory.get_trajectory_record_start_pose( name : str) -> tuple[MotionPose, StatusCodeEnum]
설명기록된 궤적의 시작 포즈를 검색합니다.
매개변수name : 궤적 프로그램 이름.
반품MotionPose: 궤적의 시작 포즈.
StatusCodeEnum: 함수의 실행 결과.
호환 로봇 소프트웨어 버전협업(Copper): v7.5.0.0+
산업용(Bronze): v7.5.0.0+

예제 코드

trajectory/trajectory_record.py
py
#!python
"""
Copyright © 2016 Agilebot Robotics Ltd. All rights reserved.
Instruction: 轨迹记录相关使用示例 / Example of real-time trajectory records usage
"""

import time

from Agilebot import Arm, RobotStatusEnum, ServoStatusEnum, StatusCodeEnum
from Agilebot.IR.A.hardware_state import HardwareState, HWState

# [ZH] 初始化捷勃特机器人
# [EN] Initialize the robot
arm = Arm()
# [ZH] 连接捷勃特机器人
# [EN] Connect to the robot
ret = arm.connect("10.27.1.254")
# [ZH] 检查是否连接成功
# [EN] Check if the connection is successful
if ret == StatusCodeEnum.OK:
    print("机器人连接成功 / Robot connected successfully")
else:
    print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 订阅轨迹记录状态
# [EN] Subscribe to the trajectory record status
hw_state = HardwareState("10.27.1.254")
hw_state.subscribe(topic_list=[HWState.TOPIC_TRAJECTORY_RECORDS_STATUS])

# [ZH] 开始记录轨迹
# [EN] Start recording trajectory
ret = arm.trajectory.trajectory_record_begin("test")
if ret == StatusCodeEnum.OK:
    print("开始轨迹记录成功 / Start trajectory record successful")
else:
    print(f"开始轨迹记录失败,错误代码 / Start trajectory record failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)
time.sleep(10)

res = hw_state.recv()
print(f"轨迹记录状态 / Trajectory record status: {res}")

# [ZH] 结束记录轨迹
# [EN] End recording trajectory
ret = arm.trajectory.trajectory_record_finish("test")
if ret == StatusCodeEnum.OK:
    print("结束轨迹记录成功 / End trajectory record successful")
else:
    print(f"结束轨迹记录失败,错误代码 / End trajectory record failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

res = hw_state.recv()
print(f"轨迹记录状态 / Trajectory record status: {res}")

# [ZH] 获取轨迹列表
# [EN] Get trajectory list
record_list, ret = arm.trajectory.get_trajectory_record_list()
if ret == StatusCodeEnum.OK:
    print("获取轨迹记录列表成功 / Get trajectory record list successful")
else:
    print(f"获取轨迹记录列表失败,错误代码 / Get trajectory record list failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)
assert "test" in record_list

# [ZH] 获取轨迹起始位姿
# [EN] Get trajectory start pose
pose, ret = arm.trajectory.get_trajectory_record_start_pose("test")
if ret == StatusCodeEnum.OK:
    print("获取轨迹起始位姿成功 / Get trajectory start pose successful")
else:
    print(f"获取轨迹起始位姿失败,错误代码 / Get trajectory start pose failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 移动到起始位姿
# [EN] Move to the start pose
ret = arm.motion.move_joint(pose)
if ret == StatusCodeEnum.OK:
    print("关节运动成功 / Joint motion successful")
else:
    print(f"关节运动失败,错误代码 / Joint motion failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 等待控制器到位
# [EN] Wait for the controller to be ready
while True:
    robot_status, ret = arm.get_robot_status()
    if ret == StatusCodeEnum.OK:
        print("获取机器人状态成功 / Get robot status successful")
    else:
        print(f"获取机器人状态失败,错误代码 / Get robot status failed, error code: {ret.errmsg}")
        arm.disconnect()
        exit(1)
    print(f"robot_status arm: {robot_status}")
    servo_status, ret = arm.get_servo_status()
    if ret == StatusCodeEnum.OK:
        print("获取伺服状态成功 / Get servo status successful")
    else:
        print(f"获取伺服状态失败,错误代码 / Get servo status failed, error code: {ret.errmsg}")
        arm.disconnect()
        exit(1)
    print(f"伺服状态 / Servo status: {servo_status}")
    if robot_status == RobotStatusEnum.ROBOT_IDLE and servo_status == ServoStatusEnum.SERVO_IDLE:
        break
    time.sleep(2)

# [ZH] 开始回放轨迹
# [EN] Start replay trajectory
ret = arm.trajectory.trajectory_replay_start("test")
if ret == StatusCodeEnum.OK:
    print("开始轨迹回放成功 / Start trajectory replay successful")
else:
    print(f"开始轨迹回放失败,错误代码 / Start trajectory replay failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

time.sleep(5)

# [ZH] 停止回放轨迹
# [EN] Stop replay trajectory
ret = arm.trajectory.trajectory_replay_stop("test")
if ret == StatusCodeEnum.OK:
    print("停止轨迹回放成功 / Stop trajectory replay successful")
else:
    print(f"停止轨迹回放失败,错误代码 / Stop trajectory replay failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 删除轨迹
# [EN] Delete trajectory
ret = arm.trajectory.trajectory_record_delete("test")
if ret == StatusCodeEnum.OK:
    print("删除轨迹记录成功 / Delete trajectory record successful")
else:
    print(f"删除轨迹记录失败,错误代码 / Delete trajectory record failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 断开捷勃特机器人连接
# [EN] Disconnect from the robot
arm.disconnect()
print("机器人断开连接成功 / Robot disconnected successfully")

4.7.13 기록 시작 궤적/경로

메서드 이름trajectory.path_record_begin( name : str, comment : str, param : float, angle : float = 1) -> StatusCodeEnum
설명궤적 테이블(.traj) 또는 경로 테이블(.path) 기록을 시작합니다.
매개변수name : 궤적/경로 파일 이름은 .traj 또는 .path로 끝나야 합니다.
comment : 궤적/경로에 대한 설명.
param :
- .path 테이블의 경우: 선형 동작 거리 임계값(mm).
- .traj 테이블의 경우: 기록 간격(ms).
angle : 회전 각도 임계값 (°), name.path 파일인 경우에만 유효합니다.
반품StatusCodeEnum: 함수 실행 결과.
호환 로봇 소프트웨어 버전협업(Copper): v7.7.I.0+
산업용(Bronze): 지원되지 않음

4.7.14 궤적/경로 기록 중지

메서드 이름trajectory.path_record_finish() -> StatusCodeEnum
설명현재 궤적/경로 테이블 기록을 중지합니다.
매개변수없음
반품StatusCodeEnum: 함수 실행 결과.
호환 로봇 소프트웨어 버전협업(Copper): v7.7.I.0+
산업용(Bronze): 지원되지 않음

4.7.15 궤적/경로의 시작 포즈 가져오기

메서드 이름trajectory.get_path_start_pose( name : str) -> tuple[MotionPose, StatusCodeEnum]
설명지정된 궤적/경로 파일의 시작 포즈를 검색합니다.
매개변수name : 궤적/경로 파일 이름.
반품MotionPose : 시작 포즈.
StatusCodeEnum: 함수의 실행 결과입니다.
호환 로봇 소프트웨어 버전협업(Copper): v7.7.I.0+
산업용(Bronze): 지원되지 않음

4.7.16 궤적/경로 상태 가져오기

메서드 이름trajectory.get_path_state( path_list : list[str]) -> tuple[dict[str, int], StatusCodeEnum]
설명궤적/경로 파일의 현재 상태를 일괄 쿼리합니다.
매개변수path_list : 쿼리할 궤적/경로 파일 이름 목록입니다.
반품dict[str, int] : 파일명 → 상태 코드 매핑.
StatusCodeEnum: 함수 실행 결과.
호환 로봇 소프트웨어 버전협업(Copper): v7.7.I.0+
산업용(Bronze): 지원되지 않음

4.7.17 경로 계획자 매개변수 설정

메서드 이름trajectory.set_path_planner_parameter( transition_time : float, scaling_factor : float) -> StatusCodeEnum
설명동작의 부드러움과 속도/가속도 분포에 영향을 미치는 경로 계획 매개변수를 구성합니다.
매개변수transition_time : 블렌딩 시간(0~1; 더 큰 = 더 부드러운 가속/decel).
scaling_factor : 경로 매개변수 s 가중치(0~1; 0: 균일한 시간 스케일링, 1: 최대 변위 스케일링, 0.5: 동일 가속, 0.33: 동일 저크).
반품StatusCodeEnum: 함수의 실행 결과.
호환 로봇 소프트웨어 버전협업(Copper): v7.7.I.0+
산업용(Bronze): 지원되지 않음

4.7.18 경로 계획자 매개변수 가져오기

메서드 이름trajectory.get_path_planner_parameter() -> tuple[float, float, StatusCodeEnum]
설명현재 경로 계획자 매개변수를 읽습니다.
매개변수없음
반품transition_time : 블렌딩 시간, 0–1.
scaling_factor : 재분배 가중치, 0–1.
StatusCodeEnum: 함수 실행 결과.
호환 로봇 소프트웨어 버전협업(Copper): v7.7.I.0+
산업용(Bronze): 지원되지 않음

4.7.19 궤적/경로를 따라 이동

메서드 이름trajectory.move_path( name : str, vel : float = 100, acc : float = 1) -> StatusCodeEnum
설명로봇 엔드 이펙터에게 지정된 궤적/경로 파일을 따라 이동하도록 명령합니다.
매개변수name : 궤적/path 파일 이름.
vel : TCP 속도(0~5000mm/s).
acc : 가속 배율(0~1.2).
반품StatusCodeEnum: 함수의 실행 결과.
호환 로봇 소프트웨어 버전협업(Copper): v7.7.I.0+
산업용(Bronze): 지원되지 않음

예제 코드

trajectory/path_record.py
py
#!python
"""
Copyright © 2016 Agilebot Robotics Ltd. All rights reserved.
Instruction: 路径记录相关使用示例 / Example of usage related to path records
"""

import time

from Agilebot import Arm, MoveMode, RobotStatusEnum, ServoStatusEnum, StatusCodeEnum

# [ZH] 初始化机械臂并连接到指定IP地址
# [EN] Initialize the robotic arm and connect to the specified IP address
arm = Arm()
ret = arm.connect("10.27.1.254")
if ret == StatusCodeEnum.OK:
    print("机器人连接成功 / Robot connected successfully")
else:
    print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 开始记录轨迹,指定文件名、轨迹名、记录模式和覆盖选项
# [EN] Start trajectory recording, specifying filename, trajectory name, recording mode and overwrite option
ret = arm.trajectory.path_record_begin("test_path.path", "Path Test", 10, 1)
if ret == StatusCodeEnum.OK:
    print("开始路径记录成功 / Start path record successful")
else:
    print(f"开始路径记录失败,错误代码 / Start path record failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 检查记录状态,传入轨迹文件名列表
# [EN] Check recording status, passing in trajectory filename list
state, ret = arm.trajectory.get_path_state(["test_path.path"])
if ret == StatusCodeEnum.OK:
    print("获取路径状态成功 / Get path state successful")
else:
    print(f"获取路径状态失败,错误代码 / Get path state failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)
if state["test_path.path"] == 0:
    print("路径表记录中 / Path table recording in progress")

# [ZH] 示教运动
# [EN] Teaching motion
ret = arm.jogging.move(3, MoveMode.Continuous)
if ret == StatusCodeEnum.OK:
    print("点动运动成功 / Jogging movement successful")
else:
    print(f"点动运动失败,错误代码 / Jogging movement failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)
# 等待3秒,让机械臂持续运动
time.sleep(2)
# 停止机械臂运动
arm.jogging.stop()
time.sleep(2)
ret = arm.jogging.move(-3, MoveMode.Continuous)
if ret == StatusCodeEnum.OK:
    print("点动运动成功 / Jogging movement successful")
else:
    print(f"点动运动失败,错误代码 / Jogging movement failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)
# 等待3秒,让机械臂持续运动
time.sleep(2)
# 停止机械臂运动
arm.jogging.stop()
time.sleep(2)

# [ZH] 结束轨迹记录
# [EN] Finish trajectory recording
ret = arm.trajectory.path_record_finish()
if ret == StatusCodeEnum.OK:
    print("结束路径记录成功 / Finish path record successful")
else:
    print(f"结束路径记录失败,错误代码 / Finish path record failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 检查记录状态,传入轨迹文件名列表
# [EN] Check recording status, passing in trajectory filename list
state, ret = arm.trajectory.get_path_state(["test_path.path"])
if ret == StatusCodeEnum.OK:
    print("获取路径状态成功 / Get path state successful")
else:
    print(f"获取路径状态失败,错误代码 / Get path state failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)
if state["test_path.path"] == 1:
    print("路径表记录完成 / Path table recording completed")

# [ZH] 获取记录轨迹的起始位置姿态
# [EN] Get the starting position pose of the recorded trajectory
pose, ret = arm.trajectory.get_path_start_pose("test_path.path")
if ret == StatusCodeEnum.OK:
    print("获取路径起始位姿成功 / Get path start pose successful")
else:
    print(f"获取路径起始位姿失败,错误代码 / Get path start pose failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 移动到起始位姿
# [EN] Move to the start pose
ret = arm.motion.move_joint(pose)
if ret == StatusCodeEnum.OK:
    print("关节运动成功 / Joint motion successful")
else:
    print(f"关节运动失败,错误代码 / Joint motion failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 等待控制器到位
# [EN] Wait for the controller to be ready
while True:
    robot_status, ret = arm.get_robot_status()
    # [ZH] 检查机器人状态获取是否成功
    # [EN] Check if robot status acquisition is successful
    if ret == StatusCodeEnum.OK:
        print("获取机器人状态成功 / Get robot status successful")
    else:
        print(f"获取机器人状态失败,错误代码 / Get robot status failed, error code: {ret.errmsg}")
        arm.disconnect()
        exit(1)
    print(f"robot_status arm: {robot_status}")
    servo_status, ret = arm.get_servo_status()
    # [ZH] 检查伺服状态获取是否成功
    # [EN] Check if servo status acquisition is successful
    if ret == StatusCodeEnum.OK:
        print("获取伺服状态成功 / Get servo status successful")
    else:
        print(f"获取伺服状态失败,错误代码 / Get servo status failed, error code: {ret.errmsg}")
        arm.disconnect()
        exit(1)
    print(f"servo status arm: {servo_status}")
    if robot_status == RobotStatusEnum.ROBOT_IDLE and servo_status == ServoStatusEnum.SERVO_IDLE:
        break
    time.sleep(2)

# [ZH] 设置轨迹规划参数(速度比例和加速度比例)
# [EN] Set trajectory planning parameters (velocity ratio and acceleration ratio)
ret = arm.trajectory.set_path_planner_parameter(0.5, 0.3333333)
if ret == StatusCodeEnum.OK:
    print("设置路径规划参数成功 / Set path planner parameter successful")
else:
    print(f"设置路径规划参数失败,错误代码 / Set path planner parameter failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 获取轨迹规划参数以验证设置是否成功
# [EN] Get trajectory planning parameters to verify if the setting is successful
param1, param2, ret = arm.trajectory.get_path_planner_parameter()
if ret == StatusCodeEnum.OK:
    print("获取路径规划参数成功 / Get path planner parameter successful")
else:
    print(f"获取路径规划参数失败,错误代码 / Get path planner parameter failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 移动到记录的轨迹,指定轨迹文件名、速度和模式
# [EN] Move to the recorded trajectory, specifying trajectory filename, speed and mode
ret = arm.trajectory.move_path("test_path.path", 2000, 1)
if ret == StatusCodeEnum.OK:
    print("路径运动成功 / Path motion successful")
else:
    print(f"路径运动失败,错误代码 / Path motion failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)
time.sleep(3)

# [ZH] 断开与机械臂的连接
# [EN] Disconnect from the robotic arm
arm.disconnect()
print("机器人断开连接成功 / Robot disconnected successfully")