Python API

EN KO

Python에서 이 저장소를 사용하는 대표적인 방법은 두 가지입니다.

간단 래퍼: UR_RTDE

작은 래퍼 클래스이며, 읽기 쉽고 실제 애플리케이션 코드에 복사해 넣기 쉬운 형태를 목표로 합니다.

동기 UR_RTDE 예제
from __future__ import annotations

from ur_rtde_api import UR_RTDE

HOST = "192.168.163.128"
FREQUENCY_HZ = 125
ROBOT_FIELDS = [
    "timestamp",
    "actual_q",
    "actual_TCP_pose",
    "input_int_register_24",
    "output_int_register_24",
]


def main() -> int:
    robot = UR_RTDE(
        HOST=HOST,
        FREQUENCY_HZ=FREQUENCY_HZ,
        FIELD=ROBOT_FIELDS,
    )

    robot.start()
    try:
        print("actual_q [rad]        =", robot["actual_q"])
        print("actual_q [deg]        =", robot.q_deg())
        print("actual_TCP_pose       =", robot["actual_TCP_pose"])
        print("TCP xyz mm + RPY deg  =", robot.tcp_rpy_deg())

        print("input_int_register_24 (before) =", robot["input_int_register_24"])
        robot["input_int_register_24"] = 33
        print("input_int_register_24 (after)  =", robot["input_int_register_24"])

        if "output_int_register_24" in ROBOT_FIELDS:
            print("output_int_register_24         =", robot["output_int_register_24"])
        return 0
    finally:
        robot.stop()
        robot.close()


if __name__ == "__main__":
    raise SystemExit(main())

코어 클래스: URRobot

URRobot 은 웹 인터페이스 내부에서도 사용하는 조금 더 명시적인 저수준 인터페이스입니다.

생성 예시는 아래와 같습니다.

from backend.ur_robot import URRobot

robot = URRobot(
    host="192.168.163.128",
    frequency_hz=125.0,
    fields=["timestamp", "actual_q", "actual_TCP_pose"],
)

비동기 예제

비동기 URRobot 예제
from __future__ import annotations

import asyncio

from backend.ur_robot import URRobot

HOST = "192.168.163.128"
FREQUENCY_HZ = 125.0
ROBOT_FIELDS = [
    "timestamp",
    "actual_q",
    "actual_TCP_pose",
]


async def main() -> None:
    robot = URRobot(
        host=HOST,
        frequency_hz=FREQUENCY_HZ,
        fields=ROBOT_FIELDS,
    )

    await robot.start_async()
    try:
        frame = await robot.wait_next_frame_async(timeout=1.0)
        print("frame index           =", frame.frame_index)
        print("actual_q [rad]        =", frame["actual_q"])
        print("actual_q [deg]        =", robot.q_deg())
        print("TCP xyz mm + RPY deg  =", robot.tcp_rpy_deg())
    finally:
        await robot.stop_async()
        await robot.close_async()


if __name__ == "__main__":
    asyncio.run(main())

값 읽기

두 API 모두 최신 캐시값을 필드명으로 바로 읽을 수 있습니다.

print(robot["actual_q"])
print(robot["actual_TCP_pose"])

GP input 쓰기

쓰기 대상은 input_*_register_* 필드만 사용하세요.

robot["input_int_register_24"] = 33
robot["input_double_register_24"] = 12.5
robot["input_bit_register_64"] = True

변환 helper

표시와 디버깅에 유용한 helper 예시입니다.

print(robot.q_deg())
print(robot.tcp_mm())
print(robot.tcp_mm_deg())
print(robot.tcp_rpy())
print(robot.tcp_rpy_deg())

권장 연동 패턴

조금 더 큰 애플리케이션에서는 다음 패턴을 권장합니다.

  • 로봇 연결당 robot 객체 하나 유지

  • 필요한 최소 필드 조합만 선택

  • 웹 인터페이스는 점검용으로 사용

  • Python API는 자동화와 로깅에 사용