grpc_client/clients/get_joint_state_client.py

74 lines
2.5 KiB
Python
Raw Normal View History

2025-11-13 03:01:00 +08:00
import sys
import time
from google.protobuf import timestamp_pb2
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
class GetJointStateClient(RobotClientBase):
"""Continuous client to fetch robot joint states"""
def send(self, interval=0.5, device_id="hc01"):
"""Continuously fetch joint states and print in fixed order"""
try:
while True:
# Construct request
req = pb.JointRequest()
req.header.device_id = device_id
timestamp = timestamp_pb2.Timestamp()
timestamp.GetCurrentTime()
req.header.timestamp.CopyFrom(timestamp)
# Call RPC with timeout
try:
resp = self.stub.getJointState(req, timeout=10)
except Exception as e:
print(f"RPC call failed: {e}")
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 = {}
for state in resp.state:
for name, pos in zip(state.name, state.position):
joint_dict[name] = round(pos, 12)
joint_list = [{"joint_name": name, "rad": joint_dict.get(name, 0.0)}
for name in joint_order]
# Print timestamp
print(f"[{time.strftime('%H:%M:%S')}]")
# Print each joint, last one without comma
for i, j in enumerate(joint_list):
if i < len(joint_list) - 1:
print(f"{j},")
else:
print(f"{j}")
time.sleep(interval)
except KeyboardInterrupt:
print("\nStopped fetching joint states.")
if __name__ == "__main__":
client = GetJointStateClient()
try:
client.send(interval=0.5)
finally:
client.close()