From 04a4b035f1cc868975eae921bcf2e4ae58d3752a Mon Sep 17 00:00:00 2001 From: xiaoliangstd <2303335747@qq.com> Date: Wed, 19 Feb 2025 21:39:18 +0800 Subject: [PATCH 01/10] Update the examples for the Go2 front camera --- example/{ => go2}/front_camera/camera_opencv.py | 0 example/{ => go2}/front_camera/capture_image.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename example/{ => go2}/front_camera/camera_opencv.py (100%) rename example/{ => go2}/front_camera/capture_image.py (100%) diff --git a/example/front_camera/camera_opencv.py b/example/go2/front_camera/camera_opencv.py similarity index 100% rename from example/front_camera/camera_opencv.py rename to example/go2/front_camera/camera_opencv.py diff --git a/example/front_camera/capture_image.py b/example/go2/front_camera/capture_image.py similarity index 100% rename from example/front_camera/capture_image.py rename to example/go2/front_camera/capture_image.py From 4eadcf6ba0cc822501ff2f1766be637c0fb7f229 Mon Sep 17 00:00:00 2001 From: xiaoliangstd <2303335747@qq.com> Date: Thu, 20 Feb 2025 20:35:47 +0800 Subject: [PATCH 02/10] Update the examples for the B2W and B2 cameras. --- example/b2/camera/camera_opencv.py | 51 +++++++++++++++++++ example/b2/camera/capture_image.py | 51 +++++++++++++++++++ example/b2w/camera/camera_opencv.py | 51 +++++++++++++++++++ example/b2w/camera/capture_image.py | 51 +++++++++++++++++++ .../b2/back_video/back_video_api.py | 16 ++++++ .../b2/back_video/back_video_client.py | 23 +++++++++ .../b2/front_video/front_video_api.py | 16 ++++++ .../b2/front_video/front_video_client.py | 23 +++++++++ unitree_sdk2py/b2/video/video_api.py | 16 ------ unitree_sdk2py/b2/video/video_client.py | 23 --------- 10 files changed, 282 insertions(+), 39 deletions(-) create mode 100644 example/b2/camera/camera_opencv.py create mode 100644 example/b2/camera/capture_image.py create mode 100644 example/b2w/camera/camera_opencv.py create mode 100644 example/b2w/camera/capture_image.py create mode 100644 unitree_sdk2py/b2/back_video/back_video_api.py create mode 100644 unitree_sdk2py/b2/back_video/back_video_client.py create mode 100644 unitree_sdk2py/b2/front_video/front_video_api.py create mode 100644 unitree_sdk2py/b2/front_video/front_video_client.py delete mode 100644 unitree_sdk2py/b2/video/video_api.py delete mode 100644 unitree_sdk2py/b2/video/video_client.py diff --git a/example/b2/camera/camera_opencv.py b/example/b2/camera/camera_opencv.py new file mode 100644 index 00000000..3fafcef6 --- /dev/null +++ b/example/b2/camera/camera_opencv.py @@ -0,0 +1,51 @@ +from unitree_sdk2py.core.channel import ChannelFactoryInitialize +from unitree_sdk2py.b2.front_video.front_video_client import FrontVideoClient +from unitree_sdk2py.b2.back_video.back_video_client import BackVideoClient +import cv2 +import numpy as np +import sys + +def display_image(window_name, data): + # If data is a list, we need to convert it to a bytes object + if isinstance(data, list): + data = bytes(data) + + # Now convert to numpy image + image_data = np.frombuffer(data, dtype=np.uint8) + image = cv2.imdecode(image_data, cv2.IMREAD_COLOR) + if image is not None: + cv2.imshow(window_name, image) + +if __name__ == "__main__": + if len(sys.argv) > 1: + ChannelFactoryInitialize(0, sys.argv[1]) + else: + ChannelFactoryInitialize(0) + + frontCameraClient = FrontVideoClient() # Create a front camera video client + frontCameraClient.SetTimeout(3.0) + frontCameraClient.Init() + + backCameraClient = BackVideoClient() # Create a back camera video client + backCameraClient.SetTimeout(3.0) + backCameraClient.Init() + + # Loop to continuously fetch images + while True: + # Get front camera image + front_code, front_data = frontCameraClient.GetImageSample() + if front_code == 0: + display_image("Front Camera", front_data) + + # Get back camera image + back_code, back_data = backCameraClient.GetImageSample() + if back_code == 0: + display_image("Back Camera", back_data) + + # Press ESC to stop + if cv2.waitKey(20) == 27: + break + + # Clean up windows + cv2.destroyAllWindows() + diff --git a/example/b2/camera/capture_image.py b/example/b2/camera/capture_image.py new file mode 100644 index 00000000..dcfaad6d --- /dev/null +++ b/example/b2/camera/capture_image.py @@ -0,0 +1,51 @@ +import time +import os +import sys + +from unitree_sdk2py.core.channel import ChannelFactoryInitialize +from unitree_sdk2py.b2.front_video.front_video_client import FrontVideoClient +from unitree_sdk2py.b2.back_video.back_video_client import BackVideoClient + +if __name__ == "__main__": + if len(sys.argv) > 1: + ChannelFactoryInitialize(0, sys.argv[1]) + else: + ChannelFactoryInitialize(0) + + # 创建前置相机客户端 + front_client = FrontVideoClient() + front_client.SetTimeout(3.0) + front_client.Init() + + # 创建后置相机客户端 + back_client = BackVideoClient() + back_client.SetTimeout(3.0) + back_client.Init() + + print("##################Get Front Camera Image###################") + # 获取前置相机图像 + front_code, front_data = front_client.GetImageSample() + + if front_code != 0: + print("Get front camera image error. Code:", front_code) + else: + front_image_name = "./front_img.jpg" + print("Front Image Saved as:", front_image_name) + + with open(front_image_name, "+wb") as f: + f.write(bytes(front_data)) + + print("##################Get Back Camera Image###################") + # 获取后置相机图像 + back_code, back_data = back_client.GetImageSample() + + if back_code != 0: + print("Get back camera image error. Code:", back_code) + else: + back_image_name = "./back_img.jpg" + print("Back Image Saved as:", back_image_name) + + with open(back_image_name, "+wb") as f: + f.write(bytes(back_data)) + + time.sleep(1) diff --git a/example/b2w/camera/camera_opencv.py b/example/b2w/camera/camera_opencv.py new file mode 100644 index 00000000..3fafcef6 --- /dev/null +++ b/example/b2w/camera/camera_opencv.py @@ -0,0 +1,51 @@ +from unitree_sdk2py.core.channel import ChannelFactoryInitialize +from unitree_sdk2py.b2.front_video.front_video_client import FrontVideoClient +from unitree_sdk2py.b2.back_video.back_video_client import BackVideoClient +import cv2 +import numpy as np +import sys + +def display_image(window_name, data): + # If data is a list, we need to convert it to a bytes object + if isinstance(data, list): + data = bytes(data) + + # Now convert to numpy image + image_data = np.frombuffer(data, dtype=np.uint8) + image = cv2.imdecode(image_data, cv2.IMREAD_COLOR) + if image is not None: + cv2.imshow(window_name, image) + +if __name__ == "__main__": + if len(sys.argv) > 1: + ChannelFactoryInitialize(0, sys.argv[1]) + else: + ChannelFactoryInitialize(0) + + frontCameraClient = FrontVideoClient() # Create a front camera video client + frontCameraClient.SetTimeout(3.0) + frontCameraClient.Init() + + backCameraClient = BackVideoClient() # Create a back camera video client + backCameraClient.SetTimeout(3.0) + backCameraClient.Init() + + # Loop to continuously fetch images + while True: + # Get front camera image + front_code, front_data = frontCameraClient.GetImageSample() + if front_code == 0: + display_image("Front Camera", front_data) + + # Get back camera image + back_code, back_data = backCameraClient.GetImageSample() + if back_code == 0: + display_image("Back Camera", back_data) + + # Press ESC to stop + if cv2.waitKey(20) == 27: + break + + # Clean up windows + cv2.destroyAllWindows() + diff --git a/example/b2w/camera/capture_image.py b/example/b2w/camera/capture_image.py new file mode 100644 index 00000000..dcfaad6d --- /dev/null +++ b/example/b2w/camera/capture_image.py @@ -0,0 +1,51 @@ +import time +import os +import sys + +from unitree_sdk2py.core.channel import ChannelFactoryInitialize +from unitree_sdk2py.b2.front_video.front_video_client import FrontVideoClient +from unitree_sdk2py.b2.back_video.back_video_client import BackVideoClient + +if __name__ == "__main__": + if len(sys.argv) > 1: + ChannelFactoryInitialize(0, sys.argv[1]) + else: + ChannelFactoryInitialize(0) + + # 创建前置相机客户端 + front_client = FrontVideoClient() + front_client.SetTimeout(3.0) + front_client.Init() + + # 创建后置相机客户端 + back_client = BackVideoClient() + back_client.SetTimeout(3.0) + back_client.Init() + + print("##################Get Front Camera Image###################") + # 获取前置相机图像 + front_code, front_data = front_client.GetImageSample() + + if front_code != 0: + print("Get front camera image error. Code:", front_code) + else: + front_image_name = "./front_img.jpg" + print("Front Image Saved as:", front_image_name) + + with open(front_image_name, "+wb") as f: + f.write(bytes(front_data)) + + print("##################Get Back Camera Image###################") + # 获取后置相机图像 + back_code, back_data = back_client.GetImageSample() + + if back_code != 0: + print("Get back camera image error. Code:", back_code) + else: + back_image_name = "./back_img.jpg" + print("Back Image Saved as:", back_image_name) + + with open(back_image_name, "+wb") as f: + f.write(bytes(back_data)) + + time.sleep(1) diff --git a/unitree_sdk2py/b2/back_video/back_video_api.py b/unitree_sdk2py/b2/back_video/back_video_api.py new file mode 100644 index 00000000..16f566b2 --- /dev/null +++ b/unitree_sdk2py/b2/back_video/back_video_api.py @@ -0,0 +1,16 @@ +""" +" service name +""" +ROBOT_BACK_VIDEO_SERVICE_NAME = "back_videohub" + + +""" +" service api version +""" +ROBOT_BACK_VIDEO_API_VERSION = "1.0.0.0" + + +""" +" api id +""" +ROBOT_BACK_VIDEO_API_ID_GETIMAGESAMPLE = 1001 diff --git a/unitree_sdk2py/b2/back_video/back_video_client.py b/unitree_sdk2py/b2/back_video/back_video_client.py new file mode 100644 index 00000000..e19c97fc --- /dev/null +++ b/unitree_sdk2py/b2/back_video/back_video_client.py @@ -0,0 +1,23 @@ +import json + +from ...rpc.client import Client +from .back_video_api import * + + +""" +" class FrontVideoClient +""" +class BackVideoClient(Client): + def __init__(self): + super().__init__(ROBOT_BACK_VIDEO_SERVICE_NAME, False) + + + def Init(self): + # set api version + self._SetApiVerson(ROBOT_BACK_VIDEO_API_VERSION) + # regist api + self._RegistApi(ROBOT_BACK_VIDEO_API_ID_GETIMAGESAMPLE, 0) + + # 1001 + def GetImageSample(self): + return self._CallBinary(ROBOT_BACK_VIDEO_API_ID_GETIMAGESAMPLE, []) diff --git a/unitree_sdk2py/b2/front_video/front_video_api.py b/unitree_sdk2py/b2/front_video/front_video_api.py new file mode 100644 index 00000000..6f4717af --- /dev/null +++ b/unitree_sdk2py/b2/front_video/front_video_api.py @@ -0,0 +1,16 @@ +""" +" service name +""" +ROBOT_FRONT_VIDEO_SERVICE_NAME = "front_videohub" + + +""" +" service api version +""" +ROBOT_FRONT_VIDEO_API_VERSION = "1.0.0.0" + + +""" +" api id +""" +ROBOT_FRONT_VIDEO_API_ID_GETIMAGESAMPLE = 1001 diff --git a/unitree_sdk2py/b2/front_video/front_video_client.py b/unitree_sdk2py/b2/front_video/front_video_client.py new file mode 100644 index 00000000..5ba065ad --- /dev/null +++ b/unitree_sdk2py/b2/front_video/front_video_client.py @@ -0,0 +1,23 @@ +import json + +from ...rpc.client import Client +from .front_video_api import * + + +""" +" class FrontVideoClient +""" +class FrontVideoClient(Client): + def __init__(self): + super().__init__(ROBOT_FRONT_VIDEO_SERVICE_NAME, False) + + + def Init(self): + # set api version + self._SetApiVerson(ROBOT_FRONT_VIDEO_API_VERSION) + # regist api + self._RegistApi(ROBOT_FRONT_VIDEO_API_ID_GETIMAGESAMPLE, 0) + + # 1001 + def GetImageSample(self): + return self._CallBinary(ROBOT_FRONT_VIDEO_API_ID_GETIMAGESAMPLE, []) diff --git a/unitree_sdk2py/b2/video/video_api.py b/unitree_sdk2py/b2/video/video_api.py deleted file mode 100644 index a4cb1b64..00000000 --- a/unitree_sdk2py/b2/video/video_api.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -" service name -""" -VIDEO_SERVICE_NAME = "videohub" - - -""" -" service api version -""" -VIDEO_API_VERSION = "1.0.0.1" - - -""" -" api id -""" -VIDEO_API_ID_GETIMAGESAMPLE = 1001 diff --git a/unitree_sdk2py/b2/video/video_client.py b/unitree_sdk2py/b2/video/video_client.py deleted file mode 100644 index 79e1fb5a..00000000 --- a/unitree_sdk2py/b2/video/video_client.py +++ /dev/null @@ -1,23 +0,0 @@ -import json - -from ...rpc.client import Client -from .video_api import * - - -""" -" class VideoClient -""" -class VideoClient(Client): - def __init__(self): - super().__init__(VIDEO_SERVICE_NAME, False) - - - def Init(self): - # set api version - self._SetApiVerson(VIDEO_API_VERSION) - # regist api - self._RegistApi(VIDEO_API_ID_GETIMAGESAMPLE, 0) - - # 1001 - def GetImageSample(self): - return self._CallBinary(VIDEO_API_ID_GETIMAGESAMPLE, []) From aee4390c272cd2e18423954c2fc6fa7d4525f1ae Mon Sep 17 00:00:00 2001 From: xiaoliangstd <2303335747@qq.com> Date: Mon, 3 Mar 2025 16:21:31 +0800 Subject: [PATCH 03/10] Fix the import error in go2 robot_state_client.py --- unitree_sdk2py/go2/robot_state/robot_state_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unitree_sdk2py/go2/robot_state/robot_state_client.py b/unitree_sdk2py/go2/robot_state/robot_state_client.py index 5b2e74d1..097a8910 100644 --- a/unitree_sdk2py/go2/robot_state/robot_state_client.py +++ b/unitree_sdk2py/go2/robot_state/robot_state_client.py @@ -1,7 +1,7 @@ import json from ...rpc.client import Client -from ...rpc.client_internal import * +from ...rpc.internal import * from .robot_state_api import * From 986f39d54182badc1aa3a0c282bcd898fba4ef20 Mon Sep 17 00:00:00 2001 From: xiaoliangstd <2303335747@qq.com> Date: Wed, 5 Mar 2025 16:10:13 +0800 Subject: [PATCH 04/10] =?UTF-8?q?add=20g1=20Squat2StandUp=E3=80=81StandUp2?= =?UTF-8?q?Squat=E3=80=81Lie2StandUp=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/g1/high_level/g1_loco_client_example.py | 15 +++++++++++---- unitree_sdk2py/g1/loco/g1_loco_client.py | 11 +++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/example/g1/high_level/g1_loco_client_example.py b/example/g1/high_level/g1_loco_client_example.py index 4b7a42d8..55ee0596 100644 --- a/example/g1/high_level/g1_loco_client_example.py +++ b/example/g1/high_level/g1_loco_client_example.py @@ -14,8 +14,8 @@ class TestOption: option_list = [ TestOption(name="damp", id=0), - TestOption(name="stand_up", id=1), - TestOption(name="sit", id=2), + TestOption(name="Squat2StandUp", id=1), + TestOption(name="StandUp2Squat", id=2), TestOption(name="move forward", id=3), TestOption(name="move lateral", id=4), TestOption(name="move rotate", id=5), @@ -25,6 +25,7 @@ class TestOption: TestOption(name="wave hand1", id=9), # wave hand without turning around TestOption(name="wave hand2", id=10), # wave hand and trun around TestOption(name="shake hand", id=11), + TestOption(name="Lie2StandUp", id=12), ] class UserInterface: @@ -83,9 +84,11 @@ def terminal_handle(self): if test_option.id == 0: sport_client.Damp() elif test_option.id == 1: - sport_client.StandUp() + sport_client.Damp() + time.sleep(0.5) + sport_client.Squat2StandUp() elif test_option.id == 2: - sport_client.Sit() + sport_client.StandUp2Squat() elif test_option.id == 3: sport_client.Move(0.3,0,0) elif test_option.id == 4: @@ -106,5 +109,9 @@ def terminal_handle(self): sport_client.ShakeHand() time.sleep(3) sport_client.ShakeHand() + elif test_option.id == 12: + sport_client.Damp() + time.sleep(0.5) + sport_client.Lie2StandUp() # When using the Lie2StandUp function, ensure that the robot faces up and the ground is hard, flat and rough. time.sleep(1) \ No newline at end of file diff --git a/unitree_sdk2py/g1/loco/g1_loco_client.py b/unitree_sdk2py/g1/loco/g1_loco_client.py index af04b05d..9d3a632d 100644 --- a/unitree_sdk2py/g1/loco/g1_loco_client.py +++ b/unitree_sdk2py/g1/loco/g1_loco_client.py @@ -78,14 +78,17 @@ def Damp(self): def Start(self): self.SetFsmId(200) - def Squat(self): - self.SetFsmId(2) + def Squat2StandUp(self): + self.SetFsmId(706) + + def Lie2StandUp(self): + self.SetFsmId(702) def Sit(self): self.SetFsmId(3) - def StandUp(self): - self.SetFsmId(4) + def StandUp2Squat(self): + self.SetFsmId(706) def ZeroTorque(self): self.SetFsmId(0) From 892693efe035ae3db7a62ed429ebd0bc15f88ca7 Mon Sep 17 00:00:00 2001 From: wei liang <2303335747@qq.com> Date: Mon, 23 Jun 2025 16:04:31 +0800 Subject: [PATCH 05/10] add G1ArmActionClient and corresponding examples --- .../g1/high_level/g1_arm_action_example.py | 141 ++++++++++++++++++ unitree_sdk2py/g1/arm/g1_arm_action_api.py | 19 +++ unitree_sdk2py/g1/arm/g1_arm_action_client.py | 56 +++++++ 3 files changed, 216 insertions(+) create mode 100644 example/g1/high_level/g1_arm_action_example.py create mode 100644 unitree_sdk2py/g1/arm/g1_arm_action_api.py create mode 100644 unitree_sdk2py/g1/arm/g1_arm_action_client.py diff --git a/example/g1/high_level/g1_arm_action_example.py b/example/g1/high_level/g1_arm_action_example.py new file mode 100644 index 00000000..7b0c2895 --- /dev/null +++ b/example/g1/high_level/g1_arm_action_example.py @@ -0,0 +1,141 @@ +import time +import sys +from unitree_sdk2py.core.channel import ChannelSubscriber, ChannelFactoryInitialize +from unitree_sdk2py.g1.arm.g1_arm_action_client import G1ArmActionClient +from unitree_sdk2py.g1.arm.g1_arm_action_client import action_map +from dataclasses import dataclass + +@dataclass +class TestOption: + name: str + id: int + +option_list = [ + TestOption(name="release arm", id=0), + TestOption(name="shake hand", id=1), + TestOption(name="high five", id=2), + TestOption(name="hug", id=3), + TestOption(name="high wave", id=4), + TestOption(name="clap", id=5), + TestOption(name="face wave", id=6), + TestOption(name="left kiss", id=7), + TestOption(name="heart", id=8), + TestOption(name="right heart", id=9), + TestOption(name="hands up", id=10), + TestOption(name="x-ray", id=11), + TestOption(name="right hand up", id=12), + TestOption(name="reject", id=13), + TestOption(name="right kiss", id=14), + TestOption(name="two-hand kiss", id=15), + +] + +class UserInterface: + def __init__(self): + self.test_option_ = None + + def convert_to_int(self, input_str): + try: + return int(input_str) + except ValueError: + return None + + def terminal_handle(self): + input_str = input("Enter id or name: \n") + + if input_str == "list": + self.test_option_.name = None + self.test_option_.id = None + for option in option_list: + print(f"{option.name}, id: {option.id}") + return + + for option in option_list: + if input_str == option.name or self.convert_to_int(input_str) == option.id: + self.test_option_.name = option.name + self.test_option_.id = option.id + print(f"Test: {self.test_option_.name}, test_id: {self.test_option_.id}") + return + + print("No matching test option found.") + + +if __name__ == "__main__": + if len(sys.argv) < 2: + print(f"Usage: python3 {sys.argv[0]} networkInterface") + sys.exit(-1) + + print("WARNING: Please ensure there are no obstacles around the robot while running this example.") + input("Press Enter to continue...") + + ChannelFactoryInitialize(0, sys.argv[1]) + + test_option = TestOption(name=None, id=None) + user_interface = UserInterface() + user_interface.test_option_ = test_option + + armAction_client = G1ArmActionClient() + armAction_client.SetTimeout(10.0) + armAction_client.Init() + + # actionList = armAction_client.GetActionList() + # print("actionList\n",actionList) + + print("Input \"list\" to list all test option ...") + while True: + user_interface.terminal_handle() + + print(f"Updated Test Option: Name = {test_option.name}, ID = {test_option.id}") + + if test_option.id == 0: + armAction_client.ExecuteAction(action_map.get("release arm")) + elif test_option.id == 1: + armAction_client.ExecuteAction(action_map.get("shake hand")) + time.sleep(2) + armAction_client.ExecuteAction(action_map.get("release arm")) + elif test_option.id == 2: + armAction_client.ExecuteAction(action_map.get("high five")) + time.sleep(2) + armAction_client.ExecuteAction(action_map.get("release arm")) + elif test_option.id == 3: + armAction_client.ExecuteAction(action_map.get("hug")) + time.sleep(2) + armAction_client.ExecuteAction(action_map.get("release arm")) + elif test_option.id == 4: + armAction_client.ExecuteAction(action_map.get("high wave")) + elif test_option.id == 5: + armAction_client.ExecuteAction(action_map.get("clap")) + elif test_option.id == 6: + armAction_client.ExecuteAction(action_map.get("face wave")) + elif test_option.id == 7: + armAction_client.ExecuteAction(action_map.get("left kiss")) + elif test_option.id == 8: + armAction_client.ExecuteAction(action_map.get("heart")) + time.sleep(2) + armAction_client.ExecuteAction(action_map.get("release arm")) + elif test_option.id == 9: + armAction_client.ExecuteAction(action_map.get("right heart")) + time.sleep(2) + armAction_client.ExecuteAction(action_map.get("release arm")) + elif test_option.id == 10: + armAction_client.ExecuteAction(action_map.get("hands up")) + time.sleep(2) + armAction_client.ExecuteAction(action_map.get("release arm")) + elif test_option.id == 11: + armAction_client.ExecuteAction(action_map.get("x-ray")) + time.sleep(2) + armAction_client.ExecuteAction(action_map.get("release arm")) + elif test_option.id == 12: + armAction_client.ExecuteAction(action_map.get("right hand up")) + time.sleep(2) + armAction_client.ExecuteAction(action_map.get("release arm")) + elif test_option.id == 13: + armAction_client.ExecuteAction(action_map.get("reject")) + time.sleep(2) + armAction_client.ExecuteAction(action_map.get("release arm")) + elif test_option.id == 14: + armAction_client.ExecuteAction(action_map.get("right kiss")) + elif test_option.id == 15: + armAction_client.ExecuteAction(action_map.get("two-hand kiss")) + + time.sleep(1) \ No newline at end of file diff --git a/unitree_sdk2py/g1/arm/g1_arm_action_api.py b/unitree_sdk2py/g1/arm/g1_arm_action_api.py new file mode 100644 index 00000000..f3e98298 --- /dev/null +++ b/unitree_sdk2py/g1/arm/g1_arm_action_api.py @@ -0,0 +1,19 @@ +""" +" service name +""" +ARM_ACTION_SERVICE_NAME = "arm" + +""" +" service api version +""" +ARM_ACTION_API_VERSION = "1.0.0.14" + +""" +" api id +""" +ROBOT_API_ID_ARM_ACTION_EXECUTE_ACTION = 7106 +ROBOT_API_ID_ARM_ACTION_GET_ACTION_LIST = 7107 + +""" +" error code +""" \ No newline at end of file diff --git a/unitree_sdk2py/g1/arm/g1_arm_action_client.py b/unitree_sdk2py/g1/arm/g1_arm_action_client.py new file mode 100644 index 00000000..615d2765 --- /dev/null +++ b/unitree_sdk2py/g1/arm/g1_arm_action_client.py @@ -0,0 +1,56 @@ +import json + +from ...rpc.client import Client +from .g1_arm_action_api import * + +action_map = { + "release arm": 99, + "two-hand kiss": 11, + "left kiss": 12, + "right kiss": 13, + "hands up": 15, + "clap": 17, + "high five": 18, + "hug": 19, + "heart": 20, + "right heart": 21, + "reject": 22, + "right hand up": 23, + "x-ray": 24, + "face wave": 25, + "high wave": 26, + "shake hand": 27, +} + + +""" +" class SportClient +""" +class G1ArmActionClient(Client): + def __init__(self): + super().__init__(ARM_ACTION_SERVICE_NAME, False) + + def Init(self): + # set api version + self._SetApiVerson(ARM_ACTION_API_VERSION) + + # regist api + self._RegistApi(ROBOT_API_ID_ARM_ACTION_EXECUTE_ACTION, 0) + self._RegistApi(ROBOT_API_ID_ARM_ACTION_GET_ACTION_LIST, 0) + + ## API Call ## + def ExecuteAction(self, action_id: int): + p = {} + p["data"] = action_id + parameter = json.dumps(p) + code, data = self._Call(ROBOT_API_ID_ARM_ACTION_EXECUTE_ACTION, parameter) + return code + + def GetActionList(self): + p = {} + parameter = json.dumps(p) + code, data = self._Call(ROBOT_API_ID_ARM_ACTION_GET_ACTION_LIST, parameter) + if code == 0: + return code, json.loads(data) + else: + return code, None \ No newline at end of file From 60e8358bcf68a785c628096760fbfc941d9a44a9 Mon Sep 17 00:00:00 2001 From: wei liang <2303335747@qq.com> Date: Mon, 23 Jun 2025 16:15:28 +0800 Subject: [PATCH 06/10] update LOCO_SERVICE_NAME for G1 LocoClient to support ai_sport >= 8.2.0.0 --- unitree_sdk2py/g1/loco/g1_loco_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unitree_sdk2py/g1/loco/g1_loco_api.py b/unitree_sdk2py/g1/loco/g1_loco_api.py index 937de19b..2fdca7e3 100644 --- a/unitree_sdk2py/g1/loco/g1_loco_api.py +++ b/unitree_sdk2py/g1/loco/g1_loco_api.py @@ -1,7 +1,7 @@ """ " service name """ -LOCO_SERVICE_NAME = "loco" +LOCO_SERVICE_NAME = "sport" """ From 27310f851ae9ae7bc1858d82951b179520e25e82 Mon Sep 17 00:00:00 2001 From: silencht Date: Tue, 24 Jun 2025 11:50:47 +0800 Subject: [PATCH 07/10] feat: add thread-safe lazy initialization to ChannelFactory --- unitree_sdk2py/core/channel.py | 69 ++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/unitree_sdk2py/core/channel.py b/unitree_sdk2py/core/channel.py index d955f750..64577f99 100644 --- a/unitree_sdk2py/core/channel.py +++ b/unitree_sdk2py/core/channel.py @@ -1,5 +1,6 @@ import time from typing import Any, Callable +import threading from threading import Thread, Event from cyclonedds.domain import Domain, DomainParticipant @@ -192,41 +193,51 @@ class ChannelFactory(Singleton): __participant = None __qos = None + __initialized = False + __init_lock = threading.Lock() + def __init__(self): super().__init__() def Init(self, id: int, networkInterface: str = None, qos: Qos = None): - config = None - # choose config - if networkInterface is None: - config = ChannelConfigAutoDetermine - else: - config = ChannelConfigHasInterface.replace('$__IF_NAME__$', networkInterface) - - try: - self.__domain = Domain(id, config) - except DDSException as e: - print("[ChannelFactory] create domain error. msg:", e.msg) - return False - except: - print("[ChannelFactory] create domain error.") - return False - - try: - self.__participant = DomainParticipant(id) - except DDSException as e: - print("[ChannelFactory] create domain participant error. msg:", e.msg) - return False - except: - print("[ChannelFactory] create domain participant error") - return False - - self.__qos = qos - - return True + if self.__class__.__initialized: + return True + + with self.__class__.__init_lock: + if self.__class__.__initialized: + return True + + config = None + # choose config + if networkInterface is None: + config = ChannelConfigAutoDetermine + else: + config = ChannelConfigHasInterface.replace('$__IF_NAME__$', networkInterface) + + try: + self.__class__.__domain = Domain(id, config) + except DDSException as e: + print("[ChannelFactory] create domain error. msg:", e.msg) + return False + except: + print("[ChannelFactory] create domain error.") + return False + + try: + self.__class__.__participant = DomainParticipant(id) + except DDSException as e: + print("[ChannelFactory] create domain participant error. msg:", e.msg) + return False + except: + print("[ChannelFactory] create domain participant error") + return False + + self.__class__.__qos = qos + self.__class__.__initialized = True + return True def CreateChannel(self, name: str, type: Any): - return Channel(self.__participant, name, type, self.__qos) + return Channel(self.__class__.__participant, name, type, self.__class__.__qos) def CreateSendChannel(self, name: str, type: Any): channel = self.CreateChannel(name, type) From c5754b8435ef953ad769202db28d98b10145148d Mon Sep 17 00:00:00 2001 From: Sun Jiayun Date: Wed, 9 Jul 2025 14:57:08 +0800 Subject: [PATCH 08/10] add client Call method to support VIOCE service api --- unitree_sdk2py/rpc/client.py | 22 ++++++++++++++++++ unitree_sdk2py/rpc/client_base.py | 37 ++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/unitree_sdk2py/rpc/client.py b/unitree_sdk2py/rpc/client.py index d774e538..646be040 100644 --- a/unitree_sdk2py/rpc/client.py +++ b/unitree_sdk2py/rpc/client.py @@ -56,6 +56,28 @@ def _CallNoReply(self, apiId: int, parameter: str): else: return RPC_ERR_CLIENT_API_NOT_REG + def _CallRequestWithParamAndBin(self, apiId: int, requestParamter: str, + requestBinary: list): + ret, proirity, leaseId = self.__CheckApi(apiId) + if ret == 0: + return self._CallRequestWithParamAndBinBase(apiId, requestParamter, + requestBinary, proirity, + leaseId) + else: + return RPC_ERR_CLIENT_API_NOT_REG, None + + def _CallRequestWithParamAndBinNoReply(self, apiId: int, requestParamter: str, + requestBinary: list): + ret, proirity, leaseId = self.__CheckApi(apiId) + if ret == 0: + return self._CallRequestWithParamAndBinNoReplyBase(apiId, + requestParamter, + requestBinary, + proirity, + leaseId) + else: + return RPC_ERR_CLIENT_API_NOT_REG + def _CallBinary(self, apiId: int, parameter: list): ret, proirity, leaseId = self.__CheckApi(apiId) if ret == 0: diff --git a/unitree_sdk2py/rpc/client_base.py b/unitree_sdk2py/rpc/client_base.py index 1bac028f..fae1db91 100644 --- a/unitree_sdk2py/rpc/client_base.py +++ b/unitree_sdk2py/rpc/client_base.py @@ -55,7 +55,42 @@ def _CallNoReplyBase(self, apiId: int, parameter: str, proirity: int, leaseId: i return 0 else: return RPC_ERR_CLIENT_SEND - + + def _CallRequestWithParamAndBinBase(self, apiId: int, requestParamter: str, + requestBinary: list, proirity: int = 0, + leaseId: int = 0): + header = self.__SetHeader(apiId, leaseId, proirity, False) + request = Request(header, requestParamter, requestBinary) + + future = self.__stub.SendRequest(request, self.__timeout) + if future is None: + return RPC_ERR_CLIENT_SEND, None + + result = future.GetResult(self.__timeout) + + if result.code != FutureResult.FUTURE_SUCC: + self.__stub.RemoveFuture(request.header.identity.id) + code = RPC_ERR_CLIENT_API_TIMEOUT if result.code == FutureResult.FUTUTE_ERR_TIMEOUT else RPC_ERR_UNKNOWN + return code, None + + response = result.value + + if response.header.identity.api_id != apiId: + return RPC_ERR_CLIENT_API_NOT_MATCH, None + else: + return response.header.status.code, response.data + + def _CallRequestWithParamAndBinNoReplyBase(self, apiId: int, requestParamter: str, + requestBinary: list, proirity: int, + leaseId: int): + header = self.__SetHeader(apiId, leaseId, proirity, True) + request = Request(header, requestParamter, request_binary) + + if self.__stub.Send(request, self.__timeout): + return 0 + else: + return RPC_ERR_CLIENT_SEND + def _CallBinaryBase(self, apiId: int, parameter: list, proirity: int, leaseId: int): header = self.__SetHeader(apiId, leaseId, proirity, False) request = Request(header, "", parameter) From f5592911758bf20c4b2b3124c9421d89c685325d Mon Sep 17 00:00:00 2001 From: wei liang <2303335747@qq.com> Date: Wed, 9 Jul 2025 15:59:25 +0800 Subject: [PATCH 09/10] Update the G1 audio client WAV playback example, and also update the B2 locomotion interfaces --- example/b2/high_level/b2_sport_client.py | 51 +++--- example/g1/audio/g1_audio_client_play_wav.py | 35 ++++ example/g1/audio/test.wav | Bin 0 -> 132246 bytes example/g1/audio/wav.py | 166 +++++++++++++++++++ unitree_sdk2py/b2/sport/sport_api.py | 55 +++--- unitree_sdk2py/b2/sport/sport_client.py | 164 ++++++++---------- unitree_sdk2py/g1/audio/g1_audio_client.py | 11 +- 7 files changed, 329 insertions(+), 153 deletions(-) create mode 100644 example/g1/audio/g1_audio_client_play_wav.py create mode 100644 example/g1/audio/test.wav create mode 100644 example/g1/audio/wav.py diff --git a/example/b2/high_level/b2_sport_client.py b/example/b2/high_level/b2_sport_client.py index 695d28ea..25aafe26 100644 --- a/example/b2/high_level/b2_sport_client.py +++ b/example/b2/high_level/b2_sport_client.py @@ -11,17 +11,15 @@ class TestOption: id: int option_list = [ - TestOption(name="damp", id=0), - TestOption(name="stand_up", id=1), - TestOption(name="stand_down", id=2), - TestOption(name="move forward", id=3), - TestOption(name="move lateral", id=4), - TestOption(name="move rotate", id=5), - TestOption(name="stop_move", id=6), - TestOption(name="switch_gait", id=7), - TestOption(name="switch_gait", id=8), - TestOption(name="recovery", id=9), - TestOption(name="balanced stand", id=10) + TestOption(name="Damp", id=0), + TestOption(name="BalanceStand", id=1), + TestOption(name="StopMove", id=2), + TestOption(name="StandUp", id=3), + TestOption(name="StandDown", id=4), + TestOption(name="RecoveryStand", id=5), + TestOption(name="Move", id=6), + TestOption(name="FreeWalk", id=7), + TestOption(name="ClassicWalk", id=8) ] class UserInterface: @@ -59,7 +57,9 @@ def terminal_handle(self): print(f"Usage: python3 {sys.argv[0]} networkInterface") sys.exit(-1) - print("WARNING: Please ensure there are no obstacles around the robot while running this example.") + print("WARNING: Please ensure there are no obstacles around the robot while running this example.\n" + "NOTE: Some interfaces are not demonstrated in this example for safety reasons. " + "If you need to use them, please contact technical support: https://serviceconsole.unitree.com/index.html#/") input("Press Enter to continue...") ChannelFactoryInitialize(0, sys.argv[1]) @@ -80,26 +80,27 @@ def terminal_handle(self): print(f"Updated Test Option: Name = {test_option.name}, ID = {test_option.id}") if test_option.id == 0: - sport_client.Damp() + print(f"ret:{sport_client.Damp()}") elif test_option.id == 1: - sport_client.StandUp() + print(f"ret:{sport_client.BalanceStand()}") elif test_option.id == 2: - sport_client.StandDown() + print(f"ret:{sport_client.StopMove()}") elif test_option.id == 3: - sport_client.Move(0.3,0,0) + print(f"ret:{sport_client.StandUp()}") elif test_option.id == 4: - sport_client.Move(0,0.3,0) + print(f"ret:{sport_client.StandDown()}") elif test_option.id == 5: - sport_client.Move(0,0,0.5) + print(f"ret:{sport_client.RecoveryStand()}") elif test_option.id == 6: - sport_client.StopMove() + print(f"ret:{sport_client.Move(0.5,0.0,0.0)}") elif test_option.id == 7: - sport_client.SwitchGait(0) + print(f"ret:{sport_client.FreeWalk()}") elif test_option.id == 8: - sport_client.SwitchGait(1) - elif test_option.id == 9: - sport_client.RecoveryStand() - elif test_option.id == 10: - sport_client.BalanceStand() + print(f"ret:{sport_client.ClassicWalk(True)}") + print(f"ret:{sport_client.Move(0.1,0.0,0.0)}") + time.sleep(2) + print(f"ret:{sport_client.ClassicWalk(False)}") + print(f"ret:{sport_client.Move(-0.3,0.0,0.0)}") + time.sleep(2) time.sleep(1) diff --git a/example/g1/audio/g1_audio_client_play_wav.py b/example/g1/audio/g1_audio_client_play_wav.py new file mode 100644 index 00000000..3f3b6de6 --- /dev/null +++ b/example/g1/audio/g1_audio_client_play_wav.py @@ -0,0 +1,35 @@ +import sys +from unitree_sdk2py.core.channel import ChannelFactoryInitialize +from unitree_sdk2py.g1.audio.g1_audio_client import AudioClient +from wav import read_wav, play_pcm_stream + +def main(): + if len(sys.argv) < 3: + print(f"Usage: python3 {sys.argv[0]} ") + sys.exit(1) + + net_interface = sys.argv[1] + wav_path = sys.argv[2] + + ChannelFactoryInitialize(0, net_interface) + audioClient = AudioClient() + audioClient.SetTimeout(10.0) + audioClient.Init() + + pcm_list, sample_rate, num_channels, is_ok = read_wav(wav_path) + print(f"[DEBUG] Read success: {is_ok}") + print(f"[DEBUG] Sample rate: {sample_rate} Hz") + print(f"[DEBUG] Channels: {num_channels}") + print(f"[DEBUG] PCM byte length: {len(pcm_list)}") + + if not is_ok or sample_rate != 16000 or num_channels != 1: + print("[ERROR] Failed to read WAV file or unsupported format (must be 16kHz mono)") + return + + play_pcm_stream(audioClient, pcm_list, "example") + + audioClient.PlayStop("example") + +if __name__ == "__main__": + main() + diff --git a/example/g1/audio/test.wav b/example/g1/audio/test.wav new file mode 100644 index 0000000000000000000000000000000000000000..d0bd0bbca59d5cf6abe4b4aad75bda31b5e381fc GIT binary patch literal 132246 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 literal 0 HcmV?d00001 diff --git a/example/g1/audio/wav.py b/example/g1/audio/wav.py new file mode 100644 index 00000000..015fe8f2 --- /dev/null +++ b/example/g1/audio/wav.py @@ -0,0 +1,166 @@ +import struct +import time + +def read_wav(filename): + try: + with open(filename, 'rb') as f: + def read(fmt): + return struct.unpack(fmt, f.read(struct.calcsize(fmt))) + + # === Chunk Header === + chunk_id, = read(' Date: Wed, 30 Jul 2025 17:08:47 +0800 Subject: [PATCH 10/10] feat(go2): add some new supported go2 sports APIs,delete deprecated functions that are no longer supported Now the APIs of `SportClient` in the following list are supported: | name | value | example | | :------------------------------------ | :---- | :---- | | ROBOT_SPORT_API_ID_HEART | 1036 |Heart(); | | ROBOT_SPORT_API_ID_STATICWALK | 1061 |StaticWalk(); | | ROBOT_SPORT_API_ID_TROTRUN | 1062 |TrotRun(); | | ROBOT_SPORT_API_ID_ECONOMICGAIT | 1063 |EconomicGait(); | | ROBOT_SPORT_API_ID_LEFTFLIP | 2041 |LeftFlip(); | | ROBOT_SPORT_API_ID_BACKFLIP | 2043 |BackFlip(); | | ROBOT_SPORT_API_ID_HANDSTAND | 2044 |HandStand(); | | ROBOT_SPORT_API_ID_FREEWALK | 2045 |FreeWalk(); | | ROBOT_SPORT_API_ID_FREEBOUND | 2046 |FreeBound(); | | ROBOT_SPORT_API_ID_FREEJUMP | 2047 |FreeJump(); | | ROBOT_SPORT_API_ID_FREEAVOID | 2048 |FreeAvoid(); | | ROBOT_SPORT_API_ID_CLASSICWALK | 2049 |ClassicWalk(); | | ROBOT_SPORT_API_ID_WALKUPRIGHT | 2050 |WalkUpright(); | | ROBOT_SPORT_API_ID_CROSSSTEP | 2051 |CrossStep(); | | ROBOT_SPORT_API_ID_AUTORECOVERY_SET | 2054 |AutoRecoverySet(); | | ROBOT_SPORT_API_ID_AUTORECOVERY_GET | 2055 |AutoRecoveryGet(); | | ROBOT_SPORT_API_ID_SWITCHAVOIDMODE | 2058 |SwitchAvoidMode(); | BREAKING CHANGE: The functions or API IDs in the following list are no longer supported. If you need to use a new version, please remove the following references: | API ID | Macro Definition | Function Name | | :----- | :------------------------------------ | :------------------- | | 1011 | ROBOT_SPORT_API_ID_SWITCHGAIT | SwitchGait() | | 1012 | ROBOT_SPORT_API_ID_TRIGGER | Trigger() | | 1013 | ROBOT_SPORT_API_ID_BODYHEIGHT | BodyHeight() | | 1014 | ROBOT_SPORT_API_ID_FOOTRAISEHEIGHT | FootRaiseHeight() | | 1018 | ROBOT_SPORT_API_ID_TRAJECTORYFOLLOW | TrajectoryFollow() | | 1019 | ROBOT_SPORT_API_ID_CONTINUOUSGAIT | ContinuousGait() | | 1021 | ROBOT_SPORT_API_ID_WALLOW | Wallow() | | 1024 | ROBOT_SPORT_API_ID_GETBODYHEIGHT | BodyHeight | | 1025 | ROBOT_SPORT_API_ID_GETFOOTRAISEHEIGHT | (No direct function) | | 1026 | ROBOT_SPORT_API_ID_GETSPEEDLEVEL | (No direct function) | --- example/go2/high_level/go2_sport_client.py | 37 +-- unitree_sdk2py/go2/sport/sport_api.py | 43 ++- unitree_sdk2py/go2/sport/sport_client.py | 309 ++++++++------------- 3 files changed, 140 insertions(+), 249 deletions(-) diff --git a/example/go2/high_level/go2_sport_client.py b/example/go2/high_level/go2_sport_client.py index b14d79d0..23873e65 100644 --- a/example/go2/high_level/go2_sport_client.py +++ b/example/go2/high_level/go2_sport_client.py @@ -24,17 +24,14 @@ class TestOption: TestOption(name="move lateral", id=4), TestOption(name="move rotate", id=5), TestOption(name="stop_move", id=6), - TestOption(name="switch_gait", id=7), - TestOption(name="switch_gait", id=8), + TestOption(name="hand stand", id=7), TestOption(name="balanced stand", id=9), - TestOption(name="recovery", id=10), TestOption(name="recovery", id=10), TestOption(name="left flip", id=11), TestOption(name="back flip", id=12), TestOption(name="free walk", id=13), TestOption(name="free bound", id=14), TestOption(name="free avoid", id=15), - TestOption(name="walk stair", id=16), TestOption(name="walk upright", id=17), TestOption(name="cross step", id=18), TestOption(name="free jump", id=19) @@ -71,14 +68,13 @@ def terminal_handle(self): if __name__ == "__main__": - if len(sys.argv) < 2: - print(f"Usage: python3 {sys.argv[0]} networkInterface") - sys.exit(-1) print("WARNING: Please ensure there are no obstacles around the robot while running this example.") input("Press Enter to continue...") - - ChannelFactoryInitialize(0, sys.argv[1]) + if len(sys.argv)>1: + ChannelFactoryInitialize(0, sys.argv[1]) + else: + ChannelFactoryInitialize(0) test_option = TestOption(name=None, id=None) user_interface = UserInterface() @@ -100,7 +96,8 @@ def terminal_handle(self): elif test_option.id == 2: sport_client.StandDown() elif test_option.id == 3: - sport_client.Move(0.3,0,0) + ret = sport_client.Move(0.3,0,0) + print("ret: ",ret) elif test_option.id == 4: sport_client.Move(0,0.3,0) elif test_option.id == 5: @@ -108,9 +105,9 @@ def terminal_handle(self): elif test_option.id == 6: sport_client.StopMove() elif test_option.id == 7: - sport_client.SwitchGait(0) - elif test_option.id == 8: - sport_client.SwitchGait(1) + sport_client.HandStand(True) + time.sleep(4) + sport_client.HandStand(False) elif test_option.id == 9: sport_client.BalanceStand() elif test_option.id == 10: @@ -122,13 +119,7 @@ def terminal_handle(self): ret = sport_client.BackFlip() print("ret: ",ret) elif test_option.id == 13: - ret = sport_client.FreeWalk(True) - print("ret: ",ret) - elif test_option.id == 14: - ret = sport_client.FreeBound(True) - print("ret: ",ret) - time.sleep(2) - ret = sport_client.FreeBound(False) + ret = sport_client.FreeWalk() print("ret: ",ret) elif test_option.id == 14: ret = sport_client.FreeBound(True) @@ -142,12 +133,6 @@ def terminal_handle(self): time.sleep(2) ret = sport_client.FreeAvoid(False) print("ret: ",ret) - elif test_option.id == 16: - ret = sport_client.WalkStair(True) - print("ret: ",ret) - time.sleep(10) - ret = sport_client.WalkStair(False) - print("ret: ",ret) elif test_option.id == 17: ret = sport_client.WalkUpright(True) print("ret: ",ret) diff --git a/unitree_sdk2py/go2/sport/sport_api.py b/unitree_sdk2py/go2/sport/sport_api.py index bfca62a5..2cc3cee1 100644 --- a/unitree_sdk2py/go2/sport/sport_api.py +++ b/unitree_sdk2py/go2/sport/sport_api.py @@ -23,46 +23,35 @@ SPORT_API_ID_MOVE = 1008 SPORT_API_ID_SIT = 1009 SPORT_API_ID_RISESIT = 1010 -SPORT_API_ID_SWITCHGAIT = 1011 -SPORT_API_ID_TRIGGER = 1012 -SPORT_API_ID_BODYHEIGHT = 1013 -SPORT_API_ID_FOOTRAISEHEIGHT = 1014 SPORT_API_ID_SPEEDLEVEL = 1015 SPORT_API_ID_HELLO = 1016 SPORT_API_ID_STRETCH = 1017 -SPORT_API_ID_TRAJECTORYFOLLOW = 1018 -SPORT_API_ID_CONTINUOUSGAIT = 1019 SPORT_API_ID_CONTENT = 1020 -SPORT_API_ID_WALLOW = 1021 SPORT_API_ID_DANCE1 = 1022 SPORT_API_ID_DANCE2 = 1023 -SPORT_API_ID_GETBODYHEIGHT = 1024 -SPORT_API_ID_GETFOOTRAISEHEIGHT = 1025 -SPORT_API_ID_GETSPEEDLEVEL = 1026 SPORT_API_ID_SWITCHJOYSTICK = 1027 SPORT_API_ID_POSE = 1028 SPORT_API_ID_SCRAPE = 1029 SPORT_API_ID_FRONTFLIP = 1030 SPORT_API_ID_FRONTJUMP = 1031 SPORT_API_ID_FRONTPOUNCE = 1032 -SPORT_API_ID_WIGGLEHIPS = 1033 -SPORT_API_ID_GETSTATE = 1034 -SPORT_API_ID_ECONOMICGAIT = 1035 SPORT_API_ID_HEART = 1036 -ROBOT_SPORT_API_ID_DANCE3 = 1037 -ROBOT_SPORT_API_ID_DANCE4 = 1038 -ROBOT_SPORT_API_ID_HOPSPINLEFT = 1039 -ROBOT_SPORT_API_ID_HOPSPINRIGHT = 1040 - -ROBOT_SPORT_API_ID_LEFTFLIP = 1042 -ROBOT_SPORT_API_ID_BACKFLIP = 1044 -ROBOT_SPORT_API_ID_FREEWALK = 1045 -ROBOT_SPORT_API_ID_FREEBOUND = 1046 -ROBOT_SPORT_API_ID_FREEJUMP = 1047 -ROBOT_SPORT_API_ID_FREEAVOID = 1048 -ROBOT_SPORT_API_ID_WALKSTAIR = 1049 -ROBOT_SPORT_API_ID_WALKUPRIGHT = 1050 -ROBOT_SPORT_API_ID_CROSSSTEP = 1051 +SPORT_API_ID_STATICWALK = 1061 +SPORT_API_ID_TROTRUN = 1062 +SPORT_API_ID_ECONOMICGAIT = 1063 +SPORT_API_ID_LEFTFLIP = 2041 +SPORT_API_ID_BACKFLIP = 2043 +SPORT_API_ID_HANDSTAND = 2044 +SPORT_API_ID_FREEWALK = 2045 +SPORT_API_ID_FREEBOUND = 2046 +SPORT_API_ID_FREEJUMP = 2047 +SPORT_API_ID_FREEAVOID = 2048 +SPORT_API_ID_CLASSICWALK = 2049 +SPORT_API_ID_WALKUPRIGHT = 2050 +SPORT_API_ID_CROSSSTEP = 2051 +SPORT_API_ID_AUTORECOVERY_SET = 2054 +SPORT_API_ID_AUTORECOVERY_GET = 2055 +SPORT_API_ID_SWITCHAVOIDMODE = 2058 """ " error code diff --git a/unitree_sdk2py/go2/sport/sport_client.py b/unitree_sdk2py/go2/sport/sport_client.py index d058e515..2675ab26 100644 --- a/unitree_sdk2py/go2/sport/sport_client.py +++ b/unitree_sdk2py/go2/sport/sport_client.py @@ -36,52 +36,45 @@ def Init(self): self._SetApiVerson(SPORT_API_VERSION) # regist api - self._RegistApi(SPORT_API_ID_DAMP, 0) - self._RegistApi(SPORT_API_ID_BALANCESTAND, 0) - self._RegistApi(SPORT_API_ID_STOPMOVE, 0) - self._RegistApi(SPORT_API_ID_STANDUP, 0) - self._RegistApi(SPORT_API_ID_STANDDOWN, 0) - self._RegistApi(SPORT_API_ID_RECOVERYSTAND, 0) - self._RegistApi(SPORT_API_ID_EULER, 0) - self._RegistApi(SPORT_API_ID_MOVE, 0) - self._RegistApi(SPORT_API_ID_SIT, 0) - self._RegistApi(SPORT_API_ID_RISESIT, 0) - self._RegistApi(SPORT_API_ID_SWITCHGAIT, 0) - self._RegistApi(SPORT_API_ID_TRIGGER, 0) - self._RegistApi(SPORT_API_ID_BODYHEIGHT, 0) - self._RegistApi(SPORT_API_ID_FOOTRAISEHEIGHT, 0) - self._RegistApi(SPORT_API_ID_SPEEDLEVEL, 0) - self._RegistApi(SPORT_API_ID_HELLO, 0) - self._RegistApi(SPORT_API_ID_STRETCH, 0) - self._RegistApi(SPORT_API_ID_TRAJECTORYFOLLOW, 0) - self._RegistApi(SPORT_API_ID_CONTINUOUSGAIT, 0) - # self._RegistApi(SPORT_API_ID_CONTENT, 0) - self._RegistApi(SPORT_API_ID_WALLOW, 0) - self._RegistApi(SPORT_API_ID_DANCE1, 0) - self._RegistApi(SPORT_API_ID_DANCE2, 0) - # self._RegistApi(SPORT_API_ID_GETBODYHEIGHT, 0) - # self._RegistApi(SPORT_API_ID_GETFOOTRAISEHEIGHT, 0) - # self._RegistApi(SPORT_API_ID_GETSPEEDLEVEL, 0) - self._RegistApi(SPORT_API_ID_SWITCHJOYSTICK, 0) - self._RegistApi(SPORT_API_ID_POSE, 0) - self._RegistApi(SPORT_API_ID_SCRAPE, 0) - self._RegistApi(SPORT_API_ID_FRONTFLIP, 0) - self._RegistApi(SPORT_API_ID_FRONTJUMP, 0) - self._RegistApi(SPORT_API_ID_FRONTPOUNCE, 0) - self._RegistApi(SPORT_API_ID_WIGGLEHIPS, 0) - self._RegistApi(SPORT_API_ID_GETSTATE, 0) - self._RegistApi(SPORT_API_ID_ECONOMICGAIT, 0) - self._RegistApi(SPORT_API_ID_HEART, 0) - - self._RegistApi(ROBOT_SPORT_API_ID_LEFTFLIP, 0) - self._RegistApi(ROBOT_SPORT_API_ID_BACKFLIP, 0) - self._RegistApi(ROBOT_SPORT_API_ID_FREEWALK, 0) - self._RegistApi(ROBOT_SPORT_API_ID_FREEBOUND, 0) - self._RegistApi(ROBOT_SPORT_API_ID_FREEJUMP, 0) - self._RegistApi(ROBOT_SPORT_API_ID_FREEAVOID, 0) - self._RegistApi(ROBOT_SPORT_API_ID_WALKSTAIR, 0) - self._RegistApi(ROBOT_SPORT_API_ID_WALKUPRIGHT, 0) - self._RegistApi(ROBOT_SPORT_API_ID_CROSSSTEP, 0) + self._RegistApi(SPORT_API_ID_DAMP, 0) # Damp + self._RegistApi(SPORT_API_ID_BALANCESTAND, 0) # BalanceStand + self._RegistApi(SPORT_API_ID_STOPMOVE, 0) # StopMove + self._RegistApi(SPORT_API_ID_STANDUP, 0) # StandUp + self._RegistApi(SPORT_API_ID_STANDDOWN, 0) # StandDown + self._RegistApi(SPORT_API_ID_RECOVERYSTAND, 0) # RecoveryStand + self._RegistApi(SPORT_API_ID_EULER, 0) # Euler + self._RegistApi(SPORT_API_ID_MOVE, 0) # Move + self._RegistApi(SPORT_API_ID_SIT, 0) # Sit + self._RegistApi(SPORT_API_ID_RISESIT, 0) # RiseSit + self._RegistApi(SPORT_API_ID_SPEEDLEVEL, 0) # SpeedLevel + self._RegistApi(SPORT_API_ID_HELLO, 0) # Hello + self._RegistApi(SPORT_API_ID_STRETCH, 0) # Stretch + self._RegistApi(SPORT_API_ID_CONTENT, 0) # Content + self._RegistApi(SPORT_API_ID_DANCE1, 0) # Dance1 + self._RegistApi(SPORT_API_ID_DANCE2, 0) # Dance2 + self._RegistApi(SPORT_API_ID_SWITCHJOYSTICK, 0) # SwitchJoystick + self._RegistApi(SPORT_API_ID_POSE, 0) # Pose + self._RegistApi(SPORT_API_ID_SCRAPE, 0) # Scrape + self._RegistApi(SPORT_API_ID_FRONTFLIP, 0) # FrontFlip + self._RegistApi(SPORT_API_ID_FRONTJUMP, 0) # FrontJump + self._RegistApi(SPORT_API_ID_FRONTPOUNCE, 0) # FrontPounce + self._RegistApi(SPORT_API_ID_HEART, 0) # Heart + self._RegistApi(SPORT_API_ID_STATICWALK, 0) # StaticWalk + self._RegistApi(SPORT_API_ID_TROTRUN, 0) # TrotRun + self._RegistApi(SPORT_API_ID_ECONOMICGAIT, 0) # EconomicGait + self._RegistApi(SPORT_API_ID_LEFTFLIP, 0) # LeftFlip + self._RegistApi(SPORT_API_ID_BACKFLIP, 0) # BackFlip + self._RegistApi(SPORT_API_ID_HANDSTAND, 0) # HandStand + self._RegistApi(SPORT_API_ID_FREEWALK, 0) # FreeWalk + self._RegistApi(SPORT_API_ID_FREEBOUND, 0) # FreeBound + self._RegistApi(SPORT_API_ID_FREEJUMP, 0) # FreeJump + self._RegistApi(SPORT_API_ID_FREEAVOID, 0) # FreeAvoid + self._RegistApi(SPORT_API_ID_CLASSICWALK, 0) # ClassicWalk + self._RegistApi(SPORT_API_ID_WALKUPRIGHT, 0) # WalkUpright + self._RegistApi(SPORT_API_ID_CROSSSTEP, 0) # CrossStep + self._RegistApi(SPORT_API_ID_AUTORECOVERY_SET, 0) # AutoRecoverySet + self._RegistApi(SPORT_API_ID_AUTORECOVERY_GET, 0) # AutoRecoveryGet + self._RegistApi(SPORT_API_ID_SWITCHAVOIDMODE, 0) # SwitchAvoidMode # 1001 def Damp(self): @@ -159,37 +152,6 @@ def RiseSit(self): code, data = self._Call(SPORT_API_ID_RISESIT, parameter) return code - # 1011 - def SwitchGait(self, t: int): - p = {} - p["data"] = t - parameter = json.dumps(p) - code, data = self._Call(SPORT_API_ID_SWITCHGAIT, parameter) - return code - - # 1012 - def Trigger(self): - p = {} - parameter = json.dumps(p) - code, data = self._Call(SPORT_API_ID_TRIGGER, parameter) - return code - - # 1013 - def BodyHeight(self, height: float): - p = {} - p["data"] = height - parameter = json.dumps(p) - code, data = self._Call(SPORT_API_ID_BODYHEIGHT, parameter) - return code - - # 1014 - def FootRaiseHeight(self, height: float): - p = {} - p["data"] = height - parameter = json.dumps(p) - code, data = self._Call(SPORT_API_ID_FOOTRAISEHEIGHT, parameter) - return code - # 1015 def SpeedLevel(self, level: int): p = {} @@ -212,49 +174,11 @@ def Stretch(self): code, data = self._Call(SPORT_API_ID_STRETCH, parameter) return code - # 1018 - def TrajectoryFollow(self, path: list): - l = len(path) - if l != SPORT_PATH_POINT_SIZE: - return SPORT_ERR_CLIENT_POINT_PATH - - path_p = [] - for i in range(l): - point = path[i] - p = {} - p["t_from_start"] = point.timeFromStart - p["x"] = point.x - p["y"] = point.y - p["yaw"] = point.yaw - p["vx"] = point.vx - p["vy"] = point.vy - p["vyaw"] = point.vyaw - path_p.append(p) - - parameter = json.dumps(path_p) - code = self._CallNoReply(SPORT_API_ID_TRAJECTORYFOLLOW, parameter) - return code - - # 1019 - def ContinuousGait(self, flag: int): + # 1020 + def Content(self): p = {} - p["data"] = flag parameter = json.dumps(p) - code, data = self._Call(SPORT_API_ID_CONTINUOUSGAIT, parameter) - return code - - # # 1020 - # def Content(self): - # p = {} - # parameter = json.dumps(p) - # code, data = self._Call(SPORT_API_ID_CONTENT, parameter) - # return code - - # 1021 - def Wallow(self): - p = {} - parameter = json.dumps(p) - code, data = self._Call(SPORT_API_ID_WALLOW, parameter) + code, data = self._Call(SPORT_API_ID_CONTENT, parameter) return code # 1022 @@ -271,33 +195,6 @@ def Dance2(self): code, data = self._Call(SPORT_API_ID_DANCE2, parameter) return code - # 1025 - def GetFootRaiseHeight(self): - p = {} - parameter = json.dumps(p) - - code, data = self._Call(SPORT_API_ID_GETFOOTRAISEHEIGHT, parameter) - - if code == 0: - d = json.loads(data) - return code, d["data"] - else: - return code, None - - - # 1026 - def GetSpeedLevel(self): - p = {} - parameter = json.dumps(p) - - code, data = self._Call(SPORT_API_ID_GETSPEEDLEVEL, parameter) - - if code == 0: - d = json.loads(data) - return code, d["data"] - else: - return code, None - # 1027 def SwitchJoystick(self, on: bool): p = {} @@ -342,30 +239,6 @@ def FrontPounce(self): code, data = self._Call(SPORT_API_ID_FRONTPOUNCE, parameter) return code - # 1033 - def WiggleHips(self): - p = {} - parameter = json.dumps(p) - code, data = self._Call(SPORT_API_ID_WIGGLEHIPS, parameter) - return code - - # 1034 - def GetState(self, keys: list): - parameter = json.dumps(keys) - code, data = self._Call(SPORT_API_ID_GETSTATE, parameter) - if code == 0: - return code, json.loads(data) - else: - return code, None - - # 1035 - def EconomicGait(self, flag: bool): - p = {} - p["data"] = flag - parameter = json.dumps(p) - code, data = self._Call(SPORT_API_ID_ECONOMICGAIT, parameter) - return code - # 1036 def Heart(self): p = {} @@ -373,74 +246,118 @@ def Heart(self): code, data = self._Call(SPORT_API_ID_HEART, parameter) return code - # 1042 + # 2041 def LeftFlip(self): p = {} - p["data"] = True parameter = json.dumps(p) - code, data = self._Call(ROBOT_SPORT_API_ID_LEFTFLIP, parameter) + code, data = self._Call(SPORT_API_ID_LEFTFLIP, parameter) return code - # 1044 + # 2043 def BackFlip(self): p = {} - p["data"] = True parameter = json.dumps(p) - code, data = self._Call(ROBOT_SPORT_API_ID_BACKFLIP, parameter) + code, data = self._Call(SPORT_API_ID_BACKFLIP, parameter) return code - # 1045 - def FreeWalk(self, flag: bool): + # 2045 + def FreeWalk(self): p = {} - p["data"] = True parameter = json.dumps(p) - code, data = self._Call(ROBOT_SPORT_API_ID_FREEWALK, parameter) + code, data = self._Call(SPORT_API_ID_FREEWALK, parameter) return code - # 1046 + # 2046 def FreeBound(self, flag: bool): p = {} p["data"] = flag parameter = json.dumps(p) - code, data = self._Call(ROBOT_SPORT_API_ID_FREEBOUND, parameter) + code, data = self._Call(SPORT_API_ID_FREEBOUND, parameter) return code - # 1047 + # 2047 def FreeJump(self, flag: bool): p = {} p["data"] = flag parameter = json.dumps(p) - code, data = self._Call(ROBOT_SPORT_API_ID_FREEJUMP, parameter) + code, data = self._Call(SPORT_API_ID_FREEJUMP, parameter) return code - # 1048 + # 2048 def FreeAvoid(self, flag: bool): p = {} p["data"] = flag parameter = json.dumps(p) - code, data = self._Call(ROBOT_SPORT_API_ID_FREEAVOID, parameter) + code, data = self._Call(SPORT_API_ID_FREEAVOID, parameter) + return code + + # 2050 + def WalkUpright(self, flag: bool): + p = {} + p["data"] = flag + parameter = json.dumps(p) + code, data = self._Call(SPORT_API_ID_WALKUPRIGHT, parameter) return code - # 1049 - def WalkStair(self, flag: bool): + # 2051 + def CrossStep(self, flag: bool): p = {} p["data"] = flag parameter = json.dumps(p) - code, data = self._Call(ROBOT_SPORT_API_ID_WALKSTAIR, parameter) + code, data = self._Call(SPORT_API_ID_CROSSSTEP, parameter) return code - # 1050 - def WalkUpright(self, flag: bool): + # 1061 + def StaticWalk(self): + p = {} + parameter = json.dumps(p) + code, data = self._Call(SPORT_API_ID_STATICWALK, parameter) + return code + + # 1062 + def TrotRun(self): p = {} - p["data"] = flag parameter = json.dumps(p) - code, data = self._Call(ROBOT_SPORT_API_ID_WALKUPRIGHT, parameter) + code, data = self._Call(SPORT_API_ID_TROTRUN, parameter) return code - # 1051 - def CrossStep(self, flag: bool): + # 2044 + def HandStand(self, flag: bool): + p = {} + p["data"] = flag + parameter = json.dumps(p) + code, data = self._Call(SPORT_API_ID_HANDSTAND, parameter) + return code + # 2049 + def ClassicWalk(self, flag: bool): p = {} p["data"] = flag parameter = json.dumps(p) - code, data = self._Call(ROBOT_SPORT_API_ID_CROSSSTEP, parameter) - return code \ No newline at end of file + code, data = self._Call(SPORT_API_ID_CLASSICWALK, parameter) + return code + + # 2054 + def AutoRecoverySet(self, enabled: bool): + p = {} + p["data"] = enabled + parameter = json.dumps(p) + code, data = self._Call(SPORT_API_ID_AUTORECOVERY_SET, parameter) + return code + + # 2055 + def AutoRecoveryGet(self): + p = {} + parameter = json.dumps(p) + code, data = self._Call(SPORT_API_ID_AUTORECOVERY_GET, parameter) + if code == 0: + d = json.loads(data) + return code, d["data"] + else: + return code, None + + # 2058 + def SwitchAvoidMode(self): + p = {} + parameter = json.dumps(p) + code, data = self._Call(SPORT_API_ID_SWITCHAVOIDMODE, parameter) + return code