上电与抱闸

1. 简介

CS的29999端口控制机器人上下电、释放抱闸、查询基本信息等功能。本文借助代码介绍对应脚本的使用方法。

2. 相关指令

2.1 上电

robotControl -on
功能:
该指令用于控制机器人进行上电操作。
示例:
TIMEOUT = 5.0
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(TIMEOUT)
cmd = "robotControl -on"
resp = send_cmd(sock, cmd)
响应:
Powering on

2.2 释放抱闸

brakeRelease
功能:
该指令用于控制机器人进行释放抱闸。
示例:
TIMEOUT = 5.0
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(TIMEOUT)
cmd = "brakeRelease"
resp = send_cmd(sock, cmd)
响应:
Brake Releasing...

2.3 检验当前连接状态

echo
功能:
该指令用于简单测试当前连接状态,得到响应即可。
示例:
TIMEOUT = 5.0
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(TIMEOUT)
cmd = "echo"
resp = send_cmd(sock, cmd)
响应:
Hello ELITE ROBOTS.

2.4 弹出消息框

popup -s CS系列
功能:
该指令用于在示教器上弹出消息框,消息框的内容在 -s 后面定义。
示例:
TIMEOUT = 5.0
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(TIMEOUT)
cmd = "popup -s CS系列"
resp = send_cmd(sock, cmd)
响应:
Showing popup with text: CS系列

2.5 关闭弹出框

popup -c
功能:
该指令用于在关闭在示教器上弹出消息框。
示例:
TIMEOUT = 5.0
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(TIMEOUT)
cmd = "popup -c"
resp = send_cmd(sock, cmd)
响应:
Closing popup

3. 代码示例

"""
Elite CS 系列机器人 29999 Dashboard 端口控制脚本
按顺序执行:上电 → 释放抱闸 → 检验连接 → 弹出消息 → 关闭弹出 → 获取模式 → 获取类型 → 获取版本 → 获取速度 → 设置速度50% → 下电 → 关机
"""

import socket
import sys
import time

# ============================================================
# 配置区
# ============================================================
ROBOT_IP = "192.168.254.138"  # 机器人 IP,按实际情况修改
PORT = 29999                 # Dashboard 端口
TIMEOUT = 5.0                # 单次收发超时(秒)

# 命令序列
COMMANDS = [
    ("上电",              "robotControl -on"),
    ("释放抱闸",          "brakeRelease"),
    ("检验当前连接状态",   "echo"),
    ("弹出消息框",        "popup -s CS系列"),
    ("关闭弹出框",        "popup -c"),
    ("获取机器人模式",     "robotMode"),
    ("获取机器人类型",     "robot -t"),
    ("获取版本",          "version"),
    ("获取速度",          "speed"),
    ("设置速度 50%",       "speed -v 50"),
    ("下电",              "robotControl -off"),
    ("关机",              "shutdown"),
]

TIME_WAIT = 5.0

# ============================================================
# 核心函数
# ============================================================
def send_cmd(sock: socket.socket, cmd: str) -> str:
    """向 29999 端口发送一条命令,返回响应文本"""
    sock.sendall((cmd + "\n").encode("utf-8"))
    try:
        resp = sock.recv(4096).decode("utf-8", errors="replace").strip()
    except socket.timeout:
        resp = "[TIMEOUT] 未收到响应"
    return resp


def main():
    # 确保 stdout 输出 UTF-8(Windows PowerShell 兼容)
    if sys.platform == "win32":
        sys.stdout.reconfigure(encoding="utf-8")

    print(f"=" * 60)
    print(f"Elite CS 机器人 Dashboard 控制脚本")
    print(f"目标: {ROBOT_IP}:{PORT}")
    print(f"=" * 60)

    # 建立 TCP 连接
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(TIMEOUT)
    try:
        sock.connect((ROBOT_IP, PORT))
    except ConnectionRefusedError:
        print(f"[ERROR] 连接被拒绝,请检查机器人 IP 和端口 ({ROBOT_IP}:{PORT})")
        return
    except socket.timeout:
        print(f"[ERROR] 连接超时,请检查网络连通性")
        return
    except OSError as e:
        print(f"[ERROR] 连接失败: {e}")
        return

    # 接收欢迎信息
    try:
        welcome = sock.recv(4096).decode("utf-8", errors="replace").strip()
        print(f"\n[欢迎信息] {welcome}\n")
    except socket.timeout:
        print("[WARN] 未收到欢迎信息,继续执行\n")

    # 按顺序执行命令
    for i, (desc, cmd) in enumerate(COMMANDS, 1):
        print(f"[{i:02d}/{len(COMMANDS)}] {desc}")
        print(f"        命令: {cmd}")

        resp = send_cmd(sock, cmd)
        print(f"        响应: {resp}")
        print()

        time.sleep(TIME_WAIT)

    # 断开连接
    try:
        sock.sendall(b"quit\n")
        sock.recv(4096)
    except Exception:
        pass
    finally:
        sock.close()

    print("=" * 60)
    print("所有命令执行完毕,连接已断开")
    print("=" * 60)


if __name__ == "__main__":
    main()