# 机器人相关模块文档 (Python版本)

## 机器人相关

### 校验机器人是否存在

* 方法说明

  校验机器人是否存在。

```python
async def is_robot_exist(robot_name: str) -> bool
```

* 输入参数

  `robot_name`: string 类型，机器人名称。

* 输出参数
  * `True`: 存在。
  * `False`: 不存在。

* 异常

  本方法不抛出异常。

### 获取机器人基本信息

* 方法说明

  获取机器人基本信息。

```python
async def get_lite_robots_status() -> str
```

* 输入参数

  无。

* 输出参数

```json
[
  {
    "battery_level": 1,
    "confidence": 1,
    "currentGroup": "unnamed",
    "current_map": "newCHACHECPD-15_1",
    "current_map_invalid": false,
    "dI": [],
    "dO": [],
    "disconnect": false,
    "dispatchable": true,
    "dispatchable_status": 0,
    "errors": [],
    "ip": "",
    "low_battery": false,
    "reloc_status": 1,
    "task_status": 0,
    "unconfirmed_reloc": false,
    "unlock": 0,
    "uuid": "sim_01"
  },
  {
    "battery_level": 1,
    "confidence": 1,
    "currentGroup": "RobotGroup-01",
    "current_map": "newCHACHECPD-15_1",
    "current_map_invalid": false,
    "dI": [],
    "dO": [],
    "disconnect": false,
    "dispatchable": true,
    "dispatchable_status": 0,
    "errors": [],
    "ip": "",
    "low_battery": false,
    "orderId": "ab913f4b-9a35-4cdf-a4e5-07928897e0d2",
    "reloc_status": 1,
    "state": "FINISHED",
    "task_status": 4,
    "unconfirmed_reloc": false,
    "unlock": 0,
    "uuid": "sim_02"
  }
]
```

* 异常

  本方法抛出异常。

### 根据ID获取机器人基本信息

* 方法说明

  根据ID获取机器人基本信息。

```python
async def get_lite_robots_status_by_id(agv_id: str) -> str
```

* 输入参数

  `agv_id`: string 类型，机器人ID。

* 输出参数

```json
{
  "battery_level": 1,
  "confidence": 1,
  "currentGroup": "unnamed",
  "current_map": "newCHACHECPD-15_1",
  "current_map_invalid": false,
  "dI": [],
  "dO": [],
  "disconnect": false,
  "dispatchable": true,
  "dispatchable_status": 0,
  "errors": [],
  "ip": "",
  "low_battery": false,
  "reloc_status": 1,
  "task_status": 0,
  "unconfirmed_reloc": false,
  "unlock": 0,
  "uuid": "sim_01"
}
```

* 异常

  本方法会抛出异常。

### 根据ID获取机器人位置

* 方法说明

  根据机器人ID获取机器人的位置。

```python
async def get_vehicle_station(agv_id: str) -> str
```

* 输入参数

  `agv_id`: string 类型，机器人ID。

* 输出参数

```json
{
  "lastStation": "LM32",
  "station": "AP25"
}
```

如果与调度断连返回空对象 `{}`。

* 异常

  本方法不抛出异常。

### 获取Core报错信息

* 方法说明

  获取Core报错信息。

```python
async def get_core_alarms() -> str
```

* 输入参数

  无。

* 输出参数

```json
{
  "errors": [
    {
      "code": 52106,
      "desc": "(AMB-01: blocked by chengpin-02 in occupy path. blocked by chengpin-02 in block group's edge BlockGroup102)(AMB-02: blocked by AMB-05 in occupy path. blocked by AMB-05 in block group's edge BlockGroup94)(AMB-03: blocked by AMB-05 in block group's lm BlockGroup94)(AMB-05: blocked by AMB-03 in block group's lm BlockGroup105)(chengpin-02: blocked by AMB-01 in occupy path. blocked by AMB-01 in block group's edge BlockGroup102)",
      "times": 5,
      "timestamp": 1681110467
    },
    {
      "code": 52201,
      "desc": "(AMB-01,chengpin-02, in BlockGroup102, whose max number is 1 ), The number of robots in same block group is over max number.",
      "times": 1,
      "timestamp": 1681110452
    }
  ],
  "warnings": [
    {
      "code": 54000,
      "desc": "AMB-02,AMB-05,chengpin-03,chengpin-08, unable to reach park point.",
      "times": 1,
      "timestamp": 1681110462
    }
  ]
}
```

当与调度断连时，本方法会返回 `None`。

* 异常

  本方法不会抛出异常。

async ### 根据ID获取Core报错信息

* 方法说明

  根据ID获取Core报错信息。

```python
async def get_core_alarms_by_id(code: int) -> str
```

* 输入参数

  `code`: int类型，错误码。

* 输出参数

```json
{
  "errors": [
    {
      "code": 52201,
      "desc": "(AMB-01,chengpin-02, in BlockGroup102, whose max number is 1 ), The number of robots in same block group is over max number.",
      "times": 1,
      "timestamp": 1681110452
    }
  ]
}
```

当与调度断连时，本方法会返回 `None`。

* 异常

  本方法不会抛出异常。

### 获取Rbk报错信息

* 方法说明

  获取Rbk报错信息。

```python
async def get_rbk_alarms() -> str
```

* 输入参数

  无。

* 输出参数

```json
{
  "errors": [
    {
      "code": 52200,
      "desc": "Blocked by : chengpin-02",
      "times": 1,
      "timestamp": 1681116822857
    },
    {
      "code": 52200,
      "desc": "Blocked by : AMB-01",
      "times": 1,
      "timestamp": 1681116822858
    }
  ]
}
```

当与调度断连时，本方法会返回 `None`。

* 异常

  本方法不会抛出异常。

### 根据ID获取Rbk报错信息

* 方法说明

  根据ID获取Rbk报错信息。

```python
async def get_rbk_alarms_by_id(code: int) -> str
```

* 输入参数

  `code`: int类型，错误码。

* 输出参数

```json
{
  "errors": [
    {
      "code": 52200,
      "desc": "Blocked by : chengpin-02",
      "times": 1,
      "timestamp": 1681117052956
    },
    {
      "code": 52200,
      "desc": "Blocked by : AMB-01",
      "times": 1,
      "timestamp": 1681117052956
    }
  ]
}
```

当与调度断连时，本方法会返回 `None`。

* 异常

  本方法不会抛出异常。

### 设置机器人软急停

* 方法说明

  设置机器人软急停。

```python
async def set_soft_stop(vehicle_id: str, status: bool) -> bool
```

* 输入参数

  `vehicle_id`: string 类型，机器人名称。
  `status`: boolean类型，`True`: 设置机器人软急停，`False`: 取消机器人软急停。

* 输出参数
  * `True`: 成功。
  * `False`: 失败。

* 异常

  本方法不抛出异常。

### 获取机器人所有信息

* 方法说明

  获取机器人所有信息。

```python
async def get_robots_status() -> str
```

* 输入参数

  无。

* 输出参数

```json
{
  "dynamic_obstacle": {},
  "errors": [
    {
      "52101": 1634020173,
      "desc": "hu-test-1,hu-test-3, have no charge point in map.",
      "times": 1
    },
    {
      "52103": 1634020173,
      "desc": "hu-test-1,hu-test-3, have no park point in map.",
      "times": 1
    },
    {
      "53200": 1634020174,
      "desc": "[{\"error_msg\":\"old: hu-test-1, now: AMB-01, please change back!\",\"ip\":\"106.14.198.1\"}]",
      "times": 1
    }
  ],
  "fatals": [],
  "notices": [],
  "report": [
    {
      "area_resources_occupied": [
        {
          "area_name": "new",
          "avoidObs_area_occupied": {
            "radius": -1,
            "x": 0,
            "y": 0
          },
          "blocks_occupied": [],
          "path_occupied": [
            {
              "end_id": "AP1",
              "end_percentage": 0.7882161028093827,
              "source_id": "AP61",
              "start_percentage": 0.7882161028093827
            }
          ]
        }
      ],
      "basic_info": {
        "current_map": "20200529150233136",
        "dsp_version": "simulation",
        "ip": "106.14.198.1",
        "model": "AMB-150",
        "robot_note": "",
        "version": "v3.3.4.51"
      },
      "changes": {
        "maps": [
          "20200529150233136.smap",
          "default.smap",
          "wwww(1).smap"
        ],
        "model": true
      },
      "chassis": {
        "goods_region": {
          "name": "",
          "point": []
        },
        "head": 0.42,
        "radius": 0.0,
        "shape": 1,
        "tail": 0.38,
        "width": 0.56
      },
      "connection_status": 1,
      "current_order": {},
      "dispatchable": false,
      "is_error": false,
      "lock_info": {
        "desc": "",
        "ip": "58.34.135.130",
        "locked": true,
        "nick_name": "DESKTOP-27FKEEM(0d50b)",
        "port": 54733,
        "time_t": "1634023715",
        "type": 2
      },
      "network_delay": 100,
      "rbk_report": {
        "DI": [],
        "DO": [],
        "angle": -1.5626,
        "battery_level": 1.0,
        "blocked": false,
        "brake": false,
        "charging": false,
        "confidence": 0.996,
        "current": -1.0,
        "current_map": "20200529150233136",
        "current_map_md5": "72a91de898406e10b9cedfed51a3a5f9",
        "current_station": "LM1",
        "emergency": false,
        "errors": [],
        "fatals": [],
        "fork": {
          "fork_auto_flag": true,
          "fork_height": -0.0,
          "fork_height_in_place": false,
          "forward_in_place": false,
          "forward_val": 0.0
        },
        "info": {},
        "jack": {
          "jack_emc": false,
          "jack_enable": false,
          "jack_error_code": 0,
          "jack_height": 0.0,
          "jack_isFull": false,
          "jack_load_times": 0,
          "jack_mode": false,
          "jack_speed": 0,
          "jack_state": 0
        },
        "last_station": "CP2",
        "lock_info": {
          "desc": "",
          "ip": "58.34.135.130",
          "locked": true,
          "nick_name": "DESKTOP-27FKEEM(0d50b)",
          "port": 54733,
          "time_t": "1634023715",
          "type": 2
        },
        "notices": [],
        "odo": 24.771,
        "received_on": {
          "data_nsec": "1110998989197957",
          "frame_id": "",
          "pub_nsec": "1110998989197957",
          "seq": "0"
        },
        "reloc_status": 1,
        "requestCurrent": -0.0,
        "requestVoltage": -0.0,
        "roller": {
          "roller_emc": false,
          "roller_enable": false,
          "roller_error_code": 0,
          "roller_isFull": false,
          "roller_mode": false,
          "roller_speed": 0,
          "roller_state": 0
        },
        "soft_emc": false,
        "steer": -0.0,
        "time": 104303118,
        "today_odo": 15.812,
        "total_time": 444534615,
        "voltage": 1.0,
        "vx": -0.0,
        "vy": -0.0,
        "w": -0.0,
        "warnings": [
          {
            "55001": 1634020734,
            "desc": "The robot is in the dispatching state. If you need to control, please regain control and go offline during dispatching.",
            "times": 1
          }
        ],
        "x": -0.3316,
        "y": -1.4711
      },
      "undispatchable_reason": {
        "current_map_invalid": false,
        "disconnect": false,
        "dispatchable_status": 0,
        "low_battery": false,
        "unconfirmed_reloc": false,
        "unlock": 1
      },
      "uuid": "hu-test-1",
      "vehicle_id": "AMB-01"
    }
  ],
  "scene_md5": "b481893504019cd71c03484f4b2419e1",
  "warnings": []
}
```

当与调度断连时，本方法会返回 `None`。

* 异常

  本方法抛出异常。

### 查询所有机器人充电阈值

* 方法说明

  获取所有机器人充电阈值信息。

```python
async def query_charge_param() -> str
```

* 输入参数

  无。

* 输出参数

```json
[
  {
    "vehicle": "AMB-01",
    "params": {
      "chargeNeed": 40.0,
      "chargeOnly": 30.0,
      "chargedOK": 50.0,
      "chargedFull": 90.0
    }
  },
  {
    "vehicle": "AMB-02",
    "params": {
      "chargeNeed": 50.0,
      "chargeOnly": 20.0,
      "chargedOK": 60.0,
      "chargedFull": 80.0
    }
  }
]
```

当与调度断连时，本方法会返回 `None`。

* 异常

  本方法不抛出异常。

### 查询机器人充电阈值

* 方法说明

  根据机器人名称获取机器人充电阈值信息。

```python
async def query_charge_param_by_vehicles(vehicles: str) -> str
```

* 输入参数

  `vehicles`: JSON 格式的字符串(将数组转成字符串格式)，查询指定数量的机器人充电阈值信息。

* 输出参数

```json
[
  {
    "vehicle": "AMB-01",
    "params": {
      "chargeNeed": 40.0,
      "chargeOnly": 30.0,
      "chargedOK": 50.0,
      "chargedFull": 90.0
    }
  },
  {
    "vehicle": "AMB-02",
    "params": {
      "chargeNeed": 50.0,
      "chargeOnly": 20.0,
      "chargedOK": 60.0,
      "chargedFull": 80.0
    }
  }
]
```

* 异常

  本方法不抛出异常。

### 修改机器人充电阈值

* 方法说明

  根据机器人名称修改机器人充电阈值信息。

```python
async def modify_charge_param(param: str) -> bool
```

* 输入参数

  `param`: JSON 格式的字符串，包含要修改的机器人名称和对应的阈值。

* 输出参数
  * `True`: 修改成功。
  * `False`: 修改失败。

* 异常

  本方法不抛出异常。

* 示例：

```python
def boot():
    # 指定要修改的机器人名称，以及对应的阈值
    req = {
        "vehicles": ["sim_01"],
        "params": {
            "chargeNeed": 30
        }
    }
    
    # 查询修改前的阈值信息
    before = jj.query_charge_param_by_vehicles(json.dumps(["sim_01"]))
    
    # 使用 modify_charge_param 修改阈值
    data = jj.modify_charge_param(json.dumps(req))
    
    # 查询修改后的阈值信息
    after = jj.query_charge_param_by_vehicles(json.dumps(["sim_01"]))
    
    # 打印结果
    jj.script_log("info", "Charge", f"query = {before}")
    jj.script_log("info", "Charge", f"modify = {data}")
    jj.script_log("info", "Charge", f"query = {after}")
```

得到以下打印信息，表示修改 chargeNeed 参数成功：

![修改充电阈值](data:image/png;base64...)