grpc_client/ui/run_action.py

211 lines
6.8 KiB
Python

import argparse
import sys
from clients._path_setup import ensure_paths
ensure_paths()
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Run robot client actions.")
parser.add_argument(
"action",
choices=[
"movej",
"movel",
"speedj",
"speedl",
"stop_motion",
"get_pose",
"torque_on",
"torque_off",
],
help="Action to run",
)
parser.add_argument("--host", default="192.168.0.222", help="gRPC server host")
parser.add_argument("--port", type=int, default=50052, help="gRPC server port")
parser.add_argument("--device-id", default="right_arm", help="Device ID")
parser.add_argument("--interval", type=float, default=0.05, help="Interval seconds")
parser.add_argument("--base-link", default="PELVIS_S", help="Base link for pose")
parser.add_argument("--ee-link", default="R_FINGER_TIP", help="End-effector link for pose")
parser.add_argument("--vel", type=float, default=1.0, help="Motion velocity")
parser.add_argument("--acc", type=float, default=0.5, help="Motion acceleration")
parser.add_argument("--duration", type=float, default=0.2, help="Speed command duration")
parser.add_argument("--blend-radius", type=float, default=0.0, help="MoveL blend radius")
parser.add_argument(
"--frame",
choices=["base", "tool", "world", "user"],
default="base",
help="Cartesian command frame",
)
parser.add_argument(
"--joint-list",
default="",
help="Joint list format: JOINT:VALUE;JOINT:VALUE",
)
parser.add_argument("--x", type=float, default=0.0, help="Cartesian pose x")
parser.add_argument("--y", type=float, default=0.0, help="Cartesian pose y")
parser.add_argument("--z", type=float, default=0.0, help="Cartesian pose z")
parser.add_argument("--rx", type=float, default=0.0, help="Cartesian pose rx")
parser.add_argument("--ry", type=float, default=0.0, help="Cartesian pose ry")
parser.add_argument("--rz", type=float, default=0.0, help="Cartesian pose rz")
parser.add_argument("--vx", type=float, default=0.0, help="Cartesian velocity x")
parser.add_argument("--vy", type=float, default=0.0, help="Cartesian velocity y")
parser.add_argument("--vz", type=float, default=0.0, help="Cartesian velocity z")
parser.add_argument("--wx", type=float, default=0.0, help="Cartesian angular velocity x")
parser.add_argument("--wy", type=float, default=0.0, help="Cartesian angular velocity y")
parser.add_argument("--wz", type=float, default=0.0, help="Cartesian angular velocity z")
return parser.parse_args()
def parse_joint_values(value: str, field_name: str) -> list[dict]:
parsed = []
for item in value.split(";"):
if not item or ":" not in item:
continue
name, raw = item.split(":", 1)
try:
number = float(raw)
except ValueError:
number = 0.0
parsed.append({"joint_name": name, field_name: number})
return parsed
def main() -> int:
args = parse_args()
address = f"{args.host}:{args.port}"
if args.action == "movej":
from clients.arm_motion_client import ArmMotionClient
from clients.movej_client import test_joint_list
joint_list = test_joint_list
if args.joint_list:
parsed = parse_joint_values(args.joint_list, "rad")
if parsed:
joint_list = parsed
client = ArmMotionClient(address=address)
try:
client.movej(joint_list, vel=args.vel, acc=args.acc, device_id=args.device_id)
print(joint_list)
finally:
client.close()
return 0
if args.action == "movel":
from clients.arm_motion_client import ArmMotionClient
client = ArmMotionClient(address=address)
try:
client.movel(
pose={
"x": args.x,
"y": args.y,
"z": args.z,
"rx": args.rx,
"ry": args.ry,
"rz": args.rz,
},
vel=args.vel,
acc=args.acc,
blend_radius=args.blend_radius,
frame=args.frame,
device_id=args.device_id,
)
finally:
client.close()
return 0
if args.action == "speedj":
from clients.arm_motion_client import ArmMotionClient
joint_list = parse_joint_values(args.joint_list, "velocity")
client = ArmMotionClient(address=address)
try:
client.speedj(
joint_list,
acc=args.acc,
duration=args.duration,
device_id=args.device_id,
)
print(joint_list)
finally:
client.close()
return 0
if args.action == "speedl":
from clients.arm_motion_client import ArmMotionClient
client = ArmMotionClient(address=address)
try:
client.speedl(
velocity={
"vx": args.vx,
"vy": args.vy,
"vz": args.vz,
"wx": args.wx,
"wy": args.wy,
"wz": args.wz,
},
acc=args.acc,
duration=args.duration,
frame=args.frame,
device_id=args.device_id,
)
finally:
client.close()
return 0
if args.action == "stop_motion":
from clients.arm_motion_client import ArmMotionClient
client = ArmMotionClient(address=address)
try:
client.stop_motion(device_id=args.device_id)
finally:
client.close()
return 0
if args.action == "get_pose":
from clients.get_pose_client import GetPoseClient
client = GetPoseClient(address=address)
try:
client.send(
interval=args.interval,
device_id=args.device_id,
base_link=args.base_link,
ee_link=args.ee_link,
)
finally:
client.close()
return 0
if args.action == "torque_on":
from clients.torque_on_client import TorqueOnClient
client = TorqueOnClient(address=address)
try:
client.send(device_id=args.device_id)
finally:
client.close()
return 0
if args.action == "torque_off":
from clients.torque_off_client import TorqueOffClient
client = TorqueOffClient(address=address)
try:
client.send(device_id=args.device_id)
finally:
client.close()
return 0
return 1
if __name__ == "__main__":
sys.exit(main())