diff --git a/.idea/grpc_client.iml b/.idea/grpc_client.iml
index 7584dbd..2c80e12 100644
--- a/.idea/grpc_client.iml
+++ b/.idea/grpc_client.iml
@@ -4,7 +4,7 @@
-
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index a031d5d..366343e 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -3,5 +3,5 @@
-
+
\ No newline at end of file
diff --git a/clients/__init__.py b/clients/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/clients/__pycache__/__init__.cpython-39.pyc b/clients/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 0000000..bf63648
Binary files /dev/null and b/clients/__pycache__/__init__.cpython-39.pyc differ
diff --git a/clients/__pycache__/base_client.cpython-39.pyc b/clients/__pycache__/base_client.cpython-39.pyc
new file mode 100644
index 0000000..985fd70
Binary files /dev/null and b/clients/__pycache__/base_client.cpython-39.pyc differ
diff --git a/clients/__pycache__/hand_client.cpython-39.pyc b/clients/__pycache__/hand_client.cpython-39.pyc
new file mode 100644
index 0000000..2a93c5c
Binary files /dev/null and b/clients/__pycache__/hand_client.cpython-39.pyc differ
diff --git a/clients/__pycache__/http_server.cpython-39.pyc b/clients/__pycache__/http_server.cpython-39.pyc
new file mode 100644
index 0000000..c5a6359
Binary files /dev/null and b/clients/__pycache__/http_server.cpython-39.pyc differ
diff --git a/clients/__pycache__/movej_client.cpython-39.pyc b/clients/__pycache__/movej_client.cpython-39.pyc
new file mode 100644
index 0000000..90a9f1c
Binary files /dev/null and b/clients/__pycache__/movej_client.cpython-39.pyc differ
diff --git a/clients/base_client.py b/clients/base_client.py
index dc6c854..6896f03 100644
--- a/clients/base_client.py
+++ b/clients/base_client.py
@@ -1,8 +1,11 @@
import grpc
import time
import sys
-sys.path.append("/home/lgv/cmvr/0-workspace/grpc_client/generated") # 指向 generated
-sys.path.append("/home/lgv/cmvr/0-workspace/grpc_client/generated/cmvr") # 指向 cmvr 顶层
+from pathlib import Path
+BASE_DIR = Path(__file__).resolve().parent.parent # 上一级目录
+
+sys.path.append(str(BASE_DIR / "generated"))
+sys.path.append(str(BASE_DIR / "generated" / "cmvr"))
from cmvr.api import humanoid_robot_service_pb2_grpc
from cmvr.api import dexhand_service_pb2_grpc
diff --git a/clients/get_joint_state_client.py b/clients/get_joint_state_client.py
index f0d8d00..e856b76 100644
--- a/clients/get_joint_state_client.py
+++ b/clients/get_joint_state_client.py
@@ -2,19 +2,42 @@ import sys
import time
from google.protobuf import timestamp_pb2
+import matplotlib.pyplot as plt # 新增
+
sys.path.append("../generated")
from generated.cmvr.api import humanoid_robot_service_pb2_grpc as rpc
from generated.cmvr.api import humanoid_robot_command_pb2 as pb
from clients.base_client import RobotClientBase
+# 固定关节顺序
+JOINT_ORDER = [
+ "L_SHOULDER_P", "L_SHOULDER_R", "L_SHOULDER_Y",
+ "L_ELBOW_R", "L_WRIST_P", "L_WRIST_Y", "L_WRIST_R",
+ "R_SHOULDER_P", "R_SHOULDER_R", "R_SHOULDER_Y",
+ "R_ELBOW_R", "R_WRIST_P", "R_WRIST_Y", "R_WRIST_R",
+ "HEAD_P", "HEAD_Y", "HEAD_R","WAIST_Y","WAIST_R"
+]
+
class GetJointStateClient(RobotClientBase):
"""Continuous client to fetch robot joint states"""
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ # 时间轴
+ self.time_history = []
+ self._start_time = None
+ # 记录每个关节的角度、速度
+ self.pos_history = {name: [] for name in JOINT_ORDER}
+ self.vel_history = {name: [] for name in JOINT_ORDER}
+
def send(self, interval=0.5, device_id="hc01"):
"""Continuously fetch joint states and print in fixed order"""
try:
+ if self._start_time is None:
+ self._start_time = time.time()
+
while True:
# Construct request
req = pb.JointRequest()
@@ -31,24 +54,25 @@ class GetJointStateClient(RobotClientBase):
time.sleep(interval)
continue
- # Fixed order for printing
- joint_order = [
- "L_SHOULDER_P", "L_SHOULDER_R", "L_SHOULDER_Y",
- "L_ELBOW_R", "L_WRIST_P", "L_WRIST_Y", "L_WRIST_R",
- "R_SHOULDER_P", "R_SHOULDER_R", "R_SHOULDER_Y",
- "R_ELBOW_R", "R_WRIST_P", "R_WRIST_Y", "R_WRIST_R",
- "HEAD_P", "HEAD_Y","HEAD_R"
- ]
-
-
- # Map response to dictionary
- joint_dict = {}
+ # ====== 1. 同时取 position 和 velocity ======
+ joint_pos_dict = {}
+ joint_vel_dict = {}
for state in resp.state:
- for name, pos in zip(state.name, state.position):
- joint_dict[name] = round(pos, 12)
+ # 这里就用你说的三元 zip
+ for name, pos, vel in zip(state.name, state.position, state.velocity):
+ joint_pos_dict[name] = round(pos, 12)
+ joint_vel_dict[name] = round(vel, 12)
- joint_list = [{"joint_name": name, "rad": joint_dict.get(name, 0.0)}
- for name in joint_order]
+ # ====== 2. 记录到历史数据里,用于之后画图 ======
+ t = time.time() - self._start_time
+ self.time_history.append(t)
+ for name in JOINT_ORDER:
+ self.pos_history[name].append(joint_pos_dict.get(name, 0.0))
+ self.vel_history[name].append(joint_vel_dict.get(name, 0.0))
+
+ # 保持原来的打印逻辑(打印角度)
+ joint_list = [{"joint_name": name, "rad": joint_pos_dict.get(name, 0.0)}
+ for name in JOINT_ORDER]
# Print timestamp
print(f"[{time.strftime('%H:%M:%S')}]")
@@ -63,11 +87,67 @@ class GetJointStateClient(RobotClientBase):
except KeyboardInterrupt:
print("\nStopped fetching joint states.")
+ # 例子:退出时画几个关节的角度 & 速度曲线
+ # try:
+ # # 你可以根据需要改关节列表
+ # self.plot_pos_and_vel([ "R_SHOULDER_P", "R_SHOULDER_R", "R_SHOULDER_Y",
+ # "R_ELBOW_R", "R_WRIST_P", "R_WRIST_Y", "R_WRIST_R"])
+ # except Exception as e:
+ # print(f"绘图失败: {e}")
+
+ # ====== 3. 绘制速度和角度(同一张图,两行子图) ======
+ def plot_pos_and_vel(self, joint_names):
+ """
+ 在一张图中绘制多个关节的角度和速度:
+ - 上 subplot:角度(rad)
+ - 下 subplot:速度(rad/s)
+
+ joint_names: str 或 [str, ...]
+ """
+ if isinstance(joint_names, str):
+ joint_names = [joint_names]
+
+ # 检查关节名合法性
+ invalid = [n for n in joint_names if n not in self.pos_history]
+ if invalid:
+ print(f"未知关节名: {invalid}")
+ print(f"可选关节: {list(self.pos_history.keys())}")
+ return
+
+ if not self.time_history:
+ print("还没有采集到任何数据,无法绘图。")
+ return
+
+ t = self.time_history
+
+ plt.figure(figsize=(10, 6))
+
+ # 上:角度
+ plt.subplot(2, 1, 1)
+ for name in joint_names:
+ plt.plot(t, self.pos_history[name], label=name)
+ plt.ylabel("Position (rad)")
+ plt.title("Joint Position")
+ plt.grid(True)
+ plt.legend()
+
+ # 下:速度
+ plt.subplot(2, 1, 2)
+ for name in joint_names:
+ plt.plot(t, self.vel_history[name], label=name)
+ plt.xlabel("Time (s)")
+ plt.ylabel("Velocity (rad/s)")
+ plt.title("Joint Velocity")
+ plt.grid(True)
+ plt.legend()
+
+ plt.tight_layout()
+ plt.show()
if __name__ == "__main__":
client = GetJointStateClient()
try:
- client.send(interval=0.5)
+ client.send(interval=0.005)
finally:
client.close()
diff --git a/clients/hand_client.py b/clients/hand_client.py
index 9c74bb2..dc212e4 100644
--- a/clients/hand_client.py
+++ b/clients/hand_client.py
@@ -14,16 +14,16 @@ handshake = [
{"id": 1, "value": 0.0},
{"id": 2, "value": 0.0},
{"id": 3, "value": 0.0},
- {"id": 4, "value": 0.1},
- {"id": 5, "value": 0.0},
+ {"id": 4, "value": 0.0},
+ {"id": 5, "value": 1.0},
]
hand_open = [
- {"id": 0, "value": 0.8},
- {"id": 1, "value": 0.8},
- {"id": 2, "value": 0.8},
- {"id": 3, "value": 0.8},
- {"id": 4, "value": 0.8},
+ {"id": 0, "value": 0.7},
+ {"id": 1, "value": 0.7},
+ {"id": 2, "value": 0.7},
+ {"id": 3, "value": 0.7},
+ {"id": 4, "value": 0.7},
{"id": 5, "value": 1.0},
]
@@ -104,7 +104,7 @@ if __name__ == "__main__":
# ]
# client.set_angles(hand_open, device_id="hand2")
- client.set_angles(angles, device_id="hand2")
+ client.set_angles(hand_open, device_id="hand2")
# client.set_angles(handshake, device_id="hand1")
# Close client
diff --git a/clients/http_server.py b/clients/http_server.py
new file mode 100644
index 0000000..9489167
--- /dev/null
+++ b/clients/http_server.py
@@ -0,0 +1,133 @@
+from __future__ import annotations
+
+import time
+from threading import Lock
+from fastapi import FastAPI
+from pydantic import BaseModel
+from typing import Optional
+
+from clients.movej_client import MoveJClient, action_music,action_air,action_drive_comfort,action_drive_economy,action_hello
+
+
+app = FastAPI(title="Humanoid Robot Control API (Blocking + Mutex + Ignore)")
+
+class ActionResponse(BaseModel):
+ code: int
+ msg: str
+ action: Optional[str] = None
+ ignored: bool = False
+
+class StatusResponse(BaseModel):
+ running: bool
+ current_action: Optional[str]
+ last_action: Optional[str]
+ last_finished_at: Optional[float]
+
+
+# 🔒 全局唯一互斥锁:保证同一时间只能执行一个 action
+action_lock = Lock()
+
+# 状态变量(简单可用;多线程更严谨可再加锁,这里够用)
+running = False
+current_action = None
+last_action = None
+last_finished_at = None
+
+
+def run_action_blocking_ignore_if_busy(action_func, action_name: str) -> ActionResponse:
+ """
+ 通用执行模板:
+ - 忙:直接忽略(立即返回,不执行)
+ - 空闲:阻塞执行,执行完再返回
+ """
+ global running, current_action, last_action, last_finished_at
+
+ # 忙就忽略(静默丢弃动作)
+ if not action_lock.acquire(blocking=False):
+ return ActionResponse(
+ code=0,
+ msg=f"{action_name} ignored: robot busy",
+ action=action_name,
+ ignored=True,
+ )
+
+ client = MoveJClient()
+ # client = 0
+ running = True
+ current_action = action_name
+
+ try:
+ action_func(client) # ✅ 阻塞到动作执行结束
+ last_action = action_name
+ last_finished_at = time.time()
+ return ActionResponse(
+ code=0,
+ msg=f"{action_name} finished",
+ action=action_name,
+ ignored=False,
+ )
+ except Exception as e:
+ return ActionResponse(
+ code=1,
+ msg=f"{action_name} failed: {e}",
+ action=action_name,
+ ignored=False,
+ )
+ finally:
+ try:
+ # print("closing action")
+ client.close()
+ finally:
+ running = False
+ current_action = None
+ action_lock.release()
+
+
+# @app.post("/action/one", response_model=ActionResponse)
+# def call_action_one():
+# return run_action_blocking_ignore_if_busy(action_one, "action_one")
+
+@app.post("/action/music", response_model=ActionResponse)
+def call_action_music():
+ return run_action_blocking_ignore_if_busy(action_music, "action_music")
+
+@app.post("/action/air", response_model=ActionResponse)
+def call_action_air():
+ return run_action_blocking_ignore_if_busy(action_air, "action_air")
+
+@app.post("/action/hello", response_model=ActionResponse)
+def call_action_hello():
+ return run_action_blocking_ignore_if_busy(action_hello, "action_hello")
+# @app.post("/action/drive_comfort", response_model=ActionResponse)
+# def call_action_drive_comfort():
+# return run_action_blocking_ignore_if_busy(action_drive_comfort, "action_drive_comfort")
+#
+# @app.post("/action/drive_economy", response_model=ActionResponse)
+# def call_action_drive_economy():
+# return run_action_blocking_ignore_if_busy(action_drive_economy, "action_drive_economy")
+#
+# @app.post("/action/two", response_model=ActionResponse)
+# def call_action_two():
+# return run_action_blocking_ignore_if_busy(action_two, "action_two")
+# @app.post("/action/two", response_model=ActionResponse)
+# def call_action_two():
+# return run_action_blocking_ignore_if_busy(action_two, "action_two")
+
+@app.get("/status", response_model=StatusResponse)
+def get_status():
+ return StatusResponse(
+ running=running,
+ current_action=current_action,
+ last_action=last_action,
+ last_finished_at=last_finished_at,
+ )
+
+
+if __name__ == "__main__":
+ import uvicorn
+ uvicorn.run(
+ "http_server:app",
+ host="0.0.0.0",
+ port=8000,
+ reload=False
+ )
\ No newline at end of file
diff --git a/clients/main.py b/clients/main.py
new file mode 100644
index 0000000..68da937
--- /dev/null
+++ b/clients/main.py
@@ -0,0 +1,141 @@
+# import time
+#
+# from hand_client import DexHandClient
+#
+#
+# from movej_client import MoveJClient
+#
+# import atexit
+#
+# hand_open = [
+# {"id": 0, "value": 0.8},
+# {"id": 1, "value": 0.8},
+# {"id": 2, "value": 0.8},
+# {"id": 3, "value": 0.8},
+# {"id": 4, "value": 0.8},
+# {"id": 5, "value": 1.0},
+# ]
+#
+#
+# hand_touch = [
+# {"id": 0, "value": 0},
+# {"id": 1, "value": 0},
+# {"id": 2, "value": 0},
+# {"id": 3, "value": 1.0},
+# {"id": 4, "value": 0.3},
+# {"id": 5, "value": 0.3},
+# ]
+#
+# handshake = [
+# {"id": 0, "value": 0.0},
+# {"id": 1, "value": 0.0},
+# {"id": 2, "value": 0.0},
+# {"id": 3, "value": 0.0},
+# {"id": 4, "value": 0.0},
+# {"id": 5, "value": 1.0},
+# ]
+#
+#
+# left_joint_list = [
+#
+# {'joint_name': 'L_SHOULDER_P', 'rad': -0.230949540675},
+# {'joint_name': 'L_SHOULDER_R', 'rad': -1.0384195613},
+# {'joint_name': 'L_SHOULDER_Y', 'rad': -15.045008286377},
+# {'joint_name': 'L_ELBOW_R', 'rad': -1.615503893099},
+# {'joint_name': 'L_WRIST_P', 'rad': 14.787740913187},
+# {'joint_name': 'L_WRIST_Y', 'rad': -0.353138324696},
+# {'joint_name': 'L_WRIST_R', 'rad': 0.28},
+# ]
+#
+# right_joint_list = [
+#
+# {'joint_name': 'L_SHOULDER_P', 'rad': -0.038843127376},
+# {'joint_name': 'L_SHOULDER_R', 'rad': -0.782479233371},
+# {'joint_name': 'L_SHOULDER_Y', 'rad': -14.639593111463},
+# {'joint_name': 'L_ELBOW_R', 'rad': -2.009983759425},
+# {'joint_name': 'L_WRIST_P', 'rad': 14.79076046324},
+# {'joint_name': 'L_WRIST_Y', 'rad': -0.022087994402},
+# {'joint_name': 'L_WRIST_R', 'rad': 0.28},
+#
+#
+# ]
+# start_joint_list = [
+# {'joint_name': 'L_SHOULDER_P', 'rad': -0.029367758425},
+# {'joint_name': 'L_SHOULDER_R', 'rad': -1.448823970756},
+# {'joint_name': 'L_SHOULDER_Y', 'rad': -14.5604203382},
+# {'joint_name': 'L_ELBOW_R', 'rad': -0.184456443516},
+# {'joint_name': 'L_WRIST_P', 'rad': 14.629440930445},
+# {'joint_name': 'L_WRIST_Y', 'rad': -0.021720636379},
+# {'joint_name': 'L_WRIST_R', 'rad': -0.120802885537},
+# ]
+#
+# single_joint = [
+# {'joint_name': 'R_SHOULDER_Y', 'rad': 0},
+# ]
+#
+#
+# first_joint_list = [
+# {'joint_name': 'L_SHOULDER_P', 'rad': 0.013117624077},
+# {'joint_name': 'L_SHOULDER_R', 'rad': -1.153729162914},
+# {'joint_name': 'L_SHOULDER_Y', 'rad': -14.255272070875},
+# {'joint_name': 'L_ELBOW_R', 'rad': -1.477644963752},
+# {'joint_name': 'L_WRIST_P', 'rad': 15.28202635377},
+# {'joint_name': 'L_WRIST_Y', 'rad': -0.000359764059},
+# {'joint_name': 'L_WRIST_R', 'rad': 0.124166062475},
+# ]
+#
+# second_joint_list=[
+# {'joint_name': 'L_SHOULDER_P', 'rad': -0.563525308548},
+# {'joint_name': 'L_SHOULDER_R', 'rad': -1.290596130675},
+# {'joint_name': 'L_SHOULDER_Y', 'rad': -14.162486167364},
+# {'joint_name': 'L_ELBOW_R', 'rad': -1.021621712276},
+# {'joint_name': 'L_WRIST_P', 'rad': 15.432362166456},
+# {'joint_name': 'L_WRIST_Y', 'rad': 0.018426754365},
+# {'joint_name': 'L_WRIST_R', 'rad': -0.005352795583},
+# ]
+#
+# def action_hello():
+# # client.send(start_joint_list, vel=2.0, acc=2.0)
+# hand_client.set_angles(hand_open, device_id="hand1")
+# client.send(right_joint_list, vel=2.0, acc=2.0)
+# # time.sleep(1)
+# while True:
+# client.send(right_joint_list, vel=3.0, acc=3.0)
+# client.send(left_joint_list, vel=3.0, acc=3.0)
+# # client.send(start_joint_list, vel=1.0, acc=1.0)
+#
+# def action_touch():
+# # client.send(start_joint_list, vel=2.0, acc=2.0)
+# hand_client.set_angles(hand_touch, device_id="hand1")
+# client.send(first_joint_list, vel=2.0, acc=2.0)
+# # time.sleep(1)
+# while True:
+# client.send(first_joint_list, vel=5.0, acc=3.0)
+# client.send(second_joint_list, vel=5.0, acc=3.0)
+# # client.send(start_joint_list, vel=1.0, acc=1.0)
+#
+#
+# def cleanup():
+# time.sleep(3)
+# hand_client.set_angles(handshake, device_id="hand1")
+# client.send(start_joint_list, vel=2.0, acc=2.0)
+# if hand_client is not None:
+# hand_client.close()
+# if client is not None:
+# client.close()
+# print("程序结束:已执行清理并打印此信息。")
+#
+# atexit.register(cleanup)
+#
+#
+# if __name__ == "__main__":
+# # Initialize client
+# global hand_client
+# global client
+#
+# hand_client = DexHandClient()
+# client = MoveJClient()
+#
+# action_touch()
+#
+#
diff --git a/clients/movej_client.py b/clients/movej_client.py
index fda57e2..e6c3440 100644
--- a/clients/movej_client.py
+++ b/clients/movej_client.py
@@ -3,6 +3,8 @@ import time
from google.protobuf import timestamp_pb2
+from clients.hand_client import DexHandClient
+
sys.path.append("../generated")
from generated.cmvr.api import humanoid_robot_command_pb2 as pb
@@ -13,6 +15,7 @@ import math
from typing import List, Dict, Literal
+
class MoveJClient(RobotClientBase):
"""Client to send MoveJ commands to the robot"""
@@ -29,20 +32,7 @@ class MoveJClient(RobotClientBase):
device_id: device ID
"""
# Construct JointCmd list
- # cmds = [pb.JointCmd(joint_name=j["joint_name"], rad=j["rad"], vel=vel) for j in joint_list]
-
- offset = {
- "R_WRIST_Y": -0.0,
- }
-
- cmds = [
- pb.JointCmd(
- joint_name=j["joint_name"],
- rad=j["rad"] + offset.get(j["joint_name"], 0),
- vel=vel
- )
- for j in joint_list
- ]
+ cmds = [pb.JointCmd(joint_name=j["joint_name"], rad=j["rad"], vel=vel) for j in joint_list]
# Construct request header
header = common_pb2.CommandHeader.Request()
@@ -73,56 +63,327 @@ class MoveJClient(RobotClientBase):
print("MoveJ RPC call failed:", e)
-zero_joint_list = [
+# init_joint_list = [
+# {'joint_name': 'R_SHOULDER_P', 'rad': -0.003768504782},
+# {'joint_name': 'R_SHOULDER_R', 'rad': -0.256264020657},
+# {'joint_name': 'R_SHOULDER_Y', 'rad': 2.526736892626},
+# {'joint_name': 'R_ELBOW_R', 'rad': -1.542952107456},
+# {'joint_name': 'R_WRIST_P', 'rad': 0.117851681162},
+# {'joint_name': 'R_WRIST_Y', 'rad': 0.097711538603},
+# {'joint_name': 'R_WRIST_R', 'rad': 0.021115966972},
+# ]
- {'joint_name': 'R_WRIST_R', 'rad': 0},
- {'joint_name': 'R_WRIST_Y', 'rad': 0},
- {'joint_name': 'R_WRIST_P', 'rad': 0},
- {'joint_name': 'R_ELBOW_R', 'rad': 0},
- {'joint_name': 'R_SHOULDER_Y', 'rad': 0},
- {'joint_name': 'R_SHOULDER_R', 'rad': 0},
- {'joint_name': 'R_SHOULDER_P', 'rad': 0},
+init_joint_list = [
+{'joint_name': 'R_SHOULDER_P', 'rad': -0.062633119026},
+{'joint_name': 'R_SHOULDER_R', 'rad': -0.013667237243},
+{'joint_name': 'R_SHOULDER_Y', 'rad': 2.563999526183},
+{'joint_name': 'R_ELBOW_R', 'rad': -0.275263170082},
+{'joint_name': 'R_WRIST_P', 'rad': 0.21726806475},
+{'joint_name': 'R_WRIST_Y', 'rad': -0.044427538871},
+{'joint_name': 'R_WRIST_R', 'rad': -0.065047050427},
]
start_joint_list = [
-
- {'joint_name': 'R_WRIST_R', 'rad': -0.182982265197},
- {'joint_name': 'R_WRIST_Y', 'rad': 0.057211977764},
- {'joint_name': 'R_WRIST_P', 'rad': -2.450283707826},
- {'joint_name': 'R_ELBOW_R', 'rad': 1.691315387916},
- {'joint_name': 'R_SHOULDER_Y', 'rad': 1.741483963795},
- {'joint_name': 'R_SHOULDER_R', 'rad': 1.000908225412},
- {'joint_name': 'R_SHOULDER_P', 'rad': -0.275362840863},
+{'joint_name': 'R_SHOULDER_P', 'rad': 0.212733518819},
+{'joint_name': 'R_SHOULDER_R', 'rad': -0.391965314899},
+{'joint_name': 'R_SHOULDER_Y', 'rad': 2.564591855398},
+{'joint_name': 'R_ELBOW_R', 'rad': -1.503521397093},
+{'joint_name': 'R_WRIST_P', 'rad': 0.217252876821},
+{'joint_name': 'R_WRIST_Y', 'rad': 0.164711187099},
+{'joint_name': 'R_WRIST_R', 'rad': 0.227967960443},
]
-end_joint_list = [
+air_in_joint_list= [
+{'joint_name': 'R_SHOULDER_P', 'rad': 0.467093352929},
+{'joint_name': 'R_SHOULDER_R', 'rad': -0.397918033661},
+{'joint_name': 'R_SHOULDER_Y', 'rad': 2.332349442301},
+{'joint_name': 'R_ELBOW_R', 'rad': -1.108740619931},
+{'joint_name': 'R_WRIST_P', 'rad': 0.184619713748},
+{'joint_name': 'R_WRIST_Y', 'rad': 0.165660432636},
+{'joint_name': 'R_WRIST_R', 'rad': 0.013328010806},
+]
- {'joint_name': 'R_WRIST_R', 'rad': 0.590444918686},
- {'joint_name': 'R_WRIST_Y', 'rad': 0.133274073403},
- {'joint_name': 'R_WRIST_P', 'rad': -2.832957807407},
- {'joint_name': 'R_ELBOW_R', 'rad': 0.722278081411},
- {'joint_name': 'R_SHOULDER_Y', 'rad': 1.454527987188},
- {'joint_name': 'R_SHOULDER_R', 'rad': 1.319798720377},
- {'joint_name': 'R_SHOULDER_P', 'rad': 0.886766195809},
+air_open_joint_list= [
+{'joint_name': 'R_SHOULDER_P', 'rad': 0.562264710474},
+{'joint_name': 'R_SHOULDER_R', 'rad': -0.375382944612},
+{'joint_name': 'R_SHOULDER_Y', 'rad': 2.390867581924},
+{'joint_name': 'R_ELBOW_R', 'rad': -1.143580778878},
+{'joint_name': 'R_WRIST_P', 'rad': 0.19485637762},
+{'joint_name': 'R_WRIST_Y', 'rad': 0.159855796177},
+{'joint_name': 'R_WRIST_R', 'rad': 0.26605484086},
+]
+
+air_close_joint_list= air_open_joint_list
+
+go_home_joint_list = [
+{'joint_name': 'R_SHOULDER_P', 'rad': 0.451632041621},
+{'joint_name': 'R_SHOULDER_R', 'rad': -0.307911521083},
+{'joint_name': 'R_SHOULDER_Y', 'rad': 2.13536865317},
+{'joint_name': 'R_ELBOW_R', 'rad': -1.294201365225},
+{'joint_name': 'R_WRIST_P', 'rad': 0.378274346518},
+{'joint_name': 'R_WRIST_Y', 'rad': 0.037015483938},
+{'joint_name': 'R_WRIST_R', 'rad': 0.148664191295},
+]
+
+empty_joint_list = [
+{'joint_name': 'R_SHOULDER_P', 'rad': 0.255359389661},
+{'joint_name': 'R_SHOULDER_R', 'rad': -0.283898456732},
+{'joint_name': 'R_SHOULDER_Y', 'rad': 2.498425644483},
+{'joint_name': 'R_ELBOW_R', 'rad': -1.261196097901},
+{'joint_name': 'R_WRIST_P', 'rad': 0.159945974503},
+{'joint_name': 'R_WRIST_Y', 'rad': 0.124704284694},
+{'joint_name': 'R_WRIST_R', 'rad': 0.089323055792},
]
+music_in_joint_list= [
+{'joint_name': 'R_SHOULDER_P', 'rad': 0.534755574811},
+{'joint_name': 'R_SHOULDER_R', 'rad': -0.370206708698},
+{'joint_name': 'R_SHOULDER_Y', 'rad': 2.318657524675},
+{'joint_name': 'R_ELBOW_R', 'rad': -1.133308992921},
+{'joint_name': 'R_WRIST_P', 'rad': 0.217250029084},
+{'joint_name': 'R_WRIST_Y', 'rad': 0.151281261241},
+{'joint_name': 'R_WRIST_R', 'rad': 0.087528290167},
+]
-if __name__ == "__main__":
- # Initialize client
- client = MoveJClient()
+music_open_joint_list = [
+{'joint_name': 'R_SHOULDER_P', 'rad': 0.562264710474},
+{'joint_name': 'R_SHOULDER_R', 'rad': -0.375382944612},
+{'joint_name': 'R_SHOULDER_Y', 'rad': 2.390867581924},
+{'joint_name': 'R_ELBOW_R', 'rad': -1.143580778878},
+{'joint_name': 'R_WRIST_P', 'rad': 0.19485637762},
+{'joint_name': 'R_WRIST_Y', 'rad': 0.149855796177},
+{'joint_name': 'R_WRIST_R', 'rad': 0.25605484086},
+]
+music_close_joint_list = music_open_joint_list
+set_in_joint_list = [
+{'joint_name': 'R_SHOULDER_P', 'rad': 0.494828409031},
+{'joint_name': 'R_SHOULDER_R', 'rad': -0.305430193249},
+{'joint_name': 'R_SHOULDER_Y', 'rad': 2.207381267348},
+{'joint_name': 'R_ELBOW_R', 'rad': -1.228615143333},
+{'joint_name': 'R_WRIST_P', 'rad': 0.262071504853},
+{'joint_name': 'R_WRIST_Y', 'rad': 0.097687807464},
+{'joint_name': 'R_WRIST_R', 'rad': 0.069247461928},
+]
+dirve_mode_joint_list = [
+{'joint_name': 'R_SHOULDER_P', 'rad': 0.563493983445},
+{'joint_name': 'R_SHOULDER_R', 'rad': -0.162294407962},
+{'joint_name': 'R_SHOULDER_Y', 'rad': 2.249594216381},
+{'joint_name': 'R_ELBOW_R', 'rad': -1.289937354272},
+{'joint_name': 'R_WRIST_P', 'rad': 0.142454226992},
+{'joint_name': 'R_WRIST_Y', 'rad': 0.000561004112},
+{'joint_name': 'R_WRIST_R', 'rad': 0.167736130893},
+]
- R_WRIST_R_joint = [
- {'joint_name': 'R_WRIST_R', 'rad': 0.0},
+dirve_soft_joint_list = [
+
+{'joint_name': 'R_SHOULDER_P', 'rad': 0.535399163285},
+{'joint_name': 'R_SHOULDER_R', 'rad': -0.308316848927},
+{'joint_name': 'R_SHOULDER_Y', 'rad': 2.505504168453},
+{'joint_name': 'R_ELBOW_R', 'rad': -1.088469481487},
+{'joint_name': 'R_WRIST_P', 'rad': -0.006021064442},
+{'joint_name': 'R_WRIST_Y', 'rad': 0.165673722074},
+{'joint_name': 'R_WRIST_R', 'rad': 0.062983648315},
+]
+
+dirve_jie_joint_list = [
+
+{'joint_name': 'R_SHOULDER_P', 'rad': 0.511487668206},
+{'joint_name': 'R_SHOULDER_R', 'rad': -0.330508311093},
+{'joint_name': 'R_SHOULDER_Y', 'rad': 2.33301771116},
+{'joint_name': 'R_ELBOW_R', 'rad': -1.139994529239},
+{'joint_name': 'R_WRIST_P', 'rad': 0.228347658658},
+{'joint_name': 'R_WRIST_Y', 'rad': 0.164826995055},
+{'joint_name': 'R_WRIST_R', 'rad': 0.075367851372},
+]
+
+head_front_joint_list = [
+ {'joint_name': 'HEAD_P', 'rad': -0.15311278316},
+ {'joint_name': 'HEAD_Y', 'rad': -0.04022955268},
+ {'joint_name': 'HEAD_R', 'rad': 0.050031017646},
+]
+
+head_screen_joint_list = [
+ {'joint_name': 'HEAD_P', 'rad': -0.307521160933},
+ {'joint_name': 'HEAD_Y', 'rad': -0.474696809681},
+ {'joint_name': 'HEAD_R', 'rad': 0.074742644342},
+]
+
+singal_joint_list = [
+{'joint_name': 'R_WRIST_P', 'rad': 0.217252876821},
+]
+
+hand_touch = [
+ {"id": 0, "value": 0},
+ {"id": 1, "value": 0},
+ {"id": 2, "value": 0},
+ {"id": 3, "value": 1.0},
+ {"id": 4, "value": 0.3},
+ {"id": 5, "value": 0.3},
+]
+
+hand_open = [
+ {"id": 0, "value": 0.8},
+ {"id": 1, "value": 0.8},
+ {"id": 2, "value": 0.8},
+ {"id": 3, "value": 0.8},
+ {"id": 4, "value": 0.8},
+ {"id": 5, "value": 1.0},
]
- # client.send(start_joint_list, 2.0, 1.0)
- # client.send(start_joint_list,2.0,2.0)
- # client.send(end_joint_list, 1.5, 1.5)
- while True:
- client.send(start_joint_list,1.5,1.5)
- client.send(end_joint_list,1.5,1.5)
+hello_l_joint_list = [
+ # {'joint_name': 'R_SHOULDER_P', 'rad': 0.399221347784},
+ # {'joint_name': 'R_SHOULDER_R', 'rad': -0.287301501983},
+ # {'joint_name': 'R_SHOULDER_Y', 'rad': 2.066446782461},
+ # {'joint_name': 'R_ELBOW_R', 'rad': -2.153093915083},
+ # {'joint_name': 'R_WRIST_P', 'rad': 0.005766666638},
+ # {'joint_name': 'R_WRIST_Y', 'rad': 0.292756816084},
+ # {'joint_name': 'R_WRIST_R', 'rad': -0.466447865964},
+{'joint_name': 'R_SHOULDER_P', 'rad': 0.500229616137},
+{'joint_name': 'R_SHOULDER_R', 'rad': -0.252456596808},
+{'joint_name': 'R_SHOULDER_Y', 'rad': 2.183436548675},
+{'joint_name': 'R_ELBOW_R', 'rad': -2.107785476354},
+{'joint_name': 'R_WRIST_P', 'rad': -0.115909524794},
+{'joint_name': 'R_WRIST_Y', 'rad': 0.10194042747},
+{'joint_name': 'R_WRIST_R', 'rad': -0.283499773607},
+]
+
+hello_r_joint_list = [
+ {'joint_name': 'R_SHOULDER_P', 'rad': 0.406399542535},
+ {'joint_name': 'R_SHOULDER_R', 'rad': -0.299956843483},
+ {'joint_name': 'R_SHOULDER_Y', 'rad': 2.461169655645},
+ {'joint_name': 'R_ELBOW_R', 'rad': -2.049333783919},
+ {'joint_name': 'R_WRIST_P', 'rad': 0.185113321427},
+ {'joint_name': 'R_WRIST_Y', 'rad': -0.44407319941},
+ {'joint_name': 'R_WRIST_R', 'rad': -0.491400683396},
+]
+
+
+
+
+#
+
+
+def action_hello(client):
+ hand_client.set_angles(hand_open, device_id="hand2")
+ client.send(init_joint_list, vel=1.0, acc=1.0)
+ client.send(hello_l_joint_list, vel=2.0, acc=2.0)
+ for _ in range(3):
+ client.send(hello_l_joint_list, vel=3.0, acc=5.0)
+ time.sleep(0.1)
+ client.send(hello_r_joint_list, vel=3.0, acc=5.0)
+ time.sleep(0.1)
+ client.send(init_joint_list, vel=1.5, acc=1.5)
+ hand_client.set_angles(hand_open, device_id="hand2")
+
+def action_air(client):
+ hand_client.set_angles(hand_touch, device_id="hand2")
+ client.send(init_joint_list, vel=2.0, acc=2.0)
+ client.send(head_screen_joint_list, vel=1.0, acc=1.0)
+ client.send(start_joint_list, vel=1.0, acc=1.0)
+ client.send(air_in_joint_list, vel=3.0, acc=3.0)
+ client.send(start_joint_list, vel=3.0, acc=3.0)
+ # # # # #
+ # # time.sleep(1)
+ # # client.send(air_open_joint_list, vel=3.0, acc=3.0)
+ # # client.send(start_joint_list, vel=3.0, acc=3.0)
+ time.sleep(1)
+ client.send(air_close_joint_list, vel=3.0, acc=2.0)
+ client.send(start_joint_list, vel=3.0, acc=2.0)
+ time.sleep(1)
+ client.send(go_home_joint_list, vel=3.0, acc=2.0)
+ client.send(start_joint_list, vel=3.0, acc=3.0)
+ client.send(head_front_joint_list, vel=1.0, acc=1.0)
+ client.send(init_joint_list, vel=2.0, acc=2.0)
+ hand_client.set_angles(hand_open, device_id="hand2")
+
+def action_music(client):
+ # init_joint_list
+ hand_client.set_angles(hand_touch, device_id="hand2")
+ client.send(init_joint_list, vel=2.0, acc=2.0)
+ client.send(head_screen_joint_list, vel=1.0, acc=1.0)
+ client.send(start_joint_list, vel=1.0, acc=1.0)
+ client.send(music_in_joint_list, vel=3.0, acc=3.0)
+ client.send(start_joint_list, vel=3.0, acc=3.0)
+ # # #
+ time.sleep(1)
+ client.send(music_open_joint_list, vel=3.0, acc=3.0)
+ client.send(start_joint_list, vel=3.0, acc=3.0)
+ # time.sleep(2)
+ # client.send(music_close_joint_list, vel=3.0, acc=3.0)
+ # client.send(start_joint_list, vel=3.0, acc=3.0)
+ time.sleep(1)
+ client.send(go_home_joint_list, vel=3.0, acc=2.0)
+ client.send(start_joint_list, vel=3.0, acc=2.0)
+ client.send(head_front_joint_list, vel=1.0, acc=1.0)
+ client.send(init_joint_list, vel=2.0, acc=2.0)
+ hand_client.set_angles(hand_open, device_id="hand2")
+def action_drive_economy(client):
+ # client.send(head_screen_joint_list, vel=1.0, acc=1.0)
+ # client.send(start_joint_list, vel=1.0, acc=1.0)
+ # client.send(set_in_joint_list, vel=3.0, acc=2.0)
+ # client.send(start_joint_list, vel=3.0, acc=2.0)
+ # # #
+ time.sleep(1)
+ # client.send(dirve_mode_joint_list, vel=3.0, acc=2.0)
+ # client.send(start_joint_list, vel=3.0, acc=2.0)
+ #
+ # time.sleep(1)
+ # client.send(dirve_jie_joint_list, vel=3.0, acc=2.0)
+ # client.send(start_joint_list, vel=3.0, acc=2.0)
+ # time.sleep(2)
+ # client.send(go_home_joint_list, vel=3.0, acc=2.0)
+ # client.send(start_joint_list, vel=3.0, acc=2.0)
+ # client.send(head_front_joint_list, vel=1.0, acc=1.0)
+def action_drive_comfort(client):
+ # client.send(head_screen_joint_list, vel=1.0, acc=1.0)
+ # client.send(start_joint_list, vel=1.0, acc=1.0)
+ # client.send(set_in_joint_list, vel=3.0, acc=2.0)
+ # client.send(start_joint_list, vel=3.0, acc=2.0)
+ # # #
+ time.sleep(1)
+ # client.send(dirve_mode_joint_list, vel=3.0, acc=2.0)
+ # client.send(start_joint_list, vel=3.0, acc=2.0)
+ #
+ # time.sleep(1)
+ # client.send(dirve_soft_joint_list, vel=3.0, acc=2.0)
+ # client.send(start_joint_list, vel=3.0, acc=2.0)
+ # time.sleep(2)
+ # client.send(go_home_joint_list, vel=3.0, acc=2)
+ # client.send(start_joint_list, vel=3.0, acc=2)
+ # client.send(head_front_joint_list, vel=1.0, acc=1.0)
+
+ # client.send(init_joint_list, vel=1.0, acc=1.0)
+client = MoveJClient()
+hand_client = DexHandClient()
+if __name__ == "__main__":
+ # Initialize client
+
+ # action_air(client)
+ action_hello(client)
+ # client.send(head_front_joint_list, vel=1.0, acc=1.0)
+ # client.send(go_home_joint_list, vel=3.0, acc=3.0)
+ # action_music(client)
+
+ # action_music(client)
+ # action_air(client)
+ # action_one(client)
+ # action_drive_soft(client)
+ # action_drive_economy(client)
+ # action_drive_comfort(client)
+ # client.send(singal_joint_list, vel=1.0, acc=1.0)
+ # client.send(start_joint_list, vel=1.0, acc=1.0)
+ # while True:
+ # client.send(hello_l_joint_list, vel=1.0, acc=1.0)
+ # time.sleep(0.1)
+ # client.send(hello_r_joint_list, vel=1.0, acc=1.0)
+ # time.sleep(0.1)
+ # # hello_l_joint_list
+
+
+
+ # Close client
client.close()
diff --git a/clients/test.py b/clients/test.py
index f424beb..42991ca 100644
--- a/clients/test.py
+++ b/clients/test.py
@@ -1,5 +1,18 @@
-from google.protobuf import timestamp_pb2
+import requests
-timestamp = timestamp_pb2.Timestamp()
-timestamp.GetCurrentTime()
-print(timestamp)
\ No newline at end of file
+
+#netsh advfirewall firewall add rule name="FastAPI 8000" dir=in action=allow protocol=TCP localport=8000
+
+# "http://192.168.0.131:8000/action/one",
+resp = requests.post(
+ "http://127.0.0.1:8000/action/drive_economy",
+ timeout=80000
+)
+
+
+# resp = requests.post(
+# "http://192.168.0.131:8000/action/one",
+# timeout=800000
+# )
+
+print(resp.json())
diff --git a/generated/__pycache__/__init__.cpython-39.pyc b/generated/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 0000000..4fc2ab7
Binary files /dev/null and b/generated/__pycache__/__init__.cpython-39.pyc differ
diff --git a/generated/cmvr/__pycache__/__init__.cpython-39.pyc b/generated/cmvr/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 0000000..526278d
Binary files /dev/null and b/generated/cmvr/__pycache__/__init__.cpython-39.pyc differ
diff --git a/generated/cmvr/api/__pycache__/__init__.cpython-39.pyc b/generated/cmvr/api/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 0000000..df87170
Binary files /dev/null and b/generated/cmvr/api/__pycache__/__init__.cpython-39.pyc differ
diff --git a/generated/cmvr/api/__pycache__/common_pb2.cpython-39.pyc b/generated/cmvr/api/__pycache__/common_pb2.cpython-39.pyc
new file mode 100644
index 0000000..235d56c
Binary files /dev/null and b/generated/cmvr/api/__pycache__/common_pb2.cpython-39.pyc differ
diff --git a/generated/cmvr/api/__pycache__/dexhand_command_pb2.cpython-39.pyc b/generated/cmvr/api/__pycache__/dexhand_command_pb2.cpython-39.pyc
new file mode 100644
index 0000000..ca3379f
Binary files /dev/null and b/generated/cmvr/api/__pycache__/dexhand_command_pb2.cpython-39.pyc differ
diff --git a/generated/cmvr/api/__pycache__/dexhand_service_pb2_grpc.cpython-39.pyc b/generated/cmvr/api/__pycache__/dexhand_service_pb2_grpc.cpython-39.pyc
new file mode 100644
index 0000000..41cc4b1
Binary files /dev/null and b/generated/cmvr/api/__pycache__/dexhand_service_pb2_grpc.cpython-39.pyc differ
diff --git a/generated/cmvr/api/__pycache__/hlc_command_pb2.cpython-39.pyc b/generated/cmvr/api/__pycache__/hlc_command_pb2.cpython-39.pyc
new file mode 100644
index 0000000..0f420ba
Binary files /dev/null and b/generated/cmvr/api/__pycache__/hlc_command_pb2.cpython-39.pyc differ
diff --git a/generated/cmvr/api/__pycache__/humanoid_robot_command_pb2.cpython-39.pyc b/generated/cmvr/api/__pycache__/humanoid_robot_command_pb2.cpython-39.pyc
new file mode 100644
index 0000000..14150d6
Binary files /dev/null and b/generated/cmvr/api/__pycache__/humanoid_robot_command_pb2.cpython-39.pyc differ
diff --git a/generated/cmvr/api/__pycache__/humanoid_robot_service_pb2_grpc.cpython-39.pyc b/generated/cmvr/api/__pycache__/humanoid_robot_service_pb2_grpc.cpython-39.pyc
new file mode 100644
index 0000000..93203b0
Binary files /dev/null and b/generated/cmvr/api/__pycache__/humanoid_robot_service_pb2_grpc.cpython-39.pyc differ