diff --git a/README.md b/README.md index 3428981..b853957 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,10 @@ The TeleVuer library is a specialized version of the Vuer library, designed to e Currently, this module serves as a core component of the [xr_teleoperate](https://github.com/unitreerobotics/xr_teleoperate) library, offering advanced functionality for teleoperation tasks. It supports various XR devices, including Apple Vision Pro, Meta Quest3, Pico 4 Ultra Enterprise etc., ensuring compatibility and ease of use for robotic teleoperation applications. ## Release Note +V3.0 brings updates: +1. Added `pass_through` interface to enable/disable the pass-through mode. +2. Support `webrtc` interface to enable/disable the webrtc streaming mode. +3. Use `render_to_xr` method (adjust from `set_display_image`) to send images to XR device. V2.0 brings updates: @@ -15,6 +19,14 @@ V2.0 brings updates: 5. Streamlined the data structure: removed the nested `TeleStateData` and return everything in the unified `TeleData`. 6. Added new image-transport interfaces such as `set_display_image`. +## Diagram + +

+ + Diagram + +

+ ## Install ```bash @@ -33,7 +45,7 @@ python _test_tv_wrapper.py # First, use Apple Vision Pro or Pico 4 Ultra Enterprise to connect to the same Wi-Fi network as your computer. # Next, open safari / pico browser, enter https://host machine's ip:8012/?ws=wss://host machine's ip:8012 # for example, https://192.168.123.2:8012?ws=wss://192.168.123.2:8012 -# Use the appropriate method (hand gesture or controller) to click the "Virtual Reality" button in the bottom-left corner of the screen. +# Use the appropriate method (hand gesture or controller) to click the "pass-through" button in the bottom-left corner of the screen. # Press Enter in the terminal to launch the program. ``` diff --git a/test/_test_televuer.py b/test/_test_televuer.py index 7527ae7..14d23ee 100644 --- a/test/_test_televuer.py +++ b/test/_test_televuer.py @@ -6,38 +6,19 @@ if project_root not in sys.path: import time from televuer import TeleVuer -# image client. if you want to test with real image stream, -# please copy image_client.py and messaging.py from xr_teleoperate/teleop/image_server to the current directory before running this test script -# from image_client import ImageClient import logging_mp logger_mp = logging_mp.get_logger(__name__, level=logging_mp.INFO) def run_test_TeleVuer(): - head_binocular = True - head_img_shape = (480, 1280, 3) # default image - - # img_client = ImageClient(host="127.0.0.1") # 127.0.0.1 is localhost, 192.168.123.164 is unitree robot's host ip - # if not img_client.has_head_cam(): - # logger_mp.error("Head camera is required. Please enable head camera on the image server side.") - # head_img_shape = img_client.get_head_shape() - # head_binocular = img_client.is_binocular() - # xr-mode use_hand_track = True - use_image = True - webrtc = True - tv = TeleVuer(binocular = head_binocular, use_hand_tracking = use_hand_track, img_shape = head_img_shape, - use_image=use_image, webrtc=webrtc) + tv = TeleVuer(use_hand_tracking = use_hand_track, pass_through=True) try: input("Press Enter to start TeleVuer test...") running = True while running: start_time = time.time() - # image client - # head_img, head_img_fps = img_client.get_head_frame() - # tv.set_display_image(head_img) - logger_mp.info("=" * 80) logger_mp.info("Common Data (always available):") logger_mp.info(f"head_pose shape: {tv.head_pose.shape}\n{tv.head_pose}\n") @@ -89,7 +70,6 @@ def run_test_TeleVuer(): logger_mp.warning("KeyboardInterrupt, exiting program...") finally: tv.close() - # img_client.close() logger_mp.warning("Finally, exiting program...") exit(0) diff --git a/test/_test_tv_wrapper.py b/test/_test_tv_wrapper.py index 7bc2dba..bd9d990 100644 --- a/test/_test_tv_wrapper.py +++ b/test/_test_tv_wrapper.py @@ -6,40 +6,29 @@ if project_root not in sys.path: import time from televuer import TeleVuerWrapper -# image client. if you want to test with real image stream, -# please copy image_client.py and messaging.py from xr_teleoperate/teleop/image_server to the current directory before running this test script -# from image_client import ImageClient import logging_mp logger_mp = logging_mp.get_logger(__name__, level=logging_mp.INFO) def run_test_tv_wrapper(): - head_binocular = True - head_img_shape = (480, 1280, 3) # default image shape - - # img_client = ImageClient(host="127.0.0.1") # 127.0.0.1 is localhost, 192.168.123.164 is unitree robot's host ip - # if not img_client.has_head_cam(): - # logger_mp.error("Head camera is required. Please enable head camera on the image server side.") - # head_img_shape = img_client.get_head_shape() - # head_binocular = img_client.is_binocular() - # xr-mode use_hand_track=False - use_image=True - webrtc=True - tv_wrapper = TeleVuerWrapper(binocular=head_binocular, use_hand_tracking=use_hand_track, img_shape=head_img_shape, return_hand_rot_data = True, - use_image=use_image, webrtc=webrtc) + tv_wrapper = TeleVuerWrapper(use_hand_tracking=use_hand_track, pass_through=True, return_hand_rot_data=False, + # binocular=False, img_shape=(480, 1280, 3), + # webrtc=False, webrtc_url="https://127.0.0.1:60001/offer" + ) try: input("Press Enter to start tv_wrapper test...") running = True while running: start_time = time.time() - # image client - # head_img, head_img_fps = img_client.get_head_frame() - # tv_wrapper.set_display_image(head_img) logger_mp.info("---- TV Wrapper TeleData ----") teleData = tv_wrapper.get_tele_data() + # import cv2 + # img = cv2.videoCapture(0).read()[1] + # tv_wrapper.render_to_xr(img) + logger_mp.info("-------------------=== TeleData Snapshot ===-------------------") logger_mp.info(f"[Head Pose]:\n{teleData.head_pose}") logger_mp.info(f"[Left Wrist Pose]:\n{teleData.left_wrist_pose}") @@ -82,7 +71,6 @@ def run_test_tv_wrapper(): logger_mp.warning("KeyboardInterrupt, exiting program...") finally: tv_wrapper.close() - # img_client.close() logger_mp.warning("Finally, exiting program...") exit(0)