• G1 常見問題(圖文版)

    🤖 G1 常見問題(134 篇)

    頂部搜索框實時過濾。。。

    導航問題列表

      Q

      Dex3三指靈巧手版本判斷與設置

      前情提要

      請注意,,,,您需要先將固件與APP更新到最新版本,,才能自行設置Dex3的版本。。否則,,,,請在客戶服務中心提交工單,,與技術支持溝通該問題。。。

      本文檔僅適用於Dex3三指靈巧手,,,要獲取Inspire等第三方靈巧手的相關支持,,請參閱靈巧手廠商的官方文檔。。

      何種情況需要進行設置

      首次收到您的Dex3-1 三指靈巧手並安裝後,,,Dex3在開機時會進行一次自我標定。。。所以在開機前,,請您給Dex3留出一定的空間活動,,,,否則會影響本次開機期間手指的性能表現。。。

      當Dex3的設置正確時,,,將會以以下方式進標定。。。。(數據更新至2025年7月4日)

      在一些舊固件版本,,標定動作也可能會有些許不同。。。。但無論如何,,,,若設置正確,,則標定的最後一個動作為:

      State

      如果不是,,,,則建議您檢查一下Dex3的版本。。。

      版本一覽與判斷方法

      要判斷Dex3的版本,,,需要您確認Dex3手指指根部的刻字。。刻字位置指示:

      版本 刻字 備注
      108減速比舊款 通過App內有無力矩數據判斷有無觸覺
      108減速比,,,無觸覺 L/R
      108減速比,,有觸覺 L-T/R-T
      214減速比,,,,無觸覺 L214/R214
      214減速比,,,有觸覺 L214-T/R214-T

      (以上數據更新至2025年7月4日)

      以下是一些示例:

      一、、、、108減速比無觸覺

      二、、、、214減速比有觸覺

      請注意:單個機器人上只能運行一個版本的靈巧手,,,,如您發現您的靈巧手版本不一致,,,請在客戶服務平台提交工單,,,,聯系技術支持。。

      如何設置靈巧手版本

      打開您的Unitre Explorer App,,,選擇“設備”。。

      選擇“數據”

      選擇“機器人”

      向下滑動,,,找到“靈巧手硬件版本”

      選擇合適的版本。。。。要驗證效果,,,您需要重啟機器,,,查看開機自動標定動作的執行效果。。。

      來源文件:DEV_G1_Dex3三指靈巧手版本判斷與設置.md
      Q

      G1WiFi網卡被RF-kill鎖定

      RF-Kill導致無法啟用WiFi網卡

      當您使用:

      sudo ifconfig wlan0 up
      

      可能會遇到如下錯誤提示: SIOCSIFFLAGS: Operation not possible due to RF-kill

      若遇到此問題,,,,需要解鎖wifi網卡。。。。使用此命令:

      sudo rfkill unblock wifi
      
      來源文件:DEV_G1_G1WiFi網卡被RF-kill鎖定.md
      Q

      G1 D435i 提示流已被占用應如何解決

      原因

      若 realsense-viewer 或者 librealsense2 提示相機的 frame 被占用了的原因是 Unitree Explore APP 中的第一人稱畫面流將 D435i 相機的畫面占用。。

      解決方法

      開發者需要獲取 D435i 的圖像流需要將第一人稱取流程序服務關閉。。。 使用下面的命令查看當前取流服務的狀態

      ps -ef | grep "master_service" | grep -v grep
      

      在終端中運行之後,,,應該會輸出類似下面的預期畫面。。。。 這個表明上面的查找命令找到了 master_service 服務並且服務正在運行。。。。 開發者需要停止這個服務運行,,才能正常開發 D435i 相機,,,,這個有兩種方法。。

      方法一

      使用命令停止該服務並不允許開機自動運行。。

      # 停止正在運行的取流
      sudo systemctl stop master_service
      
      # 禁止取流服務開機自啟
      sudo systemctl disable master_service
      
      # 查看服務狀態
      sudo systemctl status master_service
      
      # 查看該服務狀態應該會顯示狀態為DISABLE
      

      這樣就可以關閉第一人稱畫面的取流服務。。。

      方法二

      可以直接將取流服務的程序移動到不同的目錄位置。。。令程序無法正常啟動。。

      sudo mv /unitree/module/video_hub_pc4 ~/
      

      用以上兩種方法避免 D435i 相機的占用即可。。。。

      來源文件:DEV_G1_G1_D435i_提示流已被占用應如何解決.md
      Q

      G1 D435i相機使用

      D435i相機

      G1 機器人深度相機位於機器人眼睛位置,,,,型號為 intel realsense D435i。。 相機包含雙目紅外相機(global shutter)、、、激光發射器、、、RGB相機(rolling shutter)、、、、6軸imu。。。可以提供ir、、rgb、、、、depth格式的圖像以及imu姿態數據。。。 D435i相機是一個 USB 相機,,,通過 USB 數據線進行數據傳輸,,因此 D435i 相機接在哪個設備上就需要在該設備上獲取相機數據,,無法實現跨設備獲取數據。。。 產品規格信息:

      D435i 與 G1 的旋轉變換

      D435i相機在 G1 上是斜向下安裝的,,,相機坐標系相對於機器人坐標的位置關系(0.0576235 0.01753 0.41987),,,Realsense D435i 相機 pitch軸傾角是47.5°(單位:度),,,,yaw軸和roll軸無傾斜。。。

      使用 Realsen Viewer 上位機查看圖像(個人 PC Windows 推薦)

      使用個人 PC 配合上位機獲取圖像。。。直接在這個鏈接里面下載Realsense Viewer 下載 RealSense.Viewer.exe 下載完成之後進行安裝之後,,,,桌面上就會出現 Realsense Viewer 的圖標。。。。 雙擊打開 Realsense Viewer,,將 G1 後肩部的深度相機 typec 數據線接到後頸部接口上。。。。在 Realsense Viewer 中將 RGB 開關打開即可獲取到相機圖像。。。

      使用 librealsense2 配合示例程序獲取圖像 (G1 PC2)

      安裝 librealsense2

      不要使用 2.50.0 版本以上的 librealsense2 這個版本使用了 fastcdr 和 fastrtps 依賴,,會導致編譯不通過。。。。

      相機 SDK 倉庫: 進入 SDK 倉庫下載項目代碼 下載後將項目代碼放入 G1 PC2 中,,,進行解壓。。。解壓完成之後,,進入文件夾中。。 右鍵在此目錄打開終端,,,使用 CMake 編譯這個項目,,步驟可以參考下面的內容

      mkdir build && cd build
      
      cmake ..
      
      cmake --build .
      

      librealsense2在編譯過程中需要網絡下載相關依賴,,,,建議給設備配置網絡。。。。

      使用樣例程序獲取圖像

      編譯 sdk 之後可以使用中的程序配合 librealsense2 進行使用。。。需要編寫一個 CMakeLists.txt 文件,,,將樣例程序進行編譯。。。

      使用示例程序需要 OpenCV 依賴,,關於 OpenCV 的安裝這里不再贅述,,,,可以參考網上教程。。。

      先創建一個如圖所示的文件夾以及文件 CMakeLists.txt 文件可以參考以下內容

      cmake_minimum_required(VERSION 3.1.0)
      
      project(get_camera_imu_stream_test)
      
      
      set(CMAKE_BUILD_TYPE Release)
      set(CMAKE_CXX_FLAGS_RELEASE "-O3 -w")
      set(CMAKE_C_FLAGS_RELEASE "-O3 -w")
      
      # Find librealsense2 installed package
      find_package(realsense2 REQUIRED)
      find_package(OpenCV REQUIRED)
      
      # Enable C++11
      set(CMAKE_CXX_STANDARD 11)
      set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
      
      # Add the application sources to the target
      add_executable(${PROJECT_NAME} test.cpp)
      
      # Link librealsense2 to the target
      target_link_libraries(${PROJECT_NAME} ${realsense2_LIBRARY} ${OpenCV_LIBS})
      

      編寫完成之後創建一個 build 文件夾,,,使用以下命令進行編譯並運行。。

      cd build
      
      cmake ..
      
      make -j6
      
      ./GetImage
      

      一切正常並成功運行之後,,,可以看到類似下面效果的視頻流彈出。。。。

      來源文件:DEV_G1_G1_D435i相機使用.md
      Q

      G1 EDU 調試線故障解決方法

      問題現象

      G1 在開發時無法將控制指令發送至機器人或者無法收到機器人發出的數據信息。。。。但可以通過 SSH 登錄至 PC2。。通過 Ping 指令也無法 Ping 通 192.168.123.161,,但可以 Ping 通 192.168.123.164。。。。機器人也可以正常的開機,,,正常進入運控進行行走。。。。

      問題原因

      通過以上現象可以確定 PC2 是正常的,,,但沒法和 PC1 正常通訊且無法獲取 PC1 發送過來的信息。。這個大概率是 PC1 和 PC2 通訊的 8Pin 調試線有異常。。。。如下圖框出處的調試線。。。

      解決方法

      可以拆開 G1 機器人背板後,,,檢查這個調試線是否接緊。。可以嘗試重新拔插之後,,看問題現象是否依舊。。若問題依然存在,,,可以通過售後工單平台聯系技術支持進行處理。。。

      在拆解機器人背板或者拔插調試線時,,不要帶電操作!!!!!!!!

      來源文件:DEV_G1_G1_EDU_調試線故障解決方法.md
      Q

      G1 IMU 標定

      如何標定G1的IMU? 您需要先把機器人掛起來。。。。 然後找到一個水平儀,,,如下圖所示進行放置。。。。 建議兩人合作標定 IMU,,,一人將機器人垂直懸掛在支架上(檢查水平儀的氣泡)。。。另一人可以檢查imu標定界面中“預期數值”和“實際數值”的偏差(如下圖所示)。。。在水平儀調整至水平之後,,,,“預期數值”和“實際數值”的偏差應小於 ±1° 。。

      以上準備就緒後點擊 Unitree-explore 應用程序中的“校準”按鈕。。。。標定過程中不要晃動機器人,,,不要有震動,,,,保證機器人靜置狀態。。。。等待 APP 上提示標定完成即可。。。

      很抱歉,,您需要自行購買水平儀工具。。。

      來源文件:DEV_G1_G1_IMU_標定.md
      Q

      G1 MID360 ROS2使用方法

      下載 Livox ROS2 項目

      開發者點擊進入對應的項目地址。。。。點擊右上角的 Download Zip 下載對應的壓縮包。。。。

      將項目傳輸至機器人內

      通過 ping 命令檢查與機器人的連通是否正常。。。。 檢查連接正常之後,,使用 scp 命令將項目傳入機器人內。。。。

      編譯運行項目

      檢查雷達連通性

      可以使用 ping 命令檢查與雷達 ip 192.168.123.120 是否正常通訊。。 如出現以上輸出,,,則代表和雷達正常連接。。

      編譯項目

      通過 SSH 或者 NoMachine 登錄至機器人上,,,解壓剛剛傳入機器人的 Livox ROS2 驅動。。。。如下圖即為解壓好的 Livox ROS2 驅動。。。 將解壓好的驅動文件夾放入一個工作空間中,,如:"livox_test/src",,,,在此目錄中打開終端,,,,執行以下命令進行項目構建。。。。

      cd livox_test/src/livox_ros_driver2-master
      
      ./build.sh ROS2
      

      如果運行沒有異常可以看到如下類似的輸出。。

      修改配置文件

      打開以下路徑的配置文件"livox_ros_driver2-master/config/MID360_config.json" 將配置文件內容修改為如上圖所示的內容。。。。

      運行項目

      在工作空間中打開一個新的終端,,執行以下命令

      source install/setup.sh
      ros2 launch livox_ros_driver2 msg_MID360_launch.py
      

      運行上面的命令之後,,,,可以看到類似下圖的輸出

      可視化點雲

      在任意目錄的終端中執行 rviz2 運行一個 rviz2 軟件 如上圖,,添加一個點雲可視化。。。 修改話題為livox/cloud,,,fixed_frame為livox,,即可看到雷達點雲輸出。。。。

      來源文件:DEV_G1_G1_MID360_ROS2使用方法.md
      Q

      G1 MID360使用方法

      MID360 雷達 IP

      MID360雷達的 IP 地址為 192.168.123.120。。。使用 RJ45 網線連接G1後肩部的網口之後可以用 ping 命令查看是否成功和雷達連通。。。。

      雷達與機器人的旋轉變換

      MID360 雷達在 G1 上是倒置安裝的,,,雷達坐標系相對於機器人坐標的位置關系(-0.0, 0.0, -0.47618),,Mid-360雷達pitch軸傾角是-2.3°(單位:度),,yaw軸和roll軸無傾斜。。。

      雷達點雲的獲取方式

      目前 G1 在固件 V1.4.6 以上的版本中新增了雷達服務接口。。。對應的服務為 Lidar Driver 這個服務會在 G1 啟動後驅動雷達,,獲取雷達數據並將雷達的點雲數據和 IMU 數據作為 DDS 話題發布出來。。。 對應的點雲話題為rt/utlidar/cloud_livox_mid360,,,輸出頻率10HZ,frame_id為"livox_frame",,輸出頻率約為 10HZ。。。 對應的IMU話題為rt/utlidar/imu_livox_mid360,,,,輸出頻率為200HZ。。。。 lidar_driver服務狀態 MID 360話題名稱 MID 360點雲效果

      Livox官方提供的資料

      雷達詳情頁: 雷達資料頁: 雷達官方 github 地址:

      來源文件:DEV_G1_G1_MID360使用方法.md
      Q

      G1 SDK開發常見錯誤碼合集

      錯誤碼

      在開發 SDK 時,,,如果 API 接口調用出現異常。。。客戶端或服務端會返回一個對應的 4 位數錯誤碼。。。開發者可以根據返回的錯誤碼查詢對應的錯誤原因。。

      G1 機器人 SDK2 錯誤碼對照表

      通用錯誤

      錯誤碼 錯誤描述 錯誤釋義
      3001 未知錯誤 不明錯誤,,,可聯系技術支持排查
      3102 請求發送錯誤 發送指令時出現錯誤
      3103 API 未注冊 當前 SDK 的頭文件沒有定義該 API
      3104 請求超時 請求直至超時沒有收到相應
      3105 請求與響應數據不匹配 API的入參不正確,,,檢查調用的入參
      3106 響應數據無效 相應的數據不符合要求或有異常數據
      3107 租約無效 --
      3201 響應發送錯誤 機器人相應無法發回客戶端
      3202 服務端內部錯誤 機器人本身有異常,,,,無法執行API
      3203 API 在服務端未實現 API 沒有在機器人中有定義
      3204 API 參數錯誤 API 調用的參數錯誤
      3205 請求被拒絕 機器人拒絕調用這個API
      3206 租約無效 --
      3207 租約已存在 --

      手臂動作錯誤

      錯誤碼 錯誤描述 錯誤釋義
      7400 “rt/arm_sdk”被占用 手臂動作話題被占用,,檢查機器人是否在做其他動作
      7401 手臂被舉起 需要執行手臂放下指令,,,,恢覆位置
      7402 錯誤的手臂動作 ID 這個動作ID沒有定義,,,,檢查動作ID是否正確
      7404 錯誤的運控 ID 機器人的狀態錯誤,,檢查機器人是否在運控狀態

      音頻錯誤

      錯誤碼 錯誤描述 錯誤釋義
      100 參數錯誤 檢查調用API時傳入的參數

      運控錯誤

      錯誤碼 錯誤描述 錯誤釋義
      7301 運控狀態不可用 檢查機器人運控服務是否正常
      7302 不正確的fsm id 檢查調用的 fsm id 是否正確
      7303 不正確的task id 檢查調用的 task id 是否正確

      若調用 API 返回 -1 錯誤碼,,,代表 G1 目前的狀態不支持調用該 API 。。

      來源文件:DEV_G1_G1_SDK開發常見錯誤碼合集.md
      Q

      G1 URDF 版本選擇

      G1的URDF模型文件提供在宇樹的GitHub倉庫中,,,,並實時維護中。。具體連接:

      宇樹提供了不同硬件版本(hip關節減速比、、、手腕關節電機類型)、、、是否鎖腰(針對29自由度G1)、、、是否帶靈巧手的URDF文件,,可以根據mode_machine類型選擇,,可以在G1 App中查看設備的機型。。。。具體方法如下:

      1.連接app

      2.查看機器人數據

      App中具體路徑【首頁 - 設備 - 數據 - 機器人】 下滑找到設備類型,,,這里的當前版本的序號即對應的mode_machine類型。。。。

      注: 1.同一台設備,,,鎖定腰部和解鎖腰部,,,設備類型會發生變化,,,根據當前顯示的類型選擇。。。。 2.清單里的機型,,,會根據硬件調整有所增減。。。。

      來源文件:DEV_G1_G1_URDF_版本選擇.md
      Q

      G1 pc2的WiFi網卡不見了怎麼辦????

      執行 ifconfig 查看是否有wlan0這張網卡

      在 G1 的 PC2 里面打開一個終端輸入 ifconfig 查詢網卡信息,,,看終端打印的內容(如下圖所示)是否有包含 wlan0 這張網卡。。如果有這張網卡,,證明G1的網卡是正常可用的。。如果沒有顯示有 wlan0 這張網卡,,,則可以進行下一步。。。

      查找無線網卡的 usb 連接

      在 G1 的 PC2 里面打開一個終端輸入 sudo dmesg | grep -i usb 查詢與 USB 設備相關的系統日志信息。。。開發PC2的無線網卡在內部是以一個 USB 設備連接的,,,因此可以通過這個方法查詢到無線網卡的連接是否正常。。。。一個正常的設備的 USB 連接應該是沒有任何的報錯的(如下圖所示)。。 可以從上圖可見在 USB 日志中 new interface driver rtl8852bu 即為G1 PC2 有線網卡的驅動,,代表有線網卡正常連接。。 異常的 USB 日志可以參考下圖,,,,日志中會有 error 出現並沒有有線網卡驅動的連接提示。。

      重新安裝 rtl8852bu 網卡驅動

      通過上面兩個步驟排查無線網卡沒有正常驅動或連接之後可以嘗試重新安裝 rtl8852bu 網卡的驅動。。。。 點擊此連接進入github中下載無線網卡驅動

      下載完成之後將壓縮包放到 G1 PC2的主目錄中,,然後按下面步驟執行

      #打開終端
      
      cd ~/rtl8852bu-20240418
      
      sudo ./install-driver.sh
      
      #等待執行完成即可
      
      

      上述腳本安裝完成,,,重啟 G1 PC2 之後重覆上面兩個步驟檢查網卡能否正常使用。。。

      如果安裝驅動之後仍舊無法正常使用 wlan0 連接無線網絡,,,,即可判斷 G1 PC2 的無線網卡在硬件上有異常。。。。可以通過工單平台聯系售後工程師進行維修。。。。

      來源文件:DEV_G1_G1_pc2的WiFi網卡不見了怎麼辦_.md
      Q

      G1 固件1.5.3後用程序拉起lidar_driver與unitree_slam服務

      概述

      在 G1 固件更新至v1.5.3版本之後,,,由於為了節省 PC1 資源。。關於 Mid360 雷達和 slam 導航的兩個相關服務,,,unitree_slam 和 lidar_driver 不會在開機默認啟動。。而是保持關閉狀態。。。

      使用 APP 查看服務狀態

      使用 Unitree Explore APP 連接機器人。。。。點擊[設備],,進入設備配置信息查看頁面。。 在配置信息頁面找到左側的運維服務,,,,進入運維服務里面的服務狀態選項。。。。 進入服務狀態即可看到當前設備上運行的所有服務,,,我們要操作的服務是 unitree_slam 和 lidar_driver,,如下圖所示。。 在使用的時候可以手動開啟這兩個服務。。。。

      使用程序啟動 slam 相關服務

      使用到的接口

      使用程序開啟 slam 相關的服務需要使用到的接口為設備狀態服務接口。。。對應的類為RobotStateClient 類,,,,RobotStateClient 是設備狀態服務提供的 Client,,通過 RobotClient 可以方便地通過 RPC 方式實現對 G1 內部的服務控制、、、、獲取服務狀態、、、設備狀態和系統資源使用信息。。。 本接口覆用自B2的設備狀態服務接口。。開發者可以在SDK的以下位置找到相關資源。。。。

      unitree_sdk2\include\unitree\robot\b2\robot_state //C++
      unitree_sdk2py\b2\robot_state #Python
      unitree_ros2\example\src\include\common\ros2_robot_state_client.h //ROS2
      

      在這個類中找到 ServiceSwitch 接口,,,這個 api 填入對應的參數。。即可開關 G1 上對應的服務。。。。這個服務的三個入參分別為要開關的服務名稱,,,需要開啟還是關閉,,,,操作完成之後對應服務的狀態(返回值)。。

      樣例程序

      開發者可以使用以下提供的程序結合 unitree_sdk2 去使用這個 api 接口開關這兩個服務。。。

      #include <chrono>
      #include <iosestream>
      #include <thread>
      
      #include <unitree/robot/channel/channel_publisher.hpp>
      #include <unitree/robot/channel/channel_subscriber.hpp>
      
      #include <unitree/robot/b2/robot_state/robot_state_api.hpp>
      #include <unitree/robot/b2/robot_state/robot_state_client.hpp>
      
      int main(){
          std::string networkInterface = "eth0";//network_interface
          unitree::robot::ChannelFactory::Instance()->Init(0, networkInterface);
      
          unitree::robot::b2::RobotStateClient rs;
          rs.SetTimeout(25.0f);
          rs.Init();
      
          int status1 = 0;
          int status2 = 0;
          int res1 = 0;
          int res2 = 0;
          res1 = rs.ServiceSwitch("lidar_driver", 1, status1);
          usleep(200000);
          res2 = rs.ServiceSwitch("unitree_slam", 1, status2);
          usleep(200000);
      
          std::cout << "lidar_driver api: " << res1 << std::endl;
          std::cout << "unitree_slam api: " << res2 << std::endl;
          std::cout << "lidar_driver status: " << status1 << std::endl;
          std::cout << "unitree_slam status: " << status2 << std::endl;
      
          return 0;
      }
      

      將以上代碼放置至 unitree_sdk2 中進行編譯,,,連接機器人之後運行代碼,,,,運行方法與Go2快速開發中的過程類似。。 Demo程序運行成功之後,,,G1 上的 unitree_slam 和 lidar_driver 服務就會開始運行。。。開發者可以將這個程序作為自啟動程序運行。。達到每次開啟機器人,,服務自動運行的效果。。。

      來源文件:DEV_G1_G1_固件1_5_3後用程序拉起lidar_driver與unitree_slam服務.md
      Q

      G1 如何關閉大模型對答但保留麥克風和揚聲器功能

      chatgo 服務

      宇樹官方的語音助手功能是由 APP 中的 chatgo 服務來提供的。。部分開發用戶有自行開發的大模型問答功能。。不需要使用宇樹官方的大模型問答,,但需要使用 G1 自帶的麥克風和揚聲器功能。。可以將 APP 中的【設備-服務狀態】內的 chatgo 服務關閉即可實現這個功能。。。。

      來源文件:DEV_G1_G1_如何關閉大模型對答但保留麥克風和揚聲器功能.md
      Q

      G1 播放音頻方法

      使用 G1 機載揚聲器進行播放

      若開發者需要使用 G1 機身上搭載的揚聲器進行音頻的播放。。由於開發PC中沒有連接揚聲器,,,G1的揚聲器直連在運控PC1上。。。所以這種方式只有一種實現方式,,,就是通過宇樹提供的 G1 音頻接口進行播放。。 使用 PlayStream API 接口播放音頻需要輸入一段 WAV 格式 采樣率16K 單通道 16bit 的音頻文件進行播放。。。。若需要停止播放可以使用 PlayStop 接口停止音頻的播放。。。

      自行外接揚聲器進行播放

      由於使用機載揚聲器進行音頻播放需要一定的程序編程能力並且對音頻格式有一定要求。。。。開發者可以借助 G1 肩部接口連接一個揚聲器到 G1 上進行播放。。。 用戶在購買揚聲器時可以咨詢賣家此款揚聲器是否支持在 arm64,,,linux20.04系統上使用,,,並且最好購買typec接口的揚聲器。。。。

      來源文件:DEV_G1_G1_播放音頻方法.md
      Q

      G1 更換設備樹方法

      [!WARNING] 以下內容僅適用於 Jetpack 5.1.1 版本 G1 進行使用!!!!!!!!!

      更換設備樹的場景

      這個更換設備樹的方案適用於 USB 接口無法識別為 3.0 時可以嘗試此方法更換設備樹。。。。

      檢查設備版本

      下載檢查版本腳本文件

      首先保存或者下載下方的腳本文件,,,覆制放入 G1 NX(PC2)中。。。。

      #!/bin/bash
      
      # 設置源 DTB 文件路徑和目標目錄
      DTB_SOURCE="/boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb"
      TEMP_DIR="/tmp"
      DTB_FILENAME="kernel_tegra234-p3767-0000-p3768-0000-a0.dtb"
      DTS_FILENAME="output.dts"
      SEARCH_PATTERN="dtbbuildtime"
      
      # 檢查源 DTB 文件是否存在
      if [ ! -f "$DTB_SOURCE" ]; then
        echo "錯誤: 源文件不存在: $DTB_SOURCE" >&2
        exit 1
      fi
      
      # 檢查 dtc 命令是否可用
      if ! command -v dtc &> /dev/null; then
        echo "錯誤: dtc (Device Tree Compiler) 未找到。。。請先安裝 device-tree-compiler 包。。。" >&2
        exit 1
      fi
      
      sudo cp "$DTB_SOURCE" "$TEMP_DIR/"
      
      if [ $? -ne 0 ]; then
        echo "錯誤: 覆制 DTB 文件失敗。。" >&2
        exit 1
      fi
      
      # 運行 dtc 命令,,,,將標準輸出和標準錯誤都重定向到 /dev/null
      sudo dtc -I dtb -O dts -o "$TEMP_DIR/$DTS_FILENAME" "$TEMP_DIR/$DTB_FILENAME" >/dev/null 2>&1
      
      if [ $? -ne 0 ]; then
        echo "Error: decompile DTB error" >&2
        # 清理臨時覆制的 .dtb 文件
        sudo rm -f "$TEMP_DIR/$DTB_FILENAME"
        exit 1
      fi
      
      echo "Searching '$SEARCH_PATTERN'..."
      # 搜索並輸出結果
      sudo grep "$SEARCH_PATTERN" "$TEMP_DIR/$DTS_FILENAME"
      
      if [ $? -ne 0 ]; then
        echo "警告: 在 $TEMP_DIR/$DTS_FILENAME 中未找到模式 '$SEARCH_PATTERN'。。。。"
      fi
      
      echo "Completed. "
      
      

      點此鏈接下載腳本文件:

      在 PC2 中檢查版本

      在 PC2 中放置腳本文件的目錄右鍵打開終端,,執行腳本文件。。

      chmod +x check_dt_version.sh
      ./check_dt_version.sh
      

      執行的效果應該如下: 顯示以上內容表示版本正確。。如果腳本⽆法運⾏或者輸出結果不⼀致,,,則表明軟件版本不對。。。需要進⾏設備樹替換。。

      更換設備樹版本

      先通過如下命令查看/boot/extlinux/extlinux.conf的內容,,,,確保紅⾊箭頭所指內容⼀致。。。 下載下方的設備樹文件 點擊此處下載設備樹文件: 下載完成之後覆制放入 G1 PC2 主目錄下,,,右鍵打開終端,,執行以下命令,,,,更換設備樹文件。。

      sudo cp /boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb /boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb.bk
      sudo rm -rf /boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb
      sudo cp -rf /home/unitree/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb /boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb
      sudo reboot
      
      來源文件:DEV_G1_G1_更換設備樹方法.md
      Q

      G1 獲取電池電量

      電量信息結構體

      G1 機器人提供了電量信息的話題:rt/lf/bmsstate。。。在文檔中心有相關的結構體定義,,,,如下面圖片。。。

      用 ROS2 方式獲取

      按照教程配置ROS2通信之後,,,可以用命令 ROS2 打印電池話題信息。。

      ros2 topic echo /lf/bmsstate
      

      獲取效果如以下圖片:

      使用程序進行獲取

      電池電量可以通過 DDS 訂閱話題 “rt/lf/bmsstate”來實現。。訂閱到數據之後觸發回調函數,,,,打印對應的 BmsState 數據即可。。 Demo 代碼如下:

      #include <unitree/robot/channel/channel_publisher.hpp>
      #include <unitree/robot/channel/channel_subscriber.hpp>
      // DDS
      
      #include <unitree/idl/hg/BmsState_.hpp>
      
      #define TOPIC_BMSSTATE "rt/lf/bmsstate"
      
      using namespace unitree::robot;
      
      void BmsStateMessageHandler(const void* message)
      {
          unitree_hg::msg::dds_::BmsState_ bms_state = *(unitree_hg::msg::dds_::BmsState_*)message;
          std::cout << "Battery Soc:" << bms_state.soc() << std::endl;
          std::cout << "Battery Current:" << bms_state.current() << std::endl;
      }
      
      int main(){
          std::string networkInterface = "eth0";//network_interface
          unitree::robot::ChannelFactory::Instance()->Init(0, networkInterface);
      
          ChannelSubscriber<unitree_hg::msg::dds_::BmsState_> suberlow(TOPIC_BMSSTATE);
          suberlow.InitChannel(BmsStateMessageHandler);
      
          while(1){
              usleep(20000);
          }
      
          return 0;
      }
      

      將以上代碼放置至 unitree_sdk2 中進行編譯,,,,連接機器人之後運行代碼,,運行方法與Go2快速開發中的過程類似。。。。 Demo程序運行成功之後,,,終端會打印獲取到的 G1 當前電流以及當前電量。。。

      來源文件:DEV_G1_G1_獲取電池電量.md
      Q

      G1產品資料&開發資料

      手冊、、、、說明書

      • G1 說明書(App下載頁面最下面):

      • G1 教學視頻(App下載頁面下面):

      • G1 開發文檔:

      • G1 腰部固定件使用說明:

      • G1-Edu 用戶開發單元資料: 開發文檔 - 關於G1 - 電氣接口:

      開發文檔 - 關於G1 - 機載計算機:

      • G1 末端假手、、、、靈巧手拆裝手冊(App下載頁面最下面):

      模型、、圖紙

      • G1 三維簡化模型(開發文檔 - 應用開發 - 獲取SDK):

      • G1 URDF: G1 URDF 版本選擇:

      • G1 機身安裝孔位(開發文檔 - 關於G1 - 安裝孔位):

      • G1 末端圖紙、、、、模型、、、、裝配示意: G1基礎版&標準版末端圖紙: G1進階版末端圖紙: G1旗艦版A&B末端圖紙: G1旗艦版C末端圖紙:

      來源文件:DEV_G1_G1產品資料_開發資料.md
      Q

      G1修改網卡優先級

      問題現象

      很多用戶在使用 G1 的無線網卡成功連接 wifi 無線網絡之後。。。。仍然無法通過連接的 wifi 訪問互聯網。。例如無法正常解析百度的域名,,無法正常訪問網絡。。

      問題原因

      這個大概率是因為機器人上的有線網絡 eth0 網卡的優先級太高了。。。。導致網絡流量會優先流向有線網。。。而 G1 的有線網是無法訪問互聯網的,,導致 G1 在連接 wifi 網絡之後依舊無法上網。。。

      解決辦法

      可以通過調整 G1 PC2 中的網卡網絡優先級來進行解決。。。。 第一步先查看 G1 中兩個的網卡名稱,,,,可以通過以下命令查看

      nmcli connection show
      

      查看的效果如下圖。。。。可以看到 wlan0 和 eth0 兩個網卡。。。。 第二步通過命令設置兩個網卡的優先級

      # 無線網卡:Metric=100
      sudo nmcli connection modify "TP-LINK_402_1" ipv4.route-metric 100
      # 有線網卡:Metric=100
      sudo nmcli connection modify "unitree1" ipv4.route-metric 100
      

      可以由上面命令看出,,,,我們想讓 G1 正常上網,,,可以將兩張網卡的優先級設置為同級,,,,均為 Metric 100 的等級。。 第三步重啟網絡讓配置生效 我們已經修改了網絡的優先級了,,,,此時重啟網絡配置令修改生效即可。。

      sudo nmcli connection down "TP-LINK_402_1" && nmcli connection up "TP-LINK_402_1"
      sudo nmcli connection down "unitree1" && nmcli connection up "unitree1"
      

      !!! 提示 在這一步可能會導致您的連接斷開,,等待 G1 網絡重啟完成之後即可重新連接 !!! 第四步驗證是否已經修改生效

      ip route show default
      

      通過上面的命令可以讀取當前網卡的優先級,,,,如果修改生效了,,則可以看到 wlan0 和 eth0 的優先級是一致的。。

      來源文件:DEV_G1_G1修改網卡優先級.md
      Q

      G1內部設備拓撲圖

      來源文件:DEV_G1_G1內部設備拓撲圖.md
      Q

      G1開發計算單元內置WiFi打開方法

      G1內置的開發計算單元(Orin NX,,,,192.168.123.164)配置了WiFi模塊,,,,但是出廠默認關閉了。。。。如果要使用WiFi模塊,,,需要通過連接顯示器設置一下打開,,,,具體步驟如下:

      連接顯示器

      G1的9號Type-C口具備DP功能,,,,可以連接DP顯示器或者通過轉換器連接HDMI顯示器。。。

      顯示桌面以後,,,輸入密碼進入系統。。。。

      推薦使用綠聯科技,,,CM475 型號 Type-C 轉 HDMI。。。。 務必使用直連顯示器的方式,,,,不要使用NoMachine等遠程桌面,,,權限不夠,,,無法操作。。。

      關閉飛行模式,,,,打開WiFi

      打開系統設置,,選擇WiFi設置,,,先關閉飛行模式(Airplane Mode),,,然後再打開WiFi功能。。。。

      連接搜索到的WiFi,,,連接使用

      正常情況下就可以搜索到附近的WiFi信號了,,選擇對應的,,,輸入密碼即可連接。。

      來源文件:DEV_G1_G1開發計算單元內置WiFi打開方法.md
      Q

      G1的PC2恢覆系統教程

      !!! warning 使用須知 1、、、進行更新前請自行備份PC2中的個人文件 2、、若自己無法操作,,可以提把機器寄回重刷 !!!

      1、、、、下載系統鏡像

      從以下鏈接中下載 g1_nx_Jetpack5.1.1_20250930.img.bz2

      2、、、、拆卸 NVMe 硬盤

      您需要準備以下工具:

      全套六角、、、梅花扳手(螺絲刀批頭也可以)。。NVME M.2硬盤讀卡器/移動硬盤盒(NGFF不可用)。。。。

      1. 擰下後把手部分的兩顆螺絲。。。

      把手1

      把手2

      1. 使用一字螺絲刀或者撬棒從圖示位置輕輕撬開外殼。。。。(四個孔為安裝孔,,內部沒有螺絲。。)

      1. 小心揭下保護泡棉(不要撕破)

      1. 拆卸四顆螺絲,,,,卸下背板。。。。

      1. 取出NVME硬盤。。。

      NVME

      3、、、燒錄系統鏡像

      借助NVMe M.2移動硬盤盒把拆出的硬盤插⼊您的電腦,,確認該NVMe存儲設備的設備節點,,⽐如:/dev/sdc。。。把鏡像燒寫到NVMe存儲設備中,,,執⾏如下命令:

      # 注意:/dev/sdc根據實際情況填寫
      bzip2 -dc g1_nx_Jetpack5.1.1_20250930.img.bz2 | sudo dd of=/dev/sdc status=progress
      

      把燒錄好的NVMe盤裝回到機器人中,,,,即可上電開機使用了。。

      來源文件:DEV_G1_G1的PC2恢覆系統教程.md
      Q

      G1離線語音播報清單

      觸發離線語音 中文語音 English Voice
      急停 急停已觸發,,,請重啟設備恢覆運行。。。。 Emergency estop trigger, please restart to resume.
      下蹲 設備下蹲中,,,請注意安全。。。。 Robot squatting,,,,please be careful.
      起身 設備正在起身,,,,請注意安全。。 Robot rising, please be careful.
      自適應起身 設備正在起身,,請注意安全。。。。 Robot rising, please be careful.
      零力矩模式 零力矩模式。。。。 Zero torque mode.
      阻尼模式 阻尼模式。。。 Damp mode.
      預備模式 預備模式。。 Ready mode.
      調試模式 調試模式。。。。 Development mode.
      走跑運控 已進入走跑模式,,請控制速度,,,注意安全。。。。 Walkrun mode activated, control your speed and stay alert.
      常規運控 已進入常規運控模式,,,,請注意安全。。。。 Rountine control engaged, process with caution.
      舞蹈運控 已進入舞蹈模式,,,,請與機器人保持安全距離 Entering dance mode, please keep a safe distance.
      越障運控 已進入越障模式,,請謹慎操作,,注意安全。。。。 Obstacle negotiation enabled, operate with care.
      格鬥運控 已進入格鬥模式,,,,請與機器人保持安全距離。。。 Combat mode initiated, maintain a safe distance form the robot.
      來源文件:DEV_G1_G1離線語音播報清單.md
      Q

      G1肩部接口參數解析

      電氣接口參數

      G1 的頂部配備了電氣接口,,這些接口用於連接各個機身關節電機、、、、傳感器外設、、、、網口等。。。。這樣的設計使您能夠方便地進行調試、、、排查問題以及進行二次開發。。。。每個接口都有對應的電氣接口參數,,,,用戶在使用的時候需要注意這些電氣參數進行使用,,避免錯接。。。
      序號接口類型接口簡稱接口說明
      1XT30UPB-FVBAT58V/5A 電池電源輸出(此處直連電池電源)
      2XT30UPB-F24V24V/5A電源輸出
      3XT30UPB-F12V12V/5A電源輸出
      4RJ451000 BASE-T千兆以太網
      5RJ451000 BASE-T千兆以太網
      6Type-CType-C支持USB3.0 host,,5V/1.5A電源輸出
      7Type-CType-C支持USB3.0 host,,,,5V/1.5A電源輸出
      8Type-CType-C支持USB3.0 host,,,5V/1.5A電源輸出
      9Type-CAlt Mode Type-C支持USB3.2 host,,支持DP1.4
      10I/OI/O OUT12V: 12V/3A電源輸出

      IO接口電氣參數及功能

      GPIO編號NX引腳號覆用關系debugfs文件系統的引腳名
      GPIO1203UART1_TXDGPIO3_PR.02
      GPIO2205UART1_RXDGPIO3_PR.03
      GPIO3232I2C2_SCLGPIO3_PI.03
      GPIO4234I2C2_SDAGPIO3_PI.04
      GPIO5128GPIOGPIO3_PCC.02
      GPIO6130GPIOGPIO3_PCC.03

      來源文件:DEV_G1_G1肩部接口參數解析.md
      Q

      G1自帶板卡的IP、、用戶名和密碼是多少????

      G1-EDU 機載標配 1 塊【運控計算單元】,,並且標配一塊【開發計算單元】。。

      【運控計算單元】為 Unitree 運動控制程序專用,,不對外開放。。開發者僅可使用【開發計算單元】進行二次開發。。。。

      在開發文檔或者技術支持過程中,,,【運控計算單元】會被表述為PC2,,,,相對的,,,,【運控計算單元】一般表述為PC1。。

      【開發計算單元】,,,地址為 192.168.123.164,,,用戶名:unitree,,,密碼:123。。。。

      ```

      ssh

      ssh unitree@192.168.123.164

      密碼123

      ```

      參數 運控計算單元(PC1) 開發計算單元(PC2)
      型號 不提供 Jetson Orin NX 16G,,,100TOPS
      CPU 8核CPU Arm® Cortex®-A78AE
      顯存 - 16G
      內存 - 16G
      存儲 - 2T
      IP地址 192.168.123.161 192.168.123.164
      用戶名 不開放 unitree
      密碼 不開放 123
      來源文件:DEV_G1_G1自帶板卡的IP_用戶名和密碼是多少_.md
      Q

      G1舞蹈模式背景音樂

      音樂下載:

      !!! note 提示 當您需要在大範圍配合音響演示時,,可以將G1內部的音量調為0%。。。 位置在App-設備-數據-音頻。。。 !!!

      來源文件:DEV_G1_G1舞蹈模式背景音樂.md
      Q

      PC2連接藍牙設備教程

      命令行工具 bluetoothctl 詳解

      bluetoothctl 是 BlueZ 提供的交互式 CLI 工具,,支持設備掃描、、配對、、、信任、、、、連接等全流程操作,,功能強大且穩定。。

      基礎操作步驟:

      1、、、、進入交互模式:

      bluetoothctl
      # 輸出示例:[bluetooth]
      

      2、、、、啟用適配器可見性(設備發現模式):

      [bluetooth]# discoverable on  # 允許其他設備發現本機
      [bluetooth]# pairable on      # 允許配對
      

      3、、、掃描周邊設備:

      [bluetooth]# scan on  # 開始掃描,,,輸出設備 MAC 地址和名稱
      # 示例輸出:[NEW] Device AA:BB:CC:DD:EE:FF 我的藍牙設備
      

      4、、配對設備(需記錄目標設備 MAC 地址,,,如 AA:BB:CC:DD:EE:FF):

      [bluetooth]# pair AA:BB:CC:DD:EE:FF
      # 若設備需要 PIN 碼,,,,按提示輸入(通常為 0000 或 1234,,,,具體參考設備手冊)
      

      5、、、信任設備(避免重覆配對,,,,自動連接):

      [bluetooth]# trust AA:BB:CC:DD:EE:FF
      

      6、、連接設備:

      [bluetooth]# connect AA:BB:CC:DD:EE:FF
      # 成功後輸出:[已連接] 我的藍牙設備
      

      7、、、退出交互模式:

      [bluetooth]# quit
      

      常用命令速查:

      命令 功能
      show 顯示本機藍牙適配器信息
      devices 列出已配對/發現的設備
      remove 刪除已配對設備
      disconnect 斷開與設備的連接
      power on/off 開啟/關閉藍牙適配器

      圖形化工具:Blueman

      對於偏好 GUI 的用戶,,,,Blueman 提供更直觀的操作界面:

      1、、、安裝 Blueman

      sudo apt install blueman
      

      2、、、啟動 Blueman:

      命令行執行 blueman-manager

      3、、、基本操作:

      點擊工具欄的“掃描”按鈕發現設備,,,,右鍵選擇“配對”“信任”“連接”。。。。 音頻設備連接後,,可通過右鍵“音頻配置”切換 A2DP(立體聲)或 HSP(通話)模式。。

      4、、、、高級設置: 在 Blueman 首選項中,,,可配置適配器名稱、、、可見性超時、、自動連接規則等。。

      來源文件:DEV_G1_PC2連接藍牙設備教程.md
      Q

      Unitree G1-NX模塊固件更新方法

      !!! warning 使用須知 1、、、進行更新前請自行備份PC2中的個人文件 2、、、若刷失敗了,,,,可用同樣的方法刷回Jetpack 5.1.1 3、、更新Jetpack固件的問題不在保修範圍內 4、、、提設備維修工單只支持刷回Jetpack 5.1.1,,,,不支持刷其他版本的Jetpack !!!

      1. 所需硬件設備

      1. 安裝有Ubuntu20/22系統的電腦
      2. 一根USB Type-A轉USB Type-C數據線
      3. NVME M.2移動硬盤盒(用於系統燒錄)

      2. 所需文件

      比如需刷 Jetpack 6.2 ,,,,則下載 Jetpack_6.2_nx.tar.bz2 和 g1-nx-j6.2.img.bz2 文件。。

      3. 操作步驟

      3.1 關鍵部件介紹

      ①電源指示燈 ②PWR按鍵 ③REC按鍵 ④燒錄口

      3.2 NX模塊固件更新步驟

      1. 先拆下 NVMe 硬盤
      2. G1上電開機,,,等到電源指示燈三燈常亮
      3. 同時按下 powerrec 鍵,,,持續2秒鐘左右,,此時可以觀察到電源指示燈會從三燈 常亮變為一個指示燈亮或全滅狀態
      4. 松開 power
      5. 等待2秒鐘
      6. 松開 rec

      此時,,,,設備進入燒錄模式,,,將數據線Type-A口連接您的電腦,,Type-C口連接G1的燒錄口。。。

      在您的電腦上新建一個終端,,,輸入 lsusb,,可以看到有 NVIDIA Corp. APX字樣,,如下 所示:

      表明設備已經成功進入燒錄模式。。

      解壓固件包 Jetpack_6.2_nx.tar.bz2 ,,,,進入目錄

      sudo tar -xjvf Jetpack_6.2_nx.tar.bz2
      cd Jetpack_6.2_nx/Linux_for_Tegra
      

      運行以下命令,,,進行固件更新

      sudo ./flash_nx_module.sh
      

      耐心等待8分鐘左右,,,,看到以下信息,,,視為更新成功

      *** The target xxx has been flashed successfully. ***
      Make the target filesystem available to the device and reset the board
      to boot from external nvme0n1p1
      

      此時,,,將燒錄了Unitree Jetpack 6.2鏡像的系統的固態硬盤插⼊G1載板即可啟動系統。。

      !!! note 注意 NX模塊更新完固件後,,,,只能啟動Unitree Jetpack 6.2系統,,如果想再使⽤回Jetpack 5.1.1系統,,,,燒錄Jetpack 5.1.1固件即可。。 !!!

      4. Unitree Jetpack 6.2鏡像燒錄步驟

      找塊空⽩的NVME盤,,插⼊您的電腦(借助NVME M.2移動硬盤盒),,確認該NVME存儲設備的設備節點,,,,⽐如: /dev/sdc,,,如果存儲設備是第⼀次使⽤,,,,需要對該磁盤進⾏格式化,,⽐如格式化為 ext4 ,,,,格式化命令如下:

      # 注意:/dev/sdc根據實際情況填寫
      sudo mkfs -t ext4 /dev/sdc
      

      把鏡像燒寫到NVME存儲設備中,,,,執⾏如下命令:

      # 注意:/dev/sdc根據實際情況填寫
      bzip2 -dc g1-nx-j6.2.img.bz2 | sudo dd of=/dev/sdc status=progress
      

      把燒錄好的NVME盤裝到G1的PC2中,,,,即可上電開機使用了。。。。

      5. 多功能USB type-C不識別USB3.0問題解決方法

      下載最新的設備樹,,拷貝到G1-NX上解壓,,,然後使用如下命令進行設備樹更新:

      sudo cp /boot/dtb/kernel_tegra234-p3768-0000+p3767-0000-nv.dtb /boot/dtb/kernel_tegra234-p3768-0000+p3767-0000-nv.dtb.bk
      
      sudo rm -rf /boot/dtb/kernel_tegra234-p3768-0000+p3767-0000-nv.dtb
      
      # 在解壓後的文件夾下執行以下命令
      sudo cp ./kernel_tegra234-p3768-0000+p3767-0000-nv.dtb /boot/dtb/kernel_tegra234-p3768-0000+p3767-0000-nv.dtb
      
      sudo reboot
      

      更新完成後,,通過如下方式查看當前系統版本:

      unitree@unitree-g1-nx:~$ cat /proc/device-tree/board-version
      g1nx-jetpack6.2-r36.4.3-20251203-v1.0
      

      系統版本顯示為:g1nx-jetpack6.2-r36.4.3-20251203-v1.0, 表示已經更新到最新版本。。。。

      該版本解決了 多功能USB type-C口不識別USB3.0的問題。。。。

      來源文件:DEV_G1_Unitree_G1-NX模塊固件更新方法.md
      Q

      為什麼控制機器人手臂的時候會出現往下掉的現象

      1. 問題描述

      1.1 現象

      在機械臂控制程序中,,,當手臂在A點保持靜止,,然後調用軌跡移動函數進行角度變化時,,,在銜接的瞬間會出現短暫的下垂現象(手臂先向下掉落一段距離,,,,然後才開始按預期軌跡運動)。。

      1.2 覆現條件

      • 使用純PD控制(不帶重力補償)
      • 控制模式從"位置保持"切換到"軌跡跟蹤"
      • 切換過程中控制器狀態被重置或目標位置發生跳變

      2. 根本原因分析

      2.1 純PD控制的特性

      純PD控制器的標準形式為:

      τ = Kp * (θ_des - θ_act) + Kd * (θ̇_des - θ̇_act)
      

      關鍵特性: - 不存在積分項(I),,,無法消除穩態誤差 - 要維持機械臂在懸停位置,,,必須依賴靜態位置誤差 e = θ_des - θ_act - 這個誤差產生的比例力矩 Kp * e 恰好抵消重力矩

      2.2 下垂產生的機理

      在A點靜止時:

      實際位置 θ_act ≈ A - δ    (δ為微小偏差)
      目標位置 θ_des = A
      位置誤差 e = A - (A - δ) = δ
      輸出力矩 τ = Kp * δ  (剛好抵消重力)
      

      切換到軌跡移動時(問題代碼):

      self.low_cmd.motor_cmd[joint].q = (1.0 - ratio) * self.low_state.motor_state[joint].q
      # Stage 1將目標位置逐漸拉向0,,,,導致誤差歸零
      

      切換瞬間: 1. 指令位置發生跳變或重置 2. 位置誤差 e 突然減小或歸零 3. 輸出力矩 τ 瞬間下降 4. 手臂失去支撐力矩 → 下垂 5. 控制器檢測到新誤差 → 恢覆力矩 → 開始跟蹤軌跡


      3. 解決方案

      原理: 保持指令位置連續。。。在任何時候,,發送給電機的目標位置必須是連續的,,不能有跳變。。。。

      說明: initial_pos 零位 current_pos 從lowstate話題消息中讀取的當前關節位置 target_pos 目標位置

      Python實現:

      def LowCmdWrite(self):
          self.time_ += self.control_dt_
      
          # 錯誤做法:不要這樣
          # self.low_cmd.motor_cmd[joint].q = (1.0 - ratio) * current_pos
      
          # 正確做法:直接從初始位置插值到目標
          if self.time_ < self.duration_ * 2:
              for i, joint in enumerate(self.arm_joints):
                  ratio = np.clip(self.time_ / (self.duration_ * 2), 0.0, 1.0)
                  # 從初始位置平滑過渡到目標位置
                  self.low_cmd.motor_cmd[joint].q = (
                      (1.0 - ratio) * self.target_pos_1[i] +
                      ratio * self.target_pos_2[i]
                  )
                  self.low_cmd.motor_cmd[joint].dq = 0.0
                  self.low_cmd.motor_cmd[joint].kp = self.kp
                  self.low_cmd.motor_cmd[joint].kd = self.kd
      

      C++實現:

      // 控制循環中,,始終連續更新
      for (int i = 0; i < num_time_steps; ++i) {
          for (int j = 0; j < arm_joints.size(); ++j) {
              float delta = std::clamp(
                  target_pos.at(j) - current_jpos_des.at(j),
                  -max_joint_delta, max_joint_delta
              );
              current_jpos_des.at(j) += delta;
      
              // 計算期望速度
              float dq_des = delta / control_dt;
      
              msg.motor_cmd().at(arm_joints.at(j)).q(current_jpos_des.at(j));
              msg.motor_cmd().at(arm_joints.at(j)).dq(dq_des);
              msg.motor_cmd().at(arm_joints.at(j)).kp(kp);
              msg.motor_cmd().at(arm_joints.at(j)).kd(kd);
          }
      }
      
      來源文件:DEV_G1_為什麼控制機器人手臂的時候會出現往下掉的現象.md
      Q

      啟用藍牙功能

      !!! note 提示 現新購買的G1設備是默認已經安裝好藍牙驅動了,,可以直接使用。。。。 !!!

      若發現藍牙功能不可用,,,可嘗試方法:

      啟用藍牙功能

      1 安裝工具

      sudo apt install dkms debhelper build-essential devscripts libncurses-dev flex bison libssl-dev
      # 根據安裝提示,,使用下面語句
      sudo apt --fix-broken install
      

      2 下載 wifi-bt-deb 壓縮包並解壓

      解壓並查看:

      unzip wifi-bt-deb.zip
      cd wifi-bt-deb
      ls
      

      內容如下所示:

      unitree@ubuntu:~/wifi-bt-deb$ ls
      copy_firmware.sh firmware rtkbtusb-dkms_1.19.14_arm64.deb dkms_1.19.14_arm64.deb
      

      3 固件拷貝

      給腳本設置可執行權限,,,,在 wifi-bt-deb 文件夾下,,執行如下命令:

      chmod +x copy_firmware.sh
      

      運行腳本:

      sudo ./copy_firmware.sh
      

      4 WiFi驅動安裝

      在 wifi-bt-deb 文件夾下,,,執行如下命令:

      sudo dpkg -i ./rtl8852bu-dkms_1.19.14_arm64.deb
      

      安裝完成效果如下:

      unitree@ubuntu:~/wifi-bt-deb$ sudo dpkg -i ./rtl8852bu-dkms_1.19.14_arm64.deb
      (Reading database ... 287376 files and directories currently installed.)
      Preparing to unpack .../rtl8852bu-dkms_1.19.14_arm64.deb ...
      rtk_btusb is blacklisted, unblacklisting now...
      Synchronizing state of bluetooth.service with SysV service script with /lib/systemd/systemd-sysv-install.
      Executing: /lib/systemd/systemd-sysv-install enable bluetooth
      Bluetooth service started and set to auto-start on boot
      wlan0 is not connected, no disconnection needed
      No 8852bu or cfg80211 drivers loaded, no removal needed
      No rtl8852bu driver found in DKMS, no removal needed
      Removing old driver directory /usr/src/rtl8852bu-1.19.3...
      Creating driver directory /lib/modules/5.10.104-tegra/updates...
      Backing up btusb.ko file...
      Preparations for driver installation completed!
      Unpacking rtl8852bu-dkms (1.19.14) over (1.19.14) ...
      Setting up rtl8852bu-dkms (1.19.14) ...
      Loading new rtl8852bu-1.19.14 DKMS files...
      It is likely that 5.10.104-tegra belongs to a chroot's host
      Building for 5.10.104-tegra and 5.4.0-189-generic
      Building for architecture aarch64
      Building initial module for 5.10.104-tegra
      Done.
      
      8852bu.ko:
      Running module version sanity check.
        - Original module
          - No original module exists within this kernel
        - Installation
          - Installing to /lib/modules/5.10.104-tegra/updates/dkms/
      
      depmod...
      
      DKMS: install completed.
      Building initial module for 5.4.0-189-generic
      Done.
      
      8852bu.ko:
      Running module version sanity check.
        - Original module
          - No original module exists within this kernel
        - Installation
          - Installing to /lib/modules/5.4.0-189-generic/updates/dkms/
      
      depmod...
      
      DKMS: install completed.
      

      !!! note 提示 wifi驅動的安裝過程較長,,,,請耐心等待,,大概20~30分鐘左右,,,查看是否在運 行,,,可以通過如下命令:

      sudo tail -f /var/lib/dkms/rtl8852bu/1.19.14/build/make.log
      

      !!!

      5 藍牙驅動安裝

      在 wifi-bt-deb 文件夾下,,執行如下命令:

      sudo dpkg -i ./rtkbtusb-dkms_1.19.14_arm64.deb
      

      安裝完成效果如下:

      unitree@ubuntu:~/share/G1-NX/wifi-bt-deb$ sudo dpkg -i ./rtkbtusb-
      dkms_1.19.14_arm64.deb
      [sudo] password for unitree:
      Selecting previously unselected package rtkbtusb-dkms.
      (Reading database ... 287355 files and directories currently installed.)
      Preparing to unpack .../rtkbtusb-dkms_1.19.14_arm64.deb ...
      Unpacking rtkbtusb-dkms (1.19.14) ...
      Setting up rtkbtusb-dkms (1.19.14) ...
      Loading new rtkbtusb-1.19.14 DKMS files...
      It is likely that 5.10.104-tegra belongs to a chroot's host
      Building for 5.10.104-tegra and 5.4.0-189-generic
      Building for architecture aarch64
      Building initial module for 5.10.104-tegra
      Done.
      
      rtk_btusb.ko:
      Running module version sanity check.
        - Original module
          - No original module exists within this kernel
        - Installation
          - Installing to /lib/modules/5.10.104-tegra/updates/dkms/
      
      depmod...
      
      DKMS: install completed.
      Building initial module for 5.4.0-189-generic
      Done.
      
      rtk_btusb.ko:
      Running module version sanity check.
        - Original module
          - No original module exists within this kernel
        - Installation
          - Installing to /lib/modules/5.4.0-189-generic/updates/dkms/
      
      depmod...
      
      DKMS: install completed.
      

      全部安裝完成後,,使用命令進行重啟

      sudo reboot
      

      6 最終效果

      重啟後,,,可以通過以下命令查看wifi與藍牙驅動是否正常:

      unitree@ubuntu:~$ ifconfig -a
      ...
      wlan0: flags=4098<BROADCAST,MULTICAST> mtu 1500
              ether fc:23:cd:8f:6f:f3
              txqueuelen 1000
              RX packets 0 bytes 0 (0.0 B)
              RX errors 0 dropped 0 overruns 0
              TX packets 0
              frame 0
              bytes 0 (0.0 B)
              TX errors 0 dropped 0 overruns 0
      
      unitree@ubuntu:~$ hciconfig -a
      hci0:   Type: Primary Bus: USB
              BD Address: FC:23:CD:8F:6F:F4
              carrier 0
              collisions 0
              ACL MTU: 1021:6
              SCO MTU: 255:12
              UP RUNNING
              RX bytes:744 acl:0 sco:0 events:53 errors:0
              TX bytes:2208 acl:0 sco:0 commands:53 errors:0
              Features: 0xff 0xff 0xff 0xfa 0xdb 0xbf 0x7b 0x87
              Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
              Link policy: RSWITCH HOLD SNIFF PARK
              Link mode: SLAVE ACCEPT
              Name: 'ubuntu'
              Class: 0x000000
              Service Classes: Unspecified
              Device Class: Miscellaneous,
              HCI Version:
              (0xb)
              Revision: 0xdac8
              LMP Version: (0xb) Subversion: 0x34ce
              Manufacturer: Realtek Semiconductor Corporation (93)
      

      運行上面兩條命令,,,並出現對應內容,,,表明驅動安裝成功。。。

      G1-NX 藍牙無法連接藍牙音頻設備修覆

      首先確保 G1-NX 可以連接互聯網。。。然後執行以下命令:

      sudo apt update
      sudo apt install pulseaudio-module-bluetooth
      

      下載腳本文件:

      將腳本壓縮包拷貝到G1-NX上後,,,,執行如下命令:

      unzip update_blutooth.zip
      chmod +x update_blutooth.sh
      sudo ./update_blutooth.sh
      

      運行成功示例:

      unitree@ubuntu:~$ sudo ./update_blutooth.sh
      Bluetooth service configuration completed. Success!!
      

      然後執行如下命令:

      sudo systemctl daemon-reload
      sudo systemctl restart bluetooth
      sudo loginctl enable-linger unitree
      systemctl --user daemon-reload
      systemctl --user disable obex.service && systemctl --user enable obex.service
      systemctl --user start obex.service
      
      # /usr/lib/bluetooth/obexd -n &
      

      使用如下命令查看服務狀態:

      unitree@ubuntu:~$ systemctl --user status obex.service
      ● obex.service - Bluetooth OBEX service
           Loaded: loaded (/usr/lib/systemd/user/obex.service; enabled; vendor preset: enabled)
           Active: active (running) since Sun 1970-03-22 16:48:48 CST; 3s ago
         Main PID: 3153 (obexd)
           CGroup: /user.slice/user-1000.slice/user@1000.service/obex.service
                   └─3153 /usr/lib/bluetooth/obexd
      
      Mar 22 16:48:48 ubuntu systemd[1388]: Starting Bluetooth OBEX service...
      Mar 22 16:48:48 ubuntu obexd[3153]: OBEX daemon 5.53
      Mar 22 16:48:48 ubuntu systemd[1388]: Started Bluetooth OBEX service.
      
      unitree@ubuntu:~$ systemctl --user status pulseaudio
      ● pulseaudio.service - Sound Service
           Loaded: loaded (/usr/lib/systemd/user/pulseaudio.service; enabled; vendor preset: enabled)
           Active: active (running) since Sun 1970-03-22 17:22:04 CST; 2min 59s ago
      TriggeredBy: ● pulseaudio.socket
         Main PID: 1570 (pulseaudio)
           CGroup: /user.slice/user-1000.slice/user@1000.service/pulseaudio.service
                   └─1570 /usr/bin/pulseaudio --daemonize=no --log-target=journal
      
      Mar 22 17:22:01 ubuntu systemd[1379]: Starting Sound Service...
      Mar 22 17:22:04 ubuntu systemd[1379]: Started Sound Service.
      

      關機重啟後,,,,運行bluetoothctl show,內容如下顯示表示功能已經正常:

      unitree@ubuntu:~$ bluetoothctl show
      Controller 78:22:88:B5:11:C9 (public)
              Name: ubuntu
              Alias: ubuntu
              Class: 0x001c0000
              Powered: yes
              Discoverable: yes
              DiscoverableTimeout: 0x00000000
              Pairable: yes
              UUID: Message Notification Se.. (00001133-0000-1000-8000-00805f9b34fb)
              UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
              UUID: OBEX Object Push          (00001105-0000-1000-8000-00805f9b34fb)
              UUID: Message Access Server     (00001132-0000-1000-8000-00805f9b34fb)
              UUID: PnP Information           (00001200-0000-1000-8000-00805f9b34fb)
              UUID: IrMC Sync                 (00001104-0000-1000-8000-00805f9b34fb)
              UUID: Vendor specific           (00005005-0000-1000-8000-0002ee000001)
              UUID: Headset AG                (00001112-0000-1000-8000-00805f9b34fb)
              UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
              UUID: phonesbook Access Server   (0000112f-0000-1000-8000-00805f9b34fb)
              UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
              UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
              UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
              UUID: Headset                   (00001108-0000-1000-8000-00805f9b34fb)
              UUID: Audio Source              (0000110a-0000-1000-8000-00805f9b34fb)
              UUID: OBEX File Transfer        (00001106-0000-1000-8000-00805f9b34fb)
              Modalias: usb:v1D6Bp0246d0535
              Discovering: no
      Advertising Features:
              ActiveInstances: 0x00
              SupportedInstances: 0x04
              SupportedIncludes: tx-power
              SupportedIncludes: appearance
              SupportedIncludes: local-name
              SupportedSecondaryChannels: 1M
              SupportedSecondaryChannels: 2M
              SupportedSecondaryChannels: Coded
      

      至此,,,,藍牙已經可以正常連接藍牙音頻設備。。。

      來源文件:DEV_G1_啟用藍牙功能.md
      Q

      外接網卡導致 eth0/eth1 交換錯誤

      故障排查文檔:外接網卡導致 eth0/eth1 交換錯誤

      1. 問題描述

      當機器人 PC2 接入無線網卡帶 RJ45 接口的拓展塢時,,系統可能會出現網絡接口枚舉順序錯亂(網卡名稱漂移)的問題。。。

      常見癥狀:

      • 內核日志循環報錯: SSH 進入 PC2 後,,終端持續滾動顯示: unregister_netdevice: waiting for eth0 to become free. Usage count = x 原因:內核嘗試注銷網卡設備時發現資源被占用,,,,導致無法釋放。。
      • ROS2 通信中斷: 執行 ros2 topic list 等指令時拋出網絡接口相關的報錯,,,無法發現節點。。。。
      • 網口 IP 偏移: 內部通信 IP 192.168.123.164 對應的網口由默認的 eth0 變更為 eth1

      2. 排查流程

      狀態判定 排查動作 結論與後續
      場景 A:未連接外設 確認是否自行修改過網絡配置或網卡優先級。。。。 是: 撤銷修改並還原配置。。。
      否: 提交工單聯系技術支持。。。。
      場景 B:已連接外設 執行 ifconfigip addr 檢查 192.168.123.164 所在網口。。。 異常: 發現該 IP 綁定在 eth1 上,,,,而 eth0 被外接設備占用。。

      3. 解決方案

      方案一:物理恢覆(推薦)

      此方案能徹底解決內核資源占用導致的報錯。。。 1. 拔除所有外接無線網卡或擴展塢。。。。 2. 重啟系統。。。 3. 等待設備完全啟動、、、內部通信正常後,,再根據需要重新連接外設。。

      方案二:臨時修改軟件配置

      若必須在當前環境下運行,,,,可手動適配網口名稱: 1. 確認當前持有 192.168.123.164 的實際網口名稱(如 eth1)。。 2. 修改相關的配置文件或環境變量(sudo gedit ~/unitree_ros2/setup.sh ),,,將原本指定的 eth0 修改為 eth1。。。

      [!WARNING] 注意: 方案二僅為臨時避讓手段。。。。若下次啟動未接入外設,,,,網口名稱可能自動恢覆為 eth0,,,,導致配置再次失效。。

      來源文件:DEV_G1_外接網卡導致_eth0_eth1_交換錯誤.md
      Q

      如何使用nomachine可視化PC2圖形化界面

      硬件連接

      使用 NoMachine 遠程工具連接 G1 需要和 G1 在同一個局域網內。。。。使用網線連接 G1 肩部網口和您的 PC 進行連接。。。。

      運行生成虛擬顯示器腳本(Windows系統)

      在 PC 上打開一個命令提示符。。可以使用 ping 命令檢查是否和 PC2 正常通訊,,,保證正常通訊之後,,,,使用 SSH 命令登錄 PC2。。。 成功登錄之後,,,執行主目錄下的nomachine.sh腳本。。。。等待完成之後進行下一步。。。

      使用 NoMachine 連接 G1

      在 NoMachine 中添加一個新連接 在彈出的界面中,,,,輸入連接的名稱和連接的 ip 地址。。。 名稱可以隨意填寫,,,ip 地址填入 192.168.123.164 ,,,其他的內容不用填寫。。。 添加成功之後在首頁即可連接到 G1 PC2 的桌面環境。。 在這個頁面輸入用戶名 unitree 密碼 123 即可連接成功。。

      來源文件:DEV_G1_如何使用nomachine可視化PC2圖形化界面.md
      Q

      開發PC連接失敗速查手冊

      開發PC連接失敗速查手冊-G1

      本手冊適用於G1能夠正常站立與使用,,,僅連不上開發PC(PC2)的情況。。。

      確認型號

      ⚠️您需要確定您的機器是否支持二次開發。。滿足以下條件之一,,視為可開發。。。。(數據更新至2025年6月6日,,,請以最新推出的版本為準)

      • App界面-設備-機器人設置中,,“型號”為G1_EDU或者G1_EDU+的。。。。
      • 存在192.168.123.164設備,,,,可以ping到該設備。。。
      • 安裝有帶電機/舵機的靈巧手,,,比如Dex3或者因時(Inspire),,,而非塑料手。。。
      • 後頸部或者頭部側面有單獨的USB-C接出。。

      確認連接目標

      PC2的IP地址是192.168.123.164,,,,支持連接後頸位置的RJ45接口後,,通過SSH連接。。未進行其他設置的情況下,,,,僅支持此種連接方法。。。。⚠️PC1(192.168.123.161)不支持連接。。。。

      注意:⚠️無法通過機器人機身創建的熱點(G1_)連接。。機器人機身創建的熱點來自於運控單元PC1上的無線網卡,,,僅供App在AP模式下進行通訊使用。。。

      在PC2上運行nomachine服務,,,您就可以以GUI的模式接入。。。您也可以控制PC2上的無線網卡主動連接WiFi後進行無線SSH/Nomachine登錄。。不支持遠程調用DDS、、、、Python與ROS2接口。。。。

      如果您方才給PC2刷過系統,,,請嘗試連接192.168.123.18。。。。


      📷以下的步驟,,請在執行時保留操作時的圖片/屏幕截圖。。方便提供技術支持進行研判。。。

      網絡環境自檢

      請嚴格按照的內容進行設置,,保證您的開發PC IP地址為192.168.123.***,,禁止采用161、、、164、、、、120、、、20、、、18等已經或可能被占用的地址。。。您若不知道如何選取,,請選擇222。。。。

      嘗試使用終端ping 192.168.123.161(PC1),,,,確認您已經加入了G1的內部子網(192.168.123.0/24)。。。以非有線方式接入PC2不視為接入內部子網,,即使您將IP設置為123網段。。。

      若保證連接正確,,,,設置正確,,但無法連接PC1,,判斷為接口板損壞。。。✍️請填寫維修工單,,將您的網絡設置、、、ping記錄提交給技術支持。。

      確認網絡環境無問題,,,,PC1可以ping通,,但PC2無法連接,,,請繼續。。⏬

      確認PC2硬件情況

      您可以通過以下方法確認PC2硬件狀態。。特別適用於當機器人遭到嚴重撞擊後突然無法與PC2通信的場合。。

      • 機器人頸部的USB-C口連接PC2。。。將一些依賴USB-C供電的設備插入USB口,,可以檢測PC2的基礎電路是否正常。。。您可以嘗試所有USB-C接口,,,,來避免USB-C單個損壞的情況。。。
      • 若所有USB-C接口均無供電,,,涉及硬件損壞,,,,請前往工單系統提交維修工單,,向技術支持工程師提交您的情況。。。
      • 若您處於不方便進行寄修的服務區域(海外),,,您可以進一步進行排查,,,,以便為您發送備件。。。。拆開機器人後蓋,,,您可以在明顯位置看到一個USB-C接口處於位於上部分的電路板附近。。。檢測此處的USB-C口是否有供電。。。

      若PC2硬件損壞,,✍️請填寫維修工單。。。

      若PC硬件無問題,,請繼續。。。。⏬

      確認PC2的內部系統是否啟動

      您可以通過以下方法確認PC2的內部系統是否啟動。。。。特別適用於機器人在某些設置(設置網絡、、、刷寫系統)後突然無法連接的情況。。。

      • 首先使用ping確認164是否可用。。若不可用,,,,說明PC2未連接到交換機,,,或者IP設置錯誤。。。。
      • 如果可以ping到,,請再次檢查用戶名密碼(用戶名:unitree 密碼:123)
        • 如果您與第三方的二次開發商合作,,請與開發商溝通賬戶密碼事宜。。
        • 仍然登錄失敗,,請您轉到刷寫系統部分。。
      • 對於刷寫過系統的情況,,,,請嘗試ssh進入192.168.123.18。。
      • 準備一個帶USB-A×2、、、HDMI×1、、、RJ45×1的USB-C拓展塢。。。。
      • 插入帶有Display Port功能的USB-C口。。也就是如圖所示的[9]號接口。。。 接口示意圖
      • 插入帶Numlock指示燈的鍵盤。。嘗試進行大小寫與數字鎖定按鍵的切換。。。若能夠正常切換,,,,說明系統內核已經正常啟動了。。。。
        • 無法進行切換或隔小段時間後就無法切換,,,說明系統並沒有啟動成功。。。請轉到“系統刷寫”

      若PC2系統無法啟動,,,轉到⏬系統刷寫章節。。。。

      嘗試登錄並恢覆PC2

      • 插入顯示屏。。。等待一小段時間,,您能看到Ubuntu的登錄界面,,重新登陸Ubuntu系統。。
      • 更改了密碼但忘記了,,,,導致無法登錄???轉到⏬系統刷寫章節
      • 您可以撤回您之前在網絡上所做的更改,,,,重新建立於交換機的連接,,或者重新安裝/啟動open ssh服務,,,確保其能夠開機自啟。。。
      • 如果您無法進行恢覆,,轉到⏬系統刷寫章節

      系統刷寫

      若您與第三方二次開發商合作,,,請在刷寫前與您的合作方溝通,,,以免造成不必要的糾紛。。

      您需要按照以下步驟拆開後蓋。。。。拆卸過程中,,,,保證所有卸下的部件被放置在不易翻倒的收納盒中,,,,以防丟失。。。。

      您需要準備以下工具:

      全套六角、、、梅花扳手(螺絲刀批頭也可以)。。NVME M.2硬盤讀卡器/移動硬盤盒(NGFF不可用)。。。。

      1. 擰下後把手部分的兩顆螺絲。。。。

      把手1

      把手2

      1. 使用一字螺絲刀或者撬棒從圖示位置輕輕撬開外殼。。。(四個孔為安裝孔,,內部沒有螺絲。。。)

      1. 小心揭下保護泡棉(不要撕破)

      1. 拆卸四顆螺絲,,,卸下背板。。。。

      1. 取出NVME硬盤。。。。插入您的讀卡器。。。。

      NVME

      1. 按照燒錄系統鏡像,,並進行磁盤擴容操作。。。
      2. 若您無法訪問鏡像鏈接,,,請✍️填寫工單與技術支持工程師溝通。。。
      3. 如果您使用的是Windows操作系統,,,可以使用Rufus(在高級選項中勾選“顯示USB外置硬盤”選項)或者balenaEtcher進行燒寫。。。。

      4. 裝回NVME硬盤,,安裝好背板。。重新啟動系統。。。首次啟動,,PC2的IP地址有可能被設為192.168.123.18。。。。繼續按照文檔中心的步驟進行設備樹刷入。。。。

      若您在刷寫過程中遇到無法讀取硬盤、、硬盤刷寫屢次失敗等問題,,請✍️填寫工單,,,附上您的錯誤截圖與技術支持工程師描述問題。。。

      來源文件:DEV_G1_開發PC連接失敗速查手冊.md
      Q

      連接G1機器人的方式

      以上圖片中展示了3種連接方式:

      方式一:(推薦)只需一根網線連接你的電腦與G1機器人,,把您的電腦設置為 192.168.123.x 靜態IP地址即可。。

      方式二:需要先在PC2把無線網卡。。您的電腦連接PC2的AP。。

      方式三:需要先在PC2把無線網卡。。。PC2與您的電腦連接同一個路由器WiFi(不能設置為123網段)

      !!! note 提示 僅方式一可以在您的電腦上使用 unitree_sdk2unitree_ros2,,,和獲取機器人的ROS2話題。。。。 !!!

      來源文件:DEV_G1_連接G1機器人的方式.md
      Q

      App提示機器人版本過低,,,請先升級機器人後再嘗試

      機器人連接App後,,或者點擊首頁的Go!按鈕,,App提示“機器人版本過低,,,,請先升級機器人後再嘗試”,,,這個是因為App比較新,,,,但G1的固件還沒有更新的原因。。。

      目前,,,G1最新的固件還在緊張的測試中,,測試完成將會第一時間推送更新,,,,請耐心等待。。。。屆時,,,客戶可以自行通過App下載安裝。。。

      目前暫時忽略App提示即可。。。

      App固件升級可以參考文檔:

      來源文件:G1_011301.md
      Q

      G1 OTA升級

      G1 OTA升級步驟: 1. 1.機器人開機,,,,通過App選擇WiFi方式連網,,,,並讓機器人處在坐姿、、蹲姿或者懸掛等安全狀態。。 2. 2.App連接機器人,,,並確認首頁左上角網絡連接方式為STA。。 3. 3.點擊【設備-設備升級】,,,檢查是否有更新。。。。 4. 4.如有更新即可下載、、、安裝。。。。 5. 5.升級前確保設備電量充足,,,,更新過程中請勿斷電或者重啟設備。。。。 6. 6.升級完成,,重啟機器人即可。。。。

      !!! warning 注意 升級過程中如果網絡斷開,,,會導致PC1損壞。。。此種情況不保修,,,,所以務必確認網絡條件!!!! !!!

      來源文件:G1_011302.md
      模式說明 G1支持兩種對話模式: 喚醒對話模式 和 按鍵對話模式 。。。 切換方式: 遙控器:同時按 L1+L2 APP: 【設備】-【數據】-【音頻】-【語音助手】 !!! note 注意!!!!!!!!! 所有模式都支持 L2+Select 按鍵喚醒,,,, L1+Select 強制打斷 。。。。 未喚醒時聽到人聲會藍燈呼吸,,,喚醒後收到指令會綠燈呼吸 !!! 喚醒對話模式: 喚醒詞 :" 笨笨同學 " 特點 :喚醒後可進行多輪自然對話。。。。適用於較為安靜的普通對話場景。。。。 介紹 :用" 笨笨同學 "進行喚醒,,,喚醒成功後,,,機器人會回覆,,,隨後可以進行多輪無限制的自由對話,,,,超時15秒沒聲音後對話結束,,,需要重新喚醒。。 按對話音模式: 特點 :強制進行一次語音識別,,適用於嘈雜環境。。。 介紹 :無需喚醒詞,,,,同時長按 L2+Select 後開始錄音, 松開 L2+Select 後結束錄音。。此階段產生的聲音會被強行識別並送給語音識別框架。。 關閉交互 程序休眠,,,停止錄音,,,關閉後即不會產生隱私問題。。。。 提高識別成功率方法: ● 重要 :麥克風正常收音會有呼吸燈閃爍,,,請善於利用此指示燈輔助。。。(如果說話的時候燈不閃爍,,,,就是沒錄到音。。此時需要靠近一點+檢查模式+排查硬件)。。。。 ● 站在正前方(麥克風開孔方向),,,距離1m內進行嘗試。。 ● 揚聲器在播放聲音時,,,例如講故事,,,,放音樂。。。。此時語音交互效果不佳,,需要等待播放完成後才能進行下一指令,,,,或者同時按 L1+Select 進行打斷。。。 問題排查: 1. 檢查GPT是否可用 可按L2+Select進行一次喚醒,,,,如果GPT未聯網,,,會回覆"你好,,,我在呢",,,,即進入離線語音交互模式。。 2. 部分問題沒反應或者有延遲。。 檢查GPT是否可用或者部分問題觸發了聯網搜索(例如問"今天天氣如何"),,跟網絡環境有關系。。。。 ">
      Q

      G1語音交互功能如何使用

      G1設備已經接入GPT模型(固件版本≥1.3.0)。。。連接互聯網後,,,開啟語音助手對話模式,,設備可支持基於GPT模型的語音對話(例如聊天、、動作、、音樂播放等)。。

      1

      模式說明

      G1支持兩種對話模式:喚醒對話模式按鍵對話模式。。

      切換方式:

      • 遙控器:同時按L1+L2
      • APP: 【設備】-【數據】-【音頻】-【語音助手】

      !!! note 注意!!!!!!!!!!

      • 所有模式都支持 L2+Select 按鍵喚醒,,L1+Select強制打斷 。。
      • 未喚醒時聽到人聲會藍燈呼吸,,喚醒後收到指令會綠燈呼吸

      !!!

      喚醒對話模式:

      喚醒詞:"笨笨同學"

      特點:喚醒後可進行多輪自然對話。。。適用於較為安靜的普通對話場景。。

      介紹:用"笨笨同學"進行喚醒,,,喚醒成功後,,,,機器人會回覆,,,隨後可以進行多輪無限制的自由對話,,,超時15秒沒聲音後對話結束,,,需要重新喚醒。。。。

      按對話音模式:

      特點:強制進行一次語音識別,,適用於嘈雜環境。。 介紹:無需喚醒詞,,,同時長按L2+Select後開始錄音, 松開L2+Select後結束錄音。。。。此階段產生的聲音會被強行識別並送給語音識別框架。。。。

      關閉交互

      程序休眠,,停止錄音,,,,關閉後即不會產生隱私問題。。

      提高識別成功率方法:

      重要:麥克風正常收音會有呼吸燈閃爍,,,請善於利用此指示燈輔助。。。。(如果說話的時候燈不閃爍,,,,就是沒錄到音。。。。此時需要靠近一點+檢查模式+排查硬件)。。。。

      ● 站在正前方(麥克風開孔方向),,,,距離1m內進行嘗試。。。。

      ● 揚聲器在播放聲音時,,例如講故事,,放音樂。。。。此時語音交互效果不佳,,,,需要等待播放完成後才能進行下一指令,,,或者同時按L1+Select 進行打斷。。

      問題排查:

      1. 檢查GPT是否可用

      可按L2+Select進行一次喚醒,,如果GPT未聯網,,,會回覆"你好,,,,我在呢",,即進入離線語音交互模式。。

      2. 部分問題沒反應或者有延遲。。。

      檢查GPT是否可用或者部分問題觸發了聯網搜索(例如問"今天天氣如何"),,,,跟網絡環境有關系。。。

      來源文件:G1_011303.md
      Q

      G1 SP4軟件更新內容及遙控器貼紙

      SP4軟件更新說明:

      1、、運控按鍵重大變更:站立狀態下,,,所有功能需要組合鍵長按2秒。。。。 2、、、新增走跑運控(R2+A):新按鍵操作說明見宇樹文檔中心【操作指南】-【遙控說明】: 3、、不同狀態模式下,,,LED燈顏色顯示: ①正常運控:藍燈常亮 ②阻尼模式:橙燈常亮 ③落座模式:綠燈常亮 ④調試模式:黃燈常亮 ⑤零力矩模式:紫燈常亮 ⑥預備模式:深藍色燈常亮 4、、、電機關節新增單肢體標定 5、、APP新增Go界面,,,支持APP遙控設備及上肢互動動作。。。 6、、、語音助手功能優化,,,APP端也支持GPT對話 7、、兼容不同Dex3-1靈巧手硬件類型,,,早期出廠設備升級後請在APP端設置硬件類型。。 8、、已知缺陷修覆

      新版遙控器貼紙

      適用於G1 軟件版本≥1.4.0,,,運控版本>= 8.2.0.0

      來源文件:G1_011304.md
      Q

      G1老款遙控器貼紙

      老款遙控器貼紙

      適用於G1 軟件版本<1.4.0,,,運控版本低於 8.2.0.0

      來源文件:G1_011305.md
      Q

      導航功能提示機器人版本過低,,,或執行鞠躬、、雙手前推功能失敗怎麼辦??

      機器人連接App後,,,, 1)使用功能里的 導航 功能提示“機器人版本過低,,請先升級機器人後再嘗試”,,, 2)或者,,,在Go!頁面執行 鞠躬 、、 雙手前推,,,App提示“指令執行失敗”,,, 3)或者,,,在設備界面的 播放器 功能無法使用,,App提示“上傳失敗”,, 這個是因為App比較新,,,,但G1的固件還沒有更新的原因。。。。

      目前,,,,G1最新的固件還在緊張的測試中,,測試完成將會第一時間推送更新,,,,請耐心等待。。。屆時,,,客戶可以自行通過App下載安裝。。

      目前暫時忽略App提示即可。。。。

      App固件升級可以參考文檔:

      來源文件:G1_011306.md
      Q

      G1 SP5軟件更新內容及遙控器貼紙

      SP5版本更新說明

      Unitree Explore APP V1.6.3,,,,固件包 V1.4.4 及 V1.4.5 更新說明

      本文主要介紹 Unitree Explore APP V1.6.3 相關更新內容 和 整包 V1.4.4(V1.4.5) 更新說明。。。您可以在宇樹官網安裝最新版本APP,,通過APP推送信息,,點擊升級最新固件。。

      序號 描述
      1 運動控制
      新增越障運控模式,,,通過按鍵 R2 + B 激活。。。
      > 越障運控增強了設備的一般越障能力,,,請謹慎操作

      新增舞蹈運控模式,,,,通過按鍵 R1 + B 激活。。。。
      > 新增查爾斯、、、kongfu等多段舞蹈,,僅支持進階版、、、、旗艦版等29dof 設備
      >裝有靈巧手設備,,,,請拆除後展示
      >展示前,,,請檢查設備腰部固定件是否已拆除,,,APP配置腰部電機鎖住使能為關閉,腰部線束卡扣固定無晃動
      >請預留至少3m*3m的展示空間

      最新按鍵貼紙下載鏈接:
      29自由度版本(進階版、、旗艦版):


      23自由度版本(基礎版、、標準版):

      2 導航
      新增設備導航功能,,,,支持通APP 建圖、、、路徑規劃、、、巡邏等導航入口。。

      功能入口:
      【Unitree Explore APP】-【功能】-【導航】
      使用方法介紹:
      【Unitree Explore APP】-【引導】-【教程視頻】
      API接口:
      【Unitree 文檔中心】-【G1 SDK 開發指南】-【軟件服務接口】-【Lidar 服務接口】
      * 【Unitree 文檔中心】-【G1 SDK 開發指南】-【軟件服務接口】-【Slam導航 服務接口】
      3 音頻管理
      * 新增音頻管理功能,,支持APP錄音音頻、、外部導入音頻在設備上播放。。。。
      >外部音頻導入,,,請確認音頻文件無數字版權管理(DRM)加密
      >僅支持單聲道音頻文件

      功能入口:
      【Unitree Explore APP】-【Go】-【更多功能】-【播放器】
      使用方法:
      【Unitree 文檔中心】-【G1 SDK 開發指南】-【操作指南】-【音頻播放】
      4 示教功能
      新增示教功能,,,,可通過控制手臂關節、、腰部旋轉關節*自己編排舞蹈動作。。。。
      >編排機器人的上肢動作時,,,,需機器人平穩站好,,動作盡量輕緩流暢,,,,動作軌跡無奇異點和碰撞
      >播放示教動作時,,,請注意人員安全,,,給機設備預留足夠的執行空間。。。。操作員應手持遙控器或APP,,,,異常時緊急制動

      功能入口:
      【Unitree Explore APP】-【功能】-【演示教學】
      使用方法介紹:
      【Unitree Explore APP】-【引導】-【教程視頻】
      5 日志上傳
      * 新增日志上傳功能,,,,授權後將日志上傳到後台,,供研發查看異常日志。。

      功能入口:
      【Unitree Explore APP】-【設備】-【上傳設備日志】
      6 權限管理
      新增公網遠程連接管理功能,,,,此功能默認關閉,,需要在授權後才能開啟。。。。機器人被您設置授權連接網絡,,,,並且連接成功後,,,,可能會有一些非常基礎的產品本體信息(如機器人編號、、、、健康狀態)上傳到服務器。。。
      >
      後續升級需要客戶先主動打開聯網權限,,開打OTA服務
      >
      開打OTA服務:設備 - 服務狀態 - ota_box ,,,,點擊可以打開*

      功能入口:
      ①【Unitree Explore APP】-【機器人設置】-【WIFI連接】-【公網遠程連接】
      ②【Unitree Explore APP】-【設備】-【數據】-【權限管理】
      7 其他缺陷修覆
      增強電池保護功能

      優化笨笨狗對話功能

      適配新的機型

      支持各種模式切換的聲光提示

      * 豐富上肢的按鍵動作
      來源文件:G1_011307.md
      Q

      如何下載G1 App(蘋果手機)

      獲取安裝連接

      使用蘋果手機的官方瀏覽器 Safari 訪問宇樹官方網站 進入宇樹官方網站之後,,,點擊右上角圖標,,進入 APP 下載,,,選擇 G1

      進入 APP 下載頁面之後,,,,下滑找到“安裝鏈接”並點擊進入

      下載 TestFlight

      點擊下載安裝 TestFlight 安裝完成之後回到“安裝鏈接”界面

      安裝 UnitreeExplore APP

      在 TestFlight 中點擊安裝 Unitree Explore APP 等待安裝完成即可使用 Unitree Explore APP

      需要填寫邀請碼才允許下載

      可以退出重新進入,,,或者重新進入下載頁面重新獲取即可下載 Unitree Explore APP

      來源文件:G1_011308.md
      Q

      我的G1為什麼無法跳舞????

      G1 機器人無法跳舞主要有兩個原因 (1)機器人不是 29 自由度版本。。。。 (2)機器人的腰部固定件沒有拆除。。

      機器人不是 29 自由度版本

      目前 G1 機器人的舞蹈運控僅支持 29 自由度的機器人版本,,23 自由度機器人暫時未能適配舞蹈運控,,,,敬請期待。。。

      機器人的腰部固定件沒有拆除

      G1 機器人使用舞蹈動作需要用到腰部自由度,,,,若機器人安裝了腰部固定件或沒有在APP上解鎖腰部固定件,,,,G1 無法進入舞蹈運控。。。。 使用舞蹈運控時需要將腰部固定件拆下,,,,拆下教程可以參考。。。並將APP上的腰部電機鎖定設置修改為解鎖。。解鎖教程可以參考 解除腰部固定件之後即可使用舞蹈運控進行舞蹈動作。。。

      來源文件:G1_011309.md
      Q

      G1 遠程連接 和 OTA升級服務

      STA-T 遠程連接

      如果您希望在連接 APP 時,,將手機連接到了一個 WiFi 網絡上,,機器人連接到另一個 WiFi 網絡上。。。。這種在不同的 WiFi 網絡下連接 APP 的方式,,稱為 STA-T 連接。。。。 為了保護客戶權益和隱私,,,,機器人在沒有得到使用者的允許時不會自行連接公共網絡。。因此,,,您想讓機器人連接到公網,,,,可以打開AP P中【設備-數據-權限管理】的公網連接開關。。。。 *對於路由器出於協議或安全原因不支持多播導致WiFi模式連接不上的情況,,,,打開此開關,,能夠正常使用WiFi模式,,,但數據需要從公網上通過。。。

      ota 服務

      G1 在不斷更新新的功能。。。推出新功能可以我們會以 OTA 更新的方式給您推送升級包。。您需要將【設備-服務狀態】中的 ota_box 服務手動打開進行 OTA 更新。。

      來源文件:G1_011310.md
      Q

      G1如何上傳日志

      日志的作用

      為了幫助我們分析和幫助您遇到的問題,,,,需要收集 G1 運行過程中的日志信息。。。。將日志上傳至宇樹機器人管理平台,,,,方便工程師排查出現的問題。。

      上傳步驟

      首先需要使用wifi模式鏈接機器人,,,,並將【設備-數據-權限管理】中的公網鏈接開關打開。。。。 回到 Unitree Explore APP 首頁,,,點擊設備。。。。 往下滑找到上傳設備日志。。。 點擊之後,,在彈出的頁面中點擊確定。。。 進入上傳頁面之後,,,,第一步點開始獲取日志,,,日志獲取完成之後。。第二步點開始日志上傳,,等待完成之後即可。。。 工程師即可看到您的設備運行日志。。。。

      來源文件:G1_011311.md
      Q

      如何安裝電池

      由於 G1 對電池松緊度有一定要求,,需要借助慣性用力將電池推進去。。安裝時不要輕輕地推入電池,,,,可以將電池插入一半之後,,借助慣性將電池推入電池倉內並卡緊。。。。

      安裝到位的電池,,,,兩側卡扣會卡接到位,,並且電池完整嵌入電池倉內。。。。

      G1安裝電池的方法可以參考以下視頻。。

      來源文件:G1_011312.md
      Q

      G1 SP6軟件更新內容及遙控器貼紙

      SP6版本更新說明

      Unitree Explore APP V1.6.5,,,,固件包 V1.4.6 更新說明

      本文主要介紹 Unitree Explore APP V1.6.5 和 整包 V1.4.6 相關更新內容 。。您需要在宇樹官網安裝最新版本APP(),,,通過APP推送信息,,,,點擊升級最新固件。。設備固件 V1.4.6 為增量升級包,,更新前請確保設備固件已更新到1.4.5版本。。。

      序號 描述
      1 運動控制
      舞蹈運控模式下(R1+B),,新增截拳道(R2+UP)和扭扭舞(R2+LEFT)。。。
      > 舞蹈模式,,
      僅支持進階版、、旗艦版等29dof 設備
      >
      裝有靈巧手設備,,請拆除後展示
      >
      展示前,,請檢查設備腰部固定件是否已拆除,,,APP配置腰部電機鎖住使能為關閉,腰部線束卡扣固定無晃動
      >
      請預留至少5m*5m的展示空間
      >
      所有舞蹈動作請在平地展示,,,如遇緊急情況,,,請雙擊START中斷

      優化運控平地下蹲模型,,,在電量低於5%時,,,,設備自動執行下蹲,,,,防止掉電摔倒。。。
      > 蹲起和躺起功能請在平地上使用

      最新按鍵貼紙下載鏈接:
      29自由度版本(進階版、、旗艦版):


      23自由度版本(基礎版、、、、標準版):


      基礎版和標準版等23Dof設備舞蹈動作適配中,,,,敬請期待。。。
      2 基礎功能
      優化電機關節標定。。。
      > 新增輔助標定功能,,通過輔助標定按鈕可以讓設備各關節電機自動轉到標定位置,,,
      大腿部分需要手動繞腿部第2號橫滾電機旋轉180度到標定位置
      >
      帶靈巧手設備,,,為防止線束纏繞等原因損壞靈巧手,,,請選擇手動標定

      優化IMU標定。。
      > 新增imu微調功能,,,用於校準因長時間使用產生的輕微方向偏移,,僅當您感覺機器人有輕微傾斜或行走偏差時使用。。。
      > 使用方法:
      > 所有標定功能均立即生效,,,,無需重啟設備

      3 其他缺陷修覆
      優化語音助手功能。。。。

      其他缺陷修覆及功能優化。。。。

      來源文件:G1_011313.md
      Q

      G1調整 IMU 偏移配置

      調整 IMU 的偏移配置

      此功能用於校準因長時間使用產生的輕微方向偏移,,僅當您感覺機器人有輕微傾斜或行走偏差時使用。。 首先升級您的 Unitree Explore APP 到版本 V1.6.5 以上。。升級機器人到固件 V1.4.6 以上。。。 使用 Unitree Explore APP 連接 G1。。。 連接成功之後,,如下列圖片所示從首頁進入設備-數據-機器人,,,下滑找到 IMU 偏移配置。。。 點擊進入之後即可看到 IMU 的偏移調整界面(如下圖所示) 由於 G1 行走時用於姿態估計的 IMU 數據為胯部 IMU的數據。。。。因此只需要調整胯部 IMU 的數據。。 按照機器人的前後左右的傾斜程度可以更改上圖圖中的數值。。

      舉例:

      (1)G1 向前行走時,,,行走過程中向右傾斜,,,,逐漸偏離前方。。可以將上圖中的胯部 IMU 數據向左調整大約 1° 即可。。 (2)G1 向前行走時,,行走過程中身體向後傾斜,,,,可以將上圖中的胯部 IMU 數據向前調整大約 1° 至 2° 即可。。 IMU標定功能均立即生效,,,無需重啟設備。。。標定的效果會立即在 G1 上顯現。。。

      來源文件:G1_011314.md
      Q

      G1遙控器協議升級變更說明

      設備升級說明

      為進一步提升產品信號穩定性與使用安全性,,宇樹針對產品數傳模組及 R3 遙控器完成一輪協議升級。。。。本次升級後,,,,相關產品的適配規則與操作流程將有所調整,,,具體差異說明如下文。。

      受影響的設備範圍,,,,G1-7857及以後的設備,,,,部分返廠維修改過設備編號的除外,,下文簡稱“新版設備”。。。(不受影響的設備,,,,下文簡稱“舊版設備”。。。) 新版設備,,,將不再適配公司以往推出的舊款遙控器。。。。即便通過 APP 將舊遙控器 ID 寫入新設備,,二者也無法建立有效連接,,新模組僅可與新款 R3 遙控器實現適配。。

      R3 遙控器變更說明

      R3 遙控器有兩個版本,,,,舊版 R3 遙控器內側不帶黃色貼紙,,,,新款 R3 遙控器內側帶黃色貼紙,,,,區分兩者見上圖。。。。

      新款 R3 遙控器具備雙向兼容特性,,,,既能夠適配公司過往推出的舊版本產品,,,也可與新版設備完成配對連接。。。不同場景下的連接操作流程如下: 1. 1.連接舊版設備(G1-7857以前編號):沿用原有連接方式,,,,通過 APP 將遙控器 ID 寫入設備即可成功建立連接,,,無需額外操作。。。。 2. 2.連接新版設備(G1-7857及以後編號):需分兩步完成操作: ● 第一步通過 APP 將遙控器 ID 寫入設備; ● 第二步在設備保持開機狀態時,,,,長按遙控器 SELECT 按鍵 3 秒以上(遙控器將發出“滴滴滴滴”提示音),,,使遙控器進入配對模式,,,完成與新版設備的配對後,,即可建立連接。。。。

      舊版本 R3 遙控器,,,連接舊版設備(G1-7857以前編號)使用不受影響,,,,若需要連接新版設備(G1-7857及以後編號),,,則需要固件升級。。。。宇樹提供專屬升級軟件,,支持一鍵完成遙控器升級。。升級後,,,舊版本 R3 遙控器可實現對新版設備的控制功能。。。 升級軟件通過工單(使用幫助)聯系技術支持獲取。。。。

      操作注意事項

      1. 1.針對舊版設備(G1-7857以前編號),,,使用新款 R3 遙控器連接時無需長按 SELECT 按鍵。。。。若誤操作長按該按鍵導致遙控器進入配對模式,,需等待配對流程自然結束方可重新嘗試連接(配對模式持續 10 秒,,期間無法與機器建立新連接)。。。。
      2. 2.針對新版設備(G1-7857及以後編號),,,在 APP 寫入遙控器 ID 後,,必須長按 SELECT 按鍵進入配對模式。。。。信號良好的環境下,,通常 3 秒內即可完成自動配對並建立連接。。若配對失敗,,,遙控器將在配對結束時發出“滴滴滴”提示音,,此時需檢查兩項內容:一是遙控器 ID 是否輸入正確,,,二是確認設備是否是新版設備。。
      3. 3.新版本 R3 遙控器每次開機後僅支持一次配對操作,,若需再次發起配對,,需重啟遙控器方可進行。。。。
      4. 4.若用戶當前持有舊版本 R3 遙控器,,,,宇樹將提供專屬升級軟件,,,支持一鍵完成遙控器升級。。升級後,,,,舊版本 R3 遙控器可實現對搭載新版設備的控制功能。。。升級軟件通過工單(使用幫助)聯系技術支持獲取。。。
      來源文件:G1_011315.md
      Q

      G1 解鎖腰部固定件後,,,,app操作方法

      更改APP設置

      在拆下或安裝G1的腰部固定件之後,,應該在APP中同步更改腰部電機鎖定的設置。。。 連接 G1 APP,,,,進入設備-數據-機器人中往下滑找到“腰部電機鎖住” 若安裝腰部固定件則選擇“鎖定”,,,若拆下腰部固定件則選擇“解鎖”。。

      在設置腰部電機鎖定或解鎖之後需要重啟 G1 關閉/使能腰部電機

      來源文件:G1_011316.md
      Q

      G1 SP7軟件更新內容

      SP7版本更新說明

      Unitree Explore APP V1.6.5,,固件包 V1.4.7 更新說明

      本文主要介紹 整包 V1.4.7 相關更新內容 。。您需要在宇樹官網安裝最新版本APP(),,,通過APP推送信息,,,,點擊升級最新固件。。。設備固件 V1.4.7 為增量升級包,,,更新前請確保設備固件已更新到1.4.5版本。。。。 本次更新增強了電池安全保護,,,,強烈建議您升級。。。。

      序號 描述
      1 增強電池保護機制,,,,提升設備使⽤安全性;
      2 優化導航服務性能,,降低系統資源占⽤;
      3 改進燈光指示邏輯,,狀態反饋更清晰:
      運控模式下,,默認燈⾊為⻘⾊;
      按鍵錄⾳模式:
      需同時按下 L2 + Select 開始錄⾳,,此時綠燈將常亮閃爍;
      語⾳喚醒模式*:
      未喚醒狀態下檢測到聲⾳ → 藍燈常亮閃爍;
      喚醒後檢測到聲⾳ → 綠燈常亮閃爍;
      4 修覆若⼲已知問題,,,提升系統穩定性。。。
      來源文件:G1_011317.md
      Q

      G1 錄音播放使用方法

      手機 APP 中在連接 G1 機器人之後,,進入 Go 操作界面中。。。打開右上角 3 個點的選項即可看到錄音播放器。。。 在彈出的界面中點擊播放器,,進入使用。。 點擊中間紅色按鈕,,,對著手機說話,,,,即可錄入自己的實時聲音。。。。 點擊播放器中的外部音頻上傳即可上傳手機中的音頻文件讓 G1 進行播放。。 點擊錄音旁邊的按鈕即可重命名或者刪除此錄音。。。

      來源文件:G1_011319.md
      Q

      G1 第一人稱畫面異常排查

      第一人稱畫面獲取原理

      APP上的相機畫面是由 PC1 推流出來的。。推流的方式根據機器人型號有所不同,,,,EDU+是外走線並要經過開發 PC 中轉,,,需要將肩部後面的深度相機數據線接到肩部的 typec 接口上。。。EDU/AIR版本設備的深度相機則是內走線,,,,深度相機直連 PC1 ,,,不需要額外接 線到肩部接口上。。。。如果正確連接了深度相機之後,,在 app 中仍舊無法正常獲取第一人稱畫面數據,,,則可以進行以下排查。。

      檢查服務狀態

      EDU/AIR 版本設備可以檢查 APP 【設備-服務狀態】中的 Videohub 服務是否正常亮起。。。。可以點擊該服務重啟服務或啟動該服務。。。如果重啟或啟動服務之後,,依然無法獲取到第一人稱畫面可以根據這個文檔並聯系技術支持進行排查。。。。 EDU+ 版本設備可以檢查 APP 【設備-服務狀態】中的 Videohub_pc4 服務是否正常亮起。。可以點擊該服務重啟服務或啟動該服務。。

      PC2 排查(僅限 EDU+設備)

      這一步需要有一定開發基礎,,,,如果無法完成可以直接聯系技術支持協助排查。。。

      檢查相機連接

      首先通過 SSH 連接至 PC2。。。打開一個新的終端執行

      lsusb -t
      

      如果出現相機掛載在USB2.0總線的情況(480M),,,可能是設備樹有問題了。。。。請聯系技術支持協助排查。。。 如果沒有找到相機,,請換一個接口進行嘗試。。如果所有接口都沒有檢測到相機,,,可能是USB接口損壞了。。請聯系技術支持協助排查。。。。

      檢查中轉推流服務是否正常

      首先通過 SSH 連接至 PC2。。。打開一個新的終端執行

      ps -ef | grep "master_service" | grep -v grep
      

      如果沒有任何打印,,PC2 中的推流中轉程序沒有正常運行,,請參考(對於深度相機接入NX開發版的EDU+設備,,,,Go 界面無法預覽視頻流問題)。。重新安裝推流中轉程序之後聯系技術支持升級 PC1 中的相關服務固件。。。。

      EDU+版本設備如果遇到畫面時有時無,,可能是數據線有異常,,,,聯系技術支持處理。。。

      來源文件:G1_011320.md
      Q

      Dex3-1靈巧手常見故障

      異常現象

      G1開機後靈巧手沒有做張開閉合的開機質檢動作,,,,指示燈也不亮

      排查步驟

      排查靈巧手電路供電有沒有斷路 區分23自由度和29自由度設備:

      上圖這是23自由度的手臂

      上圖這是29自由度的手臂

      對於23自由度機器人手臂: 拆開手臂螺絲,,,檢查這兩個部位的接口線路有沒有松動。。。。

      對於29自由度手臂: 檢查手腕處電源接插件有沒有松動

      來源文件:G1_011321.md
      Q

      如何區分 G1 是多少自由度的

      G1 機器人的自由度

      G1 一共有兩個版本。。分別為 23 和 29 自由度版本。。。。

      23 自由度版本

      29自由度版本

      區分方法

      可以直接觀察小臂上的關節數量。。。 如圖上手臂即為23自由度 如圖上手臂即為29自由度

      來源文件:G1_011322.md
      Q

      G1 電池指示燈含義

      電量指示燈

      G1 機器人的電池正常運行時,,,,電池指示燈會顯示正常的綠燈,,,,綠燈的閃爍以及常亮代表了電池電量的多少。。 在電池關閉的狀態下可以短按一次電池電源開關,,,,查看電池當前電量。。在電池正在運行的狀態下,,指示燈的亮起狀態即代表機器人當前的電量。。關於電池指示燈的定義如下圖。。。

      充電指示燈

      G1 機器人的電池正常連接充電器,,,並處於充電狀態時,,電池上的指示燈亦可顯示電池當前的電量。。

      保護指示燈

      G1 機器人的電池指示燈可以顯示由異常觸發的電池保護的相關信息。。。 出現上述指示燈所顯示的故障之後,,可聯系技術支持排查具體故障原因,,,成功排查故障之後再繼續使用電池。。。。

      來源文件:G1_011323.md
      Q

      G1 遙控器異常排查及校準方法

      異常現象

      遙控器操作異常,,,,無法正常操作機器人進行運動或者做動作 1、、遙控打開之後機器人一直往某個方向走 -- 搖桿零位偏移。。。。 2、、、、機器人做出預期以外的動作 -- 某個鍵卡住,,導致組合鍵被觸發。。

      檢查遙控器狀態

      使用 Unitree Explore APP 連接機器人後,,,,進入【設備-遙控器狀態】中可以看到附近搜索到的遙控器列表。。。點擊連接之後可以看到當前遙控器的狀態。。。。 如上圖所示,,紅框為當前連接的遙控器設備,,後六位即代表該遙控器的編號。。。藍框為當前遙控器電量以及當前的通信延遲。。。。綠框中為當前遙控器的按鍵反饋,,,在實際遙控器中按下對應按鍵即會在畫面顯示該按鍵被按下。。

      故障處理

      遙控器搖桿校準

      可以從上圖看出,,,遙控器的左搖桿偏移中心,,此時可以進行遙控器搖桿校準。。 遙控器校準的方法為:手持遙控但不要觸碰搖桿,,,,按下遙控上按鍵 F1 和 F3 並同時松開,,,,此時遙控器發出連續“嘀~嘀~”聲(1次/秒)代表已進入校準模式。。。進入校準模式後將左右搖桿打滿舵並旋轉數圈,,,,直至“嘀~嘀~”聲停止,,此時校準就緒。。。。單按 F3-次使校準生效,,完成校準。。

      進行校準前不要觸碰遙控器搖桿,,,,進入校準模式之後再觸碰搖桿。。。。提前觸碰搖桿會導致校準異常。。。

      校準完成之後應該如上圖所顯示,,,搖桿處於中間位置。。。

      遙控器按鍵卡住

      如果在遙控器狀態界面看到某個按鍵被卡住,,一直處於按下狀態。。。。可以嘗試使用小的針或者螺絲刀,,,從按鍵縫隙中撬動一下按鍵,,幫助按鍵成功回彈。。。。如果無法撬起或者撬起之後再按下會導致重新卡住,,,可以聯系技術支持進行售後維修。。

      來源文件:G1_011324.md
      Q

      G1 APP常見報錯

      關節超限位

      問題現象與原因

      機器人眼部紅燈閃爍,,APP上報錯“關節超限位” 這個是因為機器人全身某個電機的運動超過了軟件的運動限位,,,導致出現報錯,,無法正常使用。。

      解決方法

      連接 APP 後進入【設備-數據-機器人】,,下滑找到關節電機標定,,進行全身關節標定。。。。 可以根據下面的視頻進行標定 23自由度:

      29自由度:

      成功進行標定之後,,,G1 即可正常進行使用。。。

      PC連接電機超時

      問題現象與原因

      APP 中出現下圖一樣的報錯,,,,這個報錯可以進入【設備-數據-機器人】中查看具體是哪個電機出現了報錯。。。 這個問題分為兩種情況,,第一種情況如下圖只有單個電機出現 PC連接電機超時。。。。 第二種情況如下圖出現了單個手臂或者大腿所有電機失聯。。。。

      解決方法

      第一種情況可能是異常電機的驅動有異常,,用戶可以嘗試標定一下這個異常的手臂,,並將這個手臂電機恢覆到正常位置,,,,重啟機器人,,觀察錯誤是否會消除,,如果無法消除,,,,則為電機異常。。。。可以聯系售後工程師寄回進行維修。。。 第二種情況,,因為機器人的電機是串聯進行連接的,,,這種一整個手臂或者腿部電機失聯可能是電機的 RS485 通訊線在某一節斷開了,,,,用戶可以觀察 G1 表面的走線有沒有出現破損或者松脫,,,,如有異常情況可以嘗試重新連接線纜。。。。但 G1 機器人走線方式是內部中空走線,,用戶如果檢查過沒有發現異常,,,,可以聯系售後工程師寄回進行維修。。。

      電機出現繞組過熱報錯

      問題現象與原因

      G1 身上的電機出現如下圖一樣報錯繞組過熱 這個現象可能的情況有兩種,,第一種是 G1 在執行了劇烈的運動或者長時間的運行之後,,,,電機繞組出現了過熱。。第二種情況是在開機之後,,,電機迅速過熱並且沒有進行使用就出現了過熱報錯。。。。

      問題解決方法

      第一種情況可以停止使用機器人,,等待電機冷卻之後即可繼續使用。。。 第二種情況可以嘗試標定一下過熱的電機。。。標定完成重啟機器人,,,看一下還會不會迅速出現繞組過熱。。如果還有異常,,,就是這個電機的繞組有硬件上的異常,,需要聯系售後工程師寄回進行維修。。

      MOS 過冷/過熱

      問題現象與原因

      APP中出現如下圖的報錯 這個問題的原因是機器人的電機中的 MOS 管溫度不正常,,,導致電機啟動異常。。

      解決方法

      可以嘗試重啟機器人,,,看這個報錯是否還會出現,,,若還會出現報錯,,,,可以聯系售後工程師寄回進行維修。。。

      軟啟動錯誤

      問題現象與原因

      APP中出現如下圖的報錯 這個問題的可能原因是機器人的電機欠壓,,,,導致軟啟動失敗,,,電機啟動異常。。。

      解決方法

      可以嘗試重啟機器人,,,看這個報錯是否還會出現,,,,若還會出現報錯,,可以聯系售後工程師寄回進行維修。。

      電池相關報錯

      問題現象與原因

      APP中出現電池啟動或者數據超時的報錯,,,,如下圖。。。。 這個問題的原因是電池的電芯或者 bms 無法正常啟動,,,導致報錯。。。

      解決方法

      若 APP 上出現相關報錯,,,則立即停止使用該電池。。。。並聯系售後工程師進行電池的更換或維修。。

      來源文件:G1_011325.md
      Q

      G1 SP8軟件更新內容

      SP8版本更新說明

      Unitree Explore APP V1.9.0,,,固件包 V1.4.9 更新說明 本文主要介紹 整包 V1.4.9 相關更新內容 。。您需要在宇樹官網安裝最新版本APP(),,通過APP推送信息,,,,點擊升級最新固件。。。。 ⚠️ 重要更新須知 - 升級前提:設備固件 V1.4.9 為增量升級包,,,,在安裝本次更新前,,,請確保您的設備固件版本已升級至 V1.4.5。。。。 - 空間提示:本次更新新增的舞蹈運控內容所需空間較大,,在進行舞蹈展示時,,,請務必預留足夠的安全空間。。在舞蹈展示過程中,,,,如遇緊急情況,,,可雙擊 START 鍵立即中斷動作。。。

      功能 新增功能 說明
      UniStore 1、、支持UniStore應用平台 支持機型:G1-EDU系列(其他機型適配中)
      語音助手 1、、優化喚醒對話體驗,,對話更自然
      2、、、、優化語音角色,,,,對話聲音更大
      支持機型:G1全系產品
      網絡配置 1、、、、優化安全密鑰
      2、、優化配網速度
      3、、、優化錯誤提示
      支持機型:G1全系產品
      校時 支持PC1和PC2時間同步 支持機型:G1-EDU系列
      運控 1、、、、優化走跑運控模型,,,優化走跑速度 支持機型:G1全系產品
      2、、新增舞蹈運控,,,,配合背景音樂效果更佳,,部分舞蹈動作需要空間較大,,,,請預留足夠空間,,緊急情況請雙擊START中斷。。。。
      ① 機械舞1
      ② 機械舞3
      ③ 機械舞4
      ④ 芭蕾
      支持機型:G1-29dof(23dof適配中)
      最新按鍵貼紙:
      23dof:

      29dof:

      3、、、、新增倒地狀態下自適應起身 支持機型:G1全系產品
      導航 修覆已知缺陷 支持機型:G1全系產品
      來源文件:G1_011326.md
      Q

      G1 頭部出現嗡嗡的異響該怎樣處理

      異常現象與原因

      G1的頭部出現異常的震動,,,,聲音聽上去像是高頻震動的嗡嗡聲。。 這個問題的原因有兩種,,,,第一種是雷達工作時掃描原件有異常,,,發出較大噪聲。。。。第二種情況時頭部安裝雷達處由於在使用過程中的震動出現了輕微變形,,,導致頭部共振異響。。

      解決方法

      用戶可以拆除頭部頂蓋的 4 顆固定螺絲,,,,如下圖所示。。。。用 M3 六角螺絲刀取下頂蓋。。。 如果是第一種異常情況,,,,用戶可以使用電腦 ping 雷達的 ip 地址 192.168.123.120。。。。或者使用 ros2 或者 DDS 的方法查看是否有雷達的數據。。。。也可以使用手機 APP 中的建圖與導航功能,,,查看雷達是否能夠正常建圖並查看點雲數據。。。。 也可以斷開下圖紅框中的雷達接口,,查看噪聲是否依然存在。。。若判斷為雷達本身異常,,,,可以聯系售後工程師進行售後維修 如果是第二種異常情況,,,,用戶可以拆除下圖中的 3 顆雷達固定螺絲,,重新緊固安裝雷達,,查看噪音是否依然存在。。。

      如果經過以上方法進行故障排查,,,,頭部依然存在異響,,,,可以聯系售後技術支持進行進一步判斷。。。。

      來源文件:G1_011327.md
      Q

      G1 SP9軟件更新內容

      SP9版本更新說明

      Unitree Explore APP V1.9.3,,,固件包 V1.5.1 更新說明 本文主要介紹 整包 V1.5.1 相關更新內容 。。。。您需要在宇樹官網安裝最新版本APP(),,,通過APP推送信息,,,,點擊升級最新固件。。。。 ⚠️ 重要更新須知 - 升級前提:設備固件 V1.5.1 為增量升級包,,在安裝本次更新前,,,請確保您的設備固件版本已升級至 V1.4.5。。

      ✨ 更新亮點 - 亮點功能:本次更新重點優化了網絡配置、、運動控制、、增強了硬件生態的兼容性。。

      詳細更新日志

      1、、、、網絡與連接

      體驗升級:重構了網絡連接機制,,配網操作更加直觀便捷,,,,連接速度提升。。。。

      2、、、、運動控制與互動

      1、、、、⽹絡與連接 體驗升級:重構了⽹絡連接機制,,,配⽹操作更加直觀便捷,,,,連接速度提升。。 2. 新增動作:23自由度(23dof)機型解鎖全新技能包,,,新增查爾斯舞、、、、扭扭舞及截拳道等動作。。。 23 dof 遙控貼紙鏈接:

      3. 新增上肢動作緊急中斷按鍵,,雙擊down鍵,,,,可快速下放上肢動作。。。

      3、、、硬件生態拓展

      1. 靈巧手適配:適配宇樹自研 Dex2/5 腱繩靈巧手。。。
      2. 遙控器適配:適配宇樹新款 R3 遙控器(帶急停版)。。。
      來源文件:G1_011328.md
      Q

      G1 遙控器升級方法

      準備物料

      1、、、Unitree R3 遙控器 2、、Type C 數據線 3、、、、Windows 系統 PC 4、、遙控器固件更新包

      若您沒有遙控器固件更新包,,,可以聯系售後技術支持獲取

      操作方法

      連接遙控器

      使用 Type C 數據線將遙控器連接至個人 PC 。。。。

      安裝驅動

      進入遙控器升級固件包內,,選擇 206_CN 。。。。 安裝 CP210x 的串口驅動。。。 雙擊目錄中 CP210xVCPInstaller_x64.exe 這個驅動安裝引導。。根據安裝引導中的進行驅動安裝。。。。

      遙控升級

      打開固件包中的 R3_OTA_Remote_206_CN.exe 打開之後可以看到這個遙控器升級界面 如果遙控器正常連接,,,可以在串口連接處選擇對應的遙控器串口。。 點擊選擇之後,,,,即可點擊“固件更新”等待更新完成即可。。。。

      來源文件:G1_011329.md
      Q

      G1 UniStore無法綁定動作到機器人上

      問題現象

      在 UniStore 平台獲取動作之後無法將動作綁定至對應機器人。。

      問題原因以及解決方案

      1、、、用戶沒有在APP里面綁定連接機器人 2、、、、UniStore 和 Unitree Explore APP 登錄的宇樹賬號不是同一個 用戶需要保證 UniStore 里面的個人中心登陸的賬號和 Unitree Explore APP 中登錄的賬號是同一個宇樹賬號,,,,APP中綁定的機器人即會出現在 UniStore 平台中。。。。

      來源文件:G1_011332.md
      Q

      G1 SP10軟件更新內容

      SP10版本更新說明

      Unitree Explore APP V2.1.1,,,固件包 V1.5.3 更新說明 本文主要介紹 整包 V1.5.3 相關更新內容 。。。。您需要在宇樹官網安裝最新版本APP(),,通過APP推送信息,,,點擊升級最新固件。。 ⚠️ 重要更新須知 - 升級前提:設備固件 V1.5.3 為增量升級包,,,在安裝本次更新前,,請確保您的設備固件版本已升級至 V1.4.5。。。。

      詳細更新日志

      一、、核心體驗和生態升級 1. UniStore 安裝機制重構 針對網絡環境較差導致資源下載失敗的問題,,,,UniStore全面升級為異步安裝模式。。安裝過程中不再依賴實時聯網下載網絡資源,,,改為本地安裝完成後由後台自動更新資源。。。。

      1. 示教文件共享:用戶在單台設備上完成動作示教後,,可通過 APP 將示教文件一鍵上傳至APP並共享至其他設備。。。。

      2. 語音交互全面進化

      3. 交互手勢聯動:在語音交互過程中,,,機器人將自動配合自然的交互手勢。。。。
      4. 新增覆述模式:APP端支持一鍵進入覆述模式,,,,設備將一字不差地覆述用戶指令,,充當你的覆讀機。。

      5. 29自由度(29DOF)設備動作庫擴充:新增傳統舞、、機械舞、、熱身舞、、、、街舞、、、律動等五種全新舞蹈動作包,,,,進一步豐富了機器人的娛樂與展示能力。。。。 最新遙控器貼紙下載地址: 29dof:

      23dof:

      1. 開放了Dex2/5靈巧手控制接口:支持用戶通過 APP 進行靈活配置靈巧手開合。。。。

      2. 新增迎賓模式:開啟該模式後設備會一直循環跳迎賓舞,,雙擊START或者R1+R2+Y可停止。。。

      3. 導航服務資源策略調整:導航服務默認不開啟。。。二次開發的客戶需通過APP或者程序調用接口自行開啟導航服務。。

      二、、、、其他功能優化

      1. 細化設備內部的錯誤碼與日志系統優化,,,方便問題跟蹤定位。。
      2. 修覆了在網絡環境差的情況下升級失敗、、升級速度慢等問題,,,確保固件更新過程更加穩健。。。。
      3. 針對走跑運控過程中易出現的過熱問題進行了底層算法優化,,,提升了長時間高動態運動的可靠性。。。
      來源文件:G1_011333.md
      Q

      G1 Motor30-Motor34出現連接超時異常

      異常現象

      G1 機器人可以正常使用。。但連接 APP 之後出現 Motor 30 - Motor 34 電機PC鏈接超時的報錯,,故障截圖如下圖。。。

      異常原因

      造成這個異常的原因不是 G1 本身的電機有異常,,,是因為用戶在 Unitree Explore APP 錯誤的選擇了靈巧手配置,,,,但實際設備上沒有安裝對應的靈巧手設備。。。。導致機器人自檢沒有通過,,所以造成這個異常。。

      解決方法

      用戶只需要在 Unitree Explore APP 中關閉靈巧手的檢測即可消除這個報錯異常。。。首先在 APP 中連接機器人,,點擊首頁的【設備】。。。 進入設備選項之後,,,,點擊左側的外設配置。。。 如上圖所示,,,進入靈巧手配置。。。 彈出配置頁面之後,,將靈巧手的檢測配置選擇為關閉。。 選擇完成之後,,重啟設備是配置生效。。。。首頁的 Motor 30 - Motor 34 的異常報錯即可消除。。

      來源文件:G1_011334.md
      Q

      G1 1.5.4版本無法使用語音交互功能

      若您之前沒有使用過語音功能,,,,升級到1.5.4版本後需要重新激活。。。 設備連公網(WiFi模式)後,,遙控器按L1L2+R1R2+START,,,聽到語音激活提示後,,,,重啟即可。。。

      來源文件:G1_011335.md
      Q

      G1 輔助標定操作方法

      輔助標定

      G1 需要使用標定的方法重新標定電機的軟件上下限位。。。由於 G1 全身電機較多,,標準的標定姿勢比較難通過手動擺出。。。所以可以使用輔助標定,,,,輔助擺出標準的標定姿勢。。。。

      操作步驟

      連接機器人

      標定時不局限於 AP 模式或者 WiFi 模式連接,,,只要正常連接機器人即可。。

      進入標定

      進入機身信息,,下滑找到電機相關信息,,,,點擊全身標定。。。。

      標定操作

      第一步,,將 G1 機器人懸掛至離地狀態,,各關節電機保持正常狀態。。點擊第一步的下一步進行機器人初始化。。。。 第二步,,,點擊輔助標定進行輔助姿勢旋轉的確認,,,確認自動旋轉至標定位置。。。 此時 G1 會自行運動至標定姿勢,,,,姿勢會與下面這張照片一致。。 第三步,,手動旋轉大腿 Roll 關節至標準標定位置。。。。 如果不清楚這個步驟如何操作,,可以查看下方gif圖。。。

      需要將兩側大腿都翻轉至圖示限位!!!!

      第四步,,,完成標定

      來源文件:G1_011336.md
      Q

      如何查看G1系列序列號

      G1的序列號有兩種,,4位數的藍牙碼或者主板SN序列號。。

      藍牙碼

      藍牙碼可以在下列2個地方查看:電池倉內部產品標簽的左下角、、、app搜索頁面的編號 1. 1.電池倉內部產品標簽的左下角

      1. 2.app搜索頁面的編號

      SN序列號

      SN序列號可以在下列2個地方查看:電池倉內部產品標簽、、、App設備頁面 1. 1.電池倉內部產品標簽

      1. 2.App主頁-設備-機器人設置
      來源文件:G1_serialg1.md
      Step 2: User PC 通過以太網線,,,,跟設備的RJ45口連接, 詳見 《關於G1》 章節中的的電氣接口介紹,,即可進行通信調試。。 -->">
      Q

      g1_dbg

      您可以使用自己的 PC(Ubuntu系統)通過網線連接 G1 機身肩部的以太網口,,來建立 User PC 和 G1 之間的通訊。。。您的程序既可以部署再自己 PC 上,,也可以部署在 G1 自帶的二次開發板上,,,,通過 DDS 網絡控制 G1 運動。。

      Step 1:將 G1 固定在保護支架上,,確保支架底部四個萬向輪鎖死。。

      Step 2: User PC 通過以太網線,,,,跟設備的RJ45口連接, 詳見章節中的的電氣接口介紹,,即可進行通信調試。。

      來源文件:g1_dbg.md
      Q

      g1_err

      錯誤碼及其含義

      故障來源 錯誤碼 錯誤定義
      設備總狀態信息 0x1 上層控制命令錯誤
      0x2 下層反饋數據超時
      0x4 imu反饋數據超時
      0x8 電機反饋數據超時
      0x10 電池反饋數據超時
      0x20 宇樹實體遙控器反饋數據超時
      0x40 電池型號錯誤
      0x80 軟啟動錯誤
      0x100 電機狀態錯誤
      0x200 電機過流保護,,觸發低限位保護。。。
      0x400 電機欠壓保護,,,,觸發高限位保護
      0x800 電機過流保護,,,觸發高限位保護
      0x1000 軟急停開關被按下
      0x2000 SN錯誤
      0x4000 上層機型錯誤
      0x8000 下層機型錯誤
      0x10000 USB設備錯誤
      0x40000 胯部IMU數據超時
      0x80000 主板判斷電池欠壓保護錯誤
      0x100000 主板判斷電機欠壓保護錯誤
      電機狀態信息 0x1 過流
      0x2 瞬態過壓
      0x4 持續過壓
      0x8 瞬態欠壓
      0x10 芯片過熱
      0x20 MOS過熱/過冷
      0x40 MOS溫度異常
      0x80 殼體過熱/過冷
      0x100 殼體溫度異常
      0x200 繞組過熱
      0x400 轉子編碼器1錯誤
      0x800 轉子編碼器2錯誤
      0x1000 輸出編碼器錯誤
      0x2000 標定/BOOT數據錯誤
      0x4000 異常覆位
      0x8000 電機鎖定,,,,主控認證錯誤
      0x10000 芯片驗證錯誤
      0x20000 標定模式警告
      0x40000 通信校驗錯誤
      0x80000 驅動版本過低
      0x40000000 電機端判斷,,,PC連接超時
      0x80000000 PC端判讀,,電機斷聯超時
      來源文件:g1_err.md
      3. 進入 Gparted 界面後,,點擊右上角區域,,,切換至需要進行設置的磁盤(選擇已燒錄 G1 系統的磁盤),,操作如下所示: 4. 完成磁盤切換後,,可查看磁盤中剩餘的未使用空間,,,,如下圖所示: 5. 在`/dev/sdb1`上點擊鼠標右鍵,,,,選擇`Resize/Move`選項,,,如下圖所示: 6. 使用鼠標左鍵拖動對應下圖紅色區域至底部,,,,操作如下圖所示: 7. 拖動完成後,,,,界面狀態如下圖所示: 8. 點擊`Resize/Move`按鈕,,如下圖所示: 9. 出現如下界面後,,,點擊對號進行應用,,,,如下圖所示: 10. 在彈出的界面中,,,點擊`Apply`按鈕,,,如下圖所示: 11. 等待操作完成,,,,如下圖所示: 12. 操作完成後,,,,點擊`Close`按鈕,,,如下圖所示: 此時,,,G1 磁盤擴容操作已完成,,,,可在電腦端彈出該磁盤,,,隨後將其安裝到 G1 設備上即可使用。。。。 Jetson Orin NX系統恢覆後wifi啟用方法 注: g1_nx_Jetpack5.1.1_20250930.img.bz2 鏡像已經自帶wifi,,,,燒錄後不需要使用該方法進行wifi啟用。。。。 使用以下命令安裝所需軟件工具: sudo apt update sudo apt install dkms debhelper build-essential devscripts libncurses-dev flex bison libssl-dev 下載wifi驅動deb安裝包: [wifi驅動安裝包](https://doc-cdn.unitree.com/static/2025/7/15/ddb95296714c46b28c4bfc56415c25aa.zip) 下載完成解壓後,,,,可以看到`rtl8852bu-dkms_1.19.14_arm64.deb `文件。。。。 執行如下命令進行安裝: sudo dpkg -i ./rtl8852bu-dkms_1.19.14_arm64.deb **注意:wifi驅動的安裝過程較長,,請耐心等待,,,,大概20~30分鐘左右,,查看是否在運行,,可以通過如下命令:** sudo tail -f /var/lib/dkms/rtl8852bu/1.19.14/build/make.log 安裝完成後,,使用如下命令進行重啟: sudo reboot 重啟後,,,可以通過以下命令查看wifi驅動是否正常: ifconfig -a 運行上面命令,,出現以下內容,,,表明驅動安裝成功。。。 unitree@ubuntu:~$ ifconfig -a ... ... wlan0: flags=4098<BROADCAST,MULTICAST> mtu 1500 ether fc:23:cd:8f:6f:f3 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 對於深度相機接入NX開發版的EDU+設備,,Go界面無法預覽視頻流問題 !!! warning 檢查接線 目前發貨版本的G1 EDU+機器人默認已安裝相關服務,,,若看不到畫面,,,請確認脖子後方的USB-C線插入到肩部的Type-C接口上了。。。。 !!! 是由於NX版缺少必要的補丁文件,,需要將NX板升級必要的補丁文件,,,方法如下: #### 下載補丁文件 [NX系統補丁](https://oss-global-cdn.unitree.com/static/ad3297c5c9bb40368c3e0c9febefa375.zip) 1、、將壓縮包文件拷貝到Nx板,,,IP:192.168.123.164 用戶名:unitree 密碼:123 ``` scp ./g1plus_pc4_unitree_install.zip unitree@192.168.123.164:~/ 2、、ssh 登陸Nx板,,,IP:192.168.123.164 用戶名:unitree 密碼:123 ssh unitree@192.168.123.164 3、、切換到root權限,,,,密碼123 sudo su root 4、、、解壓g1plus_pc4_unitree_install.zip文件 unzip g1plus_pc4_unitree_install.zip 5、、、進入g1plus_pc4_unitree_install目錄,,,並執行install腳本 chmod -R 777 /home/unitree/g1plus_pc4_unitree_install cd /home/unitree/g1plus_pc4_unitree_install/ rm /unitree/ -rf ./install 6、、、驗證是否安裝成功,,通過PS命令查看master_service進程是否在線 ps -ef | grep "master_service" | grep -v grep 以上操作完成之後,,可以聯系技術支持同事升級 - Patch PC4和Video Hub PC4組件更新到最新 - 重啟設備 </blockquote> ## G1肩部板IO使用方法說明 ### G1-NX肩部板IO引腳說明
      GPIO編號功能
      --
      GPIO1UART_TXD
      GPIO2UART_RXD
      GPIO3I2C_SCL
      GPIO4I2C_SDA
      GPIO5GPIO
      GPIO6GPIO
      ### UART使用說明 串口參數:波特率9600,,數據位8位,,,,無校驗,,停止位1位。。 G1系統啟動後,,,,GPIO1和GPIO2被配置為UART功能,,,,可通過以下方法進行簡單使用: ```bash # 串口輸出 test echo "test" > /dev/ttyTHS0 # 查看串口接收到的數據 cat /dev/ttyTHS0 ### I2C使用說明 G1系統啟動後,,,GPIO3和GPIO4被配置為I2C功能。。 當I2C設備連接對應引腳後,,可以使用如下命令探測設備: root@ubuntu:/home/unitree# i2cdetect -y -r 0 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- ### GPIO使用說明 G1-NX系統啟動後,,,,GPIO5和GPIO6被配置為GPIO功能,,可通過以下方法進行使用: #### Sysfs接口控制GPIO **注意:** 使用時,,,使用以下命令切換到root: su root ##### 初始化使用GPIO 將GPIO從內核空間暴露到用戶空間: # 導出GPIO5(編號330) echo 330 > /sys/class/gpio/export # 導出GPIO6(編號331) echo 331 > /sys/class/gpio/export ##### 設置GPIO為輸出模式 用於控制外部設備,,,如LED、、、繼電器等: # GPIO5設為輸出 echo out > /sys/class/gpio/PCC.02/direction # GPIO6設為輸出 echo out > /sys/class/gpio/PCC.03/direction ##### 輸出模式下設置GPIO電平值 控制 GPIO 輸出高電平(3.3V)或低電平(0V): # GPIO5輸出高電平 echo 1 > /sys/class/gpio/PCC.02/value # GPIO5輸出低電平 echo 0 > /sys/class/gpio/PCC.02/value # GPIO6輸出高電平 echo 1 > /sys/class/gpio/PCC.03/value # GPIO6輸出低電平 echo 0 > /sys/class/gpio/PCC.03/value ##### 設置GPIO為輸入模式 如果需要將 GPIO 作為輸入使用,,,,使用如下方法: # 設置GPIO5為輸入模式 echo in > /sys/class/gpio/PCC.02/direction # 設置GPIO6為輸入模式 echo in > /sys/class/gpio/PCC.03/direction ##### 讀取輸入模式下的 GPIO 值 當 GPIO 設為輸入模式後,,,,可讀取外部輸入的電平: # 讀取GPIO5的輸入電平(0為低電平,,1為高電平) cat /sys/class/gpio/PCC.02/value # 讀取GPIO6的輸入電平 cat /sys/class/gpio/PCC.03/value ##### 查看 GPIO 當前方向(輸入 / 輸出) 檢查 GPIO 當前是輸入還是輸出模式: # 查看GPIO5的方向 cat /sys/class/gpio/PCC.02/direction # 查看GPIO6的方向 cat /sys/class/gpio/PCC.03/direction ##### 釋放GPIO 當不再使用GPIO時,,需要取消導出以釋放資源: # 取消導出GPIO5(對應編號330) echo 330 > /sys/class/gpio/unexport # 取消導出GPIO6(對應編號331) echo 331 > /sys/class/gpio/unexport #### Libgpiod控制GPIO 需要先連接網絡,,並安裝gpiod。。該方法不需要登錄root。。。。 ##### 準備工作 sudo apt install gpiod #### 映射關系 G1的GPIO對應Libgpio中的映射關系為:
      GPIOsysfsLibgpiod
      ---
      GPIO5PCC.02gpiochip 1 14
      GPIO6PCC.03gpiochip 1 15
      > G1一共有兩塊GPIO芯片,,,其中GPIO5、、、GPIO6在1號芯片上,,,,其餘在0號芯片上。。。可以通過`gpiodetect`查看當前有幾塊芯片及其名稱,,,,通過`gpioinfo [芯片號]`來查看對應芯片下的IO口映射名稱和狀態。。 ##### 輸出電平 Libgpiod會自動處理使能狀態,,,,通過命令`gpioseset gpiochip[芯片號] [引腳映射號]=[電平]`可以將GPIO引腳設置為輸出模式,,,並指定電平。。。 gpioseset gpiochip1 14=0 gpioseset gpiochip1 14=1 ##### 讀取電平 Libgpiod會自動處理使能狀態,,通過命令`gpioget gpiochip[芯片號] [引腳映射號]`可以將GPIO引腳設置為輸入模式,,,並讀取電平。。 gpioget gpiochip1 14 效果: ## 更多問題 更多問題,,,可參考[幫助中心](https://serviceconsole.unitree.com/#/help/HowtoUse)">
      Q

      g1_faq

      我如何獲得最新版本更新消息與內容

      您可以關注

      腰部固定件需要進行相應的軟件配置嗎????

      要的。。您可以參考:

      發現新補買的遙控器連不上機器人了。。

      您需要參考

      為什麼我的G1機器人無法跳舞

      請參考:

      怎麼和機器人進行智能對話呢??

      您可以參考:

      G1產品資料與開發資料在哪里獲取??

      您可以參考此處:

      G1自帶PC的IP、、、用戶名和密碼是多少??

      G1-EDU 機載標配 1 塊【運控計算單元】,,,並且標配一塊【開發計算單元】。。。。

      【運控計算單元】為 Unitree 運動控制程序專用,,,不對外開放。。。。開發者僅可使用【開發計算單元】進行二次開發。。。。

      在開發文檔或者技術支持過程中,,,【運控計算單元】會被表述為PC2,,,,相對的,,【運控計算單元】一般表述為PC1。。。。

      【開發計算單元】,,地址為 192.168.123.164,,,,用戶名:unitree,,密碼:123。。。

      ```

      ssh

      ssh unitree@192.168.123.164

      密碼123

      ```

      參數 運控計算單元(PC1) 開發計算單元(PC2)
      型號 不提供 Jetson Orin NX 16G,,,100TOPS
      CPU 8核CPU Arm® Cortex®-A78AE
      顯存 - 16G
      內存 - 16G
      存儲 - 2T
      IP地址 192.168.123.161 192.168.123.164
      用戶名 不開放 unitree
      密碼 不開放 123

      我無法連上G1內置的Jetson Orin NX了,,,怎麼辦???

      請參考

      如何選擇正確的URDF版本呢????

      請參考

      我的Jetson Orin NX內部沒有無線網卡,,,怎麼辦????

      請參考

      如何讓 G1的PC2在連接WiFi後,,優先使用WiFi網卡上網呢????

      您需要修改網卡的優先級。。。可以參考:

      如何讓G1播放音頻呢???

      請參考

      G1 是否支持拓展塢??

      不支持,,,edu版本會內置Jetson ORIN NX

      Jetson Orin Nx WIFI 配置方法

      ### AP模式: 1.借助create_ap進行ap模式的創建,倉庫地址:[https://gitcode.com/gh_mirrors/cr/create_ap.git](https://gitcode.com/gh_mirrors/cr/create_ap.git)
      git clone https://gitcode.com/gh_mirrors/cr/create_ap.git
      cd ./create_ap/
      make install
      
      2.安裝必要的軟件
      sudo apt install -y hostapd dnsmasq network-manager
      
      3.連接該wifi,,,wifi的名字是MyAccessPoint
      create_ap wlan0 eth0 MyAccessPoint
      
      具體的其他使用方式方法參考: [https://gitcode.com/gh_mirrors/cr/create_ap/overview?utm_source=csdn_github_accelerator&isLogin=1](https://gitcode.com/gh_mirrors/cr/create_ap/overview?utm_source=csdn_github_accelerator&isLogin=1) ### STA模式: #### wap_cli配置WIFI方式 STA模式是常見的配置WIFI的方式,,網上的教程很多,,,下面以wpa_cli為例 進入專用控制台,默認選擇wlan0
       wpa_cli
      
      1.添加網絡,,,,獲取網絡的ID號
          add_network
      
      2.經過第(1)後得到一個ID號,,,,假設ID號是1,然後連接你的wifi
       set_network  1  ssid  “your wifi name”
       ```
      3.設置連接的WIFI的密碼
      ```bash
          set_network  1  psk  “your wifi key”
       ```
      4.使能WIFI
      ```bash
      enable_network 1
      
      5.保存WIFI信息
      save_config
      
      6.查看wifi連接狀態
      status
      
      7.退出
      quit
      
      #### nmcli配置WIFI方式 部分用戶發現wpa_cli無法使用,,,可以使用nmcli方式配置WIFI上網。。 1. 使能 waln0
      sudo ifconfig wlan0 up
      
      2. 打開無線網卡
      sudo nmcli radio wifi on
      
      3. 查看wifi是否使能
      nmcli radio wifi
      
      4. 鏈接wifi
      nmcli device wifi connect <SSID> password <password>
      

      G1設備升級最新的固件≥1.3.0後,,,報關節限位異常,,瞬間過壓(Joint limt/Transient Over Voltage)

      新的固件版本優化了關節標定精度,,,,之前的標定有概率精度不滿足要求,,,需要重新標定。。。

      設備配置網絡時,,,,出現網絡WiFi配置失敗。。。

      此問題多跟無線環境有關,,,尤其時展會等場所,,,,無線環境比較覆雜,,,幹擾比較多。。。可以將G1設備帶到幹擾少一點的地方,,,嘗試網絡配置。。。。

      G1-29自由度設備,,解鎖腰部固定件(APP同步關閉鎖腰開關)之後,,報關節超限位錯誤。。。。

      原因:腰部兩個關節電機沒有標定。。。。
      解決方法:重新標定 ,,可參考標定視頻教程 [關節標定(29 自由度)](https://www.unitree.com/cn/app/g1) 標定時,,,,需要借助`腰部固定件`給腰部電機卡限位。。。同時APP端,,,**腰部電機鎖定開關**一定要設置為`關閉`狀態

      Jetson Orin NX系統恢覆方法

      鏡像恢覆流程可參考: [Go2 NX鏡像恢覆](https://support.unitree.com/home/zh/developer/module_update)
      # G1 NX出廠鏡像名稱:g1_nx_Jetpack5.1.1_20250930.img.bz2
      鏈接: https://pan.baidu.com/s/1GMs-DE8SSHYTSNIVKsoktw?pwd=7riu 提取碼: 7riu
      
      # G1 NX出廠鏡像歷史版本(不推薦)
      鏈接: https://pan.baidu.com/s/1yPnZ6hCGSEAlpht3YvNzAQ?pwd=1221 提取碼:1221
      
      1. 把鏡像燒寫到第一步的NVME存儲設備中,,執行如下命令:
      # g1_nx_Jetpack5.1.1_20250930.img.bz2 為鏡像名稱
      bzip2 -dc g1_nx_Jetpack5.1.1_20250930.img.bz2 | sudo dd of=/dev/sdc status=progress
      

      Jetson Orin NX系統恢覆後磁盤擴容方法

      燒錄系統後,,,存在識別到的磁盤容量變小的情況,,,,可以使用如下方法進行擴容。。。。 #### 前期準備 ##### 所需設備 1. 安裝有 Ubuntu 系統的電腦 2. NVME M.2移動硬盤盒 後續所有操作均在安裝有 Ubuntu 系統的電腦上進行。。。。 ##### 軟件安裝 使用以下命令安裝所需軟件:
      sudo apt update
      sudo apt-get install gparted
      
      #### 操作流程 1. 啟動 gparted 工具,,,執行如下命令:
      sudo gparted
      
      2. 彈出對話框後,,,選擇`fix`選項,,,操作如下圖所示: 3. 進入 Gparted 界面後,,點擊右上角區域,,,,切換至需要進行設置的磁盤(選擇已燒錄 G1 系統的磁盤),,操作如下所示: 4. 完成磁盤切換後,,,可查看磁盤中剩餘的未使用空間,,,,如下圖所示: 5. 在`/dev/sdb1`上點擊鼠標右鍵,,,選擇`Resize/Move`選項,,如下圖所示: 6. 使用鼠標左鍵拖動對應下圖紅色區域至底部,,,操作如下圖所示: 7. 拖動完成後,,界面狀態如下圖所示: 8. 點擊`Resize/Move`按鈕,,,如下圖所示: 9. 出現如下界面後,,,點擊對號進行應用,,,如下圖所示: 10. 在彈出的界面中,,點擊`Apply`按鈕,,,,如下圖所示: 11. 等待操作完成,,,如下圖所示: 12. 操作完成後,,點擊`Close`按鈕,,,,如下圖所示: 此時,,G1 磁盤擴容操作已完成,,,,可在電腦端彈出該磁盤,,隨後將其安裝到 G1 設備上即可使用。。

      Jetson Orin NX系統恢覆後wifi啟用方法

      注:g1_nx_Jetpack5.1.1_20250930.img.bz2鏡像已經自帶wifi,,,燒錄後不需要使用該方法進行wifi啟用。。。

      使用以下命令安裝所需軟件工具:
      sudo apt update
      sudo apt install dkms debhelper build-essential devscripts libncurses-dev flex bison libssl-dev
      
      下載wifi驅動deb安裝包: [wifi驅動安裝包](https://doc-cdn.unitree.com/static/2025/7/15/ddb95296714c46b28c4bfc56415c25aa.zip) 下載完成解壓後,,可以看到`rtl8852bu-dkms_1.19.14_arm64.deb `文件。。。。 執行如下命令進行安裝:
      sudo dpkg -i ./rtl8852bu-dkms_1.19.14_arm64.deb
      
      **注意:wifi驅動的安裝過程較長,,,請耐心等待,,,,大概20~30分鐘左右,,,查看是否在運行,,可以通過如下命令:**
      sudo tail -f /var/lib/dkms/rtl8852bu/1.19.14/build/make.log
      
      安裝完成後,,,使用如下命令進行重啟:
      sudo reboot
      
      重啟後,,,,可以通過以下命令查看wifi驅動是否正常:
      ifconfig -a
      
      運行上面命令,,,出現以下內容,,,表明驅動安裝成功。。。。
      unitree@ubuntu:~$ ifconfig -a
      ...
      ...
      wlan0: flags=4098<BROADCAST,MULTICAST>  mtu 1500
              ether fc:23:cd:8f:6f:f3  txqueuelen 1000  (Ethernet)
              RX packets 0  bytes 0 (0.0 B)
              RX errors 0  dropped 0  overruns 0  frame 0
              TX packets 0  bytes 0 (0.0 B)
              TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
      

      對於深度相機接入NX開發版的EDU+設備,,,,Go界面無法預覽視頻流問題

      !!! warning 檢查接線 目前發貨版本的G1 EDU+機器人默認已安裝相關服務,,若看不到畫面,,,請確認脖子後方的USB-C線插入到肩部的Type-C接口上了。。。。 !!!

      是由於NX版缺少必要的補丁文件,,,,需要將NX板升級必要的補丁文件,,,,方法如下: #### 下載補丁文件 [NX系統補丁](https://oss-global-cdn.unitree.com/static/ad3297c5c9bb40368c3e0c9febefa375.zip) 1、、將壓縮包文件拷貝到Nx板,,,IP:192.168.123.164 用戶名:unitree 密碼:123 ``` scp ./g1plus_pc4_unitree_install.zip unitree@192.168.123.164:~/
      
      2、、、ssh 登陸Nx板,,IP:192.168.123.164    用戶名:unitree   密碼:123
      
      
      ssh unitree@192.168.123.164
      
      3、、切換到root權限,,密碼123
      
      
      sudo su root
      
      4、、、解壓g1plus_pc4_unitree_install.zip文件
      
      
      unzip g1plus_pc4_unitree_install.zip
      
      
      5、、進入g1plus_pc4_unitree_install目錄,,並執行install腳本
      
      
      chmod -R 777 /home/unitree/g1plus_pc4_unitree_install cd /home/unitree/g1plus_pc4_unitree_install/ rm /unitree/ -rf ./install
      
      6、、、驗證是否安裝成功,,通過PS命令查看master_service進程是否在線
      
      
      ps -ef | grep "master_service" | grep -v grep
      
      以上操作完成之後,,可以聯系技術支持同事升級
      - Patch PC4和Video Hub PC4組件更新到最新
      - 重啟設備
      
      </blockquote>
      
      ## G1肩部板IO使用方法說明
      ### G1-NX肩部板IO引腳說明
      
      
      
      GPIO編號功能
      --
      GPIO1UART_TXD
      GPIO2UART_RXD
      GPIO3I2C_SCL
      GPIO4I2C_SDA
      GPIO5GPIO
      GPIO6GPIO
      ### UART使用說明 串口參數:波特率9600,,,,數據位8位,,,,無校驗,,,停止位1位。。。 G1系統啟動後,,,GPIO1和GPIO2被配置為UART功能,,,可通過以下方法進行簡單使用: ```bash # 串口輸出 test echo "test" > /dev/ttyTHS0 # 查看串口接收到的數據 cat /dev/ttyTHS0
      ### I2C使用說明 G1系統啟動後,,GPIO3和GPIO4被配置為I2C功能。。。 當I2C設備連接對應引腳後,,可以使用如下命令探測設備:
      root@ubuntu:/home/unitree# i2cdetect -y -r 0
           0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
      00:          -- -- -- -- -- -- -- -- -- -- -- -- --
      10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      70: -- -- -- -- -- -- -- --
      
      ### GPIO使用說明 G1-NX系統啟動後,,,,GPIO5和GPIO6被配置為GPIO功能,,,,可通過以下方法進行使用: #### Sysfs接口控制GPIO **注意:** 使用時,,,使用以下命令切換到root:
      su root
      
      ##### 初始化使用GPIO 將GPIO從內核空間暴露到用戶空間:
      # 導出GPIO5(編號330)
      echo 330 > /sys/class/gpio/export
      
      # 導出GPIO6(編號331)
      echo 331 > /sys/class/gpio/export
      
      ##### 設置GPIO為輸出模式 用於控制外部設備,,,,如LED、、、繼電器等:
      # GPIO5設為輸出
      echo out > /sys/class/gpio/PCC.02/direction
      
      # GPIO6設為輸出
      echo out > /sys/class/gpio/PCC.03/direction
      
      ##### 輸出模式下設置GPIO電平值 控制 GPIO 輸出高電平(3.3V)或低電平(0V):
      # GPIO5輸出高電平
      echo 1 > /sys/class/gpio/PCC.02/value
      
      # GPIO5輸出低電平
      echo 0 > /sys/class/gpio/PCC.02/value
      
      # GPIO6輸出高電平
      echo 1 > /sys/class/gpio/PCC.03/value
      
      # GPIO6輸出低電平
      echo 0 > /sys/class/gpio/PCC.03/value
      
      ##### 設置GPIO為輸入模式 如果需要將 GPIO 作為輸入使用,,,,使用如下方法:
      # 設置GPIO5為輸入模式
      echo in > /sys/class/gpio/PCC.02/direction
      
      # 設置GPIO6為輸入模式
      echo in > /sys/class/gpio/PCC.03/direction
      
      ##### 讀取輸入模式下的 GPIO 值 當 GPIO 設為輸入模式後,,,可讀取外部輸入的電平:
      # 讀取GPIO5的輸入電平(0為低電平,,,1為高電平)
      cat /sys/class/gpio/PCC.02/value
      
      # 讀取GPIO6的輸入電平
      cat /sys/class/gpio/PCC.03/value
      
      ##### 查看 GPIO 當前方向(輸入 / 輸出) 檢查 GPIO 當前是輸入還是輸出模式:
      # 查看GPIO5的方向
      cat /sys/class/gpio/PCC.02/direction
      
      # 查看GPIO6的方向
      cat /sys/class/gpio/PCC.03/direction
      
      ##### 釋放GPIO 當不再使用GPIO時,,,,需要取消導出以釋放資源:
      # 取消導出GPIO5(對應編號330)
      echo 330 > /sys/class/gpio/unexport
      
      # 取消導出GPIO6(對應編號331)
      echo 331 > /sys/class/gpio/unexport
      
      #### Libgpiod控制GPIO 需要先連接網絡,,,並安裝gpiod。。。該方法不需要登錄root。。 ##### 準備工作
      sudo apt install gpiod
      
      #### 映射關系 G1的GPIO對應Libgpio中的映射關系為:
      GPIOsysfsLibgpiod
      ---
      GPIO5PCC.02gpiochip 1 14
      GPIO6PCC.03gpiochip 1 15
      > G1一共有兩塊GPIO芯片,,,,其中GPIO5、、、、GPIO6在1號芯片上,,,其餘在0號芯片上。。。。可以通過`gpiodetect`查看當前有幾塊芯片及其名稱,,通過`gpioinfo [芯片號]`來查看對應芯片下的IO口映射名稱和狀態。。。 ##### 輸出電平 Libgpiod會自動處理使能狀態,,通過命令`gpioseset gpiochip[芯片號] [引腳映射號]=[電平]`可以將GPIO引腳設置為輸出模式,,,,並指定電平。。。。
      gpioseset gpiochip1 14=0
      gpioseset gpiochip1 14=1
      
      ##### 讀取電平 Libgpiod會自動處理使能狀態,,,通過命令`gpioget gpiochip[芯片號] [引腳映射號]`可以將GPIO引腳設置為輸入模式,,,並讀取電平。。。。
      gpioget gpiochip1 14
      
      效果: ## 更多問題 更多問題,,,,可參考[幫助中心](https://serviceconsole.unitree.com/#/help/HowtoUse)
      來源文件:g1_faq.md
      Q

      售後_R3遙控_02030201_手柄遙控器充電

      1.充電適配器要求

      遙控器推薦使用符合FCC/CE標準,,,,規格為5V/2A的USB充電器。。

      R3遙控器更新了充電功能,,,能夠支持絕大多數設備的Type-C充電器,,但是依然建議使用規格為5V/2A的充電器。。。。

      2.充電指示燈

      和充電相關的指示燈有三個,,,分別是PG、、、、ST和電量指示燈。。。。

      正常充電時:

      PG常亮,,表示充電口供電正常;

      ST燈暫時未使用;

      開關旁的電量指示燈指示電量情況。。。。

      來源文件:售後_R3遙控_02030201_手柄遙控器充電.md
      Q

      售後_R3遙控_02030202_常見充電故障

      常見充電故障

      1.使用快充充電器後無法充電

      可以嘗試使用符合FCC/CE標準,,,規格為5V/2A的USB充電器,,慢充一下試試。。。

      如果依然無法恢覆,,,,可以通過工單系統返廠檢修。。。。

      來源文件:售後_R3遙控_02030202_常見充電故障.md
      Q

      售後_R3遙控_02030203_打開關閉按鍵提示功能

      開關提示(聲音/震動)功能

      關閉提示(聲音/震動):快速按下F1按鈕3次,,,,關閉聲音/震動。。。

      開啟提示(聲音/震動):快速按下F1按鈕3次,,開啟聲音/震動。。。

      切換提示(聲音/震動)功能

      打開提示功能的情況下,,

      切換震動:快速按下F3按鈕3次,,,切換到震動模式。。。

      切換聲音:快速按下F3按鈕3次,,,切換到聲音模式。。

      來源文件:售後_R3遙控_02030203_打開關閉按鍵提示功能.md
      Q

      售後_R3遙控_02030204_找不到遙控器搖桿

      首次使用

      搖桿擺放在遙控器包裝盒里,,,首次打開時,,需要小心,,,,防止掉落遺失。。後續可以取下放在遙控器的收納槽里。。。

      平時使用

      搖桿收納在遙控器內部,,,使用時,,拉開遙控器,,,取出搖桿安裝即可。。。。

      如圖所示,,,用右手將遙控器平穩緩慢地拉出,,,取出收納槽中的2個搖桿,,,安裝到遙控器上即可。。

      來源文件:售後_R3遙控_02030204_找不到遙控器搖桿.md
      Q

      售後_R3遙控_02030206_遙控器搖桿校準

      遙控器搖桿校準

      遙控器開機後,,,機器人就開始亂跑或者亂扭,,可能是遙控器搖桿數據偏移,,,需要校準搖桿。。。

      搖桿校準方法:

      遙控器開機,,,手持遙控器但不要觸碰搖桿,,,同時按下遙控器上按鍵F1和F3並按住,,,,直到遙控器發出連續“嘀~嘀~”聲(1次/秒),,,松開按鍵,,,代表已進入校準模式。。。。進入校準模式後將左右搖桿打滿舵並旋轉數圈,,,,直至“嘀~嘀~”聲停止,,,此時校準就緒。。。單按F3一次使校準生效,,完成校準。。。。

      注意:校準遙桿時,,,,校準前請不要觸碰搖桿,,,進入校準模式才可以動搖桿。。校準後可通過APP查看校準後的搖桿狀態。。。

      來源文件:售後_R3遙控_02030206_遙控器搖桿校準.md
      Q

      售後_R3遙控_02030207_如何綁定新版遙控器

      1. 確認遙控器編號

      可以通過兩種方法確認遙控器編號。。。。

      一、、、、查看遙控器機身或背後的貼紙,,,,找到6位遙控器編號。。

      二、、、開啟遙控器。。。。使用App,,,,依次進入設備->遙控器狀態。。可在左側的“遙控器列表”搜索到周圍的遙控器。。

      1. 寫入遙控器編號

      使用App,,,依次進入設備->數據->遙控器綁定,,,,輸入剛才找到的遙控器編號。。。

      1. 遙控器配對

      長按遙控器上的SELECT按鍵3秒,,,,直到聽到連續的“滴”聲後松開。。等待遙控器右下角的DL指示燈變為常亮,,,,則配對成功。。。

      來源文件:售後_R3遙控_02030207_如何綁定新版遙控器.md
      Q

      如何獲取SLAM點雲地圖

      使用G1的建好圖後,,,,點雲地圖是保存在PC1上的,,,用戶可以通過訂閱話題的方式獲取地圖數據。。。全局地圖點雲數據話題:rt/unitree/slam_relocations/global_map,,該話題數據僅在開始定位後發送一次。。。。

      DDS數據類型:sensor_msgs::msg::dds_::PointCloud2_

      ROS2話題數據類型:sensor_msgs::msg::PointCloud2

      方法1:C++代碼(ROS2話題方式)

      主程序代碼:

      #include <rclcpp/rclcpp.hpp>
      #include <sensor_msgs/msg/point_cloud2.hpp>
      #include <pcl/point_cloud.h>
      #include <pcl/point_types.h>
      #include <pcl/conversions.h>
      #include <pcl_conversions/pcl_conversions.h>
      #include <pcl/io/pcd_io.h>
      #include <pcl/io/ply_io.h>
      #include <filesystem>
      #include <chrono>
      #include <iomanip>
      #include <sstream>
      #include <memory>
      
      #define TOPIC "/unitree/slam_relocations/global_map"  // G1全局地圖話題
      
      class GlobalMapSaver : public rclcpp::Node
      {
      public:
          GlobalMapSaver() : Node("global_map_saver"), received_(false)
          {
              // 創建保存目錄
              save_dir_ = "./global_maps";
              if (!std::filesystem::exists(save_dir_)) {
                  std::filesystem::create_directories(save_dir_);
              }
      
              // 創建訂閱者
              subscription_ = this->create_subscription<sensor_msgs::msg::PointCloud2>(
                  TOPIC,
                  10,
                  std::bind(&GlobalMapSaver::map_callback, this, std::placeholders::_1));
      
              RCLCPP_INFO(this->get_logger(), "等待接收全局地圖數據...");
          }
      
      private:
          void map_callback(const sensor_msgs::msg::PointCloud2::SharedPtr msg)
          {
              if (received_) {
                  return;
              }
      
              received_ = true;
              RCLCPP_INFO(this->get_logger(), "接收到全局地圖數據,,開始處理...");
              RCLCPP_INFO(this->get_logger(), "數據大小: %zu 字節", msg->data.size());
      
              try {
                  // 將ROS PointCloud2轉換為PCL點雲
                  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
                  pcl::fromROSMsg(*msg, *cloud);
      
                  RCLCPP_INFO(this->get_logger(), "提取到 %zu 個點", cloud->points.size());
      
                  if (cloud->points.empty()) {
                      RCLCPP_WARN(this->get_logger(), "點雲數據為空,,無法保存");
                      return;
                  }
      
                  // 移除NaN點
                  std::vector<int> indices;
                  pcl::removeNaNFromPointCloud(*cloud, *cloud, indices);
      
                  RCLCPP_INFO(this->get_logger(), "移除NaN後剩餘 %zu 個有效點", cloud->points.size());
      
                  if (cloud->points.empty()) {
                      RCLCPP_ERROR(this->get_logger(), "點雲數據全部為NaN,,,無法保存");
                      return;
                  }
      
                  // 生成時間戳文件名
                  auto now = std::chrono::system_clock::now();
                  auto time_t_now = std::chrono::system_clock::to_time_t(now);
                  std::stringstream ss;
                  ss << std::put_time(std::localtime(&time_t_now), "%Y%m%d_%H%M%S");
                  std::string timestamp = ss.str();
      
                  // 保存為PCD文件
                  std::string pcd_path = save_dir_ + "/global_map_" + timestamp + ".pcd";
                  if (pcl::io::savePCDFileBinary(pcd_path, *cloud) == 0) {
                      RCLCPP_INFO(this->get_logger(), "PCD文件保存成功: %s", pcd_path.c_str());
                  } else {
                      RCLCPP_ERROR(this->get_logger(), "PCD文件保存失敗: %s", pcd_path.c_str());
                  }
      
                  // 保存為PLY文件
                  std::string ply_path = save_dir_ + "/global_map_" + timestamp + ".ply";
                  if (pcl::io::savePLYFileBinary(ply_path, *cloud) == 0) {
                      RCLCPP_INFO(this->get_logger(), "PLY文件保存成功: %s", ply_path.c_str());
                  } else {
                      RCLCPP_ERROR(this->get_logger(), "PLY文件保存失敗: %s", ply_path.c_str());
                  }
      
                  // 計算點雲範圍
                  pcl::PointXYZ min_pt, max_pt;
                  pcl::getMinMax3D(*cloud, min_pt, max_pt);
      
                  RCLCPP_INFO(this->get_logger(), "點雲數量: %zu 個點", cloud->points.size());
                  RCLCPP_INFO(this->get_logger(), "點雲範圍: X[%.2f, %.2f], Y[%.2f, %.2f], Z[%.2f, %.2f]",
                             min_pt.x, max_pt.x, min_pt.y, max_pt.y, min_pt.z, max_pt.z);
      
              } catch (const std::exception& e) {
                  RCLCPP_ERROR(this->get_logger(), "處理點雲數據時出錯: %s", e.what());
              }
      
              RCLCPP_INFO(this->get_logger(), "處理完成");
              rclcpp::shutdown();
          }
      
          rclcpp::Subscription<sensor_msgs::msg::PointCloud2>::SharedPtr subscription_;
          std::string save_dir_;
          bool received_;
      };
      
      int main(int argc, char** argv)
      {
          rclcpp::init(argc, argv);
          auto node = std::make_shared<GlobalMapSaver>();
          rclcpp::spin(node);
          rclcpp::shutdown();
          return 0;
      }
      

      CMakeLists.txt 配置

      cmake_minimum_required(VERSION 3.8)
      project(global_map_saver)
      
      # 設置C++標準
      set(CMAKE_CXX_STANDARD 17)
      set(CMAKE_CXX_STANDARD_REQUIRED ON)
      
      # 查找依賴包
      find_package(ament_cmake REQUIRED)
      find_package(rclcpp REQUIRED)
      find_package(sensor_msgs REQUIRED)
      find_package(pcl_conversions REQUIRED)
      find_package(PCL 1.12 REQUIRED COMPONENTS common io)
      
      # 包含目錄
      include_directories(
        ${PCL_INCLUDE_DIRS}
        ${EIGEN3_INCLUDE_DIR}
      )
      
      # 添加可執行文件
      add_executable(global_map_saver src/global_map_saver.cpp)
      
      # 鏈接庫
      target_link_libraries(global_map_saver
        ${rclcpp_LIBRARIES}
        ${sensor_msgs_LIBRARIES}
        ${PCL_LIBRARIES}
      )
      
      # 安裝目標
      install(TARGETS global_map_saver
        DESTINATION lib/${PROJECT_NAME}
      )
      
      ament_package()
      

      package.xml 配置

      <?xml version="1.0"?>
      <?xml-model href="https://download.ros.org/schema/package_format3.xsd" schematypens="https://www.w3.org/2001/XMLSchema"?>
      <package format="3">
        <name>global_map_saver</name>
        <version>1.0.0</version>
        <description>Global Map Saver Node for LIO-SAM</description>
        <maintainer email="your-email@example.com">Your Name</maintainer>
        <license>Apache License 2.0</license>
      
        <buildtool_depend>ament_cmake</buildtool_depend>
      
        <depend>rclcpp</depend>
        <depend>sensor_msgs</depend>
        <depend>pcl_conversions</depend>
        <depend>pcl_msgs</depend>
      
        <build_depend>pcl_conversions</build_depend>
        <build_depend>libpcl-all-dev</build_depend>
      
        <exec_depend>pcl_conversions</exec_depend>
        <exec_depend>libpcl-all</exec_depend>
      
        <test_depend>ament_lint_auto</test_depend>
        <test_depend>ament_lint_common</test_depend>
      
        <export>
          <build_type>ament_cmake</build_type>
        </export>
      </package>
      

      編譯

      1.創建ROS2工作空間(如果還沒有):

      mkdir -p ~/ros2_ws/src
      cd ~/ros2_ws/src
      

      2.創建package並添加代碼:

      ros2 pkg create --build-type ament_cmake global_map_saver
      # 將上面的C++代碼保存為 src/global_map_saver.cpp
      # 將CMakeLists.txt和package.xml替換為上面的內容
      

      3.安裝PCL庫:

      sudo apt-get install libpcl-dev
      

      4.編譯:

      cd ~/ros2_ws
      colcon build --packages-select global_map_saver
      source install/setup.bash
      

      使用方法

      1.運行保存腳本:

      ```bash
      export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
      ros2 run global_map_saver global_map_saver
      ```
      

      2.開啟定位,,,,使用SLAM導航服務接口開啟定位

      3.等待數據接收:腳本會一直等待直到接收到全局地圖數據

      4.自動保存並退出:接收到數據後會自動保存並關閉

      方法2:Python腳本(ROS2話題方式)

      創建 save_global_map.py:

      import rclpy
      from rclpy.node import Node
      from sensor_msgs.msg import PointCloud2
      import numpy as np
      import open3d as o3d
      import os
      from datetime import datetime
      
      TOPIC = '/unitree/slam_relocations/global_map'  # G1全局地圖話題
      
      class GlobalMapSaver(Node):
          def __init__(self):
              super().__init__('global_map_saver')
      
              self.save_dir = './global_maps'
              self.received = False
              os.makedirs(self.save_dir, exist_ok=True)
      
              self.subscription = self.create_subscription(
                  PointCloud2,
                  TOPIC,
                  self.map_callback,
                  10)
      
              self.get_logger().info('等待接收全局地圖數據...')
      
          def pointcloud2_to_array(self, cloud_msg):
              """將PointCloud2消息轉換為numpy數組"""
              # 獲取點雲的字段信息
              fmt = []
              offset = 0
              for field in cloud_msg.fields:
                  if field.name in ['x', 'y', 'z']:
                      fmt.append(('x', np.float32, offset))
                      fmt.append(('y', np.float32, offset + 4))
                      fmt.append(('z', np.float32, offset + 8))
                      break
                  offset += field.count * np.dtype(np.float32).itemsize
      
              # 將數據轉換為numpy數組
              cloud_arr = np.frombuffer(cloud_msg.data, dtype=np.float32)
      
              # 重新組織數組形狀
              num_points = cloud_msg.width * cloud_msg.height
              cloud_arr = cloud_arr.reshape(num_points, -1)
      
              # 提取xyz坐標(通常是前3列)
              points = cloud_arr[:, :3]
      
              # 移除NaN值
              points = points[~np.any(np.isnan(points), axis=1)]
      
              return points
      
          def map_callback(self, msg):
              if self.received:
                  return
      
              self.received = True
              self.get_logger().info('接收到全局地圖數據,,開始處理...')
              self.get_logger().info(f'數據大小: {len(msg.data)} 字節')
      
              try:
                  # 方法1:使用自定義轉換
                  points_array = self.pointcloud2_to_array(msg)
      
                  self.get_logger().info(f'提取到 {len(points_array)} 個有效點')
      
                  if len(points_array) == 0:
                      self.get_logger().warning('未找到有效點,,,嘗試備用方法...')
                      # 備用方法:直接解析數據
                      import struct
                      point_step = msg.point_step
                      points_list = []
      
                      for i in range(0, len(msg.data), point_step):
                          try:
                              x, y, z = struct.unpack_from('fff', msg.data, i)
                              if not (np.isnan(x) or np.isnan(y) or np.isnan(z)):
                                  points_list.append([x, y, z])
                          except:
                              continue
      
                      points_array = np.array(points_list, dtype=np.float32)
                      self.get_logger().info(f'備用方法提取到 {len(points_array)} 個點')
      
                  if len(points_array) == 0:
                      self.get_logger().error('點雲數據為空,,,,無法保存')
                      return
      
                  # 創建並保存點雲
                  pcd = o3d.geometry.PointCloud()
                  pcd.points = o3d.utility.Vector3dVector(points_array)
      
                  timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
      
                  # 保存為PCD
                  pcd_path = os.path.join(self.save_dir, f"global_map_{timestamp}.pcd")
                  o3d.io.write_point_cloud(pcd_path, pcd)
      
                  # 保存為PLY
                  ply_path = os.path.join(self.save_dir, f"global_map_{timestamp}.ply")
                  o3d.io.write_point_cloud(ply_path, pcd)
      
                  self.get_logger().info(f'全局地圖已保存:')
                  self.get_logger().info(f'  PCD格式: {pcd_path}')
                  self.get_logger().info(f'  PLY格式: {ply_path}')
                  self.get_logger().info(f'  點雲數量: {len(points_array)} 個點')
      
                  # 顯示點雲範圍
                  min_coords = np.min(points_array, axis=0)
                  max_coords = np.max(points_array, axis=0)
                  self.get_logger().info(f'  點雲範圍: X[{min_coords[0]:.2f}, {max_coords[0]:.2f}], '
                                        f'Y[{min_coords[1]:.2f}, {max_coords[1]:.2f}], '
                                        f'Z[{min_coords[2]:.2f}, {max_coords[2]:.2f}]')
      
              except Exception as e:
                  self.get_logger().error(f'處理點雲數據時出錯: {str(e)}')
                  import traceback
                  self.get_logger().error(traceback.format_exc())
      
              self.get_logger().info('處理完成')
              rclpy.shutdown()
      
      def main():
          rclpy.init()
          map_saver = GlobalMapSaver()
          rclpy.spin(map_saver)
      
      if __name__ == '__main__':
          main()
      

      安裝依賴

      # 安裝必要的Python包
      pip install open3d
      

      使用方法

      1.運行保存腳本:

      export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
      python3 save_global_map.py
      

      2.開啟定位,,,使用SLAM導航服務接口開啟定位 3.等待數據接收:腳本會一直等待直到接收到全局地圖數據 4.自動保存並退出:接收到數據後會自動保存並關閉

      驗證保存的文件

      # 使用pcl_viewer查看保存的點雲(如果安裝了PCL工具)
      pcl_viewer global_map_*.pcd
      
      來源文件:開發幫助_03060701.md
      Q

      如何進行建圖和導航

      獲取 SLAM導航服務接口 例程

      從以上文檔的 五、、、按鍵例程demo功能測試 中下載 unitree_slam_example

      按照教程編譯並運行 keyDemo 程序

      keyDemo 使用方法

      1. 將網段為123的網卡名稱作為輸入參數,,運行 keyDemo 程序,,輸出如上圖;

      2. 按下q鍵,,程序開啟建圖,,,,在建圖開始前需大致記下建圖起始位置和朝向;

      3. 遙控機器人走到需要建圖的區域,,,遙控時請控制機器人行走速度和轉彎速度不要太快,,,,盡量多走一遍建圖區域,,,,最後返回起點位置;

      4. 按下w鍵,,結束建圖;

      5. 遙控機器人至建圖起始位置,,按下a按鍵進行定位;

      6. 按下s鍵將起始點作為第一個導航拓撲點,,然後遙控機器人至其他導航點的位置,,,達到後按下s鍵,,依次采集所有的導航拓撲點信息;

      7. 遙控機器人至建圖起始位置,,,按下d鍵開啟自動導航。。。在機器人行走過程中,,可通過按鍵zx進行暫停和恢覆;

      8. 導航期間若使用遙控器介入控制,,,將會自動暫停導航,,,,並在輸出提示 Task interrupted.;

      9. 導航期間若機器人遇到障礙物無法通行會自動停障,,,,並輸出提示 There are obstacles nearby, please be careful;

      10. 可通過按下f鍵清空導航拓撲點信息,,,,重新進行采集導航拓撲點信息。。。

      使用 Rviz2 可視化建圖和導航過程

      按下q鍵,,程序開啟建圖後,,,,另外建立一個終端運行 rviz2,,,打開配置文件 /unitree/module/unitree_slam/rviz2/mapping.rviz,,可以對建圖過程進行可視化:

      建完圖回到建圖起始位置後,,按下a鍵進行定位,,,另外建立一個終端運行 rviz2,,打開配置文件 /unitree/module/unitree_slam/rviz2/relocations.rviz,,,可以對導航過程進行可視化:

      來源文件:開發幫助_03060702.md
      Q

      Python版SLAM導航服務接口

      !!! note 注意 使用前需先安裝最新的 !!!

      Python版SLAM導航服務接口代碼 g1_slam_client.py:

      import json
      from unitree_sdk2py.rpc.client import Client
      
      """
      " service name
      """
      SLAM_SERVICE_NAME = "slam_operate"
      
      """
      " service api version
      """
      SLAM_API_VERSION = "1.0.0.1"
      
      """
      " api id
      """
      ROBOT_API_ID_STOP_NODE = 1901
      ROBOT_API_ID_START_MAPPING_PL = 1801
      ROBOT_API_ID_END_MAPPING_PL = 1802
      ROBOT_API_ID_START_RElocations_PL = 1804
      ROBOT_API_ID_POSE_NAV_PL = 1102
      ROBOT_API_ID_PAUSE_NAV = 1201
      ROBOT_API_ID_RESUME_NAV = 1202
      
      """
      " class SlamClient
      """
      class SlamClient(Client):
          def __init__(self):
              super().__init__(SLAM_SERVICE_NAME, False)
      
          def Init(self):
              # set api version
              self._SetApiVerson(SLAM_API_VERSION)
      
              # regist api
              self._RegistApi(ROBOT_API_ID_STOP_NODE, 0)
              self._RegistApi(ROBOT_API_ID_START_MAPPING_PL, 0)
              self._RegistApi(ROBOT_API_ID_END_MAPPING_PL, 0)
              self._RegistApi(ROBOT_API_ID_START_RElocations_PL, 0)
              self._RegistApi(ROBOT_API_ID_POSE_NAV_PL, 0)
              self._RegistApi(ROBOT_API_ID_PAUSE_NAV, 0)
              self._RegistApi(ROBOT_API_ID_RESUME_NAV, 0)
      
          # 1901
          def stop_slam(self):
              p = {"data": {}} # Fixed data content
              parameter = json.dumps(p)
              code, data = self._Call(ROBOT_API_ID_STOP_NODE, parameter)
              return code, data
      
          # 1801
          def start_mapping(self):
              p = {"data": {"slam_type": "indoor"}} # Fixed data content
              parameter = json.dumps(p)
              code, data = self._Call(ROBOT_API_ID_START_MAPPING_PL, parameter)
              return code, data
      
          # 1802
          def end_mapping(self, pcd_name: str='test'):
              p = {"data": {"address": f"/home/unitree/{pcd_name}.pcd"}} # address:pcd file save address
              parameter = json.dumps(p)
              code, data = self._Call(ROBOT_API_ID_END_MAPPING_PL, parameter)
              return code, data
      
          # 1804
          def start_relocations(self, pcd_name: str='test', pose: dict=None):
              p = {
                  "data": {
                      "x": 0.0,
                      "y": 0.0,
                      "z": 0.0,
                      "q_x": 0.0,
                      "q_y": 0.0,
                      "q_z": 0.0,
                      "q_w": 1.0,
                      "address": f"/home/unitree/{pcd_name}.pcd",
                  }
              }
              if pose is not None:
                  p["data"].update(pose)
              # x/y/z/q_x/q_y/q_z/q_w: Initialize pose information
              # address: pcd file reading address
              parameter = json.dumps(p)
              code, data = self._Call(ROBOT_API_ID_START_RElocations_PL, parameter)
              return code, data
      
          # 1201
          def pause_navigation(self):
              p = {"data": {}} # Fixed data content
              parameter = json.dumps(p)
              code, data = self._Call(ROBOT_API_ID_PAUSE_NAV, parameter)
              return code, data
      
          # 1202
          def resume_navigation(self):
              p = {"data": {}} # Fixed data content
              parameter = json.dumps(p)
              code, data = self._Call(ROBOT_API_ID_RESUME_NAV, parameter)
              return code, data
      
          # 1102
          def pose_navigation(self, pose: dict):
              parameter = json.dumps(pose)
              code, data = self._Call(ROBOT_API_ID_POSE_NAV_PL, parameter)
              return code, data
      

      使用SLAM導航接口例程 key_demo.py:

      from g1_slam_client import SlamClient
      from unitree_sdk2py.core.channel import ChannelFactoryInitialize, ChannelSubscriber
      from unitree_sdk2py.idl.std_msgs.msg.dds_._String_ import String_
      import threading
      import json
      import sys
      import time
      
      SLAM_INFO_TOPIC = "rt/slam_info"
      SLAM_KEY_INFO_TOPIC = "rt/slam_key_info"
      
      class SlamDemo():
          def __init__(self, network_interface):
              ChannelFactoryInitialize(0, network_interface)
              self.slam_client = SlamClient()
              self.slam_client.SetTimeout(10.0)
              self.slam_client.Init()
      
              self.slam_info_subscriber = ChannelSubscriber(SLAM_INFO_TOPIC, String_)
              self.slam_info_subscriber.Init(self.slam_info_callback, 10)
      
              self.slam_key_info_subscriber = ChannelSubscriber(SLAM_KEY_INFO_TOPIC, String_)
              self.slam_key_info_subscriber.Init(self.slam_key_info_callback, 10)
      
              self.slam_info: String_ = None
              self.slam_key_info: String_ = None
      
              self.current_pose = None
              self.pose_list = []
              self.is_running = False
              self.thread_control = False
              self.is_arrived = False
      
              print("***********************  Unitree SLAM Demo ***********************")
              print("---------------            q    w                -----------------")
              print("---------------            a    s   d   f        -----------------")
              print("---------------            z    x                -----------------")
              print("------------------------------------------------------------------")
              print("------------------ q: Start mapping            -------------------")
              print("------------------ w: End mapping              -------------------")
              print("------------------ a: Start relocations         -------------------")
              print("------------------ s: Add pose to task list    -------------------")
              print("------------------ d: Execute task list        -------------------")
              print("------------------ f: Clear task list          -------------------")
              print("------------------ z: Pause navigation         -------------------")
              print("------------------ x: Resume navigation        -------------------")
              print("---------------- Press any other key to stop SLAM ----------------")
              print("------------------------------------------------------------------")
              print("------------------------------------------------------------------")
              print("--------------- Press 'Ctrl + C' to exit the program -------------")
              print("------------------------------------------------------------------")
              print("------------------------------------------------------------------")
      
          def slam_info_callback(self, msg: String_):
              self.slam_info = json.loads(msg.data)
      
              if self.slam_info['errorCode'] != 0:
                  print(f"\033[33m{self.slam_info['info']}\033[0m")
                  return
      
              if self.slam_info['type'] == 'pos_info':
                  self.current_pose = {
                      "x": self.slam_info['data']['currentPose']['x'],
                      "y": self.slam_info['data']['currentPose']['y'],
                      "z": self.slam_info['data']['currentPose']['z'],
                      "q_x": self.slam_info['data']['currentPose']['q_x'],
                      "q_y": self.slam_info['data']['currentPose']['q_y'],
                      "q_z": self.slam_info['data']['currentPose']['q_z'],
                      "q_w": self.slam_info['data']['currentPose']['q_w'],
                  }
      
          def slam_key_info_callback(self, msg: String_):
              self.key_info = json.loads(msg.data)
      
              # errorCode
              if self.key_info['errorCode'] != 0:
                  print(f"\033[33m{self.key_info['info']}\033[0m")
                  return
      
              # task_result
              if self.key_info['type'] == 'task_result':
                  self.is_arrived = self.key_info['data']['is_arrived']
                  if self.is_arrived:
                      print(f'I arrived {self.key_info["data"]["targetNodeName"]}.')
                  else:
                      print(f'I not arrived {self.key_info["data"]["targetNodeName"]}. Please help me!!!')
      
          def task_loop(self):
              self.thread_control = True
              print(f"Starting task execution with {len(self.pose_list)} poses.")
              for idx, pose in enumerate(self.pose_list):
                  print(f"Navigating to pose {idx + 1}/{len(self.pose_list)}: {pose}")
                  self.is_arrived = False
                  code, data = self.slam_client.pose_navigation({
                      "data": {
                          "targetPose": pose,
                          "mode": 1  #固定值
                      }
                  })
                  print(f"Pose navigation command sent. Return code: {code}, data: {data}")
      
                  while not self.is_arrived:
                      time.sleep(0.1)
                      if not self.thread_control:
                          break
      
              print("Task execution completed.")
              self.thread_control = False
      
          def key_execute(self):
              self.is_running = True
              while self.is_running:
                  current_key = input("Press a key to control SLAM: ")
                  if current_key == 'q':  # Start mapping
                      ret = self.slam_client.start_mapping()
                      print(f"Start mapping command sent. Return code: {ret}")
                  elif current_key == 'w':  # End mapping
                      ret = self.slam_client.end_mapping(pcd_name='test1')
                      print(f"End mapping command sent. Return code: {ret}")
                  elif current_key == 'a':  # Start relocations
                      ret = self.slam_client.start_relocations(pcd_name='test1')
                      print(f"Start relocations command sent. Return code: {ret}")
                  elif current_key == 's':  # Add pose to task list
                      self.pose_list.append(self.current_pose.copy())
                      print(f"Pose added to task list. Total poses: {len(self.pose_list)}")
                  elif current_key == 'd':  # Execute task list
                      threading.Thread(target=self.task_loop, daemon=True).start()
                  elif current_key == 'f':  # Clear task list
                      self.pose_list.clear()
                      print("Task list cleared.")
                  elif current_key == 'z':  # Pause navigation
                      ret = self.slam_client.pause_navigation()
                      print(f"Pause navigation command sent. Return code: {ret}")
                  elif current_key == 'x':  # Resume navigation
                      ret = self.slam_client.resume_navigation()
                      print(f"Resume navigation command sent. Return code: {ret}")
                  else:  # Stop SLAM
                      self.thread_control = False
                      ret = self.slam_client.stop_slam()
                      print(f"SLAM stopped. Return code: {ret}")
      
      
      if __name__ == '__main__':
          if len(sys.argv) < 2:
              print("Usage: python3 key_demo.py <網卡名,,如 eth0>")
              sys.exit(1)
      
          key_demo = SlamDemo(sys.argv[1])
      
          try:
              key_demo.key_execute()
          except KeyboardInterrupt:
              key_demo.is_running = False
              print("\nExiting program.")
      

      key_demo.py 代碼使用方法:

      1、、、、運行 key_demo.py

      python3 key_demo.py eth0 # eth0請改為實際連接機器人的網口名
      

      2、、、、按下q鍵,,,程序開啟建圖,,在建圖開始前需大致記下建圖起始位置和朝向;

      3、、遙控機器人走到需要建圖的區域,,遙控時請控制機器人行走速度和轉彎速度不要太快,,,盡量多走一遍建圖區域,,最後返回起點位置;

      4、、按下w鍵,,,,結束建圖;

      5、、遙控機器人至建圖起始位置,,按下a按鍵進行定位;

      6、、、按下s鍵將起始點作為第一個導航拓撲點,,然後遙控機器人至其他導航點的位置,,,達到後按下s鍵,,依次采集所有的導航拓撲點信息;

      7、、、遙控機器人至建圖起始位置,,,,按下d鍵開啟自動導航。。在機器人行走過程中,,,可通過按鍵zx進行暫停和恢覆;

      8、、、、導航期間若使用遙控器介入控制,,,將會自動暫停導航,,,並在輸出黃字提示 Task interrupted.;

      9、、、導航期間若機器人遇到障礙物無法通行會自動停障,,並輸出黃字提示 There are obstacles nearby, please be careful;

      10、、、可通過按下f鍵清空導航拓撲點信息,,,,重新進行采集導航拓撲點信息。。。

      來源文件:開發幫助_03060703.md
      Q

      G1產品資料&開發資料

      手冊、、、、說明書

      • G1 說明書(App下載頁面最下面):

      • G1 教學視頻(App下載頁面下面):

      • G1 開發文檔:

      • G1 腰部固定件使用說明:

      • G1-Edu 用戶開發單元資料: 開發文檔 - 關於G1 - 電氣接口:

      開發文檔 - 關於G1 - 機載計算機:

      • G1 末端假手、、、靈巧手拆裝手冊(App下載頁面最下面):

      模型、、、圖紙

      • G1 三維簡化模型(開發文檔 - 應用開發 - 獲取SDK):

      • G1 URDF: G1 URDF 版本選擇:

      • G1 機身安裝孔位(開發文檔 - 關於G1 - 安裝孔位):

      • G1 末端圖紙、、、模型、、、裝配示意: G1基礎版&標準版末端圖紙: G1進階版末端圖紙: G1旗艦版A&B末端圖紙: G1旗艦版C末端圖紙:

      來源文件:開發幫助_031301.md
      Q

      G1自帶板卡的IP、、、、用戶名和密碼是多少???

      G1-EDU 機載標配 1 塊【運控計算單元】,,,,並且標配一塊【開發計算單元】。。

      【運控計算單元】為 Unitree 運動控制程序專用,,不對外開放。。。。開發者僅可使用【開發計算單元】進行二次開發。。

      在開發文檔或者技術支持過程中,,,,【運控計算單元】會被表述為PC2,,相對的,,【運控計算單元】一般表述為PC1。。

      【開發計算單元】,,,地址為 192.168.123.164,,,,用戶名:unitree,,,密碼:123。。

      ```

      ssh

      ssh unitree@192.168.123.164

      密碼123

      ```

      參數 運控計算單元(PC1) 開發計算單元(PC2)
      型號 不提供 Jetson Orin NX 16G,,,,100TOPS
      CPU 8核CPU Arm® Cortex®-A78AE
      顯存 - 16G
      內存 - 16G
      存儲 - 2T
      IP地址 192.168.123.161 192.168.123.164
      用戶名 不開放 unitree
      密碼 不開放 123
      來源文件:開發幫助_031302.md
      Q

      G1開發計算單元內置WiFi打開方法

      G1內置的開發計算單元(Orin NX,,,192.168.123.164)配置了WiFi模塊,,,但是出廠默認關閉了。。。如果要使用WiFi模塊,,,,需要通過連接顯示器設置一下打開,,,,具體步驟如下:

      連接顯示器

      G1的9號Type-C口具備DP功能,,可以連接DP顯示器或者通過轉換器連接HDMI顯示器。。。。

      顯示桌面以後,,,輸入密碼進入系統。。

      推薦使用綠聯科技,,,CM475 型號 Type-C 轉 HDMI。。 務必使用直連顯示器的方式,,,不要使用NoMachine等遠程桌面,,,,權限不夠,,,無法操作。。

      關閉飛行模式,,,,打開WiFi

      打開系統設置,,選擇WiFi設置,,,,先關閉飛行模式(Airplane Mode),,,,然後再打開WiFi功能。。

      連接搜索到的WiFi,,,,連接使用

      正常情況下就可以搜索到附近的WiFi信號了,,選擇對應的,,,,輸入密碼即可連接。。

      來源文件:開發幫助_031303.md
      Q

      開發PC連接失敗速查手冊

      開發PC連接失敗速查手冊-G1

      本手冊適用於G1能夠正常站立與使用,,僅連不上開發PC(PC2)的情況。。

      確認型號

      ⚠️您需要確定您的機器是否支持二次開發。。。滿足以下條件之一,,視為可開發。。。(數據更新至2025年6月6日,,,請以最新推出的版本為準)

      • App界面-設備-機器人設置中,,,,“型號”為G1_EDU或者G1_EDU+的。。。。
      • 存在192.168.123.164設備,,,,可以ping到該設備。。。
      • 安裝有帶電機/舵機的靈巧手,,,,比如Dex3或者因時(Inspire),,,,而非塑料手。。。。
      • 後頸部或者頭部側面有單獨的USB-C接出。。。。

      確認連接目標

      PC2的IP地址是192.168.123.164,,支持連接後頸位置的RJ45接口後,,通過SSH連接。。未進行其他設置的情況下,,僅支持此種連接方法。。。。⚠️PC1(192.168.123.161)不支持連接。。

      注意:⚠️無法通過機器人機身創建的熱點(G1_)連接。。。。機器人機身創建的熱點來自於運控單元PC1上的無線網卡,,,,僅供App在AP模式下進行通訊使用。。。。

      在PC2上運行nomachine服務,,,,您就可以以GUI的模式接入。。。您也可以控制PC2上的無線網卡主動連接WiFi後進行無線SSH/Nomachine登錄。。。不支持遠程調用DDS、、、、Python與ROS2接口。。。

      如果您方才給PC2刷過系統,,,,請嘗試連接192.168.123.18。。。。


      📷以下的步驟,,,請在執行時保留操作時的圖片/屏幕截圖。。方便提供技術支持進行研判。。

      網絡環境自檢

      請嚴格按照的內容進行設置,,保證您的開發PC IP地址為192.168.123.***,,禁止采用161、、、164、、、120、、20、、、18等已經或可能被占用的地址。。。您若不知道如何選取,,,請選擇222。。。

      嘗試使用終端ping 192.168.123.161(PC1),,,確認您已經加入了G1的內部子網(192.168.123.0/24)。。。以非有線方式接入PC2不視為接入內部子網,,即使您將IP設置為123網段。。。

      若保證連接正確,,,設置正確,,,但無法連接PC1,,,,判斷為接口板損壞。。✍️請填寫維修工單,,,將您的網絡設置、、、ping記錄提交給技術支持。。

      確認網絡環境無問題,,PC1可以ping通,,但PC2無法連接,,,,請繼續。。。。⏬

      確認PC2硬件情況

      您可以通過以下方法確認PC2硬件狀態。。特別適用於當機器人遭到嚴重撞擊後突然無法與PC2通信的場合。。

      • 機器人頸部的USB-C口連接PC2。。。將一些依賴USB-C供電的設備插入USB口,,可以檢測PC2的基礎電路是否正常。。。您可以嘗試所有USB-C接口,,,來避免USB-C單個損壞的情況。。
      • 若所有USB-C接口均無供電,,,涉及硬件損壞,,,請前往工單系統提交維修工單,,,,向技術支持工程師提交您的情況。。
      • 若您處於不方便進行寄修的服務區域(海外),,,您可以進一步進行排查,,,以便為您發送備件。。。。拆開機器人後蓋,,您可以在明顯位置看到一個USB-C接口處於位於上部分的電路板附近。。。。檢測此處的USB-C口是否有供電。。

      若PC2硬件損壞,,,,✍️請填寫維修工單。。

      若PC硬件無問題,,,,請繼續。。⏬

      確認PC2的內部系統是否啟動

      您可以通過以下方法確認PC2的內部系統是否啟動。。。特別適用於機器人在某些設置(設置網絡、、、刷寫系統)後突然無法連接的情況。。。

      • 首先使用ping確認164是否可用。。。。若不可用,,,,說明PC2未連接到交換機,,,或者IP設置錯誤。。。。
      • 如果可以ping到,,請再次檢查用戶名密碼(用戶名:unitree 密碼:123)
        • 如果您與第三方的二次開發商合作,,請與開發商溝通賬戶密碼事宜。。。
        • 仍然登錄失敗,,,請您轉到刷寫系統部分。。
      • 對於刷寫過系統的情況,,,,請嘗試ssh進入192.168.123.18。。。
      • 準備一個帶USB-A×2、、、、HDMI×1、、、RJ45×1的USB-C拓展塢。。。
      • 插入帶有Display Port功能的USB-C口。。也就是如圖所示的[9]號接口。。 接口示意圖
      • 插入帶Numlock指示燈的鍵盤。。。嘗試進行大小寫與數字鎖定按鍵的切換。。。若能夠正常切換,,,,說明系統內核已經正常啟動了。。。。
        • 無法進行切換或隔小段時間後就無法切換,,說明系統並沒有啟動成功。。請轉到“系統刷寫”

      若PC2系統無法啟動,,,轉到⏬系統刷寫章節。。。

      嘗試登錄並恢覆PC2

      • 插入顯示屏。。。。等待一小段時間,,,您能看到Ubuntu的登錄界面,,重新登陸Ubuntu系統。。
      • 更改了密碼但忘記了,,,,導致無法登錄???轉到⏬系統刷寫章節
      • 您可以撤回您之前在網絡上所做的更改,,,重新建立於交換機的連接,,,或者重新安裝/啟動open ssh服務,,,確保其能夠開機自啟。。
      • 如果您無法進行恢覆,,轉到⏬系統刷寫章節

      系統刷寫

      若您與第三方二次開發商合作,,,請在刷寫前與您的合作方溝通,,,以免造成不必要的糾紛。。。。

      您需要按照以下步驟拆開後蓋。。拆卸過程中,,,,保證所有卸下的部件被放置在不易翻倒的收納盒中,,,,以防丟失。。。

      您需要準備以下工具:

      全套六角、、、梅花扳手(螺絲刀批頭也可以)。。NVME M.2硬盤讀卡器/移動硬盤盒(NGFF不可用)。。

      1. 擰下後把手部分的兩顆螺絲。。。。

      把手1

      把手2

      1. 使用一字螺絲刀或者撬棒從圖示位置輕輕撬開外殼。。。(四個孔為安裝孔,,,內部沒有螺絲。。)

      1. 小心揭下保護泡棉(不要撕破)

      1. 拆卸四顆螺絲,,卸下背板。。

      1. 取出NVME硬盤。。。插入您的讀卡器。。

      NVME

      1. 按照燒錄系統鏡像,,,,並進行磁盤擴容操作。。。。
      2. 若您無法訪問鏡像鏈接,,,,請✍️填寫工單與技術支持工程師溝通。。
      3. 如果您使用的是Windows操作系統,,,,可以使用Rufus(在高級選項中勾選“顯示USB外置硬盤”選項)或者balenaEtcher進行燒寫。。。。

      4. 裝回NVME硬盤,,安裝好背板。。重新啟動系統。。。首次啟動,,,PC2的IP地址有可能被設為192.168.123.18。。。繼續按照文檔中心的步驟進行設備樹刷入。。。

      若您在刷寫過程中遇到無法讀取硬盤、、、、硬盤刷寫屢次失敗等問題,,請✍️填寫工單,,,,附上您的錯誤截圖與技術支持工程師描述問題。。。。

      來源文件:開發幫助_031304.md
      Q

      G1 URDF 版本選擇

      G1的URDF模型文件提供在宇樹的GitHub倉庫中,,,並實時維護中。。。具體連接:

      宇樹提供了不同硬件版本(hip關節減速比、、、手腕關節電機類型)、、、、是否鎖腰(針對29自由度G1)、、是否帶靈巧手的URDF文件,,,,可以根據mode_machine類型選擇,,可以在G1 App中查看設備的機型。。。。具體方法如下:

      1.連接app

      2.查看機器人數據

      App中具體路徑【首頁 - 設備 - 數據 - 機器人】 下滑找到設備類型,,這里的當前版本的序號即對應的mode_machine類型。。。。

      注: 1.同一台設備,,鎖定腰部和解鎖腰部,,設備類型會發生變化,,根據當前顯示的類型選擇。。。 2.清單里的機型,,,會根據硬件調整有所增減。。。。

      來源文件:開發幫助_031305.md
      Q

      G1 IMU 標定

      如何標定G1的IMU? 您需要先把機器人掛起來。。 然後找到一個水平儀,,如下圖所示進行放置。。 建議兩人合作標定 IMU,,,,一人將機器人垂直懸掛在支架上(檢查水平儀的氣泡)。。另一人可以檢查imu標定界面中“預期數值”和“實際數值”的偏差(如下圖所示)。。在水平儀調整至水平之後,,“預期數值”和“實際數值”的偏差應小於 ±1° 。。。

      以上準備就緒後點擊 Unitree-explore 應用程序中的“校準”按鈕。。。。標定過程中不要晃動機器人,,,,不要有震動,,保證機器人靜置狀態。。。。等待 APP 上提示標定完成即可。。

      很抱歉,,您需要自行購買水平儀工具。。。

      來源文件:開發幫助_031306.md
      Q

      G1WiFi網卡被RF-kill鎖定

      RF-Kill導致無法啟用WiFi網卡

      當您使用:

      sudo ifconfig wlan0 up
      

      可能會遇到如下錯誤提示: SIOCSIFFLAGS: Operation not possible due to RF-kill

      若遇到此問題,,,需要解鎖wifi網卡。。。使用此命令:

      sudo rfkill unblock wifi
      
      來源文件:開發幫助_031308.md
      Q

      Dex3三指靈巧手版本判斷與設置

      前情提要

      請注意,,您需要先將固件與APP更新到最新版本,,,才能自行設置Dex3的版本。。。。否則,,請在客戶服務中心提交工單,,,與技術支持溝通該問題。。。

      本文檔僅適用於Dex3三指靈巧手,,要獲取Inspire等第三方靈巧手的相關支持,,,請參閱靈巧手廠商的官方文檔。。。

      何種情況需要進行設置

      首次收到您的Dex3-1 三指靈巧手並安裝後,,,Dex3在開機時會進行一次自我標定。。。所以在開機前,,請您給Dex3留出一定的空間活動,,,,否則會影響本次開機期間手指的性能表現。。。

      當Dex3的設置正確時,,將會以以下方式進標定。。(數據更新至2025年7月4日)

      在一些舊固件版本,,,標定動作也可能會有些許不同。。但無論如何,,,若設置正確,,,則標定的最後一個動作為:

      State

      如果不是,,,則建議您檢查一下Dex3的版本。。。。

      版本一覽與判斷方法

      要判斷Dex3的版本,,,需要您確認Dex3手指指根部的刻字。。刻字位置指示:

      版本 刻字 備注
      108減速比舊款 通過App內有無力矩數據判斷有無觸覺
      108減速比,,,,無觸覺 L/R
      108減速比,,有觸覺 L-T/R-T
      214減速比,,無觸覺 L214/R214
      214減速比,,,,有觸覺 L214-T/R214-T

      (以上數據更新至2025年7月4日)

      以下是一些示例:

      一、、、、108減速比無觸覺

      二、、、214減速比有觸覺

      請注意:單個機器人上只能運行一個版本的靈巧手,,,如您發現您的靈巧手版本不一致,,,,請在客戶服務平台提交工單,,聯系技術支持。。

      如何設置靈巧手版本

      打開您的Unitre Explorer App,,選擇“設備”。。。

      選擇“數據”

      選擇“機器人”

      向下滑動,,,,找到“靈巧手硬件版本”

      選擇合適的版本。。要驗證效果,,您需要重啟機器,,,查看開機自動標定動作的執行效果。。。。

      來源文件:開發幫助_031310.md
      Q

      G1 pc2的WiFi網卡不見了怎麼辦???

      執行 ifconfig 查看是否有wlan0這張網卡

      在 G1 的 PC2 里面打開一個終端輸入 ifconfig 查詢網卡信息,,,看終端打印的內容(如下圖所示)是否有包含 wlan0 這張網卡。。。。如果有這張網卡,,,,證明G1的網卡是正常可用的。。。。如果沒有顯示有 wlan0 這張網卡,,則可以進行下一步。。

      查找無線網卡的 usb 連接

      在 G1 的 PC2 里面打開一個終端輸入 sudo dmesg | grep -i usb 查詢與 USB 設備相關的系統日志信息。。。。開發PC2的無線網卡在內部是以一個 USB 設備連接的,,,因此可以通過這個方法查詢到無線網卡的連接是否正常。。。。一個正常的設備的 USB 連接應該是沒有任何的報錯的(如下圖所示)。。 可以從上圖可見在 USB 日志中 new interface driver rtl8852bu 即為G1 PC2 有線網卡的驅動,,代表有線網卡正常連接。。。 異常的 USB 日志可以參考下圖,,,日志中會有 error 出現並沒有有線網卡驅動的連接提示。。

      重新安裝 rtl8852bu 網卡驅動

      通過上面兩個步驟排查無線網卡沒有正常驅動或連接之後可以嘗試重新安裝 rtl8852bu 網卡的驅動。。。。 點擊此連接進入github中下載無線網卡驅動

      下載完成之後將壓縮包放到 G1 PC2的主目錄中,,,,然後按下面步驟執行

      #打開終端
      
      cd ~/rtl8852bu-20240418
      
      sudo ./install-driver.sh
      
      #等待執行完成即可
      
      

      上述腳本安裝完成,,重啟 G1 PC2 之後重覆上面兩個步驟檢查網卡能否正常使用。。。

      如果安裝驅動之後仍舊無法正常使用 wlan0 連接無線網絡,,,即可判斷 G1 PC2 的無線網卡在硬件上有異常。。。。可以通過工單平台聯系售後工程師進行維修。。。

      來源文件:開發幫助_031312.md
      Q

      G1的兩個imu數據如何獲取(提供demo)

      IMU 的位置

      G1全身一共有兩個 IMU 。。。一個為胯部 IMU,,另一個為軀幹 IMU。。。(位置示意如下圖)

      IMU 的話題

      G1 IMU話題分為兩個。。胯部 IMU 的數據在話題“rt/lowstate”里面的“imu_state”,,,,這個話題的 idl 消息格式為 LowState。。。。開發者可以理解為 LowState 這個消息格式中嵌套了一個 IMUState 消息格式。。 軀幹 IMU 的數據在話題“rt/secondary_imu”中,,,這個話題的idl格式為 IMUState。。。。

      IMU 數據的獲取

      胯部 IMU 的數據獲取的方法是通過 DDS 訂閱“rt/lowstate”話題。。。訂閱到數據之後觸發回調函數,,打印對應的 IMUState 數據即可。。。 Demo 代碼如下: ```C++ {.no-fold} //g1_imu_hip.cpp

      include

      include

      // DDS

      include

      include

      include

      // IDL

      define TOPIC_LOWSTATE "rt/lowstate"

      using namespace unitree::robot;

      void LowStateMessageHandler(const void message) { unitree_hg::msg::dds_::LowState_ low_state = (unitree_hg::msg::dds_::LowState_*)message; std::cout << "hip imu gyroscope x:" << low_state.imu_state().gyroscope()[0] << std::endl; std::cout << "hip imu gyroscope y:" << low_state.imu_state().gyroscope()[1] << std::endl; std::cout << "hip imu gyroscope z:" << low_state.imu_state().gyroscope()[2] << std::endl;

      std::cout << "hip imu rpy x:" << low_state.imu_state().rpy()[0] << std::endl;
      std::cout << "hip imu rpy y:" << low_state.imu_state().rpy()[1] << std::endl;
      std::cout << "hip imu rpy z:" << low_state.imu_state().rpy()[2] << std::endl;
      

      }

      int main(){ std::string networkInterface = "ens33";//network_interface網卡名稱 unitree::robot::ChannelFactory::Instance()->Init(0, networkInterface);

      ChannelSubscriber<unitree_hg::msg::dds_::LowState_> suberlow(TOPIC_LOWSTATE);
      suberlow.InitChannel(LowStateMessageHandler);
      
      while(1)
      {
        usleep(20000);
      }
      
      return 0;
      

      }

      
      軀幹 IMU 的數據獲取的方法是通過 DDS 訂閱“rt/secondary_imu”話題。。。訂閱到數據之後觸發回調函數,,,,打印對應的獲取到的Message數據即可。。。。
      Demo代碼如下:
      ```C++ {.no-fold}
      #include <unitree/robot/channel/channel_publisher.hpp>
      #include <unitree/robot/channel/channel_subscriber.hpp>
      // DDS
      
      #include <unitree/idl/hg/IMUState_.hpp>
      #include <unitree/idl/hg/LowCmd_.hpp>
      #include <unitree/idl/hg/LowState_.hpp>
      // IDL
      
      #define TOPIC_TORSOIMU "rt/secondary_imu"
      
      using namespace unitree::robot;
      
      void TorsoIMUMessageHandler(const void* message)
      {
          unitree_hg::msg::dds_::IMUState_ imu_state = *(unitree_hg::msg::dds_::IMUState_*)message;
          std::cout << "torso imu gyroscope x:" << imu_state.gyroscope()[0] << std::endl;
          std::cout << "torso imu gyroscope y:" << imu_state.gyroscope()[1] << std::endl;
          std::cout << "torso imu gyroscope z:" << imu_state.gyroscope()[2] << std::endl;
      
          std::cout << "torso imu rpy x:" << imu_state.rpy()[0] << std::endl;
          std::cout << "torso imu rpy y:" << imu_state.rpy()[1] << std::endl;
          std::cout << "torso imu rpy z:" << imu_state.rpy()[2] << std::endl;
      }
      
      int main(){
          std::string networkInterface = "ens33";//network_interface
          unitree::robot::ChannelFactory::Instance()->Init(0, networkInterface);
      
          ChannelSubscriber<unitree_hg::msg::dds_::IMUState_> suberlow(TOPIC_TORSOIMU);
          suberlow.InitChannel(TorsoIMUMessageHandler);
      
          while(1)
          {
            usleep(20000);
          }
      
          return 0;
      }
      
      

      將以上代碼放置至 unitree_sdk2 中進行編譯,,,,連接機器人之後運行代碼,,,,運行方法與中的過程類似。。 Demo程序運行成功之後,,,,終端會打印獲取到的對應部位 IMU 各個軸的 gyroscope 值和 rpy 值。。

      來源文件:開發幫助_031313.md
      Q

      G1的運控模式和調試模式切換(單向支持,,,不支持調試模式切換運控模式)

      運控模式切換調試模式的原理

      G1的運控服務名稱為 ai_sport(如下圖所示) 當這個服務被關閉之後,,用戶將無法使用宇樹運控提供的功能,,,包括但不限於模式切換、、、、行走等功能。。。。關閉這個服務就是進入了調試模式。。

      模式切換的方法

      由運控模式切換至調試模式的方法有兩種,,,,一種是從app上將 ai_sport 服務關閉,,,另一種是按遙控器上的 L2+R2 鍵進入調試模式。。。。 方法一: 先將機器人調整至阻尼或者零力矩模式,,,,並使用吊架吊起保護好機器人。。。。進入app中的設備-服務狀態 進入設備-服務狀態之後就可以看到G1上正在運行的所有服務。。我們只需要點擊關閉 ai_sport 服務即可。。。。 成功關閉之後 ai_sport 會變為灰色,,,即為關閉成功

      方法二: 先將機器人調整至阻尼或者零力矩模式,,並使用吊架吊起保護好機器人。。。。通過短按遙控器上的 L2+R2 按鍵進入調試模式。。這個組合鍵按下之後等待約20秒之後即可進入調試模式。。

      G1 成功進入調試模式之後,,眼部指示燈光會變成黃色。。。。並且語音播報會播報“調試模式”提示。。。。

      來源文件:開發幫助_031315.md
      Q

      G1利用宇樹運控保持平衡,,開發上肢動作

      需求

      有用戶希望使用官方運控保持下肢平衡,,,控制 G1 上半身完成自定義動作。。。

      arm_sdk話題

      為了滿足上述需求,,我們在運控中設置了 arm_sdk 話題。。這個話題的格式和 “Lowcmd” 話題一致。。。通過這個話題用戶可以向 arm_sdk 話題發送底層控制指令來完成上肢自定義動作。。。。這中方式是高層控制中的一個特殊模式。。。在這個控制模式下,,可以令下肢利用運控保持機器人的平衡,,上肢的運控退出。。。。用戶可以獲得上肢的電機的控制權,,,可以給電機發送控制指令,,,,完成上肢的動作。。。但下肢還處於運控控制中,,,在上肢重心發生變化依然可以保持平衡。。

      使用原理

      G1 機器人關節電機順序定義中共定義了 29 個關節電機。。。引索編號為 0-28 號。。。。arm_sdk話題使用的是引索號為 29 的電機引索,,,,通過控制的 29 號電機的q(目標位置),,將這個電機的目標位置由 0 逐漸變化到 1 來退出上肢運控。。。。從而讓用戶獲得上肢的控制權。。。。 用戶獲得上肢控制權限之後可以通過向 arm_sdk 話題發送底層控制指令控制 G1 上半身的 11 個關節電機(23dof)或 17 個關節電機(29dof)完成自定義動作。。 完成自定義動作之後可以將 29 號電機的目標位置由 1 逐漸變化到 0 重新恢覆上肢運控,,歸還上半身電機的控制權。。可以恢覆 G1 的正常行走動作。。。。 23自由度G1上半身電機引索 29自由度G1上半身電機引索 關於 arm_sdk 話題控制G1上半身可以看 sdk2 中的樣例程序 29 自由度 G1 程序 23 自由度 G1 程序

      使用 arm_sdk 話題進行 G1 上半身控制的時候,,,需要先在app中將設備-服務狀態中的"g1_arm_example"服務關閉。。。

      來源文件:開發幫助_031317.md
      Q

      G1 MID360使用方法

      MID360 雷達 IP

      MID360雷達的 IP 地址為 192.168.123.120。。使用 RJ45 網線連接G1後肩部的網口之後可以用 ping 命令查看是否成功和雷達連通。。。

      雷達與機器人的旋轉變換

      MID360 雷達在 G1 上是倒置安裝的,,雷達坐標系相對於機器人坐標的位置關系(-0.0, 0.0, -0.47618),,Mid-360雷達pitch軸傾角是-2.3°(單位:度),,yaw軸和roll軸無傾斜。。。。

      雷達點雲的獲取方式

      目前 G1 在固件 V1.4.6 以上的版本中新增了雷達服務接口。。。對應的服務為 Lidar Driver 這個服務會在 G1 啟動後驅動雷達,,,獲取雷達數據並將雷達的點雲數據和 IMU 數據作為 DDS 話題發布出來。。 對應的點雲話題為rt/utlidar/cloud_livox_mid360,,,輸出頻率10HZ,frame_id為"livox_frame",,,,輸出頻率約為 10HZ。。。 對應的IMU話題為rt/utlidar/imu_livox_mid360,,,輸出頻率為200HZ。。。 lidar_driver服務狀態 MID 360話題名稱 MID 360點雲效果

      Livox官方提供的資料

      雷達詳情頁: 雷達資料頁: 雷達官方 github 地址:

      來源文件:開發幫助_031318.md
      Q

      G1 運行底層控制程序出現電機抖動

      底層控制出現抖動的可能原因

      主要有兩種原因: (1)運控沒有完全退出 (2)電機控制參數賦值不合理

      退出宇樹運控

      開發者進行底層控制之前務必要先退出宇樹運控。。。。如果宇樹運控和開發者的底層控制指令同時存在,,,兩個控制指令會互相沖突,,在機器人上的表現就是會出現劇烈的抖動。。 G1 在零力矩或者阻尼狀態下時,,,開發者可以通過遙控器上的 L2+R2 鍵使 G1 退出宇樹運控,,,,進入調試模式。。 G1 在零力矩或者阻尼狀態下時,,可以通過連接手機app,,,,將設備-服務狀態中的 ai_aport 服務關閉掉,,,,即可關閉宇樹運控。。

      控制參數賦值不合理

      對於電機的底層控制算法,,,,唯一需要的控制目標就是輸出力矩。。可是對於機器人,,我們通常需要給關節設定位置、、、、速度和力矩。。。這時就需要對關節電機進行混合控制。。。 宇樹科技的關節電機包含如下 5 個控制指令: 1.前饋力矩:tau 2.期望角度位置:qdes 3.期望角速度:dqdes 4.位置剛度:kp 5.阻尼系數:kd 在控制過程中應該對上圖中的各項參數綜合調整,,,,調整出一個合理的參數數值。。令機器人控制的實際反饋的效果平滑、、、、流暢。。

      調整控制參數不是一個簡單容易的事情,,控制 G1 完成好看流暢的動作需要耐心調整控制參數。。。可以在調參數時多加嘗試不同的參數組合,,,實驗不同的效果。。。

      來源文件:開發幫助_031319.md
      Q

      運行 g1_audio_client_example 例程出現音頻文件格式相關報錯

      格式要求

      目前 G1 音頻接口所要求的音頻格式為 WAV 格式,,,,接口是將 WAV 格式的音頻數據轉換為 PCM 格式數據後傳入 PC1 中進行播放。。。。

      WAV格式轉換

      可能開發時您想播放的音頻文件格式是 MP3 或者其他主流的音頻格式。。可以用轉換為 WAV 格式之後使用我們的接口進行播放。。 選擇您想要播放的音頻文件放入轉換器中進行轉換 音頻編解碼器選擇 16 位,,,采樣率選擇為 16K 。。。。

      例程運行效果

      如果音頻文件被正確讀取並解碼為 PCM 格式數據,,程序運行的效果應該如下圖。。。。

      如果音頻文件為其他格式或其他原因無法正確讀取並解碼,,程序運行應該會有下面圖片中的報錯出現。。。

      來源文件:開發幫助_031320.md
      Q

      RH56DFX靈巧手使用及開發

      RH56DFX靈巧手介紹

      RH56DFX靈巧手是因時不帶觸覺的一款靈巧手,,,目前已在H1、、、、H1-2及G1上適配硬件通訊及軟件開發,,,通訊方式采用串口的方式,,,用戶可以根據因時靈巧手官方通訊協議自行編寫程序控制靈巧手,,,,或者使用宇樹靈巧手SDK控制,,,本文主要介紹後者使用宇樹靈巧手SDK的方式。。。

      H1、、、、H1-2適配RH56DFX靈巧手開發

      在線開發文檔: github開源倉庫代碼: !!! note 注意: 編譯和使用此靈巧手sdk的前置條件是要先編譯並安裝 !!!

      H1、、、H1-2運行RH56DFX靈巧手代碼例程

      sudo apt install libboost-all-dev libspdlog-dev
      # Build project
      mkdir build & cd build
      cmake ..
      make -j6
      # Terminal 1. Run h1 inspire hand service
      sudo ./inspire_h1 -s /dev/ttyUSB0
      # Terminal 2. Run example
      ./hand_example
      

      參考上述教程編譯成功後,,,,分別打開兩個終端運行./inspire_h1和./hand_example,,,運行成功後兩個靈巧手分別按一定頻率張開和閉合。。

      G1適配RH56DFX靈巧手

      RH56DFX靈巧手拆裝:

      在線開發文檔: github開源倉庫代碼:

      github開源倉庫和使用注意事項同H1、、H1-2

      G1運行RH56DFX靈巧手代碼例程

      sudo apt install libboost-all-dev libspdlog-dev
      # Build project
      mkdir build & cd build
      cmake ..
      make -j6
      # Terminal 1. Run g1 inspire hand service
      # The serial port name is hard-coded; if it doesn’t match your setup, please edit it directly in the source.
      sudo ./inspire_g1
      # Terminal 2. Run example
      ./hand_example
      

      靈巧手github開源倉庫和編譯同上文H1、、H1-2。。分別打開兩個終端運行./inspire_g1和./hand_example,,,,運行成功後效果同H1、、H1-2一樣,,,兩個靈巧手分別按一定頻率張開和閉合。。。 !!! note 注意: github開源倉庫代碼: 中inspire_g1.cpp文件里面的代碼塊:

          righthand = std::make_shared<inspire::InspireHand>(serial1, 1);
      lefthand = std::make_shared<inspire::InspireHand>(serial2, 1);
      

      括號最後面的數字1代表靈巧手ID,,,,需要和實際靈巧手匹配,,,,可以使用靈巧手上位機來設置和查看自己的ID。。 !!! RH56DFX靈巧手上位機下載請移步:

      選擇上圖標記的軟件。。。。 RH56DFX靈巧手上位機介紹參考視頻鏈接:

      來源文件:開發幫助_031321.md
      Q

      G1 D435i相機使用

      D435i相機

      G1 機器人深度相機位於機器人眼睛位置,,型號為 intel realsense D435i。。。 相機包含雙目紅外相機(global shutter)、、激光發射器、、、、RGB相機(rolling shutter)、、、6軸imu。。可以提供ir、、rgb、、、、depth格式的圖像以及imu姿態數據。。。 D435i相機是一個 USB 相機,,,,通過 USB 數據線進行數據傳輸,,,因此 D435i 相機接在哪個設備上就需要在該設備上獲取相機數據,,無法實現跨設備獲取數據。。。 產品規格信息:

      D435i 與 G1 的旋轉變換

      D435i相機在 G1 上是斜向下安裝的,,,,相機坐標系相對於機器人坐標的位置關系(0.0576235 0.01753 0.41987),,,,Realsense D435i 相機 pitch軸傾角是47.5°(單位:度),,,yaw軸和roll軸無傾斜。。。

      使用 Realsen Viewer 上位機查看圖像(個人 PC Windows 推薦)

      使用個人 PC 配合上位機獲取圖像。。。直接在這個鏈接里面下載Realsense Viewer 下載 RealSense.Viewer.exe 下載完成之後進行安裝之後,,,,桌面上就會出現 Realsense Viewer 的圖標。。。 雙擊打開 Realsense Viewer,,,將 G1 後肩部的深度相機 typec 數據線接到後頸部接口上。。。。在 Realsense Viewer 中將 RGB 開關打開即可獲取到相機圖像。。。。

      使用 librealsense2 配合示例程序獲取圖像 (G1 PC2)

      安裝 librealsense2

      不要使用 2.50.0 版本以上的 librealsense2 這個版本使用了 fastcdr 和 fastrtps 依賴,,,會導致編譯不通過。。

      相機 SDK 倉庫: 進入 SDK 倉庫下載項目代碼 下載後將項目代碼放入 G1 PC2 中,,進行解壓。。。。解壓完成之後,,,,進入文件夾中。。。。 右鍵在此目錄打開終端,,,,使用 CMake 編譯這個項目,,,步驟可以參考下面的內容

      mkdir build && cd build
      
      cmake ..
      
      cmake --build .
      

      librealsense2在編譯過程中需要網絡下載相關依賴,,,,建議給設備配置網絡。。

      使用樣例程序獲取圖像

      編譯 sdk 之後可以使用中的程序配合 librealsense2 進行使用。。。。需要編寫一個 CMakeLists.txt 文件,,,,將樣例程序進行編譯。。。。

      使用示例程序需要 OpenCV 依賴,,關於 OpenCV 的安裝這里不再贅述,,,,可以參考網上教程。。。

      先創建一個如圖所示的文件夾以及文件 CMakeLists.txt 文件可以參考以下內容

      cmake_minimum_required(VERSION 3.1.0)
      
      project(get_camera_imu_stream_test)
      
      
      set(CMAKE_BUILD_TYPE Release)
      set(CMAKE_CXX_FLAGS_RELEASE "-O3 -w")
      set(CMAKE_C_FLAGS_RELEASE "-O3 -w")
      
      # Find librealsense2 installed package
      find_package(realsense2 REQUIRED)
      find_package(OpenCV REQUIRED)
      
      # Enable C++11
      set(CMAKE_CXX_STANDARD 11)
      set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
      
      # Add the application sources to the target
      add_executable(${PROJECT_NAME} test.cpp)
      
      # Link librealsense2 to the target
      target_link_libraries(${PROJECT_NAME} ${realsense2_LIBRARY} ${OpenCV_LIBS})
      

      編寫完成之後創建一個 build 文件夾,,,,使用以下命令進行編譯並運行。。。。

      cd build
      
      cmake ..
      
      make -j6
      
      ./GetImage
      

      一切正常並成功運行之後,,可以看到類似下面效果的視頻流彈出。。。。

      來源文件:開發幫助_031322.md
      Q

      RH56FTP靈巧手開發及使用

      RH56FTP靈巧手介紹

      RH56DFTP靈巧手相比RH56DFX多了觸覺傳感器,手指指尖、、、指腹、、、、掌心部分集成高精度觸覺傳感器,,,,能夠實時反饋手指抓握信息。。。。目前已在H1、、H1-2及G1上適配硬件通訊及軟件開發,,通訊方式采用網口的方式,,,,用戶可以根據因時靈巧手官方通訊協議自行編寫程序控制靈巧手,,,,或者使用宇樹靈巧手SDK控制,,,,本文主要介紹後者使用宇樹靈巧手SDK的方式。。。 產品詳情可移步:

      G1適配RH56FTP靈巧手

      在線開發文檔:

      快速開始

      參考上文開發文檔安裝好靈巧手sdk後運行靈巧手張開和閉合示例: 打開兩個終端,,,分別運行

      python inspire_hand_sdk/example/dds_publish.py
      
      python inspire_hand_sdk/example/Headless_driver.py  (無圖模式)
      或
      python inspire_hand_sdk/example/Vision_driver.py    (有圖模式)
      

      運行成功後兩個手分別按一定頻率張開和閉合

      FTP靈巧手上位機下載請移步: 選擇上圖標記的軟件。。 通過上位機可以方便的對靈巧手進行控制、、、、修改ID,,,上位機介紹: !!! note 上位機附件介紹的是使用串口方式,,,,FTP靈巧手適配到G1人形上走的是網口通訊,,,這里可以直接用網線把適配FTP靈巧手的G1和開發電腦連接,,,上位機使用網口的方式連接 !!!

      常見問題

      1.靈巧手通訊指示燈不亮 先檢查下靈巧手在G1上的供電口(這里是xt30 2號口)有沒有插緊、、、、檢查下靈巧手上的航插口有沒有插緊。。 如果都插緊的情況還是沒有反應可能是線路故障,,,建議走工單檢修。。 2.靈巧手通訊指示燈亮,,,,但靈巧手默認ip不能ping通,,,檢查下圖這個小黑盒的網線有沒有插緊、、、、以及小黑盒和G1連接的網線有沒有插緊。。

      正常插緊的情況的是能ping通的,,,如果還有異常可以使用wireshark抓包軟件抓下看看能不能抓到ip或者走工單咨詢技術遠程排查。。。

      來源文件:開發幫助_031323.md
      Q

      G1 SDK開發常見錯誤碼合集

      錯誤碼

      在開發 SDK 時,,,,如果 API 接口調用出現異常。。客戶端或服務端會返回一個對應的 4 位數錯誤碼。。。。開發者可以根據返回的錯誤碼查詢對應的錯誤原因。。。

      G1 機器人 SDK2 錯誤碼對照表

      通用錯誤

      錯誤碼 錯誤描述 錯誤釋義
      3001 未知錯誤 不明錯誤,,,,可聯系技術支持排查
      3102 請求發送錯誤 發送指令時出現錯誤
      3103 API 未注冊 當前 SDK 的頭文件沒有定義該 API
      3104 請求超時 請求直至超時沒有收到相應
      3105 請求與響應數據不匹配 API的入參不正確,,,檢查調用的入參
      3106 響應數據無效 相應的數據不符合要求或有異常數據
      3107 租約無效 --
      3201 響應發送錯誤 機器人相應無法發回客戶端
      3202 服務端內部錯誤 機器人本身有異常,,,無法執行API
      3203 API 在服務端未實現 API 沒有在機器人中有定義
      3204 API 參數錯誤 API 調用的參數錯誤
      3205 請求被拒絕 機器人拒絕調用這個API
      3206 租約無效 --
      3207 租約已存在 --

      手臂動作錯誤

      錯誤碼 錯誤描述 錯誤釋義
      7400 “rt/arm_sdk”被占用 手臂動作話題被占用,,,,檢查機器人是否在做其他動作
      7401 手臂被舉起 需要執行手臂放下指令,,,,恢覆位置
      7402 錯誤的手臂動作 ID 這個動作ID沒有定義,,,檢查動作ID是否正確
      7404 錯誤的運控 ID 機器人的狀態錯誤,,,檢查機器人是否在運控狀態

      音頻錯誤

      錯誤碼 錯誤描述 錯誤釋義
      100 參數錯誤 檢查調用API時傳入的參數

      運控錯誤

      錯誤碼 錯誤描述 錯誤釋義
      7301 運控狀態不可用 檢查機器人運控服務是否正常
      7302 不正確的fsm id 檢查調用的 fsm id 是否正確
      7303 不正確的task id 檢查調用的 task id 是否正確

      若調用 API 返回 -1 錯誤碼,,,,代表 G1 目前的狀態不支持調用該 API 。。。

      來源文件:開發幫助_031324.md
      Q

      G1 Livox官方上位機查看雷達信息

      獲取 Livox 上位機

      訪問 ,,進入下載中心 進入下載中心後,,,下載 Livox Viewer 2-Windows 版本,,,點擊下載即可下載 Livox Viewer 2 的 zip 壓縮包。。。。 下載完成之後,,,,將這個壓縮包解壓至想要放置的電腦目錄下。。。 進入這個解壓好的文件夾中,,,即可看到一個 LivoxViewer2.exe 的文件。。。雙擊打開即可開始使用 Livox 官方的上位機。。。 打開成功後,,,LivoxViewer2 的主頁面應該如下圖所示。。

      配置 IP

      G1 機器人上的 MID 360 雷達 IP 為 192.168.123.120。。。使用網線直連 G1 機器人之後,,,要將自己電腦的 IP 地址設置為 192.168.123 網段下的 IP 才能查看到雷達數據。。。 打開 Windows 系統設置,,,選擇【網絡和 Internet】相關設置。。。點擊 G1 直連的有線連接屬性。。。。 編輯修改 IP 為 123 網段的 IP。。修改完成之後確認保存 IP 信息。。

      查看雷達數據

      回到 LivoxViewer2 上位機頁面,,點擊左上角的 Adapter 選項,,,,選擇剛剛修改的 IP 192.168.123.222。。。。 選擇對應 IP 地址,,,,若雷達正常工作。。。等待幾秒鐘之後,,,即可在 Lidar List 中看到 LivoxViewer2 掃描出來正在工作的雷達。。。 點擊 Lidar List 旁邊的連接開關即可開始連接雷達查看信息 打開之後即可在上位機的中間查看到雷達的實時點雲。。。 在上方一欄可以點擊齒輪圖標查看雷達的型號,,當前運行狀態等信息和修改雷達的各項設置設置。。。。也點擊 Reboot 可以重啟雷達。。

      來源文件:開發幫助_031325.md
      Q

      因時四代靈巧手Windows上位機連接、、、故障檢測與IP配置教程

      因時(Inspire)四代靈巧手

      Windows 上位機連接、、、、故障檢測與 IP 配置教程

      一、、、文檔目的 | Purpose

      本文檔用於指導用戶在 Windows 系統下,,將因時(Inspire)四代靈巧手連接至上位機,,,用於:- 檢測靈巧手本體是否存在故障

      • 驗證通信是否正常
      • 配置或檢查靈巧手 IP 地址

      二、、、準備工作

      • Inspire 四代靈巧手 -Windows10/11電腦
      • 字樹機器人(用於給靈巧手供電,,,,需保持開機)

      三、、軟件下載

      請下載並準備以下文件:

      • 上位機軟件(靈巧手上位機.exe)
      • 驅動文件壓縮包

      鏈接: https://pan.baidu.com/s/1EGrNq88x6k-lXtiar4WXEA?pwd=unte 提取碼: unte

      四、、驅動安裝

      1. 解壓驅動壓縮包
      2. 運行驅動安裝程序
      3. 安裝完成後建議重啟電腦

      五、、硬件連接說明

      圖1 | 通信線(Communication Cable)

      • 用於連接靈巧手與電腦通信
      • 支持串口通信(USB)或網口通信(RJ45),,,二選一即可
      • 同一線束中包含靈巧手接口與供電接口

      圖2|供電線(Power Cable)

      • 為靈巧手提供外部電源
      • 使用時需確保字樹機器人處於開機狀態

      六、、啟動上位機

      1. 雙擊運行靈巧手上位機.exe
      2. 選擇通信方式(串口或網口)
      3. 點擊 Connect 進行連接

      圖3|上位機(PC Software)

      七、、、、狀態檢測

      連接成功後,,可用於判斷靈巧手是否存在通信或本體故障。。。

      八、、IP 配置(網口)

      • 確保電腦與靈巧手處於同一網段
      • 可在上位機中讀取或修改靈巧手 IP

      九、、、、說明 | Notes

      本流程適用於調試、、檢測及售後排查場景。。。

      來源文件:開發幫助_031326.md
      Q

      G1 Comp資料

      G1-Comp使用的舵機是 XC330-M288-T 舵機使用手冊

      G1 Comp-開源文件

      G1 Comp 舵機控制程序

      G1 Comp URDF 文件

      來源文件:開發幫助_031327.md
      Q

      G1 如何關閉大模型對答但保留麥克風和揚聲器功能

      chatgo 服務

      宇樹官方的語音助手功能是由 APP 中的 chatgo 服務來提供的。。部分開發用戶有自行開發的大模型問答功能。。不需要使用宇樹官方的大模型問答,,但需要使用 G1 自帶的麥克風和揚聲器功能。。可以將 APP 中的【設備-服務狀態】內的 chatgo 服務關閉即可實現這個功能。。

      來源文件:開發幫助_031328.md
      Q

      如何使用nomachine可視化PC2圖形化界面

      硬件連接

      使用 NoMachine 遠程工具連接 G1 需要和 G1 在同一個局域網內。。。使用網線連接 G1 肩部網口和您的 PC 進行連接。。。

      運行生成虛擬顯示器腳本(Windows系統)

      在 PC 上打開一個命令提示符。。。可以使用 ping 命令檢查是否和 PC2 正常通訊,,,,保證正常通訊之後,,,使用 SSH 命令登錄 PC2。。。 成功登錄之後,,執行主目錄下的nomachine.sh腳本。。。。等待完成之後進行下一步。。

      使用 NoMachine 連接 G1

      在 NoMachine 中添加一個新連接 在彈出的界面中,,,輸入連接的名稱和連接的 ip 地址。。 名稱可以隨意填寫,,,,ip 地址填入 192.168.123.164 ,,其他的內容不用填寫。。。。 添加成功之後在首頁即可連接到 G1 PC2 的桌面環境。。。。 在這個頁面輸入用戶名 unitree 密碼 123 即可連接成功。。

      來源文件:開發幫助_031329.md
      Q

      G1 D435i 提示流已被占用應如何解決

      原因

      若 realsense-viewer 或者 librealsense2 提示相機的 frame 被占用了的原因是 Unitree Explore APP 中的第一人稱畫面流將 D435i 相機的畫面占用。。。。

      解決方法

      開發者需要獲取 D435i 的圖像流需要將第一人稱取流程序服務關閉。。。 使用下面的命令查看當前取流服務的狀態

      ps -ef | grep "master_service" | grep -v grep
      

      在終端中運行之後,,應該會輸出類似下面的預期畫面。。。 這個表明上面的查找命令找到了 master_service 服務並且服務正在運行。。。。 開發者需要停止這個服務運行,,,才能正常開發 D435i 相機,,,,這個有兩種方法。。。

      方法一

      使用命令停止該服務並不允許開機自動運行。。。。

      # 停止正在運行的取流
      sudo systemctl stop master_service
      
      # 禁止取流服務開機自啟
      sudo systemctl disable master_service
      
      # 查看服務狀態
      sudo systemctl status master_service
      
      # 查看該服務狀態應該會顯示狀態為DISABLE
      

      這樣就可以關閉第一人稱畫面的取流服務。。

      方法二

      可以直接將取流服務的程序移動到不同的目錄位置。。。。令程序無法正常啟動。。

      sudo mv /unitree/module/video_hub_pc4 ~/
      

      用以上兩種方法避免 D435i 相機的占用即可。。

      來源文件:開發幫助_031330.md
      Q

      G1 使用 ROS2 使用D435i相機

      安裝 librealsense2

      即便使用 ROS2 啟動 D435i 相機,,,,但 librealsense2 還是不可或缺的依賴。。 若您使用的是 Ubuntu20.04 系統,,,,librealsense2 的安裝方法可以參考中的方法,,此處不再贅述。。。。 若您使用的是 Ubuntu 22.04 及以上的系統可以使用以下命令進行安裝。。。。

      sudo apt install ros-<ros-distro>-librealsense2
      

      下載 realsense-ros

      可以從 realsense 官方的 github 中獲取 realsense-ros 項目,,,,可以進入下載。。 可以使用 git clone 或者 Download Zip 進行獲取。。。。

      編譯 realsense-ros

      將下載好的 realsense-ros 文件夾放入一個 ROS2 工作空間中並打開一個終端。。。。 執行以下命令進行構建和編譯。。

      執行前需要聲明 ROS2 環境變量。。。

      colcon build --packages-select realsense2_camera_msgs realsense2_description realsense2_camera
      

      若編譯順利並沒有報錯可以看到類似上面圖片的結果輸出。。。。 此時可以運行下面的指令啟動相機進行使用。。

      source install/setup.bash
      
      ros2 launch realsense2_camera rs_launch.py
      

      可以看到類似如下的程序輸出

      此時用 rviz2 可視化對應的話題即可看到對應的圖像。。。。 按照以上步驟操作,,,即可用 ROS2 可視化 D435i 的圖像。。

      來源文件:開發幫助_031331.md
      Q

      Dex3-1狀態獲取

      接口說明

      通過ros2訂閱話題/dex3/(left or right)/state可以拿到靈巧手狀態。。。。 已訂閱左手話題為例: 在終端執行ros2 topic echo /dex3/left/state 獲取左手相關狀態顯示如下:

      motor_state:
      - mode: 1
        q: -0.039015065878629684
        dq: -0.0
        ddq: 0.0
        tau_est: 5861.07958984375
        temperature:
        - 41
        - 33
        vol: 24.5
        sensor:
        - 0
        - 0
        motorstate: 0
        reserve:
        - 243
        - 71
        - 4
        - 0
      - mode: 1
        q: 0.1803588718175888
        dq: -0.0
        ddq: 0.0
        tau_est: 1674.5941162109375
        temperature:
        - 39
        - 30
        vol: 24.5
        sensor:
        - 0
        - 0
        motorstate: 0
        reserve:
        - 2
        - 99
        - 4
        - 0
      - mode: 1
        q: -0.09735891968011856
        dq: 0.0
        ddq: 0.0
        tau_est: -1674.5941162109375
        temperature:
        - 37
        - 30
        vol: 24.5
        sensor:
        - 0
        - 0
        motorstate: 0
        reserve:
        - 2
        - 99
        - 4
        - 0
      - mode: 1
        q: -0.30404800176620483
        dq: 0.0
        ddq: 0.0
        tau_est: -1674.5941162109375
        temperature:
        - 43
        - 35
        vol: 24.5
        sensor:
        - 0
        - 0
        motorstate: 0
        reserve:
        - 2
        - 99
        - 4
        - 0
      - mode: 1
        q: -0.4099312126636505
        dq: -0.0
        ddq: 0.0
        tau_est: 1674.5941162109375
        temperature:
        - 39
        - 31
        vol: 24.5
        sensor:
        - 0
        - 0
        motorstate: 0
        reserve:
        - 2
        - 99
        - 4
        - 0
      - mode: 1
        q: -0.02486167475581169
        dq: 0.0
        ddq: 0.0
        tau_est: -3349.188232421875
        temperature:
        - 39
        - 32
        vol: 24.5
        sensor:
        - 0
        - 0
        motorstate: 0
        reserve:
        - 2
        - 99
        - 4
        - 0
      - mode: 1
        q: -0.2342156618833542
        dq: -0.0
        ddq: 0.0
        tau_est: 1674.5941162109375
        temperature:
        - 37
        - 29
        vol: 24.5
        sensor:
        - 0
        - 0
        motorstate: 0
        reserve:
        - 2
        - 99
        - 4
        - 0
      press_sensor_state:
      - pressure:
        - 101464.0
        - 30000.0
        - 103832.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 101488.0
        - 30000.0
        - 102504.0
        temperature:
        - 32.0
        - 0.0
        - 31.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 32.0
        - 0.0
        - 32.0
        lost: 1615
        reserve: 0
      - pressure:
        - 30000.0
        - 30000.0
        - 30000.0
        - 101456.0
        - 30000.0
        - 30000.0
        - 103744.0
        - 30000.0
        - 102344.0
        - 30000.0
        - 30000.0
        - 30000.0
        temperature:
        - 0.0
        - 0.0
        - 0.0
        - 30.0
        - 0.0
        - 0.0
        - 30.0
        - 0.0
        - 29.0
        - 0.0
        - 0.0
        - 0.0
        lost: 1856
        reserve: 0
      - pressure:
        - 101480.0
        - 30000.0
        - 101528.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 101424.0
        - 30000.0
        - 105720.0
        temperature:
        - 32.0
        - 0.0
        - 32.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 32.0
        - 0.0
        - 32.0
        lost: 1615
        reserve: 0
      - pressure:
        - 30000.0
        - 30000.0
        - 30000.0
        - 101472.0
        - 30000.0
        - 30000.0
        - 102792.0
        - 30000.0
        - 104080.0
        - 30000.0
        - 30000.0
        - 30000.0
        temperature:
        - 0.0
        - 0.0
        - 0.0
        - 30.0
        - 0.0
        - 0.0
        - 29.0
        - 0.0
        - 29.0
        - 0.0
        - 0.0
        - 0.0
        lost: 1615
        reserve: 0
      - pressure:
        - 96624.0
        - 30000.0
        - 104472.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 101520.0
        - 30000.0
        - 101456.0
        temperature:
        - 32.0
        - 0.0
        - 32.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 32.0
        - 0.0
        - 32.0
        lost: 1615
        reserve: 0
      - pressure:
        - 30000.0
        - 30000.0
        - 30000.0
        - 103848.0
        - 30000.0
        - 30000.0
        - 104240.0
        - 30000.0
        - 104744.0
        - 30000.0
        - 30000.0
        - 30000.0
        temperature:
        - 0.0
        - 0.0
        - 0.0
        - 30.0
        - 0.0
        - 0.0
        - 30.0
        - 0.0
        - 30.0
        - 0.0
        - 0.0
        - 0.0
        lost: 1615
        reserve: 0
      - pressure:
        - 101456.0
        - 30000.0
        - 101544.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 101512.0
        - 30000.0
        - 101464.0
        temperature:
        - 35.0
        - 0.0
        - 35.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 35.0
        - 0.0
        - 35.0
        lost: 1718
        reserve: 0
      - pressure:
        - 101456.0
        - 30000.0
        - 101504.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 101528.0
        - 30000.0
        - 101480.0
        temperature:
        - 35.0
        - 0.0
        - 35.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 36.0
        - 0.0
        - 35.0
        lost: 1620
        reserve: 0
      - pressure:
        - 101456.0
        - 30000.0
        - 101488.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 101480.0
        - 30000.0
        - 101464.0
        temperature:
        - 35.0
        - 0.0
        - 35.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 35.0
        - 0.0
        - 35.0
        lost: 29218
        reserve: 0
      imu_state:
        quaternion:
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        gyroscope:
        - 0.0
        - 0.0
        - 0.0
        accelerometer:
        - 0.0
        - 0.0
        - 0.0
        rpy:
        - 0.0
        - 0.0
        - 0.0
        temperature: 0
      power_v: 0.0
      power_a: 0.0
      system_v: 0.0
      device_v: 0.0
      error:
      - 0
      - 0
      reserve:
      - 0
      - 0
      ---
      motor_state:
      - mode: 1
        q: -0.03901557996869087
        dq: -0.0
        ddq: 0.0
        tau_est: 5861.07958984375
        temperature:
        - 41
        - 33
        vol: 24.5
        sensor:
        - 0
        - 0
        motorstate: 0
        reserve:
        - 243
        - 71
        - 4
        - 0
      - mode: 1
        q: 0.18035706877708435
        dq: -0.0
        ddq: 0.0
        tau_est: 1674.5941162109375
        temperature:
        - 39
        - 30
        vol: 24.5
        sensor:
        - 0
        - 0
        motorstate: 0
        reserve:
        - 2
        - 99
        - 4
        - 0
      - mode: 1
        q: -0.0973544493317604
        dq: 0.0
        ddq: 0.0
        tau_est: -1674.5941162109375
        temperature:
        - 37
        - 30
        vol: 24.5
        sensor:
        - 0
        - 0
        motorstate: 0
        reserve:
        - 2
        - 99
        - 4
        - 0
      - mode: 1
        q: -0.3040471076965332
        dq: 0.0
        ddq: 0.0
        tau_est: -1674.5941162109375
        temperature:
        - 43
        - 35
        vol: 24.5
        sensor:
        - 0
        - 0
        motorstate: 0
        reserve:
        - 2
        - 99
        - 4
        - 0
      - mode: 1
        q: -0.4099392592906952
        dq: -0.0
        ddq: 0.0
        tau_est: 1674.5941162109375
        temperature:
        - 39
        - 31
        vol: 24.5
        sensor:
        - 0
        - 0
        motorstate: 0
        reserve:
        - 2
        - 99
        - 4
        - 0
      - mode: 1
        q: -0.024868831038475037
        dq: 0.0
        ddq: 0.0
        tau_est: -1674.5941162109375
        temperature:
        - 39
        - 32
        vol: 24.5
        sensor:
        - 0
        - 0
        motorstate: 0
        reserve:
        - 2
        - 99
        - 4
        - 0
      - mode: 1
        q: -0.23420850932598114
        dq: -0.0
        ddq: 0.0
        tau_est: 1674.5941162109375
        temperature:
        - 37
        - 29
        vol: 24.5
        sensor:
        - 0
        - 0
        motorstate: 0
        reserve:
        - 2
        - 99
        - 4
        - 0
      press_sensor_state:
      - pressure:
        - 101456.0
        - 30000.0
        - 103840.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 101488.0
        - 30000.0
        - 102504.0
        temperature:
        - 32.0
        - 0.0
        - 31.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 32.0
        - 0.0
        - 32.0
        lost: 1615
        reserve: 0
      - pressure:
        - 30000.0
        - 30000.0
        - 30000.0
        - 101448.0
        - 30000.0
        - 30000.0
        - 103744.0
        - 30000.0
        - 102352.0
        - 30000.0
        - 30000.0
        - 30000.0
        temperature:
        - 0.0
        - 0.0
        - 0.0
        - 30.0
        - 0.0
        - 0.0
        - 30.0
        - 0.0
        - 30.0
        - 0.0
        - 0.0
        - 0.0
        lost: 1856
        reserve: 0
      - pressure:
        - 101480.0
        - 30000.0
        - 101536.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 101432.0
        - 30000.0
        - 105720.0
        temperature:
        - 32.0
        - 0.0
        - 32.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 32.0
        - 0.0
        - 32.0
        lost: 1615
        reserve: 0
      - pressure:
        - 30000.0
        - 30000.0
        - 30000.0
        - 101464.0
        - 30000.0
        - 30000.0
        - 102808.0
        - 30000.0
        - 104088.0
        - 30000.0
        - 30000.0
        - 30000.0
        temperature:
        - 0.0
        - 0.0
        - 0.0
        - 30.0
        - 0.0
        - 0.0
        - 29.0
        - 0.0
        - 29.0
        - 0.0
        - 0.0
        - 0.0
        lost: 1615
        reserve: 0
      - pressure:
        - 96624.0
        - 30000.0
        - 104464.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 101520.0
        - 30000.0
        - 101464.0
        temperature:
        - 32.0
        - 0.0
        - 32.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 32.0
        - 0.0
        - 32.0
        lost: 1615
        reserve: 0
      - pressure:
        - 30000.0
        - 30000.0
        - 30000.0
        - 103840.0
        - 30000.0
        - 30000.0
        - 104240.0
        - 30000.0
        - 104744.0
        - 30000.0
        - 30000.0
        - 30000.0
        temperature:
        - 0.0
        - 0.0
        - 0.0
        - 30.0
        - 0.0
        - 0.0
        - 30.0
        - 0.0
        - 30.0
        - 0.0
        - 0.0
        - 0.0
        lost: 1615
        reserve: 0
      - pressure:
        - 101456.0
        - 30000.0
        - 101552.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 101504.0
        - 30000.0
        - 101456.0
        temperature:
        - 35.0
        - 0.0
        - 35.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 35.0
        - 0.0
        - 35.0
        lost: 1718
        reserve: 0
      - pressure:
        - 101456.0
        - 30000.0
        - 101496.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 101528.0
        - 30000.0
        - 101480.0
        temperature:
        - 35.0
        - 0.0
        - 35.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 36.0
        - 0.0
        - 35.0
        lost: 1620
        reserve: 0
      - pressure:
        - 101464.0
        - 30000.0
        - 101488.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 30000.0
        - 101488.0
        - 30000.0
        - 101464.0
        temperature:
        - 35.0
        - 0.0
        - 35.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 0.0
        - 35.0
        - 0.0
        - 35.0
        lost: 29218
        reserve: 0
      imu_state:
        quaternion:
        - 0.0
      

      這里主要介紹PressSensor數據

      圖一

      圖中 ID 表示一個傳感器數據包PressSensorState 傳感器數據>= 10w 數值大小進行傳輸為有效值,,,數值= 3w 代表無數值。。。

      例如ID:1的數據就對應

      對應圖一只有第3、、6、、、、8位數據有效。。。

      ID:8的數據就對應 對應圖一只有第0、、、、2、、、、9、、11位數據有效。。。

      來源文件:開發幫助_031337.md
      Q

      G1舞蹈模式背景音樂

      音樂下載:

      !!! note 提示 當您需要在大範圍配合音響演示時,,,,可以將G1內部的音量調為0%。。。。 位置在App-設備-數據-音頻。。。。 !!!

      來源文件:開發幫助_031338.md
      Q

      強腦靈巧手使用及開發

      BrainCo 智能仿生靈巧手 Revo 2介紹

      G1 可搭載強腦科技的二代靈巧手,,該靈巧手具有6個自由度。。。其中大拇指具有內收外展、、、、屈伸兩個主動自由度以及一個屈伸的被動自由度,,,,其餘四指各有一個屈伸的主動自由度和一個屈伸的被動自由度。。。。

      圖片1 圖片2

      G1適配BrainCo 智能仿生靈巧手 Revo 2

      G1安裝強腦手參考:

      適配G1sdk獲取地址: !!! note 此SDK只適配ARM架構計算機,,,BrainCo靈巧手是使用串口接到G1用戶電腦pc2上的,,,,可直接在pc2上編譯 !!!

      快速開始

      編譯:

      在用戶開發計算單元 PC2(NVIDIA Jetson Orin NX 板)上

      sudo apt install libspdlog-dev libfmt-dev
      cd ~
      git clone https://github.com/unitreerobotics/brainco_hand_service
      cd brainco_hand_service
      mkdir build && cd build
      cmake ..
      make -j6
      

      運行: 進入~/brainco_hand_service/bin目錄,,,打開兩個終端分別運行:

      sudo ./brainco_hand_server
      

      sudo ./test_brainco_hand_server (測試左手)
      或
      sudo ./test_brainco_hand_server right (測試右手)
      

      運行成功後靈巧手會張開閉合往覆循環

      !!! note test_brainco_hand_server用法: ./test_brainco_hand_server [left|right] 若未指定,,,默認為 left。。。。 正常情況下,,你會看到靈巧手反覆做握拳和張開動作。。。。 !!!

      test_brainco_hand_server配置為系統開機自動啟動方式:

      cd ~/brainco_hand_service
      bash setup_autostart.sh
      

      驗證是否配置成功 重啟設備後在pc2終端執行

      ps aux | grep brainco
      

      可以看到出現brainco相關的進程,,,並且test_brainco_hand_server運行成功後雙手會伸平。。。。 強腦上位機獲取、、官方資料鏈接:

      來源文件:開發幫助_031339.md
      Q

      啟用藍牙功能

      !!! note 提示 現新購買的G1設備是默認已經安裝好藍牙驅動了,,可以直接使用。。。 !!!

      若發現藍牙功能不可用,,可嘗試方法:

      啟用藍牙功能

      1 安裝工具

      sudo apt install dkms debhelper build-essential devscripts libncurses-dev flex bison libssl-dev
      # 根據安裝提示,,,,使用下面語句
      sudo apt --fix-broken install
      

      2 下載 wifi-bt-deb 壓縮包並解壓

      解壓並查看:

      unzip wifi-bt-deb.zip
      cd wifi-bt-deb
      ls
      

      內容如下所示:

      unitree@ubuntu:~/wifi-bt-deb$ ls
      copy_firmware.sh firmware rtkbtusb-dkms_1.19.14_arm64.deb dkms_1.19.14_arm64.deb
      

      3 固件拷貝

      給腳本設置可執行權限,,,,在 wifi-bt-deb 文件夾下,,,,執行如下命令:

      chmod +x copy_firmware.sh
      

      運行腳本:

      sudo ./copy_firmware.sh
      

      4 WiFi驅動安裝

      在 wifi-bt-deb 文件夾下,,執行如下命令:

      sudo dpkg -i ./rtl8852bu-dkms_1.19.14_arm64.deb
      

      安裝完成效果如下:

      unitree@ubuntu:~/wifi-bt-deb$ sudo dpkg -i ./rtl8852bu-dkms_1.19.14_arm64.deb
      (Reading database ... 287376 files and directories currently installed.)
      Preparing to unpack .../rtl8852bu-dkms_1.19.14_arm64.deb ...
      rtk_btusb is blacklisted, unblacklisting now...
      Synchronizing state of bluetooth.service with SysV service script with /lib/systemd/systemd-sysv-install.
      Executing: /lib/systemd/systemd-sysv-install enable bluetooth
      Bluetooth service started and set to auto-start on boot
      wlan0 is not connected, no disconnection needed
      No 8852bu or cfg80211 drivers loaded, no removal needed
      No rtl8852bu driver found in DKMS, no removal needed
      Removing old driver directory /usr/src/rtl8852bu-1.19.3...
      Creating driver directory /lib/modules/5.10.104-tegra/updates...
      Backing up btusb.ko file...
      Preparations for driver installation completed!
      Unpacking rtl8852bu-dkms (1.19.14) over (1.19.14) ...
      Setting up rtl8852bu-dkms (1.19.14) ...
      Loading new rtl8852bu-1.19.14 DKMS files...
      It is likely that 5.10.104-tegra belongs to a chroot's host
      Building for 5.10.104-tegra and 5.4.0-189-generic
      Building for architecture aarch64
      Building initial module for 5.10.104-tegra
      Done.
      
      8852bu.ko:
      Running module version sanity check.
        - Original module
          - No original module exists within this kernel
        - Installation
          - Installing to /lib/modules/5.10.104-tegra/updates/dkms/
      
      depmod...
      
      DKMS: install completed.
      Building initial module for 5.4.0-189-generic
      Done.
      
      8852bu.ko:
      Running module version sanity check.
        - Original module
          - No original module exists within this kernel
        - Installation
          - Installing to /lib/modules/5.4.0-189-generic/updates/dkms/
      
      depmod...
      
      DKMS: install completed.
      

      !!! note 提示 wifi驅動的安裝過程較長,,,,請耐心等待,,大概20~30分鐘左右,,,,查看是否在運 行,,,可以通過如下命令:

      sudo tail -f /var/lib/dkms/rtl8852bu/1.19.14/build/make.log
      

      !!!

      5 藍牙驅動安裝

      在 wifi-bt-deb 文件夾下,,,執行如下命令:

      sudo dpkg -i ./rtkbtusb-dkms_1.19.14_arm64.deb
      

      安裝完成效果如下:

      unitree@ubuntu:~/share/G1-NX/wifi-bt-deb$ sudo dpkg -i ./rtkbtusb-
      dkms_1.19.14_arm64.deb
      [sudo] password for unitree:
      Selecting previously unselected package rtkbtusb-dkms.
      (Reading database ... 287355 files and directories currently installed.)
      Preparing to unpack .../rtkbtusb-dkms_1.19.14_arm64.deb ...
      Unpacking rtkbtusb-dkms (1.19.14) ...
      Setting up rtkbtusb-dkms (1.19.14) ...
      Loading new rtkbtusb-1.19.14 DKMS files...
      It is likely that 5.10.104-tegra belongs to a chroot's host
      Building for 5.10.104-tegra and 5.4.0-189-generic
      Building for architecture aarch64
      Building initial module for 5.10.104-tegra
      Done.
      
      rtk_btusb.ko:
      Running module version sanity check.
        - Original module
          - No original module exists within this kernel
        - Installation
          - Installing to /lib/modules/5.10.104-tegra/updates/dkms/
      
      depmod...
      
      DKMS: install completed.
      Building initial module for 5.4.0-189-generic
      Done.
      
      rtk_btusb.ko:
      Running module version sanity check.
        - Original module
          - No original module exists within this kernel
        - Installation
          - Installing to /lib/modules/5.4.0-189-generic/updates/dkms/
      
      depmod...
      
      DKMS: install completed.
      

      全部安裝完成後,,使用命令進行重啟

      sudo reboot
      

      6 最終效果

      重啟後,,,可以通過以下命令查看wifi與藍牙驅動是否正常:

      unitree@ubuntu:~$ ifconfig -a
      ...
      wlan0: flags=4098<BROADCAST,MULTICAST> mtu 1500
              ether fc:23:cd:8f:6f:f3
              txqueuelen 1000
              RX packets 0 bytes 0 (0.0 B)
              RX errors 0 dropped 0 overruns 0
              TX packets 0
              frame 0
              bytes 0 (0.0 B)
              TX errors 0 dropped 0 overruns 0
      
      unitree@ubuntu:~$ hciconfig -a
      hci0:   Type: Primary Bus: USB
              BD Address: FC:23:CD:8F:6F:F4
              carrier 0
              collisions 0
              ACL MTU: 1021:6
              SCO MTU: 255:12
              UP RUNNING
              RX bytes:744 acl:0 sco:0 events:53 errors:0
              TX bytes:2208 acl:0 sco:0 commands:53 errors:0
              Features: 0xff 0xff 0xff 0xfa 0xdb 0xbf 0x7b 0x87
              Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
              Link policy: RSWITCH HOLD SNIFF PARK
              Link mode: SLAVE ACCEPT
              Name: 'ubuntu'
              Class: 0x000000
              Service Classes: Unspecified
              Device Class: Miscellaneous,
              HCI Version:
              (0xb)
              Revision: 0xdac8
              LMP Version: (0xb) Subversion: 0x34ce
              Manufacturer: Realtek Semiconductor Corporation (93)
      

      運行上面兩條命令,,並出現對應內容,,,,表明驅動安裝成功。。。

      G1-NX 藍牙無法連接藍牙音頻設備修覆

      首先確保 G1-NX 可以連接互聯網。。。然後執行以下命令:

      sudo apt update
      sudo apt install pulseaudio-module-bluetooth
      

      下載腳本文件:

      將腳本壓縮包拷貝到G1-NX上後,,,,執行如下命令:

      unzip update_blutooth.zip
      chmod +x update_blutooth.sh
      sudo ./update_blutooth.sh
      

      運行成功示例:

      unitree@ubuntu:~$ sudo ./update_blutooth.sh
      Bluetooth service configuration completed. Success!!
      

      然後執行如下命令:

      sudo systemctl daemon-reload
      sudo systemctl restart bluetooth
      sudo loginctl enable-linger unitree
      systemctl --user daemon-reload
      systemctl --user disable obex.service && systemctl --user enable obex.service
      systemctl --user start obex.service
      
      # /usr/lib/bluetooth/obexd -n &
      

      使用如下命令查看服務狀態:

      unitree@ubuntu:~$ systemctl --user status obex.service
      ● obex.service - Bluetooth OBEX service
           Loaded: loaded (/usr/lib/systemd/user/obex.service; enabled; vendor preset: enabled)
           Active: active (running) since Sun 1970-03-22 16:48:48 CST; 3s ago
         Main PID: 3153 (obexd)
           CGroup: /user.slice/user-1000.slice/user@1000.service/obex.service
                   └─3153 /usr/lib/bluetooth/obexd
      
      Mar 22 16:48:48 ubuntu systemd[1388]: Starting Bluetooth OBEX service...
      Mar 22 16:48:48 ubuntu obexd[3153]: OBEX daemon 5.53
      Mar 22 16:48:48 ubuntu systemd[1388]: Started Bluetooth OBEX service.
      
      unitree@ubuntu:~$ systemctl --user status pulseaudio
      ● pulseaudio.service - Sound Service
           Loaded: loaded (/usr/lib/systemd/user/pulseaudio.service; enabled; vendor preset: enabled)
           Active: active (running) since Sun 1970-03-22 17:22:04 CST; 2min 59s ago
      TriggeredBy: ● pulseaudio.socket
         Main PID: 1570 (pulseaudio)
           CGroup: /user.slice/user-1000.slice/user@1000.service/pulseaudio.service
                   └─1570 /usr/bin/pulseaudio --daemonize=no --log-target=journal
      
      Mar 22 17:22:01 ubuntu systemd[1379]: Starting Sound Service...
      Mar 22 17:22:04 ubuntu systemd[1379]: Started Sound Service.
      

      關機重啟後,,運行bluetoothctl show,內容如下顯示表示功能已經正常:

      unitree@ubuntu:~$ bluetoothctl show
      Controller 78:22:88:B5:11:C9 (public)
              Name: ubuntu
              Alias: ubuntu
              Class: 0x001c0000
              Powered: yes
              Discoverable: yes
              DiscoverableTimeout: 0x00000000
              Pairable: yes
              UUID: Message Notification Se.. (00001133-0000-1000-8000-00805f9b34fb)
              UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
              UUID: OBEX Object Push          (00001105-0000-1000-8000-00805f9b34fb)
              UUID: Message Access Server     (00001132-0000-1000-8000-00805f9b34fb)
              UUID: PnP Information           (00001200-0000-1000-8000-00805f9b34fb)
              UUID: IrMC Sync                 (00001104-0000-1000-8000-00805f9b34fb)
              UUID: Vendor specific           (00005005-0000-1000-8000-0002ee000001)
              UUID: Headset AG                (00001112-0000-1000-8000-00805f9b34fb)
              UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
              UUID: phonesbook Access Server   (0000112f-0000-1000-8000-00805f9b34fb)
              UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
              UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
              UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
              UUID: Headset                   (00001108-0000-1000-8000-00805f9b34fb)
              UUID: Audio Source              (0000110a-0000-1000-8000-00805f9b34fb)
              UUID: OBEX File Transfer        (00001106-0000-1000-8000-00805f9b34fb)
              Modalias: usb:v1D6Bp0246d0535
              Discovering: no
      Advertising Features:
              ActiveInstances: 0x00
              SupportedInstances: 0x04
              SupportedIncludes: tx-power
              SupportedIncludes: appearance
              SupportedIncludes: local-name
              SupportedSecondaryChannels: 1M
              SupportedSecondaryChannels: 2M
              SupportedSecondaryChannels: Coded
      

      至此,,藍牙已經可以正常連接藍牙音頻設備。。。

      來源文件:開發幫助_031340.md
      Q

      Unitree G1-NX模塊固件更新方法

      !!! warning 使用須知 1、、進行更新前請自行備份PC2中的個人文件 2、、、若刷失敗了,,可用同樣的方法刷回Jetpack 5.1.1 3、、、、更新Jetpack固件的問題不在保修範圍內 4、、、、提設備維修工單只支持刷回Jetpack 5.1.1,,,,不支持刷其他版本的Jetpack !!!

      1. 所需硬件設備

      1. 安裝有Ubuntu20/22系統的電腦
      2. 一根USB Type-A轉USB Type-C數據線
      3. NVME M.2移動硬盤盒(用於系統燒錄)

      2. 所需文件

      比如需刷 Jetpack 6.2 ,,則下載 Jetpack_6.2_nx.tar.bz2 和 g1-nx-j6.2.img.bz2 文件。。。。

      3. 操作步驟

      3.1 關鍵部件介紹

      ①電源指示燈 ②PWR按鍵 ③REC按鍵 ④燒錄口

      3.2 NX模塊固件更新步驟

      1. 先拆下 NVMe 硬盤
      2. G1上電開機,,等到電源指示燈三燈常亮
      3. 同時按下 powerrec 鍵,,持續2秒鐘左右,,此時可以觀察到電源指示燈會從三燈 常亮變為一個指示燈亮或全滅狀態
      4. 松開 power
      5. 等待2秒鐘
      6. 松開 rec

      此時,,設備進入燒錄模式,,將數據線Type-A口連接您的電腦,,Type-C口連接G1的燒錄口。。

      在您的電腦上新建一個終端,,輸入 lsusb,,,,可以看到有 NVIDIA Corp. APX字樣,,,如下 所示:

      表明設備已經成功進入燒錄模式。。

      解壓固件包 Jetpack_6.2_nx.tar.bz2 ,,,進入目錄

      sudo tar -xjvf Jetpack_6.2_nx.tar.bz2
      cd Jetpack_6.2_nx/Linux_for_Tegra
      

      運行以下命令,,,,進行固件更新

      sudo ./flash_nx_module.sh
      

      耐心等待8分鐘左右,,看到以下信息,,,,視為更新成功

      *** The target xxx has been flashed successfully. ***
      Make the target filesystem available to the device and reset the board
      to boot from external nvme0n1p1
      

      此時,,,,將燒錄了Unitree Jetpack 6.2鏡像的系統的固態硬盤插⼊G1載板即可啟動系統。。

      !!! note 注意 NX模塊更新完固件後,,只能啟動Unitree Jetpack 6.2系統,,如果想再使⽤回Jetpack 5.1.1系統,,,,燒錄Jetpack 5.1.1固件即可。。。 !!!

      4. Unitree Jetpack 6.2鏡像燒錄步驟

      找塊空⽩的NVME盤,,,插⼊您的電腦(借助NVME M.2移動硬盤盒),,確認該NVME存儲設備的設備節點,,,⽐如: /dev/sdc,,如果存儲設備是第⼀次使⽤,,需要對該磁盤進⾏格式化,,,⽐如格式化為 ext4 ,,,,格式化命令如下:

      # 注意:/dev/sdc根據實際情況填寫
      sudo mkfs -t ext4 /dev/sdc
      

      把鏡像燒寫到NVME存儲設備中,,執⾏如下命令:

      # 注意:/dev/sdc根據實際情況填寫
      bzip2 -dc g1-nx-j6.2.img.bz2 | sudo dd of=/dev/sdc status=progress
      

      把燒錄好的NVME盤裝到G1的PC2中,,,即可上電開機使用了。。。

      5. 多功能USB type-C不識別USB3.0問題解決方法

      下載最新的設備樹,,拷貝到G1-NX上解壓,,,,然後使用如下命令進行設備樹更新:

      sudo cp /boot/dtb/kernel_tegra234-p3768-0000+p3767-0000-nv.dtb /boot/dtb/kernel_tegra234-p3768-0000+p3767-0000-nv.dtb.bk
      
      sudo rm -rf /boot/dtb/kernel_tegra234-p3768-0000+p3767-0000-nv.dtb
      
      # 在解壓後的文件夾下執行以下命令
      sudo cp ./kernel_tegra234-p3768-0000+p3767-0000-nv.dtb /boot/dtb/kernel_tegra234-p3768-0000+p3767-0000-nv.dtb
      
      sudo reboot
      

      更新完成後,,,,通過如下方式查看當前系統版本:

      unitree@unitree-g1-nx:~$ cat /proc/device-tree/board-version
      g1nx-jetpack6.2-r36.4.3-20251203-v1.0
      

      系統版本顯示為:g1nx-jetpack6.2-r36.4.3-20251203-v1.0, 表示已經更新到最新版本。。。

      該版本解決了 多功能USB type-C口不識別USB3.0的問題。。

      來源文件:開發幫助_031341.md
      Q

      G1 播放音頻方法

      使用 G1 機載揚聲器進行播放

      若開發者需要使用 G1 機身上搭載的揚聲器進行音頻的播放。。。。由於開發PC中沒有連接揚聲器,,,,G1的揚聲器直連在運控PC1上。。。所以這種方式只有一種實現方式,,,,就是通過宇樹提供的 G1 音頻接口進行播放。。 使用 PlayStream API 接口播放音頻需要輸入一段 WAV 格式 采樣率16K 單通道 16bit 的音頻文件進行播放。。。若需要停止播放可以使用 PlayStop 接口停止音頻的播放。。

      自行外接揚聲器進行播放

      由於使用機載揚聲器進行音頻播放需要一定的程序編程能力並且對音頻格式有一定要求。。。。開發者可以借助 G1 肩部接口連接一個揚聲器到 G1 上進行播放。。。。 用戶在購買揚聲器時可以咨詢賣家此款揚聲器是否支持在 arm64,,linux20.04系統上使用,,,,並且最好購買typec接口的揚聲器。。。。

      來源文件:開發幫助_031343.md
      Q

      G1 Mujoco 可視化 G1 模型

      下載 Mujoco 仿真器

      在ubuntu20.04/22.04系統中可以通過 pip 直接安裝 Mujoco 仿真器。。。可新打開一個終端執行以下命令。。

      pip install mujoco
      

      執行以上命令之後終端會有對應輸出。。。。

      開啟 Mujoco 仿真器

      在終端中執行以下命令開啟 Mujoco

      python -m mujoco.viewer
      

      執行上述指令之後即可看到打開的一個空白的 mujoco 仿真器,,,,如下圖所示。。。 此時將機器人的 xml 文件拖入 mujoco 中即可顯示。。

      獲取機器人 xml 文件

      可以通過以下命令獲取 unitree_ros 項目

      git clone https://github.com/unitreerobotics/unitree_ros.git
      

      通過項目網頁上的下載 ZIP 獲取 unitree_ros 項目 成功獲取項目之後,,,可以將路徑"unitree_ros/robots/g1_description"中的機器人 xml 文件拖拽進入 mujoco 中。。。。文件拖入之後可以看到類似下圖的畫面。。 可以看到 G1 機器人會因為重力倒在地上,,,,這個是正常現象。。。。

      修改 mujoco 設置

      在 mujoco 中的左邊欄目中下滑找到 "Physics" 欄目,,,並點擊打開。。。 下滑找到其中的 "Physical Paremeters",,,點擊打開並修改其中的 "Gravity"的數值為 "0 0 0" ,,,,這樣修改可以消除重力的影響。。。 修改完成之後,,可以看到由於沒有了重力加速度,,,G1會緩慢向上飄起。。。。此時在左邊欄目中往上滑,,,,找到 "Simulation" 欄目,,點擊 "Reset" G1 即可恢覆成零位站立的狀態。。

      來源文件:開發幫助_031344.md
      Q

      G1內部設備拓撲圖

      來源文件:開發幫助_031345.md
      Q

      連接G1機器人的方式

      以上圖片中展示了3種連接方式:

      方式一:(推薦)只需一根網線連接你的電腦與G1機器人,,,,把您的電腦設置為 192.168.123.x 靜態IP地址即可。。

      方式二:需要先在PC2把無線網卡。。。。您的電腦連接PC2的AP。。。。

      方式三:需要先在PC2把無線網卡。。PC2與您的電腦連接同一個路由器WiFi(不能設置為123網段)

      !!! note 提示 僅方式一可以在您的電腦上使用 unitree_sdk2unitree_ros2,,,和獲取機器人的ROS2話題。。 !!!

      來源文件:開發幫助_031346.md
      Q

      G1肩部接口參數解析

      電氣接口參數

      G1 的頂部配備了電氣接口,,,,這些接口用於連接各個機身關節電機、、、傳感器外設、、、網口等。。。。這樣的設計使您能夠方便地進行調試、、排查問題以及進行二次開發。。每個接口都有對應的電氣接口參數,,,用戶在使用的時候需要注意這些電氣參數進行使用,,,避免錯接。。。。
      序號接口類型接口簡稱接口說明
      1XT30UPB-FVBAT58V/5A 電池電源輸出(此處直連電池電源)
      2XT30UPB-F24V24V/5A電源輸出
      3XT30UPB-F12V12V/5A電源輸出
      4RJ451000 BASE-T千兆以太網
      5RJ451000 BASE-T千兆以太網
      6Type-CType-C支持USB3.0 host,,5V/1.5A電源輸出
      7Type-CType-C支持USB3.0 host,,,5V/1.5A電源輸出
      8Type-CType-C支持USB3.0 host,,,,5V/1.5A電源輸出
      9Type-CAlt Mode Type-C支持USB3.2 host,,,,支持DP1.4
      10I/OI/O OUT12V: 12V/3A電源輸出

      IO接口電氣參數及功能

      GPIO編號NX引腳號覆用關系debugfs文件系統的引腳名
      GPIO1203UART1_TXDGPIO3_PR.02
      GPIO2205UART1_RXDGPIO3_PR.03
      GPIO3232I2C2_SCLGPIO3_PI.03
      GPIO4234I2C2_SDAGPIO3_PI.04
      GPIO5128GPIOGPIO3_PCC.02
      GPIO6130GPIOGPIO3_PCC.03

      來源文件:開發幫助_031347.md
      Q

      G1 手臂末端圖紙

      G1 各版本手臂末端圖紙

      G1 標準版&基礎版

      G1 進階版 4010 手腕 5010 手腕

      G1 旗艦版 A&B G1 旗艦版 C

      G1手臂末端法蘭

      4010 手腕 5010 手腕

      來源文件:開發幫助_031348.md
      Q

      G1修改網卡優先級

      問題現象

      很多用戶在使用 G1 的無線網卡成功連接 wifi 無線網絡之後。。仍然無法通過連接的 wifi 訪問互聯網。。。例如無法正常解析百度的域名,,,無法正常訪問網絡。。。。

      問題原因

      這個大概率是因為機器人上的有線網絡 eth0 網卡的優先級太高了。。導致網絡流量會優先流向有線網。。。而 G1 的有線網是無法訪問互聯網的,,導致 G1 在連接 wifi 網絡之後依舊無法上網。。。。

      解決辦法

      可以通過調整 G1 PC2 中的網卡網絡優先級來進行解決。。。 第一步先查看 G1 中兩個的網卡名稱,,可以通過以下命令查看

      nmcli connection show
      

      查看的效果如下圖。。可以看到 wlan0 和 eth0 兩個網卡。。 第二步通過命令設置兩個網卡的優先級

      # 無線網卡:Metric=100
      sudo nmcli connection modify "TP-LINK_402_1" ipv4.route-metric 100
      # 有線網卡:Metric=100
      sudo nmcli connection modify "unitree1" ipv4.route-metric 100
      

      可以由上面命令看出,,,我們想讓 G1 正常上網,,,,可以將兩張網卡的優先級設置為同級,,均為 Metric 100 的等級。。。 第三步重啟網絡讓配置生效 我們已經修改了網絡的優先級了,,,此時重啟網絡配置令修改生效即可。。

      sudo nmcli connection down "TP-LINK_402_1" && nmcli connection up "TP-LINK_402_1"
      sudo nmcli connection down "unitree1" && nmcli connection up "unitree1"
      

      !!! 提示 在這一步可能會導致您的連接斷開,,,等待 G1 網絡重啟完成之後即可重新連接 !!! 第四步驗證是否已經修改生效

      ip route show default
      

      通過上面的命令可以讀取當前網卡的優先級,,,,如果修改生效了,,,則可以看到 wlan0 和 eth0 的優先級是一致的。。

      來源文件:開發幫助_031349.md
      Q

      外接網卡導致 eth0/eth1 交換錯誤

      故障排查文檔:外接網卡導致 eth0/eth1 交換錯誤

      1. 問題描述

      當機器人 PC2 接入無線網卡帶 RJ45 接口的拓展塢時,,系統可能會出現網絡接口枚舉順序錯亂(網卡名稱漂移)的問題。。。。

      常見癥狀:

      • 內核日志循環報錯: SSH 進入 PC2 後,,,終端持續滾動顯示: unregister_netdevice: waiting for eth0 to become free. Usage count = x 原因:內核嘗試注銷網卡設備時發現資源被占用,,,導致無法釋放。。。。
      • ROS2 通信中斷: 執行 ros2 topic list 等指令時拋出網絡接口相關的報錯,,,,無法發現節點。。
      • 網口 IP 偏移: 內部通信 IP 192.168.123.164 對應的網口由默認的 eth0 變更為 eth1

      2. 排查流程

      狀態判定 排查動作 結論與後續
      場景 A:未連接外設 確認是否自行修改過網絡配置或網卡優先級。。。 是: 撤銷修改並還原配置。。。。
      否: 提交工單聯系技術支持。。
      場景 B:已連接外設 執行 ifconfigip addr 檢查 192.168.123.164 所在網口。。 異常: 發現該 IP 綁定在 eth1 上,,而 eth0 被外接設備占用。。

      3. 解決方案

      方案一:物理恢覆(推薦)

      此方案能徹底解決內核資源占用導致的報錯。。 1. 拔除所有外接無線網卡或擴展塢。。。。 2. 重啟系統。。。 3. 等待設備完全啟動、、、、內部通信正常後,,再根據需要重新連接外設。。。。

      方案二:臨時修改軟件配置

      若必須在當前環境下運行,,,,可手動適配網口名稱: 1. 確認當前持有 192.168.123.164 的實際網口名稱(如 eth1)。。 2. 修改相關的配置文件或環境變量(sudo gedit ~/unitree_ros2/setup.sh ),,將原本指定的 eth0 修改為 eth1。。。。

      [!WARNING] 注意: 方案二僅為臨時避讓手段。。。若下次啟動未接入外設,,,,網口名稱可能自動恢覆為 eth0,,導致配置再次失效。。。

      來源文件:開發幫助_03134H.md
      Q

      G1 EDU 調試線故障解決方法

      問題現象

      G1 在開發時無法將控制指令發送至機器人或者無法收到機器人發出的數據信息。。但可以通過 SSH 登錄至 PC2。。通過 Ping 指令也無法 Ping 通 192.168.123.161,,但可以 Ping 通 192.168.123.164。。。機器人也可以正常的開機,,,正常進入運控進行行走。。

      問題原因

      通過以上現象可以確定 PC2 是正常的,,,,但沒法和 PC1 正常通訊且無法獲取 PC1 發送過來的信息。。。。這個大概率是 PC1 和 PC2 通訊的 8Pin 調試線有異常。。。。如下圖框出處的調試線。。。。

      解決方法

      可以拆開 G1 機器人背板後,,檢查這個調試線是否接緊。。。可以嘗試重新拔插之後,,,看問題現象是否依舊。。。若問題依然存在,,,可以通過售後工單平台聯系技術支持進行處理。。。。

      在拆解機器人背板或者拔插調試線時,,,,不要帶電操作!!!!!!!!

      來源文件:開發幫助_031350.md
      Q

      G1新款手腕電機

      G1新款手腕電機左右手外觀不是對稱,,安裝靈巧手時需要注意不要把靈巧手裝反

      來源文件:開發幫助_0313500.md
      Q

      Dex1夾爪攝像頭顯示

      夾爪RGB相機顯示方法

      把相機的usbc線插入G1 pc2開發電腦或自己電腦

      安裝工具

      sudo apt install vlc
      
      

      打開攝像頭

      vlc v4l2:///dev/video*
      

      video*替換成實際開發電腦上實際端口號 運行成功會在開發電腦顯示攝像頭畫面

      !!! note 注意: 可以用 ls /dev/video* 直接列出系統中的視頻設備。。。通常會顯示 /dev/video0, /dev/video1 等 !!!

      相機調節焦距方式

      如果相機畫面比較糊,,可以按照視頻方式調節下焦距

      相機在window系統使用

      來源文件:開發幫助_0313501.md
      Q

      G1 開發時報ddsi_udp_conn_write to udp/239.255.0.1:7400 failed with retcode -1

      問題現象

      開發者在部署底層控制程序時,,出現類似如下的錯誤

      1776186060.872672 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.161:35953 failed with retcode -1
      1776186060.884107 [0] tev: ddsi_udp_conn_write to udp/239.255.0.1:7400 failed with retcode -1
      1776186060.892373 [0] pt_main_th: ddsi_udp_conn_write
      pt_main_th: ddsi_udp_conn_write to udp/192.168.123.161:52911 failed with retcode -1
      

      連接方式為:網線有線連接

      問題原因

      這個是因為開發者使用有線進行連接,,,,自有程序的計算端使用的是個人 PC。。個人 PC 將 DDS 消息發送至機器人的 PC1 進行控制。。。。出現該報錯的原因是在機器人運動或調試過程中,,,個人 PC 和機器人連接的網線出現硬件松脫,,網口接觸不良。。導致 DDS 通訊瞬間丟失,,導致出現這個報錯。。。

      解決方案

      開發者可以嘗試在PC2中部署自己的運控程序,,若 PC2 中進行部署沒有出現上面異常報錯。。也可以先更換 G1 上另一個網口進行測試。。。。查看是否有出現這種報錯。。。。 如果兩個網口均有異常,,則可以聯系技術支持進行售後處理。。。。

      來源文件:開發幫助_031351.md
      Q

      G1 MID360 ROS2使用方法

      下載 Livox ROS2 項目

      開發者點擊進入對應的項目地址。。。點擊右上角的 Download Zip 下載對應的壓縮包。。

      將項目傳輸至機器人內

      通過 ping 命令檢查與機器人的連通是否正常。。。 檢查連接正常之後,,,,使用 scp 命令將項目傳入機器人內。。。

      編譯運行項目

      檢查雷達連通性

      可以使用 ping 命令檢查與雷達 ip 192.168.123.120 是否正常通訊。。 如出現以上輸出,,則代表和雷達正常連接。。。。

      編譯項目

      通過 SSH 或者 NoMachine 登錄至機器人上,,,,解壓剛剛傳入機器人的 Livox ROS2 驅動。。如下圖即為解壓好的 Livox ROS2 驅動。。 將解壓好的驅動文件夾放入一個工作空間中,,,如:"livox_test/src",,在此目錄中打開終端,,,執行以下命令進行項目構建。。

      cd livox_test/src/livox_ros_driver2-master
      
      ./build.sh ROS2
      

      如果運行沒有異常可以看到如下類似的輸出。。

      修改配置文件

      打開以下路徑的配置文件"livox_ros_driver2-master/config/MID360_config.json" 將配置文件內容修改為如上圖所示的內容。。。。

      運行項目

      在工作空間中打開一個新的終端,,執行以下命令

      source install/setup.sh
      ros2 launch livox_ros_driver2 msg_MID360_launch.py
      

      運行上面的命令之後,,,可以看到類似下圖的輸出

      可視化點雲

      在任意目錄的終端中執行 rviz2 運行一個 rviz2 軟件 如上圖,,,添加一個點雲可視化。。。 修改話題為livox/cloud,,,,fixed_frame為livox,,,,即可看到雷達點雲輸出。。。

      來源文件:開發幫助_031352.md
      Q

      PC2連接藍牙設備教程

      命令行工具 bluetoothctl 詳解

      bluetoothctl 是 BlueZ 提供的交互式 CLI 工具,,支持設備掃描、、配對、、、、信任、、、、連接等全流程操作,,,,功能強大且穩定。。

      基礎操作步驟:

      1、、、進入交互模式:

      bluetoothctl
      # 輸出示例:[bluetooth]
      

      2、、、啟用適配器可見性(設備發現模式):

      [bluetooth]# discoverable on  # 允許其他設備發現本機
      [bluetooth]# pairable on      # 允許配對
      

      3、、掃描周邊設備:

      [bluetooth]# scan on  # 開始掃描,,輸出設備 MAC 地址和名稱
      # 示例輸出:[NEW] Device AA:BB:CC:DD:EE:FF 我的藍牙設備
      

      4、、配對設備(需記錄目標設備 MAC 地址,,,如 AA:BB:CC:DD:EE:FF):

      [bluetooth]# pair AA:BB:CC:DD:EE:FF
      # 若設備需要 PIN 碼,,按提示輸入(通常為 0000 或 1234,,,具體參考設備手冊)
      

      5、、信任設備(避免重覆配對,,自動連接):

      [bluetooth]# trust AA:BB:CC:DD:EE:FF
      

      6、、、連接設備:

      [bluetooth]# connect AA:BB:CC:DD:EE:FF
      # 成功後輸出:[已連接] 我的藍牙設備
      

      7、、、退出交互模式:

      [bluetooth]# quit
      

      常用命令速查:

      命令 功能
      show 顯示本機藍牙適配器信息
      devices 列出已配對/發現的設備
      remove 刪除已配對設備
      disconnect 斷開與設備的連接
      power on/off 開啟/關閉藍牙適配器

      圖形化工具:Blueman

      對於偏好 GUI 的用戶,,,Blueman 提供更直觀的操作界面:

      1、、、、安裝 Blueman

      sudo apt install blueman
      

      2、、啟動 Blueman:

      命令行執行 blueman-manager

      3、、、、基本操作:

      點擊工具欄的“掃描”按鈕發現設備,,,,右鍵選擇“配對”“信任”“連接”。。。。 音頻設備連接後,,,,可通過右鍵“音頻配置”切換 A2DP(立體聲)或 HSP(通話)模式。。。

      4、、高級設置: 在 Blueman 首選項中,,,可配置適配器名稱、、、可見性超時、、自動連接規則等。。。。

      來源文件:開發幫助_031353.md
      Q

      G1-D頭部雙目相機和手腕相機參數

      概述

      G1-D有頭部雙目相機以及手腕相機,,,對應有不同的視場角、、分辨率、、、、外參。。。

      視場角和分辨率

      頭部雙目相機參數

      分辨率: 1080P (200萬像素) 幀率: 60fps FOV: 對角D:125° 水平H:115° 垂直V:80°

      手腕相機

      腕部相機1參數(適配靈巧手三指/五指)

      分辨率:1080P (200萬像素) 幀率: 60fps 視場角(FOV): 對角: 160° 水平: 130° 垂直: 66°

      腕部相機2參數(適配二指夾爪)

      分辨率: 1080P (200萬像素) 幀率: 30/60fps 視場角(FOV): 對角: 140° 水平: 118° 垂直: 87°

      外參

      各相機光點到基礎坐標系的參數請見下,,,,可能與實物有些誤差,,,,坐標系方向見圖示:

      雙目相機:

      左眼 (101.5,,,,29.8,,1169.5)X軸正向向下俯仰47.6° 右眼(101.5,,,,-29.8,,,,1169.5)X軸方向向下俯仰47.6°

      夾爪腕部相機:

      左手 (361.3,,,148.2,,,840.2)X軸正向向下俯仰30° 右手 (361.3,,-148.2,,,,840.2)X軸正向向下俯仰30°

      靈巧手腕部相機:

      左手 (300.7,,,,111.8,,779.6)無角度偏差 右手 (300.7,,,-111.8,,779.6)無角度偏差

      來源文件:開發幫助_031354.md
      Q

      G1 背包 URDF

      背包型號

      G1 機器人目前適配了兩款算力板卡背包,,,,分別為Jetson Orin AGX 和 Jetson Orin Thor。。

      URDF下載連接

      Jetson Orin AGX

      Jetson Orin Thor

      來源文件:開發幫助_031355.md
      Q

      G1-D產品資料&開發資料

      說明書、、開發手冊

      開發手冊: 說明書: 電池&充電器說明書: 遙控器說明書:

      簡化模型-STEP

      G1-D 簡化模型:

      URDF

      G1-D URDF:

      電池、、、、電源信息

      電池信息 G1-D通用版:上身電池(快拆):9Ah G1-D旗艦版:底盤電池(內置):30Ah 電源信息 G1-D通用版續航時間:約 2 小時 G1-D旗艦版續航時間:約 6 小時

      來源文件:開發幫助_031356.md
      Q

      G1 獲取電池電量

      電量信息結構體

      G1 機器人提供了電量信息的話題:rt/lf/bmsstate。。在文檔中心有相關的結構體定義,,,,如下面圖片。。。

      用 ROS2 方式獲取

      按照教程配置ROS2通信之後,,,,可以用命令 ROS2 打印電池話題信息。。

      ros2 topic echo /lf/bmsstate
      

      獲取效果如以下圖片:

      使用程序進行獲取

      電池電量可以通過 DDS 訂閱話題 “rt/lf/bmsstate”來實現。。。。訂閱到數據之後觸發回調函數,,打印對應的 BmsState 數據即可。。 Demo 代碼如下:

      #include <unitree/robot/channel/channel_publisher.hpp>
      #include <unitree/robot/channel/channel_subscriber.hpp>
      // DDS
      
      #include <unitree/idl/hg/BmsState_.hpp>
      
      #define TOPIC_BMSSTATE "rt/lf/bmsstate"
      
      using namespace unitree::robot;
      
      void BmsStateMessageHandler(const void* message)
      {
          unitree_hg::msg::dds_::BmsState_ bms_state = *(unitree_hg::msg::dds_::BmsState_*)message;
          std::cout << "Battery Soc:" << bms_state.soc() << std::endl;
          std::cout << "Battery Current:" << bms_state.current() << std::endl;
      }
      
      int main(){
          std::string networkInterface = "eth0";//network_interface
          unitree::robot::ChannelFactory::Instance()->Init(0, networkInterface);
      
          ChannelSubscriber<unitree_hg::msg::dds_::BmsState_> suberlow(TOPIC_BMSSTATE);
          suberlow.InitChannel(BmsStateMessageHandler);
      
          while(1){
              usleep(20000);
          }
      
          return 0;
      }
      

      將以上代碼放置至 unitree_sdk2 中進行編譯,,,,連接機器人之後運行代碼,,,運行方法與Go2快速開發中的過程類似。。。 Demo程序運行成功之後,,,終端會打印獲取到的 G1 當前電流以及當前電量。。。。

      來源文件:開發幫助_031357.md
      Q

      G1的PC2恢覆系統教程

      !!! warning 使用須知 1、、進行更新前請自行備份PC2中的個人文件 2、、、若自己無法操作,,,,可以提把機器寄回重刷 !!!

      1、、、下載系統鏡像

      從以下鏈接中下載 g1_nx_Jetpack5.1.1_20250930.img.bz2

      2、、拆卸 NVMe 硬盤

      您需要準備以下工具:

      全套六角、、、、梅花扳手(螺絲刀批頭也可以)。。。。NVME M.2硬盤讀卡器/移動硬盤盒(NGFF不可用)。。。。

      1. 擰下後把手部分的兩顆螺絲。。。。

      把手1

      把手2

      1. 使用一字螺絲刀或者撬棒從圖示位置輕輕撬開外殼。。。。(四個孔為安裝孔,,,內部沒有螺絲。。)

      1. 小心揭下保護泡棉(不要撕破)

      1. 拆卸四顆螺絲,,卸下背板。。。

      1. 取出NVME硬盤。。

      NVME

      3、、、燒錄系統鏡像

      借助NVMe M.2移動硬盤盒把拆出的硬盤插⼊您的電腦,,,,確認該NVMe存儲設備的設備節點,,,,⽐如:/dev/sdc。。。把鏡像燒寫到NVMe存儲設備中,,,,執⾏如下命令:

      # 注意:/dev/sdc根據實際情況填寫
      bzip2 -dc g1_nx_Jetpack5.1.1_20250930.img.bz2 | sudo dd of=/dev/sdc status=progress
      

      把燒錄好的NVMe盤裝回到機器人中,,即可上電開機使用了。。。

      來源文件:開發幫助_031358.md
      Q

      G1-D 鏡像恢覆方法

      前期準備

      1. 硬件:請提前準備 NVMe 固態硬盤盒,,用於磁盤鏡像燒錄;
      2. 系統環境:鏡像燒錄工具支持 x86 架構 Ubuntu 20.04 / Ubuntu 22.04 / Ubuntu 24.04 操作系統。。
      3. 軟件依賴:請在燒錄主機終端執行以下命令,,,完成依賴組件安裝。。。
      sudo apt update
      sudo apt install -y partclone gawk gzip parted util-linux udisks2
      

      !!! warning 不要使用虛擬機進行鏡像燒錄!!!!!!!! !!!

      磁盤恢覆腳本

      使用以下的腳本,,,,可自行保存為文件,,文件名為 disk_recovery.sh

      #!/bin/bash
      set -eo pipefail
      
      if [[ $EUID -ne 0 ]]; then echo "錯誤: 必須以 sudo 運行"; exit 1; fi
      
      BACKUP_ROOT="./disk_backups"
      
      # =========================
      # 清空目標磁盤
      # =========================
      clean_target_for_restore() {
          local dev=$1
          systemctl stop udisks2.service 2>/dev/null || true
          for mp in $(lsblk -rn -o MOUNTPOINT "$dev" 2>/dev/null | grep '^/' | sort -r); do
              umount -l "$mp" 2>/dev/null || true
          done
          wipefs -a "$dev" 2>/dev/null || true
          sync
      }
      
      restore_env() {
          systemctl start udisks2.service 2>/dev/null || true
      }
      
      # ============================================================
      # 自動識別源磁盤名稱
      # ============================================================
      get_source_disk_name() {
          local pt_file="$1"
          grep -oP 'device: /dev/\Ksd[a-z]' "$pt_file" | head -n1
      }
      
      # ============================================================
      # 動態修改第一個分區 size
      # ============================================================
      modify_first_partition() {
          local INPUT_FILE="$1"
          local OUTPUT_FILE="$2"
          local NEW_SIZE="$3"
          local src_disk="$4"
      
          # 參數檢查
          if [ ! -f "$INPUT_FILE" ]; then
              echo "❌ 錯誤:輸入文件 $INPUT_FILE 不存在"
              return 1
          fi
          if ! [[ "$NEW_SIZE" =~ ^[0-9]+$ ]]; then
              echo "❌ 錯誤:size 必須是純數字"
              return 1
          fi
      
          sed -e '/last-lba/d' \
              -e "/^\/dev\/${src_disk}1 :/s/\(size=\s*\)[0-9]\+/\1$NEW_SIZE/" \
              "$INPUT_FILE" > "$OUTPUT_FILE"
          echo -e "\n 處理完成!!!!已修改第一個分區size = $NEW_SIZE"
      }
      
      # =========================
      # 動態獲取第一個分區 start
      # =========================
      get_first_part_start() {
          local PART_FILE="$1"
          local src_disk="$2"
          grep "^/dev/${src_disk}1 " "$PART_FILE" | awk -F'start=|, ' '{print $2}' | tr -d ' '
      }
      
      # =========================
      # 生成適配分區表
      # =========================
      generate_adapted_partition_table() {
          local src_pt_file="$1"
          local target_dev="$2"
          local output_pt_file="$3"
          local target_base=$(basename "$target_dev")
          local src_disk=$(get_source_disk_name "$src_pt_file")
      
          # 磁盤總扇區
          local total_sectors=$(blockdev --getsz "$target_dev")
          # GPT 保留 34 扇區尾扇區
          local last_usable=$((total_sectors - 34))
          # 獲取源備份里 第1分區 的 start
          local start=$(get_first_part_start "$src_pt_file" "$src_disk")
          local size=$((last_usable - start))
      
          modify_first_partition "$src_pt_file" "$output_pt_file" ${size} "$src_disk"
      
          sed -i "s|/dev/${src_disk}|/dev/${target_base}|g" "$output_pt_file"
          sed -i "s|device: /dev/${src_disk}|device: /dev/${target_base}|g" "$output_pt_file"
      
          echo ">>> 已生成適配分區表:size = $size,,設備名已替換為 $target_base"
      }
      
      # =========================
      # 讀取分區號
      # =========================
      get_partition_numbers() {
          local pt_file="$1"
          grep '^/dev/sd[a-z][0-9]' "$pt_file" | sed -E 's/^\/dev\/sd[a-z]//; s/[ :].*//' | sort -n
      }
      
      # =========================
      # 還原磁盤(通用版)
      # =========================
      restore_disk() {
          echo "可用備份列表:"
          local dirs=($(ls -d $BACKUP_ROOT/*/ 2>/dev/null))
          [[ ${#dirs[@]} -eq 0 ]] && { echo "無備份"; exit 1; }
          select dir in "${dirs[@]}"; do [[ -n "$dir" ]] && break; done
      
          # 自動識別備份源磁盤名
          local src_disk=$(get_source_disk_name "$dir/partition_table.txt")
          echo "✅ 自動識別備份源磁盤: $src_disk"
      
          read -p "請輸入目標磁盤 (例如 /dev/sdb): " target
          [[ ! -b "$target" ]] && { echo "目標磁盤不存在"; exit 1; }
      
          clean_target_for_restore "$target"
      
          read -p "⚠️  警告:$target 將會被清空,,確定繼續? (y/n): " confirm
          [[ "$confirm" != "y" ]] && { restore_env; exit 1; }
      
          local new_pt="$dir/partition_table_b.txt"
          generate_adapted_partition_table "$dir/partition_table.txt" "$target" "$new_pt"
      
          echo -e "\n>>> 寫入分區表..."
          sfdisk --force "$target" < "$new_pt"
      
          echo ">>> 刷新分區..."
          partprobe "$target"
          blockdev --rereadpt "$target"
          udevadm settle
          sync && sleep 2
      
          echo ">>> 恢覆分區數據..."
          local part_nums=$(get_partition_numbers "$new_pt")
          echo "✅ 解析到分區號: [$part_nums]"
      
          echo "$part_nums" | while read -r i; do
              [[ -z "$i" ]] && continue
              dev_part="${target}${i}"
      
              # 自動匹配備份文件(sda/sdb/sdc 都支持)
              pcl_file="$dir/${src_disk}${i}.pcl.gz"
              img_file="$dir/${src_disk}${i}.img.gz"
      
              if [[ -f "$pcl_file" && -s "$pcl_file" ]]; then
                  # 從備份文件讀取真實類型
                  fs_type=$(awk -v n="$i" '$1 == n {print $2}' "$dir/partition_types.txt")
                  echo ">>> 恢覆 $dev_part ($fs_type)"
                  partclone."$fs_type" -C -F -r -s "$pcl_file" -o "$dev_part"
              elif [[ -f "$img_file" && -s "$img_file" ]]; then
                  echo ">>> 恢覆 $dev_part (dd鏡像)"
                  zcat "$img_file" | dd of="$dev_part" bs=4M status=progress
              else
                  echo ">>> 跳過分區 $i (無備份文件)"
              fi
          done
      
          echo ">>> 文件系統檢查 + 自動擴容..."
          e2fsck -yf "${target}1" || true
          resize2fs "${target}1" || true
      
          restore_env
          echo -e "\n✅ 恢覆完成!!!自動適配任意磁盤"
      }
      
      # =========================
      # 執行還原功能
      # =========================
      clear
      echo "======================================"
      echo "   Unitree 磁盤鏡像恢覆工具V1.1"
      echo "======================================"
      restore_disk
      

      也可以點此下載腳本文件,,,自行保存至電腦目錄中。。。。

      鏡像下載與解壓

      下載鏈接:

      使用百度網盤進行下載,,,下載後保存到燒錄主機上,,並進行解壓。。。解壓命令如下:

      sudo tar -xvpf g1d_img_jetpack5.1.1_v2603.tar.gz
      

      解壓後,,將 disk_recovery.sh 腳本拷貝到解壓文件夾下(假設文件夾名為 disk_backups),,,與 disk_backups 同級,,,,如下所示:

      ma@ma:~/g1$ ls
      disk_backups  disk_recovery.sh
      

      鏡像燒錄步驟

      運行鏡像燒錄腳本:

      cd g1/
      chmod +x disk_recovery.sh
      sudo ./disk_recovery.sh
      

      選擇要進行燒錄的鏡像文件,,,輸入燒錄的鏡像的序號,,並按回車: 選擇要進行燒錄的磁盤,,,,根據實際情況進行手動輸入,,輸入完畢敲回車鍵確認:

      可以使用 lsblk 命令來確認要燒錄的目標磁盤。。。。

      輸入 y ,,,確認擦除磁盤。。。。 等待鏡像燒錄,,,,大概10分鐘左右。。。。 燒錄完成之後應該如下圖所示:

      來源文件:開發幫助_031359.md
      Q

      G1 更換設備樹方法

      [!WARNING] 以下內容僅適用於 Jetpack 5.1.1 版本 G1 進行使用!!!!!!!!

      更換設備樹的場景

      這個更換設備樹的方案適用於 USB 接口無法識別為 3.0 時可以嘗試此方法更換設備樹。。。

      檢查設備版本

      下載檢查版本腳本文件

      首先保存或者下載下方的腳本文件,,覆制放入 G1 NX(PC2)中。。

      #!/bin/bash
      
      # 設置源 DTB 文件路徑和目標目錄
      DTB_SOURCE="/boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb"
      TEMP_DIR="/tmp"
      DTB_FILENAME="kernel_tegra234-p3767-0000-p3768-0000-a0.dtb"
      DTS_FILENAME="output.dts"
      SEARCH_PATTERN="dtbbuildtime"
      
      # 檢查源 DTB 文件是否存在
      if [ ! -f "$DTB_SOURCE" ]; then
        echo "錯誤: 源文件不存在: $DTB_SOURCE" >&2
        exit 1
      fi
      
      # 檢查 dtc 命令是否可用
      if ! command -v dtc &> /dev/null; then
        echo "錯誤: dtc (Device Tree Compiler) 未找到。。。。請先安裝 device-tree-compiler 包。。。。" >&2
        exit 1
      fi
      
      sudo cp "$DTB_SOURCE" "$TEMP_DIR/"
      
      if [ $? -ne 0 ]; then
        echo "錯誤: 覆制 DTB 文件失敗。。" >&2
        exit 1
      fi
      
      # 運行 dtc 命令,,將標準輸出和標準錯誤都重定向到 /dev/null
      sudo dtc -I dtb -O dts -o "$TEMP_DIR/$DTS_FILENAME" "$TEMP_DIR/$DTB_FILENAME" >/dev/null 2>&1
      
      if [ $? -ne 0 ]; then
        echo "Error: decompile DTB error" >&2
        # 清理臨時覆制的 .dtb 文件
        sudo rm -f "$TEMP_DIR/$DTB_FILENAME"
        exit 1
      fi
      
      echo "Searching '$SEARCH_PATTERN'..."
      # 搜索並輸出結果
      sudo grep "$SEARCH_PATTERN" "$TEMP_DIR/$DTS_FILENAME"
      
      if [ $? -ne 0 ]; then
        echo "警告: 在 $TEMP_DIR/$DTS_FILENAME 中未找到模式 '$SEARCH_PATTERN'。。。。"
      fi
      
      echo "Completed. "
      
      

      點此鏈接下載腳本文件:

      在 PC2 中檢查版本

      在 PC2 中放置腳本文件的目錄右鍵打開終端,,執行腳本文件。。

      chmod +x check_dt_version.sh
      ./check_dt_version.sh
      

      執行的效果應該如下: 顯示以上內容表示版本正確。。如果腳本⽆法運⾏或者輸出結果不⼀致,,,,則表明軟件版本不對。。。。需要進⾏設備樹替換。。。。

      更換設備樹版本

      先通過如下命令查看/boot/extlinux/extlinux.conf的內容,,,,確保紅⾊箭頭所指內容⼀致。。。 下載下方的設備樹文件 點擊此處下載設備樹文件: 下載完成之後覆制放入 G1 PC2 主目錄下,,,,右鍵打開終端,,,執行以下命令,,更換設備樹文件。。。

      sudo cp /boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb /boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb.bk
      sudo rm -rf /boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb
      sudo cp -rf /home/unitree/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb /boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb
      sudo reboot
      
      來源文件:開發幫助_031360.md
      Q

      G1 固件1.5.3後用程序拉起lidar_driver與unitree_slam服務

      概述

      在 G1 固件更新至v1.5.3版本之後,,,由於為了節省 PC1 資源。。。。關於 Mid360 雷達和 slam 導航的兩個相關服務,,,unitree_slam 和 lidar_driver 不會在開機默認啟動。。。而是保持關閉狀態。。

      使用 APP 查看服務狀態

      使用 Unitree Explore APP 連接機器人。。點擊[設備],,進入設備配置信息查看頁面。。。。 在配置信息頁面找到左側的運維服務,,,進入運維服務里面的服務狀態選項。。 進入服務狀態即可看到當前設備上運行的所有服務,,我們要操作的服務是 unitree_slam 和 lidar_driver,,如下圖所示。。 在使用的時候可以手動開啟這兩個服務。。

      使用程序啟動 slam 相關服務

      使用到的接口

      使用程序開啟 slam 相關的服務需要使用到的接口為設備狀態服務接口。。。。對應的類為RobotStateClient 類,,,,RobotStateClient 是設備狀態服務提供的 Client,,通過 RobotClient 可以方便地通過 RPC 方式實現對 G1 內部的服務控制、、、、獲取服務狀態、、、、設備狀態和系統資源使用信息。。。 本接口覆用自B2的設備狀態服務接口。。。。開發者可以在SDK的以下位置找到相關資源。。

      unitree_sdk2\include\unitree\robot\b2\robot_state //C++
      unitree_sdk2py\b2\robot_state #Python
      unitree_ros2\example\src\include\common\ros2_robot_state_client.h //ROS2
      

      在這個類中找到 ServiceSwitch 接口,,這個 api 填入對應的參數。。。。即可開關 G1 上對應的服務。。。。這個服務的三個入參分別為要開關的服務名稱,,需要開啟還是關閉,,操作完成之後對應服務的狀態(返回值)。。。。

      樣例程序

      開發者可以使用以下提供的程序結合 unitree_sdk2 去使用這個 api 接口開關這兩個服務。。。

      #include <chrono>
      #include <iosestream>
      #include <thread>
      
      #include <unitree/robot/channel/channel_publisher.hpp>
      #include <unitree/robot/channel/channel_subscriber.hpp>
      
      #include <unitree/robot/b2/robot_state/robot_state_api.hpp>
      #include <unitree/robot/b2/robot_state/robot_state_client.hpp>
      
      int main(){
          std::string networkInterface = "eth0";//network_interface
          unitree::robot::ChannelFactory::Instance()->Init(0, networkInterface);
      
          unitree::robot::b2::RobotStateClient rs;
          rs.SetTimeout(25.0f);
          rs.Init();
      
          int status1 = 0;
          int status2 = 0;
          int res1 = 0;
          int res2 = 0;
          res1 = rs.ServiceSwitch("lidar_driver", 1, status1);
          usleep(200000);
          res2 = rs.ServiceSwitch("unitree_slam", 1, status2);
          usleep(200000);
      
          std::cout << "lidar_driver api: " << res1 << std::endl;
          std::cout << "unitree_slam api: " << res2 << std::endl;
          std::cout << "lidar_driver status: " << status1 << std::endl;
          std::cout << "unitree_slam status: " << status2 << std::endl;
      
          return 0;
      }
      

      將以上代碼放置至 unitree_sdk2 中進行編譯,,連接機器人之後運行代碼,,運行方法與Go2快速開發中的過程類似。。 Demo程序運行成功之後,,G1 上的 unitree_slam 和 lidar_driver 服務就會開始運行。。。。開發者可以將這個程序作為自啟動程序運行。。。。達到每次開啟機器人,,服務自動運行的效果。。

      來源文件:開發幫助_031361.md
      Q

      為什麼控制機器人手臂的時候會出現往下掉的現象

      1. 問題描述

      1.1 現象

      在機械臂控制程序中,,當手臂在A點保持靜止,,然後調用軌跡移動函數進行角度變化時,,,在銜接的瞬間會出現短暫的下垂現象(手臂先向下掉落一段距離,,然後才開始按預期軌跡運動)。。

      1.2 覆現條件

      • 使用純PD控制(不帶重力補償)
      • 控制模式從"位置保持"切換到"軌跡跟蹤"
      • 切換過程中控制器狀態被重置或目標位置發生跳變

      2. 根本原因分析

      2.1 純PD控制的特性

      純PD控制器的標準形式為:

      τ = Kp * (θ_des - θ_act) + Kd * (θ̇_des - θ̇_act)
      

      關鍵特性: - 不存在積分項(I),,,無法消除穩態誤差 - 要維持機械臂在懸停位置,,必須依賴靜態位置誤差 e = θ_des - θ_act - 這個誤差產生的比例力矩 Kp * e 恰好抵消重力矩

      2.2 下垂產生的機理

      在A點靜止時:

      實際位置 θ_act ≈ A - δ    (δ為微小偏差)
      目標位置 θ_des = A
      位置誤差 e = A - (A - δ) = δ
      輸出力矩 τ = Kp * δ  (剛好抵消重力)
      

      切換到軌跡移動時(問題代碼):

      self.low_cmd.motor_cmd[joint].q = (1.0 - ratio) * self.low_state.motor_state[joint].q
      # Stage 1將目標位置逐漸拉向0,,,導致誤差歸零
      

      切換瞬間: 1. 指令位置發生跳變或重置 2. 位置誤差 e 突然減小或歸零 3. 輸出力矩 τ 瞬間下降 4. 手臂失去支撐力矩 → 下垂 5. 控制器檢測到新誤差 → 恢覆力矩 → 開始跟蹤軌跡


      3. 解決方案

      原理: 保持指令位置連續。。。在任何時候,,發送給電機的目標位置必須是連續的,,,,不能有跳變。。

      說明: initial_pos 零位 current_pos 從lowstate話題消息中讀取的當前關節位置 target_pos 目標位置

      Python實現:

      def LowCmdWrite(self):
          self.time_ += self.control_dt_
      
          # 錯誤做法:不要這樣
          # self.low_cmd.motor_cmd[joint].q = (1.0 - ratio) * current_pos
      
          # 正確做法:直接從初始位置插值到目標
          if self.time_ < self.duration_ * 2:
              for i, joint in enumerate(self.arm_joints):
                  ratio = np.clip(self.time_ / (self.duration_ * 2), 0.0, 1.0)
                  # 從初始位置平滑過渡到目標位置
                  self.low_cmd.motor_cmd[joint].q = (
                      (1.0 - ratio) * self.target_pos_1[i] +
                      ratio * self.target_pos_2[i]
                  )
                  self.low_cmd.motor_cmd[joint].dq = 0.0
                  self.low_cmd.motor_cmd[joint].kp = self.kp
                  self.low_cmd.motor_cmd[joint].kd = self.kd
      

      C++實現:

      // 控制循環中,,,,始終連續更新
      for (int i = 0; i < num_time_steps; ++i) {
          for (int j = 0; j < arm_joints.size(); ++j) {
              float delta = std::clamp(
                  target_pos.at(j) - current_jpos_des.at(j),
                  -max_joint_delta, max_joint_delta
              );
              current_jpos_des.at(j) += delta;
      
              // 計算期望速度
              float dq_des = delta / control_dt;
      
              msg.motor_cmd().at(arm_joints.at(j)).q(current_jpos_des.at(j));
              msg.motor_cmd().at(arm_joints.at(j)).dq(dq_des);
              msg.motor_cmd().at(arm_joints.at(j)).kp(kp);
              msg.motor_cmd().at(arm_joints.at(j)).kd(kd);
          }
      }
      
      來源文件:開發幫助_031362.md
      Q

      G1離線語音播報清單

      觸發離線語音 中文語音 English Voice
      急停 急停已觸發,,請重啟設備恢覆運行。。 Emergency estop trigger, please restart to resume.
      下蹲 設備下蹲中,,,,請注意安全。。。 Robot squatting,,please be careful.
      起身 設備正在起身,,,請注意安全。。。。 Robot rising, please be careful.
      自適應起身 設備正在起身,,請注意安全。。。 Robot rising, please be careful.
      零力矩模式 零力矩模式。。。 Zero torque mode.
      阻尼模式 阻尼模式。。。 Damp mode.
      預備模式 預備模式。。。。 Ready mode.
      調試模式 調試模式。。。 Development mode.
      走跑運控 已進入走跑模式,,,請控制速度,,,注意安全。。。 Walkrun mode activated, control your speed and stay alert.
      常規運控 已進入常規運控模式,,,,請注意安全。。。。 Rountine control engaged, process with caution.
      舞蹈運控 已進入舞蹈模式,,,請與機器人保持安全距離 Entering dance mode, please keep a safe distance.
      越障運控 已進入越障模式,,請謹慎操作,,注意安全。。。 Obstacle negotiation enabled, operate with care.
      格鬥運控 已進入格鬥模式,,請與機器人保持安全距離。。。。 Combat mode initiated, maintain a safe distance form the robot.
      來源文件:開發幫助_031363.md
      站点地图
      站点地图