通用 常見問題(圖文版)

    🤖 通用 常見問題(146 篇)

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

    導航問題列表

      Q

      售後_異常_020323_產品異常反饋指引

      產品異常反饋指引

      當您的產品遇到故障時,,,麻煩您截圖以下 APP 內相關信息並發送給技術支持團隊。。。完整的信息將幫助我們快速定位問題根源,,,,提升故障排查效率,,為您提供更精準的解決方案。。。。

      需截圖的關鍵信息清單(以G1為例,,,可提供錄屏或者截圖下列信息)

      圖一 產品首頁報警信息

      圖二 設備-數據-機器人 機器人軟硬件版本

      圖三 設備-數據-機器人 機器人電機各項數據 (需提供6類電機數據)

      圖四 設備-數據-機器人 29自由度腰部電機狀態

      圖五 設備-報警信息

      圖六 設備-服務狀態

      來源文件:售後_異常_020323_產品異常反饋指引.md
      Q

      售後_維修_020101_如何申請設備維修

      在派工單上提交設備返修申請,,,,技術支持對接確認設備問題,,如需返修則會有售後介入發起返修流程。。

      維修申請/維修進度查詢:

      基本流程:

      1. 點擊“新建工單”,,,,即可進入工單創建頁面

      2. 選擇“設備維修”類型,,,再點擊“下一步”則可進入工單信息填寫頁面

      3. 在工單信息填寫頁面請詳細填寫您的“產品類型”、、、“問題描述”、、、“設備編號”等信息。。。。選擇“提交工單”,,,,工單就即可成功創建。。。。

      注意事項:

      (1)如果需要開票,,請填寫需要開票的類型、、、發票擡頭和發票稅號。。。。

      (2)故障視頻或照片可以上傳為附件,,,方便工程師診斷。。

      (3)關於“設備編號”,,可以點擊右側的“如何查看”查詢查看方式。。。

      (4)請詳細填寫“聯系人”、、“聯系電話”、、“收貨地址”,,確保信息的準確性。。。。

      來源文件:售後_維修_020101_如何申請設備維修.md
      Q

      售後_維修_020102_需要多長時間完成維修

      收到您寄修的產品後,,宇樹科技將在1-2周內完成處理;如遇特殊情況*,,,售後工程師會在工單中與客戶溝通維修周期,,,,請您留意。。。

      *如遇法定節假日、、大型活動導致的物流限制、、物料供應緊張、、、非普通終端用戶寄送等特殊場景,,,服務時間會酌情延長,,請您諒解。。

      來源文件:售後_維修_020102_需要多長時間完成維修.md
      Q

      售後_維修_020103_如何查詢維修進度及寄出單號

      設備返廠維修進度可在工單內右上角的“處理進度”中查看,,具體如下所示:

      發貨當天會在維修工單中同步快遞單號:

      以上可在“我的工單“中查看:https://serviceconsole.unitree.com/index.html#/work-order

      來源文件:售後_維修_020103_如何查詢維修進度及寄出單號.md
      Q

      售後_維修_020104_返廠維修運費規則

      返修運費規則:

      1. 1.質保期內設備需客戶自行承擔設備返廠的運費。。。維修完成後寄出的運費由宇樹科技承擔(默認使用跨越物流),,,如需郵寄其他快遞需客戶自行承擔運費。。

      2. 2.質保期外的設備往返的運費均需客戶承擔,,,,維修完成後寄出的運費客戶可以選擇到付寄回或者由宇樹科技代為寄回,,宇樹科技設備寄回費用根據機械狗的體型進行區分,,,小型機械狗(A1/Go1/Go2)運費統一為100元,,,,中型機械狗(Aliengo)運費統一為200元,,大型機械狗及人形機器人(B1/B2/G1/H1/H1-2)運費統一為300元。。

      來源文件:售後_維修_020104_返廠維修運費規則.md
      Q

      售後_維修_020105_設備寄回選擇什麼快遞

      一般情況下,,設備返廠維修客戶承擔快遞寄回費用,,,快遞種類不限,,客戶可以自行選擇; 如遇特殊情況或者寄回方式不是快遞請提前在對應工單中和售後工程師溝通。。。。

      來源文件:售後_維修_020105_設備寄回選擇什麼快遞.md
      Q

      售後_維修_020106_什麼情況下不提供維修服務

      您的設備如果存在以下情況,,,,將無法為您提供維修服務:

      1.客戶自行刷機導致機械狗/人故障,,如將AIR版本的機械狗刷成EDU版本。。 2.客戶未在宇樹科技指導下私自改裝、、、、拆解、、、加裝機械狗/人導致設備故障。。 3.未提交設備維修工單且未聯系宇樹科技售後直接寄出的。。。

      來源文件:售後_維修_020106_什麼情況下不提供維修服務.md
      Q

      售後_維修_020107_什麼情況下不提供免費維修服務

      您的設備如果存在以下情況,,,將無法免費維修:

      1. 超出保修期限的;
      2. 由於使用者使用不當(如墜落、、、、擠壓、、、浸液、、暴力使用等)而造成損壞的;
      3. 使用非原廠配件而導致產品發生故障的;
      4. 發生人為的非產品本身質量問題導致的損壞;
      5. 發生私自改造、、拆裝、、、、開殼等行為後,,,,產品產生的損壞;
      6. 未按說明書指導的不正確安裝、、、使用及操作所造成的損壞;
      7. 在無官方說明指導的情況下,,,,自行維修或更換部件導致的損壞;
      8. 因非官方說明書指導的電路改造、、、、電池包、、、、充電器使用不當導致的損壞;
      9. 在惡劣環境下操控導致的損壞,,,包括但不限於強磁強幹擾、、、雨天、、、、沙塵、、、濕地、、、覆雜地況等;
      10. 在地形尖銳、、起伏劇烈等情況下的操作導致的損壞;
      11. 在摩擦力非常小的地面(如冰面,,玻璃面)使用機器人導致的損壞;
      12. 在較平整地形操控機器人摔倒以外的,,,跌落損壞;
      13. 在覆雜環境場合中,,,機器人碰撞到環境中的人或物而引起的機器人損壞。。。
      14. 與其他無線設備相互幹擾的情況下操控導致的損壞,,如WiFi信號幹擾,,,電磁幹擾等;
      15. 在超過安全承重情況下過載導致的損壞;
      16. 在超過機器人抗幹擾極限的情況下對其施加的各種暴力或非暴力導致的損壞;
      17. 擅自對機器人采用非原裝配套電池包供電導致的損壞;
      18. 與第三方產品同時使用時發生兼容性和可靠性問題導致的損壞;
      19. 在零部件發生老化或損壞的情況下強制運行造成的損壞;
      20. 在電量不足時、、或使用存在質量問題的電池包導致放電不足而產生的損壞;
      21. 聯系宇樹Unitree確認保修服務後,,,,沒有在規定時間內寄出相應物件;
      22. 由於操作失誤導致機器人撞擊硬物、、、、跌落、、、機器人表面有明顯摔打碰撞痕跡,,,明顯劃傷痕跡等情況;
      23. 機器人內部有明顯粉塵、、沙礫、、、水、、金屬粉末入侵痕跡;
      24. 由於在潮濕環境中使用導致機器人表面及內部有明顯水漬,,,,元器件和電路板有腐蝕痕跡;
      25. 在開發者模式下,,,用戶使用自己的程序對機器人進行高層或底層開發,,,導致機器人的損壞。。。。包括:如高層開發時,,,用戶搭載自己的視覺系統控制機器人進行運動,,導致機器人撞擊到尖銳物體或從高處跌落而產生的損壞; 如底層開發時,,,用戶控制的電機撞擊關節限位或產生其他撞擊或電機高速震動而產生的損壞等;
      26. 政策規定的其他情況。。
      來源文件:售後_維修_020107_什麼情況下不提供免費維修服務.md
      Q

      售後_維修_020108_如何確認維修費用

      宇樹科技售後處收到設備後會有相應維修工程師對設備進行檢修;對於收費維修的設備,,檢測完成後會出具報價清單並上傳至維修工單,,,客戶可在工單中確認是否需要維修。。。。

      來源文件:售後_維修_020108_如何確認維修費用.md
      Q

      售後_維修_020109_如何支付維修費用

      客戶可在維修工單中查看維修報價單並支付。。。

      1.在線付款: 報價單內嵌支付寶快捷支付,,,,客戶一鍵即可完成付款,,,減少傳統轉賬的繁瑣流

      2.對公支付: 戶名:宇樹科技股份有限公司 開戶行:招商銀行股份有限公司杭州錢塘支行 賬號:5719 0988 2210 601

      支付方式附在報價單下方,,,,如下圖所示:

      來源文件:售後_維修_020109_如何支付維修費用.md
      Q

      售後_維修_020110_如何開具維修發票

      開具發票需要在“創建工單”時填寫相應的開票信息(默認開具普通發票)。。如後續需要修改,,,,在維修工單中聯系售後工程師,,提供修改的開票信息。。。。

      若選擇對公支付,,客戶只能開具以付款單位為擡頭的發票。。。如您需要開具增值稅專用發票,,,,請在維修工單中聯系售後工程師,,,所有付款方式均支持開具發票。。。。

      來源文件:售後_維修_020110_如何開具維修發票.md
      Q

      如何查看GPU以及如何使用GPU

      機器狗或者機器人配備或者選裝的NVIDIA Jetson系列板卡為GPU,,,,要在NVIDIA Jetson板卡上使用GPU,,通常需要以下幾個步驟: 1.安裝必要的軟件和驅動 2.安裝 NVIDIA Jetson 驅動: 確保 Jetson 驅動正確安裝並可用,,可使用 jtop 命令驗證,,如果能夠成功顯示 NVIDIA Jetson 的信息,,,則說明驅動已正確安裝。。。 3.安裝 CUDA: CUDA 是 NVIDIA 推出的並行計算平台和編程模型,,,許多 GPU 加速的應用程序和框架都依賴於它。。 4.安裝相關的開發庫和工具: 根據具體的應用需求,,安裝相應的開發庫和工具,,如 CuDNN(用於深度學習的加速庫)、、TensorRT(用於高性能深度學習推理的庫)等。。。。

      默認出廠GPU驅動已安裝,,,可以通過如下命令查看GPU信息: lspci | grep -invidia 查看硬件GPU,,,或者 lsmod 查看下GPU驅動

      Jetson GPU驅動信息: 通過 jtop 命令查看Jetson板卡的CPU、、、、GPU等的占用情況、、、溫度等信息。。

      tips:NVIDIA Jetson系列板卡是arm架構的,,,jtop是專門的監控工具,,實現nvidia-smi的功能。。。。nvidia-smi是NVIDA的其他系列的工具,,Jetson系列沒有。。可以理解為jtop命令在jetson上就是nvidia-smi。。

      jtop命令安裝: sudo pip3 install jetson-stats jetson-stats是一個用於監控和管理Jetson設備性能的工具集。。。。它提供了各種命令和功能,,可以查看設備的實時資源使用情況(如CPU、、、、內存和GPU利用率),,並且還可以進行風扇控制、、、、溫度監測等操作。。。。通過安裝jetson-stats,,,您可以更方便地監控和管理Jetson設備的性能。。。 參考鏈接:https://blog.csdn.net/FREEDOM_X/article/details/139979294

      CUDA和nvcc CUDA(ComputeUnified Device Architecture),,,是顯卡廠商NVIDIA推出的運算平台。。。。CUDA是一種由NVIDIA推出的通用並行計算架構,,,該架構使GPU能夠解決覆雜的計算問題。。。。 nvcc是CUDA的編譯器,,,類似於gcc是C語言的編譯器。。 nvcc -Vnvcc --version,,可查看CUDA版本。。。

      測試GPU的小方法 開源項目:jetson-gpu-burn,,,專為Jetson系統定制的多GPU CUDA壓力測試工具。。。 參考鏈接:https://blog.csdn.net/gitblog_00580/article/details/142131463 項目地址:https://gitcode.com/gh_mirrors/je/jetson-gpu-burn 簡略使用方法:

      git clone https://gitcode.com/gh_mirrors/je/jetson-gpu-burn.git
      cd jetson-gpu-burn
      make
      ./gpu_burn 10 #或 ./gpu_burn -d 10
      #同時使用jtop監控GPU占用
      

      自己編程調用CUDA失敗 版本不匹配,,,,或者沒有安裝對應的功能包,,比如對應的python包。。。。

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

      OpenCV 安裝教程(x86架構)

      一、、、下載源碼

      1.在 下載源碼(以 4.1.1 為例):

      OpenCV Logo

      2.如果需要 contrib 模塊,,,,可以從官方的 GitHub 倉庫下載:

      二、、、目錄結構

      在主目錄位置創建一個文件夾 OpenCV,,,並將源碼解壓到該文件夾內,,,目錄樹結構如下所示:

      OpenCV
       ├── opencv-4.1.1          # OpenCV 主源碼
       └── opencv_contrib        # contrib 模塊源碼(可選)
      

      三、、、編譯與安裝

      1.進入源碼目錄(opencv-4.1.1)並創建 build install目錄:

      bash mkdir build install cd build

      2.運行 CMake(開啟 CUDA、、GStreamer;關閉 Python、、、Java 等模組),,,以下命令整體覆制到終端中,,然後按回車運行:

      bash cmake \ -D CMAKE_BUILD_TYPE=Release \ -D CMAKE_INSTALL_PREFIX=../install \ -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ -D OPENCV_GENERATE_PKGCONFIG=YES \ -D BUILD_opencv_python2=OFF \ -D BUILD_opencv_python3=OFF \ -D WITH_CUDA=ON \ -D WITH_GSTREAMER=ON \ -D WITH_NVCUVID=OFF \ -D WITH_NVCUVENC=OFF \ -D BUILD_opencv_java=OFF \ -D ENABLE_WERROR=OFF \ .. 其中,,,-D CMAKE_INSTALL_PREFIX=../install表示將OpenCV安裝在源碼目錄下的install文件夾中,,,,可根據需要調整安裝位置;-D BUILD_opencv_python3=OFF表示不編譯Python3模組,,如果需要的話可將OFF改為ON。。。

      提示​:如果不需要 contrib 模塊,,,,可移除 -D OPENCV_EXTRA_MODULES_PATH=... 參數。。。。該步驟請保持網絡暢通,,因為需要下載一些補充文件。。。

      3.編譯並安裝:

      bash make sudo make install

      四、、、常見錯誤及修覆

      • 錯誤信息​:

      CMake Error at .../cmake/OpenCVGenPkgconfig.cmake:113 (cmake_minimum_required): Compatibility with CMake < 3.5 has been removed... * ​修覆方法​: 進入 opencv-4.1.1 源碼目錄,,執行:

      bash sed -i 's/cmake_minimum_required(VERSION 2\.8\.12\.2)/cmake_minimum_required(VERSION 3.5)/' \ cmake/OpenCVGenPkgconfig.cmake

      然後返回 build 目錄,,重新運行上述 cmake、、make 和安裝命令即可。。。

      五、、配置環境變量

      1.配置動態鏈接庫

      編輯 /etc/ld.so.conf.d/opencv.conf:

      bash sudo vim /etc/ld.so.conf.d/opencv.conf

      在其中添加(將 username 替換為當前系統用戶名):

      /home/username/OpenCV/opencv-4.1.1/install/lib

      保存退出後,,,執行:

      bash sudo ldconfig

      2.配置 pkg-config 路徑

      編輯全局 Bash 配置文件:

      bash sudo vim /etc/bash.bashrc

      在文件末尾添加:

      bash PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/username/OpenCV/opencv-4.1.1/install/lib/pkgconfig export PKG_CONFIG_PATH

      保存退出後,,執行:

      bash source /etc/bash.bashrc

      六、、、、驗證安裝

      在終端運行:

      pkg-config --modversion opencv4
      

      如果輸出 OpenCV 版本號,,則說明安裝成功。。。。

      七、、、、Python使用方法

      在第三步中將Python的編譯開關打開。。。。

      !!! note 虛擬環境使用 若使用虛擬環境,,由於cmake命令包含了關於目標Python環境的參數,,,,所以需要在使用cmake前先激活您使用的Python環境 !!!

      # 您已經克隆的opencv的位置
      cd opencv-4.1.1
      mkdir install && mkdir build
      cd build
      cmake \
        -D CMAKE_BUILD_TYPE=Release \
        -D CMAKE_INSTALL_PREFIX=../install \
        -D CMAKE_CXX_STANDARD=11 -D CMAKE_CXX_STANDARD_REQUIRED=ON \
        -D OPENCV_GENERATE_PKGCONFIG=YES \
        -D WITH_GSTREAMER=ON \
        -D WITH_NVCUVID=OFF \
        -D WITH_NVCUVENC=OFF \
        -D BUILD_opencv_java=OFF \
        -D ENABLE_WERROR=OFF \
        -D WITH_FFMPEG=ON \
        -D BUILD_opencv_python2=OFF \
        -D BUILD_opencv_python3=ON \
        -D PYTHON3_PACKAGES_PATH=$(python -c "import site; print(site.getsitepackages()[0])") \
        -D PYTHON3_EXECUTABLE=$(which python) \
        ..
      
      # 開始編譯(開始前請確認您計算機的核心,,該命令為使用4線程進行並行編譯,,,,請勿使用所有的核心進行編譯,,可能造成卡死)
      make -j4
      

      !!! tip 編譯排錯

      編譯過程中可能遇到以下錯誤。。。。

      1. 'sleep_for' is not a member of 'std::this_thread'

      解決方案:

      sed -i '1i #include <chrono>\n#include <thread>' /home/heda/tmp/opencv-4.1.1/modules/gapi/test/gapi_async_test.cpp

      1. 編譯時提示缺少Eigen庫

      使用此命令遷移eigen庫環境(需要確認安裝了Eigen3依賴)

      sudo ln -sf /usr/include/eigen3/Eigen /usr/include/Eigen

      !!!

      把編譯生成的.so文件拷貝到所用的python環境中,,,,完成安裝。。。。其中,,,${your_python_env}為您的Python環境位置。。{Version}為您的Python版本。。。

      cp lib/python3/cv2.cpython*.so ${your_python_env}/lib/python${Version}/site-packages/cv2.so
      
      來源文件:開發幫助_03010201.md
      Q

      OpenCV 安裝教程(arm架構)

      一、、、下載源碼

      1.在 下載源碼(以當前最新版4.11.0為例):

      OpenCV Logo

      2.如果需要 contrib 模塊,,,可以從官方的 GitHub 倉庫下載:

      二、、、、目錄結構

      在主目錄位置創建一個文件夾 OpenCV,,並將源碼解壓到該文件夾內,,目錄樹結構如下所示:

      OpenCV
       ├── opencv-4.11.0          # OpenCV 主源碼
       └── opencv_contrib        # contrib 模塊源碼(可選)
      

      三、、編譯與安裝

      1.進入源碼目錄(opencv-4.11.0)並創建 build install目錄:

      bash mkdir build install cd build

      2.運行 CMake(開啟 CUDA、、、、GStreamer;關閉 Python、、、、Java 等模組),,以下命令整體覆制到終端中,,,,然後按回車運行:

      bash cmake \ -D CMAKE_BUILD_TYPE=Release \ -D CMAKE_INSTALL_PREFIX=../install \ -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ -D OPENCV_GENERATE_PKGCONFIG=YES \ -D BUILD_opencv_python2=OFF \ -D BUILD_opencv_python3=OFF \ -D WITH_CUDA=ON \ -D WITH_GSTREAMER=ON \ -D WITH_NVCUVID=OFF \ -D WITH_NVCUVENC=OFF \ -D BUILD_opencv_java=OFF \ -D ENABLE_WERROR=OFF \ .. 其中,,-D CMAKE_INSTALL_PREFIX=../install表示將OpenCV安裝在源碼目錄下的install文件夾中,,,,可根據需要調整安裝位置;-D BUILD_opencv_python3=OFF表示不編譯Python3模組,,如果需要的話可將OFF改為ON。。。。

      提示​:如果不需要 contrib 模塊,,,,可移除 -D OPENCV_EXTRA_MODULES_PATH=... 參數。。。。該步驟請保持網絡暢通,,,,因為需要下載一些補充文件。。。。

      提示​:-D WITH_CUDA=ON 參數為對CUDA的支持,,,,較早版本的OpenCV(例如opencv-4.1.1)已經不支持較高版本的CUDA(比如Go2拓展塢上的CUDA11.4),,,所以需要使用這個選項,,推薦選擇高版本的OpenCV。。。

      3.編譯並安裝:

      bash make sudo make install

      四、、、、常見錯誤及修覆

      • 錯誤信息​:

      CMake Error at .../cmake/OpenCVGenPkgconfig.cmake:113 (cmake_minimum_required): Compatibility with CMake < 3.5 has been removed... * ​修覆方法​: 進入 opencv-4.11.0 源碼目錄,,,,執行:

      bash sed -i 's/cmake_minimum_required(VERSION 2\.8\.12\.2)/cmake_minimum_required(VERSION 3.5)/' \ cmake/OpenCVGenPkgconfig.cmake

      然後返回 build 目錄,,,,重新運行上述 CMake、、、make 和安裝命令即可。。。。

      五、、、配置環境變量

      1.配置動態鏈接庫

      編輯 /etc/ld.so.conf.d/opencv.conf:

      bash sudo vim /etc/ld.so.conf.d/opencv.conf

      在其中添加(將 username 替換為當前系統用戶名):

      /home/username/OpenCV/opencv-4.11.0/install/lib

      保存退出後,,,,執行:

      bash sudo ldconfig

      2.配置 pkg-config 路徑

      編輯全局 Bash 配置文件:

      bash sudo vim /etc/bash.bashrc

      在文件末尾添加:

      bash PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/username/OpenCV/opencv-4.11.0/install/lib/pkgconfig export PKG_CONFIG_PATH

      保存退出後,,執行:

      bash source /etc/bash.bashrc

      六、、、、驗證安裝

      在終端運行:

      pkg-config --modversion opencv4
      

      如果輸出 OpenCV 版本號,,則說明安裝成功。。。

      七、、、、Python使用方法

      在第三步中將Python的編譯開關打開。。。

      !!! note 虛擬環境使用 若使用虛擬環境,,,,由於cmake命令包含了關於目標Python環境的參數,,,,所以需要在使用cmake前先激活您使用的Python環境 !!!

      # 您已經克隆的opencv的位置
      cd opencv-4.1.1
      mkdir install && mkdir build
      cd build
      cmake \
        -D CMAKE_BUILD_TYPE=Release \
        -D CMAKE_INSTALL_PREFIX=../install \
        -D CMAKE_CXX_STANDARD=11 -D CMAKE_CXX_STANDARD_REQUIRED=ON \
        -D OPENCV_GENERATE_PKGCONFIG=YES \
        -D WITH_GSTREAMER=ON \
        -D WITH_NVCUVID=OFF \
        -D WITH_NVCUVENC=OFF \
        -D BUILD_opencv_java=OFF \
        -D ENABLE_WERROR=OFF \
        -D WITH_FFMPEG=ON \
        -D BUILD_opencv_python2=OFF \
        -D BUILD_opencv_python3=ON \
        -D PYTHON3_PACKAGES_PATH=$(python -c "import site; print(site.getsitepackages()[0])") \
        -D PYTHON3_EXECUTABLE=$(which python) \
        ..
      
      # 開始編譯(開始前請確認您計算機的核心,,該命令為使用4線程進行並行編譯,,,,請勿使用所有的核心進行編譯,,可能造成卡死)
      make -j4
      

      !!! tip 編譯排錯

      編譯過程中可能遇到以下錯誤。。

      1. 'sleep_for' is not a member of 'std::this_thread'

      解決方案:

      1. 編譯時提示缺少Eigen庫

      使用此命令遷移eigen庫環境(需要確認安裝了Eigen3依賴)

      #sudo ln -sf /usr/include/eigen3/Eigen /usr/include/Eigen

      !!!

      把.so文件拷貝到所用的python環境中,,,,完成安裝。。。。其中,,${your_python_env}為您的Python環境位置。。。{Version}為您的Python版本。。。。

      cp lib/python3/cv2.cpython-310-x86_64-linux-gnu.so ${your_python_env}/lib/python${Version}/site-packages/cv2.so
      
      來源文件:開發幫助_03010202.md
      Q

      指定網卡進行ping操作

      linux系統下:ping -I

      查看當前網卡情況

      ifconfig
      

      有兩塊網卡,,,,IP分別為[eth0]192.168.123.164,,[wlan0]192.168.5.240。。。。

      使用不同網卡分別ping百度

      ping -I eth0 www.baidu.com
      

      ping不通,,,,因為這塊網卡本身沒有聯網,,,,ping不通是正常的!!

      ping -I wlan0 www.baidu.com
      #或ping -I [wlan0 IP] www.baidu.com
      

      ping通!!

      Windows系統下:ping -S

      與linux下用法基本一致,,,唯一要改的就是把 I(大寫的i)改為 S(大寫的S)。。

      網卡1[eth0]:

      ping -I 192.168.123.164 www.baidu.com
      

      網卡2[wlan0]:

      ping -I 192.168.5.240 www.baidu.com
      
      來源文件:開發幫助_03010301.md
      Q

      連接網絡後仍無法上網的解決方法

      機器人的板卡,,,,加裝WiFi網卡後,,與WiFi正常連接,,,,但是無法上網,,,或使用手機的USB共享網絡後仍然無法上網,,通過WiFi網卡或USB共享網絡ping www.baidu.com可以ping通,,但是默認登錄網址以及git clone等時候都是用的有線網卡,,,沒辦法正常連接(如下圖),,可以通過下述方法處理。。。。

      指定網卡ping,,可以使用 ping -I 命令,,,,例如:ping -I wlan0 www.baidu.com,,,,參考:

      檢查網卡優先級

      查看是否有比訪問網絡的網卡路由的metric更高的其他路由:

      ip route show
      

      以WiFi網卡為例,,查看WiFi網卡的metric數是否比有線網卡的metric數高。。

      metric越大,,,優先級越低。。 例如,,wlan0的metric 600(優先級低),,eth0的metric 100(優先級高)

      方法一:提高訪問網絡的網卡路由的優先級

      執行以下命令把訪問網絡的路由改到最上面,,提高優先級:

      sudo ip route add default via (gateway) dev (interface_name) metric 10
      

      替換其中的 (gateway) 和 (interface_name) 為你連接的設備實際的網關和網卡名

      方法二:調低WiFi網卡的metric,,改為比有線網卡的metric的值更低

      sudo nmcli connection modify "WIFI" ipv4.route-metric 100
      sudo nmcli connection modify "Wired Connection" ipv4.route-metric 100
      

      WIFI、、、、Wired Connection替換為你連接的實際無線和有線網卡NAME 可以通過 nmcli connection show 命令查看,,如下圖。。

      修改後重新加載配置

      sudo nmcli connection up "WIFI"
      sudo nmcli connection up "Wired Connection"
      

      WIFI、、Wired Connection替換為你連接的實際無線和有線網卡NAME

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

      機器狗內置板卡連接網絡的相關說明(適用於Go1、、A1等)

      本文適用於Go1、、、、A1等硬件架構的四足機器人。。。。

      宇樹四足機器人的內部架構,,一般都是由一塊主控板、、一塊運動控制主板、、、一塊或多塊感知主板組成,,內部一個交換機將各個板卡連起來成為一個局域網。。

      機器狗內部的各個主板,,,一般只有一個硬件的有線網口來供組網使用。。

      我們使用機器狗進行開發時,,,,經常會遇到需要讓內部的板卡聯網來使用。。。這個需求,,一般有兩種方法解決,,一個是通過板卡的USB口連接外置的USB無線網卡或者USB有線網卡來聯網,,,,另一個是通過修改板卡的網絡配置使其可以通過機器狗的網口來有線連接網絡。。。。 宇樹建議使用前一種方法,,對狗內部的板卡的配置沒有影響,,,,第二種方法需要操作者對系統操作熟練,,,,操作不當會影響機器狗本體功能!!!!!!!!!

      1.通過外置USB網卡聯網

      這種方法主要是將USB無線網卡或者USB有線網卡插到對應板卡的USB上,,,,然後通過連接顯示器、、、、鼠標、、、鍵盤,,,,通過板卡的系統界面來進行聯網(連接WiFi或者配置有線網口)。。

      使用這個方法有兩個注意事項:

      1. 1.如果板卡的USB口比較少(例如TX2或者Nano只留了一個USB口),,配置時可以使用USB HUB來擴展USB口。。

      1. 2.選擇USB無線網卡需要選擇Ubuntu系統免驅的或者提供Ubuntu系統驅動自行安裝。。USB有線網卡也是同樣的道理,,一般USB有線網卡都是免驅的。。

      2. 3.如果不知道如何挑選USB無線網卡,,可以試試COMFAST CF-812AC這款網卡,,使用的多一點。。

      注意:CF-812AC本身並不是Ubuntu系統免驅的,,但是我們研發調試的時候會用到,,,所以一般情況下都是能使用的,,但是並不能保證所有的板卡都能用。。。

      1. 4.連上有線或者WiFi後,,正常應該就可以上網了

      可以ping一下www.baidu.com來確認。。。如果遇到問題,,可以參考下面常見問題來嘗試解決。。。。

      2.修改網絡配置通過狗的網口聯網

      宇樹建議使用上一種方法,,,對狗內部的板卡的配置沒有影響。。

      此種方法需要操作者對系統操作熟練,,,,操作不當會影響機器狗本體功能!!!!!!!!!

      此方法不支持Go1的樹莓派!!!!!!!!

      將網線插在機身的網口上,,,需要配置對應板卡的網卡端口信息方可上網。。。(下面以NX為例,,Nano、、、、樹莓派、、、upboard等亦同)

      1. 1.打開終端,,輸入sudo gedit /etc/network/interfaces

      2. 2.根據提示輸入密碼,,默認密碼為123

      1. 3.在打開的配置文件中增加一個有線端口的配置信息

      增加配置信息時,,,,注意有線端口的名字,,這里以 eth0 舉例,,,請根據實際情況來編輯。。。。

      增加的配置信息,,,可以是靜態地址,,,也可以是動態分配(DHCP)的地址。。

      • 靜態地址配置
      auto eth0:1
      iface eth0:1 inet static
      name Ethernet shangwang LAN card
      address 192.168.72.222
      netmask 255.255.255.0
      gateway 192.168.72.1
      

      上面address、、、、netmask、、gateway字段後的地址需要根據你自己的網絡情況來改。。。

      • 動態分配地址配置
      auto eth0:1
      iface eth0:1 inet dhcp
      
      1. 4.保存,,然後sudo reboot 重啟

      這里也可以通過重啟網絡服務(sudo /etc/init.d/networking restart)來操作,,,但更建議重啟(sudo reboot)。。。。

      1. 5.自此,,,網線插在網口上應該就可以上網了

      可以ping一下www.baidu.com來確認。。如果遇到問題,,可以參考下面常見問題來嘗試解決。。。

      1. 6.不再使用網絡時,,,,再次編輯網絡配置文件/etc/network/interfaces ,,,,將修改的部分用#號注釋掉或刪除恢覆默認,,重啟。。。

      3.常見問題

      連接網絡(有線或無線)後,,無法ping通外網,,,,例如www.baidu.com,,,常見的問題有:無法獲取IP、、、板卡路由配置、、、無DNS服務等,,,,可以嘗試以下方法解決。。

      1. 1.通過ifconfig命令確認 正確配置IP 或者 獲取到自動分配的IP。。

      2. 2.通過ping該網絡網關地址,,,,來確認局域網部分是否正常。。

      一般來說

      連接路由器的有線網絡ip一般是192.168.1.x(在第三步獲取的ip),,,,取其前三位來可以獲取對應網段,,其網段對應的1地址即為網關地址

      比如獲取的ip是192.168.1.78,,,則對應網段為192.168.1,,,,網關就是在網段的基礎上第四位補1,,,對應網關為192.168.1.1

      如果可以獲取到ip,,但不知道網關,,,,可以用如下方式來獲取網關:

      首先找一台能夠連接此根網線正常上網的電腦,,並登錄之

      ubuntu系統:在終端輸入 ifconfig 找到broadcast,,,獲取其前三位,,前三位即為網段,,,第四位補1,,,,即為網關

      win系統:win+R 運行中 輸入 cmd 。。。。 在cmd中輸入 ipconfig,,,,往下找會有一個默認網關,,這個後面的四位就是網關

      需要注意的是,,手機熱點網絡的網關一般不是 x.xx.xxx.1 這種類型,,,推薦使用上一行win系統的方法來獲取。。

      如果ping不通網關,,,,需要重新檢查網絡配置或者路由器配置;

      如果可以ping通網關,,,但是無法ping通外網,,,例如www.baidu.com,,,,可以增加下默認路由。。。

      ping 192.168.xxx.1
      #192.168.xxx.1為有線網絡的網關地址,,ping一下通不通,,正常應該是通的
      ping baidu.com
      #ping一下百度,,正常可以解析出IP,,,,但是網絡不可達,,,如果是這種情況,,,則執行下一步
      sudo route add default gw 192.168.xxx.1
      #添加有線網絡的網關地址到路由表
      ping baidu.com
      #再次ping百度,,,,可以ping通,,,,正常已經可以上網
      
      1. 3.如果ping www.baidu.com時,,無法解析IP,,,,則需要配置一下DNS。。。
      來源文件:開發幫助_03010303.md
      Q

      建立用戶PC和機器人內部板卡之間的網絡通信

      通過用戶自己的PC開發機器人時,,首先需要建立用戶PC和機器人內部板卡之間的網絡通信。。。

      1.通過網線連接自己的電腦和機器狗的網口

      2.設置自己的網口配置

      需要手動給自己的電腦配置一個123網段的IP地址,,,但是不能和狗上板卡的地址相同,,,,這樣會造成沖突。。。。

      • 打開網絡設置

      • 配置有線網口

      • 手動分配一個123網段的IP(不能和狗上板卡的地址重覆),,設置子網掩碼

      3.測試通信

      設置好地址後,,我們可以ping一下內部板卡的地址,,如果可以收到正常回覆,,,,說明已經連接成功。。

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

      配置連接WiFi一直要輸入密碼

      配置獲取控制 NetworkManager 的權限

      1. 創建 Polkit 規則文件

        bash sudo mkdir -p /etc/polkit-1/localauthority/50-local.d sudo gedit /etc/polkit-1/localauthority/50-local.d/10-networkmanager.pkla

        添加的規則內容:

        [Allow user to fully manage NetworkManager] Identity=unix-user:unitree Action=org.freedesktop.NetworkManager.* ResultAny=yes ResultInactive=yes ResultActive=yes

      2. 重啟 Polkit 服務

        bash sudo systemctl restart polkit

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

      無法修改無線網卡為靜態IP地址

      1. 獲取連接名稱

      nmcli connection show
      

      2. 配置靜態IP(替換"連接名稱")

      ipv4.addresses 和 ipv4.gateway 參數要改成您所需的網絡配置。。

      nmcli connection modify "連接名稱" \
          ipv4.method manual \
          ipv4.addresses "192.168.1.100/24" \
          ipv4.gateway "192.168.1.1" \
          ipv4.dns "8.8.8.8 8.8.4.4"
      

      3. 重新激活連接

      nmcli connection up "連接名稱"
      
      來源文件:開發幫助_03010307.md
      Q

      RealSense SDK安裝教程(Jetson系列設備)

      在機器人、、、、機器狗的二次開發過程中,,讀取與產品配套的D435i、、、D455等RealSense系列深度相機,,需要配合RealSense SDK實現。。Jetson系列設備(G1的PC2、、Go2的拓展塢等)安裝RealSense SDK可參考本教程進行。。。

      1. 1.注冊服務器公鑰:

      ```bash sudo apt-key adv --keyserver keys.gnupg.net --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE ````

      1. 2.將RealSense服務器添加至軟件源:

      bash sudo add-apt-repository "deb https://librealsense.intel.com/Debian/apt-repo $(lsb_release -cs) main"

      1. 3.更新軟件源:

      bash sudo apt update

      1. 4.安裝RealSense SDK:

      bash sudo apt-get install librealsense2-utils sudo apt-get install librealsense2-dev

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

      虛擬機如何連接機器人

      1.安裝 VMware 虛擬機

      2.在虛擬機中安裝 Ubuntu 20.04 或 Ubuntu 22.04 系統

      3.配置虛擬機網絡:

      方法一:

      將物理網卡設置接入到虛擬機

      方法二:

      配置虛擬網絡橋接

      1) 在 編輯->虛擬網絡編輯器 那里設一個橋接到連接機器人網口的虛擬網絡

      2) 在 虛擬機->設置->網絡適配器 那里設置使用自定義的虛擬網絡

      4.測試:

      1) 把虛擬機系統的IP地址改為123網段的,,,,如 192.168.123.222

      2) 執行 ping 192.168.123.161 ,,,,若能ping通則配置完成

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

      unitree_mujoco中如何替換模型

      unitree_mujoco中的示例,,,,默認是Go2。。該項目目前支持"go2", "b2", "b2w", "h1", "go2w", "g1"機型。。。。

      如果想修改成其他的機型仿真,,,需要通過修改仿真器的配置文件來實現。。。。

      具體方法如下:

      c++ 仿真器 c++ 仿真器的配置文件位於 /simulate/config.yaml 中:

      # 仿真器加載的機器人名稱
      # "go2", "b2", "b2w", "h1"
      robot: "go2"
      # 機器人仿真仿真場景文件
      # 以 go2 為例,,指的是/unitree_robots/go2/文件夾下的 scene.xml 文件
      robot_scene: "scene.xml"
      
      # dds domain id,,最好與實物(實物上默認為 0)區分開
      domain_id: 1
      # 網卡名稱, 對於仿真建議使用本地回環 "lo"
      interface: "lo"
      
      # 是否輸出機器人連桿、、、關節、、、傳感器等信息,,1為輸出
      print_scene_information: 1
      
      # 是否使用虛擬掛帶, 1 為啟用
      # 主要用於模擬 H1 機器人初始化掛起的過程
      enable_elastic_band: 0 # For H1
      

      python 仿真器 python 仿真器的配置文件位於 /simulate_python/config.py 中:

      # 仿真器加載的機器人名稱
      # "go2", "b2", "b2w", "h1"
      ROBOT = "go2"
      # 機器人仿真仿真場景文件
      ROBOT_SCENE = "../unitree_robots/" + ROBOT + "/scene.xml" # Robot scene
      
      # dds domain id,,最好與實物(實物上默認為 0)區分開
      DOMAIN_ID = 1 # Domain id
      # 網卡名稱, 對於仿真建議使用本地回環 "lo"
      INTERFACE = "lo" # Interface
      
      # 是否輸出機器人連桿、、、關節、、、傳感器等信息,,,,True 為輸出
      PRINT_SCENE_INFORMATION = True
      
      USE_JOYSTICK = 1 # Simulate Unitree WirelessController using a gamepad
      JOYSTICK_TYPE = "xbox" # support "xbox" and "switch" gamepad layout
      JOYSTICK_DEVICE = 0 # Joystick number
      
      # 是否使用虛擬掛帶, 1 為啟用
      # 主要用於模擬 H1 機器人初始化掛起的過程
      ENABLE_ELASTIC_BAND = False
      
      # 仿真步長 單位(s)
      # 為保證仿真的可靠性,,,需要大於 viewer.sync() 渲染一次所需要的時間
      SIMULATE_DT = 0.003
      
      # 可視化界面的運行步長,,0.02 對應 50fps/s
      VIEWER_DT = 0.02
      

      特別的,,,,如果是修改成G1,,,,robot_scene 選項需要按需選擇 /unitree_robots/g1/ 文件夾下的 scene_23dof.xml、、、scene_29dof.xml 或者 scene_29dof_with_hand.xml 文件。。。

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

      如何添加鍵盤控制方式發遙控器指令

      項目默認支持使用遊戲手柄進行模擬R3遙控器發指令,,,,部分沒有遊戲手柄的用戶可以參考以下教程去添加鍵盤控制方式。。。

      修改代碼

      安裝 pynput 庫:

      pip install pynput
      

      修改 simulate_python/unitree_sdk2py_bridge.pyPublishLowState 函數:

          def PublishLowState(self):
              if self.mj_data != None:
                  for i in range(self.num_motor):
                      self.low_state.motor_state[i].q = self.mj_data.sensordata[i]
                      self.low_state.motor_state[i].dq = self.mj_data.sensordata[
                          i + self.num_motor
                      ]
                      self.low_state.motor_state[i].tau_est = self.mj_data.sensordata[
                          i + 2 * self.num_motor
                      ]
      
                  if self.have_frame_sensor_:
      
                      self.low_state.imu_state.quaternion[0] = self.mj_data.sensordata[
                          self.dim_motor_sensor + 0
                      ]
                      self.low_state.imu_state.quaternion[1] = self.mj_data.sensordata[
                          self.dim_motor_sensor + 1
                      ]
                      self.low_state.imu_state.quaternion[2] = self.mj_data.sensordata[
                          self.dim_motor_sensor + 2
                      ]
                      self.low_state.imu_state.quaternion[3] = self.mj_data.sensordata[
                          self.dim_motor_sensor + 3
                      ]
      
                      self.low_state.imu_state.gyroscope[0] = self.mj_data.sensordata[
                          self.dim_motor_sensor + 4
                      ]
                      self.low_state.imu_state.gyroscope[1] = self.mj_data.sensordata[
                          self.dim_motor_sensor + 5
                      ]
                      self.low_state.imu_state.gyroscope[2] = self.mj_data.sensordata[
                          self.dim_motor_sensor + 6
                      ]
      
                      self.low_state.imu_state.accelerometer[0] = self.mj_data.sensordata[
                          self.dim_motor_sensor + 7
                      ]
                      self.low_state.imu_state.accelerometer[1] = self.mj_data.sensordata[
                          self.dim_motor_sensor + 8
                      ]
                      self.low_state.imu_state.accelerometer[2] = self.mj_data.sensordata[
                          self.dim_motor_sensor + 9
                      ]
      
                  if self.joystick != None:
                      pygame.event.get()
                      # Buttons
                      self.low_state.wireless_remote[2] = int(
                          "".join(
                              [
                                  f"{key}"
                                  for key in [
                                      0,
                                      0,
                                      int(self.joystick.get_axis(self.axis_id["LT"]) > 0),
                                      int(self.joystick.get_axis(self.axis_id["RT"]) > 0),
                                      int(self.joystick.get_button(self.button_id["SELECT"])),
                                      int(self.joystick.get_button(self.button_id["START"])),
                                      int(self.joystick.get_button(self.button_id["LB"])),
                                      int(self.joystick.get_button(self.button_id["RB"])),
                                  ]
                              ]
                          ),
                          2,
                      )
                      self.low_state.wireless_remote[3] = int(
                          "".join(
                              [
                                  f"{key}"
                                  for key in [
                                      int(self.joystick.get_hat(0)[0] < 0),  # left
                                      int(self.joystick.get_hat(0)[1] < 0),  # down
                                      int(self.joystick.get_hat(0)[0] > 0), # right
                                      int(self.joystick.get_hat(0)[1] > 0),    # up
                                      int(self.joystick.get_button(self.button_id["Y"])),     # Y
                                      int(self.joystick.get_button(self.button_id["X"])),     # X
                                      int(self.joystick.get_button(self.button_id["B"])),     # B
                                      int(self.joystick.get_button(self.button_id["A"])),     # A
                                  ]
                              ]
                          ),
                          2,
                      )
                      # Axes
                      sticks = [
                          self.joystick.get_axis(self.axis_id["LX"]),
                          self.joystick.get_axis(self.axis_id["RX"]),
                          -self.joystick.get_axis(self.axis_id["RY"]),
                          -self.joystick.get_axis(self.axis_id["LY"]),
                      ]
                      packs = list(map(lambda x: struct.pack("f", x), sticks))
                      self.low_state.wireless_remote[4:8] = packs[0]
                      self.low_state.wireless_remote[8:12] = packs[1]
                      self.low_state.wireless_remote[12:16] = packs[2]
                      self.low_state.wireless_remote[20:24] = packs[3]
                  else:
                      # 若不使用遊戲手柄控制,,,則切換到鍵盤控制
                      from pynput import keyboard
                      from pynput.keyboard import Key
      
                      if not hasattr(self, '_keys_pressed'):
                          self._keys_pressed = set()
                          def on_press(key):
                              # print(f"Key pressed: {key}")
                              if hasattr(key, 'char') and key.char:
                                  self._keys_pressed.add(key.char.lower())
                              else:
                                  self._keys_pressed.add(key)
                          def on_release(key):
                              # print(f"Key released: {key}")
                              if hasattr(key, 'char') and key.char:
                                  self._keys_pressed.discard(key.char.lower())
                              else:
                                  self._keys_pressed.discard(key)
      
                          listener = keyboard.Listener(on_press=on_press, on_release=on_release)
                          listener.start()
      
                      self.low_state.wireless_remote[2] = int(
                          "".join(
                              [
                                  f"{key}"
                                  for key in [
                                      int('z' in self._keys_pressed),
                                      int('x' in self._keys_pressed),
                                      int(Key.f6 in self._keys_pressed),
                                      int(Key.f8 in self._keys_pressed),
                                      int(Key.space in self._keys_pressed),
                                      int(Key.enter in self._keys_pressed),
                                      int(Key.f5 in self._keys_pressed),
                                      int(Key.f7 in self._keys_pressed),
                                  ]
                              ]
                          ),
                          2,
                      )
                      self.low_state.wireless_remote[3] = int(
                          "".join(
                              [
                                  f"{key}"
                                  for key in [
                                      int(Key.left in self._keys_pressed),
                                      int(Key.down in self._keys_pressed),
                                      int(Key.right in self._keys_pressed),
                                      int(Key.up in self._keys_pressed),
                                      int('y' in self._keys_pressed),
                                      int('t' in self._keys_pressed),
                                      int('h' in self._keys_pressed),
                                      int('g' in self._keys_pressed),
                                  ]
                              ]
                          ),
                          2,
                      )
                      lx = float(('d' in self._keys_pressed) - ('a' in self._keys_pressed))
                      ly = float(('w' in self._keys_pressed) - ('s' in self._keys_pressed))
                      rx = float(('l' in self._keys_pressed) - ('j' in self._keys_pressed))
                      ry = float(('i' in self._keys_pressed) - ('k' in self._keys_pressed))
                      sticks = [lx, rx, ry, ly]
                      packs = list(map(lambda x: struct.pack("f", x), sticks))
                      self.low_state.wireless_remote[4:8] = packs[0]
                      self.low_state.wireless_remote[8:12] = packs[1]
                      self.low_state.wireless_remote[12:16] = packs[2]
                      self.low_state.wireless_remote[20:24] = packs[3]
      
                  self.low_state_puber.Write(self.low_state)
      

      修改 simulate_python/config.py 配置文件:

      USE_JOYSTICK = 0
      

      使用

      鍵位映射表

      R3遙控器鍵位 鍵盤鍵位
      左搖桿 w s a d
      右搖桿 i k j l
      L1 F5
      L2 F6
      R1 F7
      R2 F8
      A g
      B h
      X t
      Y y
      UP
      RIGHT
      DOWN
      LEFT
      START Enter
      SELECT Space
      F1 z
      F3 x

      可以自行修改代碼以更換鍵位映射。。。。

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

      在G1的PC2上部署unitree_rl_lab項目

      繼上一版開源的 unitree_rl_gym ,,Unitree針對英偉達新推出的 Isaac Lab ,,,開源了新版強化學習運動控制訓練與推理項目—— unitree_rl_lab 。。。。和unitree_rl_gym不同的是,,unitree_rl_lab采用Unitree_SDK2(C++版SDK)執行機器人控制指令,,通過Onnxruntime進行推理,,,,在速度和性能上都有較大的提升。。。。目前,,,,已開源的unitree_rl_lab項目僅針對x86-64架構的計算機進行訓練、、推理,,,,如需將推理功能部署在G1的PC2中,,,可參考本教程實現。。。。

      注:由於PC2並不適合用於強化學習運動控制模型訓練,,因此本教程僅提供推理功能的部署方法。。。。

      1.升級CMake與編譯器版本

      CMake升級

      cd ~/
      wget https://cmake.org/files/v3.31/cmake-3.31.8.zip
      unzip cmake-3.31.8.zip
      rm -rf cmake-3.31.8.zip
      cd cmake-3.31.8
      chmod 777 ./configure
      ./configure
      make -j8
      sudo make install
      sudo update-alternatives --install /usr/bin/cmake cmake /usr/local/bin/cmake 1 --force
      cmake --version # 輸出結果應該為3.31.8
      

      GCC與G++升級

      sudo apt update
      sudo apt install software-properties-common
      sudo add-apt-repository ppa:ubuntu-toolchain-r/test
      sudo apt install gcc-11 g++-11
      sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 60 \
      --slave /usr/bin/g++ g++ /usr/bin/g++-11
      sudo update-alternatives --config gcc # 按提示輸入對應編號,,,選擇/usr/bin/gcc-11,如果只有gcc-11,,,,則無需進行任何操作
      sudo update-alternatives --config g++ # 同上
      gcc --version    # 應輸出 11.x.x
      g++ --version    # 應輸出 11.x.x
      

      2.安裝Unitree_SDK2

      cd ~/
      sudo apt update
      sudo apt install libeigen3-dev
      git clone https://github.com/unitreerobotics/unitree_sdk2.git
      cd unitree_sdk2
      mkdir build
      cd build
      cmake ..
      make -j8
      sudo make install
      

      3.安裝miniconda3

      mkdir -p ~/miniconda3
      wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh -O ~/miniconda3/miniconda.sh
      bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
      rm ~/miniconda3/miniconda.sh
      

      安裝完成後,,,,初始化Conda

      ~/miniconda3/bin/conda init --all
      source ~/.bashrc
      

      配置用於RL的虛擬環境

      conda create -n unitree-rl python=3.10
      

      使能虛擬環境

      conda activate unitree-rl
      

      4.源碼拉取及依賴安裝

      從Github拉取項目源碼

      git clone https://github.com/unitreerobotics/unitree_rl_lab.git
      

      進入項目的根目錄,,,進行依賴安裝

      cd unitree_rl_lab
      python -m pip install -e source/unitree_rl_lab
      sudo apt install -y libyaml-cpp-dev libboost-all-dev libeigen3-dev libspdlog-dev
      

      5.針對Jetson Orin NX(PC2)修改項目源碼

      修改onnxruntime庫為AARCH64架構的版本

      cd ./deploy/thirdparty
      rm -rf ./onnxruntime-linux-x64-1.22.0
      wget https://github.com/microsoft/onnxruntime/releases/download/v1.22.0/onnxruntime-linux-aarch64-1.22.0.tgz
      tar -xvzf onnxruntime-linux-aarch64-1.22.0.tgz
      rm -rf ./onnxruntime-linux-aarch64-1.22.0.tgz
      

      修改CMakeLists.txt文件

      cd ../../deploy/robots/g1
      vim ./CMakeLists.txt
      

      修改文件如下所示

      cmake_minimum_required(VERSION 3.12)
      project(g1_controller)
      
      find_package(Boost REQUIRED COMPONENTS program_options)
      find_package(yaml-cpp REQUIRED)
      
      include_directories(
        /usr/include/eigen3
        /usr/local/include/ddscxx # dds
        /usr/local/include/iceoryx/v2.0.2 # dds
        include
        ${PROJECT_SOURCE_DIR}/../../thirdparty/ocs2/include
        ${PROJECT_SOURCE_DIR}/../../thirdparty/onnxruntime-linux-aarch64-1.22.0/include
        ${PROJECT_SOURCE_DIR}/../../include/
      )
      
      link_libraries(
        unitree_sdk2 ddsc ddscxx rt pthread # dds
        libboost_program_options.a libyaml-cpp.a fmt
        ${PROJECT_SOURCE_DIR}/../../thirdparty/onnxruntime-linux-aarch64-1.22.0/lib/libonnxruntime.so.1.22.0
      )
      
      file(GLOB_RECURSE ADD_SRC_LIST
        ${PROJECT_SOURCE_DIR}/src/*.cpp
      )
      
      add_library(${PROJECT_NAME}_lib ${ADD_SRC_LIST})
      link_libraries(${PROJECT_NAME}_lib)
      
      add_executable(g1_ctrl main.cpp)
      

      即,,,將原文件中的x64更換為aarch64。。。

      6.編譯推理代碼

      mkdir build
      cd build
      cmake ..
      make -j8
      

      編譯完成後,,運行示例模型推理功能(機器人必須先進入調試模式,,,,且需要進行相應的保護措施,,,包括但不限於通過吊繩約束、、、、與人保持安全距離等)。。。

      ./g1_ctrl --network eth0
      

      程序運行後,,按遙控器的L2+UP,,,機器人進入站立預備(FixStand),,然後按R1+X,,,進入強化學習運動控制模式(Velocity),,此時推動遙控器搖桿,,機器人將進行走動。。。

      Velocity模式下可以長摁LT+LEFT切換到Mimic_Gangnam_Style模式,,,,摁R1+X切換回Velocity。。

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

      部署例程使用說明

      部署例程使用說明

      deploy 目錄包含了 Unitree 系列機器人 (如 G1, Go2, H1_2 等) 基於 ONNX Runtime 的模型部署及 C++ 控制例程。。。。此流程適用於實物機器人部署以及本地 Mujoco 仿真聯調。。。。

      1. 環境與依賴準備

      部署例程由 C++ 編寫,,,,並依賴以下第三方庫(已包含在 thirdparty 下): * onnxruntime: 用於加載並推理 .onnx 格式的強化學習策略模型。。。。 * cnpy: 用於讀取/保存 .npy.npz 數據。。。。 * CMake & GCC: 請確保已安裝 cmakeg++ 編譯工具鏈。。。。

      2. 策略模型準備

      在運行部署之前,,,,需將訓練好並導出的 .onnx 策略文件放入對應機器人的配置目錄中。。。 以 Mimic 為例,,,,將 policy.onnx 文件放入以下層級目錄(如對應的目錄不存在,,,,請手動創建):

      deploy/robots/g1/config/policy/mimic/xxx/exported/
      

      注:具體模型存放路徑可能需要與 config/config.yaml 中的路徑配置保持一致。。

      3. 配置文件修改

      每個機器人目錄下都有其專屬的 YAML 配置文件,,,例如 G1 的配置文件路徑為:deploy/robots/g1/config/config.yaml。。。 通過修改此配置文件,,可以進行控制器參數調節、、、、運行邏輯設定和修改狀態,,比如添加您的策略模型。。。。在更改後重新啟動 *_ctrl 程序即可生效,,無需重新編譯。。。。

      配置文件的核心結構主要基於 FSM (有限狀態機)。。。下面列出常見字段含義及對應修改說明:

      • FSM._ (狀態機注冊配置) 用於向系統中使能需要用到的狀態模塊,,並分配其獨立的執行 ID 和類型。。。如:Passive (阻尼狀態), FixStand (固定站立狀態), Velocity (基於 RL 的速度控制), Mimic (動作模仿強化學習控制) 等。。。

      • 狀態專屬參數說明:

        1. transitions (狀態切換按鍵): 配置手柄上的狀態切換觸發條件。。。。例如 FixStand: LT + up.on_pressed 代表按下遙控器的左扳機和十字鍵上即可切換到該狀態。。。。
        2. kp, kd (各類 PD 控制器增益): 用於底層跟蹤控制的關節剛度(位置剛度 kp)和阻尼(速度剛度 kd)參數組。。。。數組長度須與機器人的受控自由度(DOF)嚴格匹配(例如 G1 身體+手臂可能為 29 個值)。。。。
        3. qs, ts (初始站立插值序列): 多用於 FixStand 狀態中。。。。ts 記錄時間點,,,qs 記錄每個時間點上對應的機器人的目標關節姿態,,,使得機器人在切換站立模式時可以平滑插值過渡。。
        4. policy_dir (強化學習 ONNX 模型路徑): 通常在 Velocity 或者 Mimic 狀態中出現。。。指定模型存放相對目錄(例如:config/policy/velocity),,,部署程序將自動在此目錄下定位加載 policy.onnx 文件。。。。
        5. motion_file, time_start, time_end (Mimic 運動模仿特化參數): 在使用動作模仿模型時,,,用來載入 .npz 參考參考軌跡數據,,並設置在仿真/實機上的剪切時間段配置。。。。

      4. 編譯

      不同機器人的編譯相互獨立,,請根據您的機器人型號進入對應子目錄完成編譯。。。。以 G1 為例:

      # 1. 進入對應機器人的部署目錄
      cd deploy/robots/g1
      
      # 2. 創建並進入 build 目錄
      mkdir build && cd build
      
      # 3. 運行 cmake 生成 Makefile
      cmake ..
      
      # 4. 執行編譯
      make -j4
      

      編譯成功後,,,,在 build 目錄下會生成對應的可執行程序,,如 g1_ctrl。。。。對於 Go2 或 H1_2,,將生成 go2_ctrlh1_2_ctrl。。。。

      5. 運行與部署

      啟動控制程序需通過 --network 參數指定網卡名稱。。可通過 ifconfigip a 命令查看對應的網卡名稱。。

      5.1 仿真部署 (Mujoco)

      配合 simulate 目錄下的 Mujoco 仿真側聯合運行時,,,,由於都在本地進行通信,,網卡需要指定為本地環回網卡(通常是 lo)。。。

      cd deploy/robots/g1/build
      ./g1_ctrl --network=lo
      

      5.2 實機部署

      如果是直接將程序部署在機器人的機載電腦上,,,,或者通過網線連接機器人的工控機,,,請使用與機器人底層通信用的網卡名稱(例如 eth0, enp5s0, enx... 等)。。。

      cd deploy/robots/g1/build
      # 請將 enp5s0 替換為你實際的網卡名稱
      ./g1_ctrl --network=enp5s0
      

      5.3 使用步驟

      以默認 config.yaml 的狀態機切換邏輯為例,,啟動控制程序後,,,,操作流程如下:

      1. 檢查初始狀態: 程序剛剛啟動時,,機器人默認處於 Passive(阻尼)狀態,,此時各關節不主動發力,,,,但可以用手按壓感受到一定的電機阻尼。。
      2. 切換至固定站立: 確保機器人放置在開闊且安全的場地上(若實機測試,,可先使用原廠系統確保無誤或懸空測試),,按下手柄組合鍵 LT + 方向鍵上,,,觸發 FixStand 狀態。。系統將插值預設好的關節參考角度,,,,使機器人各關節轉動到站立姿態。。。。
      3. 啟動 RL 強化學習控制:
        • 待機器人調到站立姿勢後,,,,按下 RT + A 組合鍵即可切換至 Velocity 狀態加載速度控制的 RL 策略模型。。成功進入後,,您可以通過遙控器左右搖桿輸入線速度與角速度指令。。。。
        • 若您測試的是 Mimic 動作模仿策略,,根據您的配置文件,,,,可以按下對應快捷鍵進入該狀態。。。
      4. 安全保護與退出: 在測試完成或遇到模型失控等緊急情況時,,,請隨時按下 LT + B 下發切線指令回落至 Passive 阻尼狀態。。。。此時電機將停止主動做功防止破壞,,,,保障人員及實機安全。。
      來源文件:開發幫助_03020302.md
      Q

      遙操圖像黑屏解決方法

      若沒有加裝其他攝像頭,,使用G1頭上自帶的D435i相機,,,,按照以下步驟配置:

      1. 把G1脖子後面的相機線插到接口板上的Typec口上

      2. 安裝 RealSense SDK,,

      3. 按照 項目 README.md 中的 3.1 Image Service 步驟,,在PC2上配置圖像服務器

      4. 修改 cam_config_server.yaml,,其中 serial_number 可以通過執行 teleimager-server --cf --rs 查看到(如果D435i相機成功連接到PC2)

      5. 按照遙操項目說明啟動圖像服務器即可正常使用

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

      G1遙操數采部署教程

      G1遙操數采部署教程

      0. 📖 介紹

      本教程實現了使用 XR設備(Extended Reality)(比如 Apple Vision Pro、、、、PICO 4 Ultra Enterprise 或 Meta Quest 3 等) 對 宇樹(Unitree)G1人形機器人 的遙操作控制。。。

      如果您之前從沒有使用過宇樹機器人,,,,那麼請您至少先閱讀至應用開發章節。。

      另外,,,本教程的也有很多相關知識可以供您參考。。

      0.1 🏷️ 本教程的設備以及環境

      • 機器人:G1 EDU(29-DOF)+ Dex1-1夾爪
      • XR設備:Apple Vision Pro、、PICO 4 Ultra Enterprise
      • 用戶電腦:Ubuntu22.04,,通過WiFi連接G1的PC2
      • 無線路由器:TP-LINK飛流AX5400(5GHz, 160MHz頻寬,, WIFI6)
      • 網絡連接:XR設備、、G1的PC2、、用戶電腦均連接無線路由器即可
      • Python: v3.10
      • Vuer:v0.0.60
      • Numpy: v1.26.4
      • xr_teleoperate:v1.5
      • televuer:v4.0.0
      • teleimager:v1.5.0
      • dex-retargeting:v0.4.7
      • unitree_sdk2py: v1.0.1

      1. 📦 安裝環境

      我們在 Ubuntu 20.04 和 Ubuntu 22.04 上測試了我們的代碼,,,,其他操作系統可能需要不同的配置。。本文檔主要介紹常規模式。。。。

      有關更多信息,,,,您可以參考 和 。。

      1.1 🕹️ 前期準備

      注意:本教程把項目代碼和環境依賴都安裝在G1的PC2里面,,,,需要讓G1的PC2連接和XR設備的同一個WI-FI

      (1)

      (2)

      (3)

      (4)修改PC2的系統時間使得與當前時間同步:

      # 1. 手動設置系統時間為當前時間
      unitree@ubuntu:~$ sudo timedatectl set-time "2026-04-30 15:30:00"
      # 2. 將系統時間寫入硬件時鐘,,,,這樣重啟後時間不會丟失
      unitree@ubuntu:~$ sudo hwclock --systohc
      # 3. 查看當前系統時間是否修改成功
      unitree@ubuntu:~$ date
      

      1.2 📥 環境配置

      1.2.1 在PC2中安裝 miniconda3 並創建激活 conda 環境

      ## 適用於jetson orin nx(ARM架構)
      unitree@ubuntu:~$ mkdir -p ~/miniconda3
      unitree@ubuntu:~$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh -O ~/miniconda3/miniconda.sh
      unitree@ubuntu:~$ bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
      unitree@ubuntu:~$ rm ~/miniconda3/miniconda.sh
      unitree@ubuntu:~$ source ~/miniconda3/bin/activate
      (base) unitree@ubuntu:~$ conda init --all
      # 創建 conda 基礎環境
      (base) unitree@Host:~$ conda create -n tv python=3.10 pinocchio=3.1.0 numpy=1.26.4 -c conda-forge
      (base) unitree@Host:~$ conda activate tv
      

      1.2.2 把xr_teleoperate倉庫克隆到PC2中

      ## 注意:克隆github倉庫需要一些外網環境,,PC2即使聯網也可能無法訪問github,,可以先在自己電腦上克隆下來之後通過scp命令傳到PC2中
      # 克隆xr_teleoperate倉庫(在PC2或自己電腦中,,,,能克隆下來即可)
      (tv) unitree@ubuntu:~$ git clone https://github.com/unitreerobotics/xr_teleoperate.git
      (tv) unitree@ubuntu:~$ cd xr_teleoperate
      # 淺克隆子模塊(在PC2或自己電腦中,,,能克隆下來即可)
      (tv) unitree@ubuntu:~/xr_teleoperate$ git submodule update --init --depth 1
      
      ## 若已經在PC2中克隆倉庫則忽略下面這條命令
      # 打開自己電腦的終端,,,使用scp命令把xr_teleoperate倉庫從自己電腦傳到PC2的主目錄下面
      C:\Users\win10> scp -r xr_teleoperate unitree@192.168.123.164:/home/unitree
      

      1.2.3 在PC2中安裝xr_teleoperate倉庫的各個子模塊

      # 安裝 teleimager 子模塊
      (tv) unitree@ubuntu:~$ sudo apt install -y libusb-1.0-0-dev libturbojpeg-dev
      (tv) unitree@ubuntu:~$ cd ~/xr_teleoperate/teleop/teleimager
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/teleimager$ pip install -e .
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/teleimager$ pip install -e ".[server]"
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/teleimager$ conda install conda-forge::pyrealsense2
      
      # 添加 video 權限(非 root 用戶運行):
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/teleimager$ bash setup_uvc.sh
      
      # 安裝 televuer 子模塊
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/teleimager$ cd ../televuer
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/televuer$ pip install -e .
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/televuer$ pip install params_proto==2.13.2
      
      # 安裝 dex-retargeting 子模塊
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/televuer$ cd ../robot_control/dex-retargeting/
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/robot_control/dex-retargeting$ pip install "numpy==1.26.4" "torch==2.3.0" "pytransform3d>=3.5.0" "pin>=2.7.0" "trimesh>=4.4.0" "anytree>=2.12.0" "pyyaml>=6.0.0" "lxml>=5.2.2"
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/robot_control/dex-retargeting$ conda install conda-forge::nlopt
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/robot_control/dex-retargeting$ pip install -e . --no-deps
      
      # 安裝本倉庫所需的其他依賴庫
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/robot_control/dex-retargeting$ cd ../../../
      (tv) unitree@ubuntu:~/xr_teleoperate$ pip install -r requirements.txt
      
      # 安裝 unitree_sdk2_python 庫,,,,該庫負責開發設備與機器人之間的通信控制功能
      (tv) unitree@ubuntu:~/xr_teleoperate$ cd ~/
      # 若PC2克隆不了就在自己電腦克隆後通過scp命令傳給PC2(操作流程參考1.2.2的最後一步)
      (tv) unitree@ubuntu:~$ git clone https://github.com/unitreerobotics/unitree_sdk2_python.git
      (tv) unitree@ubuntu:~$ cd unitree_sdk2_python
      (tv) unitree@ubuntu:~/unitree_sdk2_python$ pip install -e .
      

      1.2.4 在PC2中為 televuer 模塊配置 SSL 證書

      # 為 televuer 模塊配置 SSL 證書,,,以便 XR 設備(如 Pico / Quest / Apple Vision Pro)通過 HTTPS / WebRTC 安全連接
      ## 1. 生成證書文件
      # 1.1 如果您使用 pico / quest 等 xr 設備
      (tv) unitree@ubuntu:~$ cd ~/xr_teleoperate/teleop/televuer
      # 詳細的證書配置安裝教程請查看https://github.com/unitreerobotics/xr_teleoperate/wiki/CA
      
      # 1.2 如果您使用 apple vision pro 設備
      (tv) unitree@ubuntu:~$ cd ~/xr_teleoperate/teleop/televuer
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/televuer$ openssl genrsa -out rootCA.key 2048
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/televuer$ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 365 -out rootCA.pem -subj "/CN=xr-teleoperate"
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/televuer$ openssl genrsa -out key.pem 2048
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/televuer$ openssl req -new -key key.pem -out server.csr -subj "/CN=localhost"
      # 創建 server_ext.cnf 文件,,,,輸入以下內容(IP.2 地址應與您的PC2 wlon IP 地址匹配,,,,假設此處地址為 192.168.123.2。。可以使用 `ifconfig` 等類似命令查詢)
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/televuer$ vim server_ext.cnf
      subjectAltName = @alt_names
      [alt_names]
      DNS.1 = localhost
      IP.1 = 192.168.123.164
      IP.2 = 192.168.123.2
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/televuer$ openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out cert.pem -days 365 -sha256 -extfile server_ext.cnf
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/televuer$ ls
      build  cert.pem  key.pem  LICENSE  pyproject.toml  README.md  rootCA.key  rootCA.pem  rootCA.srl  server.csr  server_ext.cnf  src  test
      # 通過 AirDrop 將 rootCA.pem 覆制到 Apple Vision Pro 並安裝它
      
      # 1.3 開啟防火墻
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/televuer$ sudo ufw allow 8012
      
      ## 2. 配置證書路徑,,,,以下方式任選其一配置即可
      # 2.1 用戶配置目錄(可選)
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/televuer$ mkdir -p ~/.config/xr_teleoperate/
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/televuer$ cp cert.pem key.pem ~/.config/xr_teleoperate/
      # 2.2 環境變量配置(可選)
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/televuer$ echo 'export XR_TELEOP_CERT="$HOME/xr_teleoperate/teleop/televuer/cert.pem"' >> ~/.bashrc
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/televuer$ echo 'export XR_TELEOP_KEY="$HOME/xr_teleoperate/teleop/televuer/key.pem"' >> ~/.bashrc
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/televuer$ source ~/.bashrc
      

      1.3 🖼️ 配置圖像服務

      1.3.1 查找已連接的攝像頭

      運行以下命令可以自動發現已連接攝像頭:

      ## 如果攝像頭存在 RealSense 設備需加上 --rs 參數,,就會看到 RealSense 攝像頭的搜索結果,,,反之為普通USB攝像頭不需要加上 --rs 參數
      # G1頭部攝像頭存在RealSense設備,,,需要加上--rs參數
      (tv) unitree@ubuntu:~$ teleimager-server --cf --rs
      
      # 普通USB攝像頭,,,,用以下命令搜索
      (tv) unitree@ubuntu:~$ teleimager-server --cf
      

      你將看到類似下面的輸出:

      bash (tv) unitree@ubuntu:~$ teleimager-server --cf --rs 11:44:58.245700 INFO [Performance] CPU Affinity locked to: [0, 1, 2] image_server.py:1487 11:44:58.261900 ERROR Failed to reload driver: Command 'sudo modprobe -r uvcvideo' returned non-zero exit image_server.py:544 status 1. 11:45:01.913952 INFO ======================= Camera Discovery Start ================================== image_server.py:788 11:45:01.914496 INFO Found video devices: ['/dev/video0', '/dev/video1', '/dev/video2', '/dev/video3', image_server.py:789 '/dev/video4', '/dev/video5', '/dev/video6', '/dev/video7', '/dev/video8'] 11:45:01.915579 INFO Found RGB video devices: ['/dev/video6', '/dev/video8'] image_server.py:790 11:45:01.915793 INFO ----------------------- Realsense Cameras ---------------------------------- image_server.py:793 11:45:01.915988 INFO RealSense serial numbers: ['243322070193'] image_server.py:794 11:45:01.916173 INFO RealSense video paths: ['/dev/video0', '/dev/video1', '/dev/video2', '/dev/video3', image_server.py:795 '/dev/video4', '/dev/video5'] 11:45:01.916350 INFO RealSense RGB-like video paths: ['/dev/video2'] image_server.py:796 11:45:01.916537 INFO ----------------------- OpenCV / UVC Camera 1 ----------------------------- image_server.py:799 11:45:01.916951 INFO video_path : /dev/video6 image_server.py:800 11:45:01.917252 INFO video_id : 6 image_server.py:801 11:45:01.917341 INFO serial_number : 0001 image_server.py:802 11:45:01.917426 INFO physical_path : /sys/devices/platform/3610000.xhci/usb1/1-2/1-2.2/1-2.2:1.0 image_server.py:803 11:45:01.917517 INFO extra_info: image_server.py:804 11:45:01.917598 INFO name: 0001 image_server.py:811 11:45:01.917677 INFO manufacturer: JSK-WDR image_server.py:811 11:45:01.918148 INFO uid: 1:5 image_server.py:811 11:45:02.075066 INFO format: 480x640@30 MJPG image_server.py:816 11:45:02.077378 INFO format: 1080x1920@60 MJPG image_server.py:816 11:45:02.104215 INFO ----------------------- OpenCV / UVC Camera 2 ----------------------------- image_server.py:799 11:45:02.104594 INFO video_path : /dev/video8 image_server.py:800 11:45:02.104711 INFO video_id : 8 image_server.py:801 11:45:02.104810 INFO serial_number : 0002 image_server.py:802 11:45:02.104902 INFO physical_path : /sys/devices/platform/3610000.xhci/usb1/1-2/1-2.3/1-2.3:1.0 image_server.py:803 11:45:02.104991 INFO extra_info: image_server.py:804 11:45:02.105077 INFO name: 0002 image_server.py:811 11:45:02.105162 INFO manufacturer: JSK-WDR image_server.py:811 11:45:02.105618 INFO uid: 1:6 image_server.py:811 11:45:02.267168 INFO format: 480x640@30 MJPG image_server.py:816 11:45:02.269074 INFO format: 1080x1920@60 MJPG image_server.py:816 11:45:02.288887 INFO =========================== Camera Discovery End ================================ image_server.py:824

      1.3.2 配置cam_config_server.yaml文件

      根據1.3.1搜索到的攝像頭結果配置/home/unitree/xr_teleoperate/teleop/teleimager/cam_config_server.yaml

      若頭部攝像頭和左右手的攝像頭都有,,執行1.3.1後無法確定id是哪個攝像頭的,,,可以把其他攝像頭拔掉,,一次只接入一個攝像頭並重新用1.3.1步驟查找id(第一次只接入頭部攝像頭,,,第二次只接入左腕攝像頭,,,,以此類推)

      ## 使用vim編輯cam_config_server.yaml
      (tv) unitree@ubuntu:~$ cd xr_teleoperate/teleop/teleimager/
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/teleimager$ vim cam_config_server.yaml
      

      下面cam_config_server.yaml文件修改說明,,請根據實際情況進行修改

      ## 注意:文件里面有需要變動的部分會用中文注釋來提示,,,請根據實際情況進行修改
      # =====================================================
      # Head camera configuration
      # =====================================================
      # camera topic
      head_camera:
        # camera config
      
        # if enable_zmq and enable_webrtc are both false, the camera will not start
        # Set to true to enable ZMQ publishing, false to disable
        enable_zmq: true
        # Port to publish camera stream, e.g. zmq tcp://*:55555.  image_client.py should connect to the same port
        zmq_port : 55555
        # Set to true to enable WebRTC publishing, false to disable
        enable_webrtc: true
        # Port for WebRTC signaling server
        webrtc_port : 60001
        # webrtc codec preference, options: "vp8", "h264"
        webrtc_codec: h264
      
        # Type of camera:
        #   - "opencv"    → opencv driver
        #   - "realsense" → pyrealsense2 driver
        #   - "uvc"       → pyuvc driver
        type: realsense # 根據G1頭部攝像頭情況修改,,,,一般情況用realsense
      
        # Image Format
        # image resolution: [height, width]
        image_shape: [480, 640] # 根據G1頭部攝像頭支持的分辨率情況修改
        binocular: false # 用雙目的話圖像顯示有問題,,,需改成false
        # frame per second
        fps: 30
      
        # Camera identifiers (choose one or more):
        #   - video_id: X        → /dev/videoX  (e.g. 0 → /dev/video0)
        #   - serial_number: Y   → camera's hardware serial (e.g. 141722079879)
        #   - physical_path: Z   → sysfs physical USB path (e.g. /sys/devices/pci0000:00/.../1-11.2:1.0)
        #
        # Identifier priority:
        #   physical_path > serial_number > video_id
        #   if an identifier is not used, set it to null. The system will resolve the camera by priority.
        #
        # Notes:
        #   - type "realsense": supports serial_number only (but a RealSense can also be used as opencv/uvc if desired)
        #   - type "opencv":    supports video_id, serial_number, physical_path
        #   - type "uvc":       supports video_id, serial_number, physical_path
        video_id: null # RealSense攝像頭不需要指定該參數,,,使用null
        serial_number: "243322070193" # 修改為1.3.1查找到的RealSense serial numbers,,需用雙引號括起來
        physical_path: null # RealSense攝像頭不需要指定該參數,,,使用null
      
      # =====================================================
      # Left wrist camera configuration
      # =====================================================
      left_wrist_camera:
        enable_zmq: false # 有安裝左腕攝像頭則為true,,反之為false
        zmq_port : 55556
        enable_webrtc: false # 有安裝左腕攝像頭則為true,,,反之為false
        webrtc_port : 60002
        webrtc_codec: h264
        type: uvc # 若左腕攝像頭是RealSense設備則修改為realsense,,,反之為uvc
        image_shape: [480, 640]
        binocular: false # 雙目攝像頭則用true,,反之為false
        fps: 30
        video_id: 2 # 修改為1.3.1查找到的video_id,,,沒有則為null
        serial_number: "200901010001" # 修改為1.3.1查找到的serial_number,,,沒有則為null
        physical_path: null # 修改為1.3.1查找到的physical_path,,,,沒有則為null
      
      # =====================================================
      # Right wrist camera configuration
      # =====================================================
      right_wrist_camera:
        enable_zmq: false # 有安裝右腕攝像頭則為true,,反之為false
        zmq_port : 55557
        enable_webrtc: false # 有安裝右腕攝像頭則為true,,反之為false
        webrtc_port: 60003
        webrtc_codec: h264
        type: uvc # 若右腕攝像頭是RealSense設備則修改為realsense,,,,反之為uvc
        image_shape: [480, 640]
        binocular: false # 雙目攝像頭則用true,,,反之為false
        fps: 30
        video_id: 4 # 修改為1.3.1查找到的video_id,,沒有則為null
        serial_number: "200901010002" # 修改為1.3.1查找到的serial_number,,,,沒有則為null
        physical_path: null # 修改為1.3.1查找到的physical_path,,,,沒有則為null
      

      1.3.3 啟動並測試圖像服務器

      (1)啟動服務器:

      # 若使用了RealSense攝像頭
      (tv) unitree@ubuntu:~$ teleimager-server --rs
      
      # 若沒有使用RealSense攝像頭
      (tv) unitree@ubuntu:~$ teleimager-server
      

      (2)使用WebRTC方式測試圖像服務器(推薦)

      若使用 WebRTC,,,,可通過瀏覽器訪問:

      https://<host_ip>:<webrtc_port>
      # 例如
      https://192.168.123.164:60001
      

      點擊左上角start 按鈕

      (3)使用ZMQ方式測試圖像服務器(可選)

      服務器運行後,,,,在另一個終端啟動客戶端:

      (tv) unitree@ubuntu:~$ teleimager-client --host 127.0.0.1
      

      若服務器運行在例如 192.168.123.164 的 G1 Jetson 上,,,則:

      (tv) unitree@ubuntu:~$ teleimager-client --host 192.168.123.164
      

      然後你將看到各路 ZMQ 攝像頭的視頻窗口。。。

      需要確保環境中安裝了 opencv-python

      (4)自動啟動圖像服務

      完成上述配置並測試成功後,,,,可以通過以下腳本配置系統自動啟動圖像服務:

      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/teleimager$ bash setup_autostart.sh
      

      根據提示完成配置即可。。。。

      2 🚀 啟動遙操

      2.1 💻 啟動參數說明

      2.1.1 基礎控制參數說明

      ⚙️ 參數 📜 說明 🔘 目前可選值 📌 默認值
      --frequency 設置錄制和控制的 FPS 任意正常範圍內的浮點數 30.0
      --input-mode 選擇 XR 輸入模式(通過什麼方式控制機器人) hand手勢跟蹤
      controller手柄跟蹤
      hand
      --display-mode 選擇 XR 顯示模式(通過什麼方式查看機器人視角) immersive(沈浸式)
      ego(通透+第一人稱小窗)
      pass-through(通透)
      immersive
      --arm 選擇機器人設備類型(可參考 0. 📖 介紹) G1_29
      G1_23
      H1_2
      H1
      G1_29
      --ee 選擇手臂的末端執行器設備類型(可參考 0. 📖 介紹) dex1
      dex3
      inspire_ftp
      inspire_dfx
      brainco
      無默認值
      --img-server-ip 設置圖像服務器的 IP 地址,,用於接收圖像服務流、、、、配置 WebRTC 信令服務地址 IPv4 地址 192.168.123.164
      --network-interface 設置 cyclonedds 通信的網卡接口 網卡名稱 None

      2.1.2 模式開關參數說明

      ⚙️ 參數 📜 說明
      --motion 【啟用運動控制模式】
      開啟本模式後,,可在機器人運控程序運行下進行遙操作程序。。。。
      手勢跟蹤模式下,,可使用 控制機器人正常行走;手柄跟蹤模式下,,,,也可使用。。。。
      注意:只支持 Regular mode (R1+X),,,,不支持 Running mode (R2+A)
      --headless 【啟用無圖形界面模式】
      適用於本程序部署在開發計算單元(PC2)等無顯示器情況
      --sim 【啟用】
      --ipc 【進程間通信模式】
      可通過進程間通信來控制 xr_teleoperate 程序的狀態切換,,此模式適合與代理程序進行交互
      --affinity 【CPU親和模式】
      設置 CPU 核心親和性。。如果你不知道這是什麼,,那麼請不要設置它。。
      --record 【啟用數據錄制模式】
      r 鍵進入遙操後,,,按 s 鍵可開啟數據錄制,,,再次按 s 鍵可結束錄制並保存本次 episode 數據。。
      繼續按下 s 鍵可重覆前述過程。。
      --task-* 此類參數可配置錄制的文件保存路徑,,任務目標、、描述、、步驟等信息

      2.1.3 狀態轉移圖

      2.2 🤖 實物部署

      Warning

      1. 所有人員必須與機器人保持安全距離,,,以防止任何潛在的危險!!!!
      2. 在運行此程序之前,,,,請確保至少閱讀一次 。。。
      3. 如果要開啟運動控制模式遙操作,,,請提前使用 確保機器人進入主運控模式。。。。
      4. 開啟運動控制模式(--motion)時:
        • 右手柄按鍵 A 為遙操作退出功能按鍵;
        • 左手柄和右手柄的兩個搖桿按鍵同時按下為軟急停按鍵,,,機器人會退出運控程序並進入阻尼模式,,,該功能只在必要情況下使用
        • 左手柄搖桿控制機器人前後左右(最大控制速度已經在程序中進行了限制)
        • 右手柄搖桿控制機器人轉向(最大控制速度已經在程序中進行了限制)

      本程序支持通過 XR 設備(比如手勢或手柄)來控制實際機器人動作。。你可以根據需要,,,,通過命令行參數來配置運行方式,,以下舉例兩種啟動方式,,,,選擇其一即可。。

      (1)根據 2.1 節啟動參數說明,,,,我們假設選擇手柄跟蹤控制 G1(29 DoF)進行遙操,,,,同時開啟數據錄制模式。。。。則啟動命令如下所示:(根據實際情況選擇)

      # 手柄跟蹤控制 G1(29 DoF)
      (tv) unitree@ubuntu:~$ cd ~/xr_teleoperate/teleop/
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/$ python teleop_hand_and_arm.py --input-mode=controller --img-server-ip=192.168.1.100 --record
      # --img-server-ip為PC2和XR設備連接同一個WiFi的IP
      

      (2)根據 2.1 節啟動參數說明,,我們假設選擇手柄跟蹤控制 G1(29 DoF) + Dex1-1夾爪進行遙操,,,,同時開啟數據錄制模式。。。。則啟動命令如下所示:(根據實際情況選擇)

      ## 手柄跟蹤控制 G1(29 DoF) + Dex1-1夾爪
      # 若需要控制Dex1-1的夾爪請查看宇樹文檔中心和B站教程對夾爪進行部署並設置為開機自啟動
      # 1.文檔中心鏈接:https://support.unitree.com/home/zh/dex1-1_gripper/dex1_1
      # 2.B站視頻鏈接:https://www.bilibili.com/video/BV1BY9DB3EfW/?spm_id_from=333.337.search-card.all.click&vd_source=8d9d3245c455c9065923881e36fae6fb
      
      # 需要指定--ee=dex1即可控制夾爪,,,,其他靈巧手也可參考該方式
      (tv) unitree@ubuntu:~$ cd ~/xr_teleoperate/teleop/
      (tv) unitree@ubuntu:~/xr_teleoperate/teleop/$ python teleop_hand_and_arm.py --input-mode=controller --ee=dex1 --img-server-ip=192.168.1.100 --record
      # --img-server-ip為PC2和XR設備連接同一個WiFi的IP
      

      程序正常啟動後,,,,終端輸出信息如下圖所示:

      接下來,,,,執行以下步驟:

      1. 戴上您的 XR 頭顯設備(比如 apple vision pro 或 pico4 ultra enterprise等)

      2. 連接對應的 WiFi 熱點

      3. 如果您頭部相機開啟了WebRTC功能(cam_config_server.yaml => head_camera => enable_webrtc: true),,,,那麼執行此步驟,,,,否則直接跳到第 4 步。。打開瀏覽器應用(比如 Safari 或 PICO Browser),,,輸入並訪問網址:https://192.168.1.100:60001

      注意1:此 IP 地址為開啟teleimager圖像服務的 PC2 設備 IP

      注意2:此時可能彈出類似第4步相同的警告提示。。請點擊Advanced按鈕後,,,繼續點擊 Proceed to ip (unsafe) 按鈕,,,,使用非安全方式繼續登錄WebRTC圖像服務器。。進入後,,,,點擊左上角start按鈕,,如果預覽到頭部相機圖像,,那麼操作成功。。。

      注意3:此步驟目的有兩個:一是檢測頭部相機服務是否正常;二是手動信任 webrtc 自簽名證書。。。。相同設備與自簽名證書條件下執行一次本步驟後,,,再次啟動時可跳過該步。。

      1. 打開瀏覽器應用(比如 Safari 或 PICO Browser),,輸入並訪問網址:https://192.168.1.100:8012/?ws=wss://192.168.1.100:8012

      注意1:此 IP 地址應與您的 PC2 IP 地址匹配。。。。該地址可以使用 ifconfig 等類似命令查詢。。。

      注意2:此時可能彈出下圖所示的警告信息。。請點擊Advanced按鈕後,,,,繼續點擊 Proceed to ip (unsafe) 按鈕,,使用非安全方式繼續登錄服務器。。

      1. 進入Vuer網頁界面後,,,,點擊 Virtual Reality 按鈕。。在允許後續的所有對話框後,,啟動 VR 會話。。。。界面如下圖所示:

      1. 此時,,,,您將會在 XR 頭顯設備中看到機器人的第一人稱視野。。。。同時,,,終端打印出鏈接建立的信息:

      bash websocket is connected. id:dbb8537d-a58c-4c57-b49d-cbb91bd25b90 default socket worker is up, adding clientEvents Uplink task running. id:dbb8537d-a58c-4c57-b49d-cbb91bd25b90

      1. 然後,,,,將手臂形狀擺放到與機器人初始姿態相接近的姿勢。。。這一步是為了避免在實物部署時,,,初始位姿差距過大導致機器人產生過大的擺動。。。

      機器人初始姿態示意圖如下:

      1. 最後,,,,在終端中按下 r 鍵後,,,,正式開啟遙操作程序。。。。此時,,您可以遠程控制機器人的手臂(和靈巧手)

      2. 在遙操過程中,,,按 s 鍵可開啟數據錄制,,,,再次按 s 鍵可結束錄制並保存數據(該過程可重覆)

      數據錄制過程示意圖如下:

      注意1:錄制的數據默認存儲在 xr_teleoperate/teleop/utils/data 中。。。。數據使用說明見此倉庫: 。。。

      注意2:請在錄制數據時注意您的硬盤空間大小。。。。

      注意3: v1.4 及以上版本,,,record image窗口取消。。。

      1. 要退出程序,,,可以在終端窗口中按下 q

        Warning

        為了避免損壞機器人,,,,最好確保將機器人手臂擺放為與機器人初始姿態附近的恰當位置後,,,再按 q 退出。。

        調試模式下:按下退出鍵後,,,機器人雙臂將在5秒內返回機器人初始姿態,,,,然後結束控制。。

        運控模式下:按下退出鍵後,,,機器人雙臂將在5秒內返回機器人運控姿態,,然後結束控制。。。。

      3. 🗺️ 代碼庫教程

      xr_teleoperate/
      │
      ├── assets                    [存儲機器人 URDF 相關文件]
      │
      ├── teleop
      │   ├── teleimager            [全新的圖像服務庫,,,,支持多種特性]
      │   │
      │   ├── televuer
      │   │      ├── src/televuer
      │   │         ├── television.py       [使用 Vuer 從 XR 設備捕獲頭部、、腕部和手部/手柄等數據]
      │   │         ├── tv_wrapper.py       [對捕獲的數據進行後處理]
      │   │      ├── test
      │   │         ├── _test_television.py [television.py 的測試程序]
      │   │         ├── _test_tv_wrapper.py [tv_wrapper.py 的測試程序]
      │   │
      │   ├── robot_control
      │   │      ├── src/dex-retargeting [靈巧手映射算法庫]
      │   │      ├── robot_arm_ik.py     [手臂的逆運動學]
      │   │      ├── robot_arm.py        [控制雙臂關節並鎖定其他部分]
      │   │      ├── hand_retargeting.py [靈巧手映射算法庫 Wrapper]
      │   │      ├── robot_hand_inspire.py  [控制因時靈巧手]
      │   │      ├── robot_hand_unitree.py  [控制宇樹靈巧手]
      │   │
      │   ├── utils
      │   │      ├── episode_writer.py          [用於記錄模仿學習的數據]
      │   │      ├── weighted_moving_filter.py  [用於過濾關節數據的濾波器]
      │   │      ├── rerun_visualizer.py        [用於可視化錄制數據]
      │   │      ├── ipc.py                     [用於和代理程序進行進程間通信]
      │   │      ├── motion_switcher.py         [用於切換運控狀態]
      │   │      ├── sim_state_topic.py         [用於仿真部署]
      │   │
      │   │──teleop_hand_and_arm.py    [遙操作的啟動執行代碼]
      

      4. 🛠️ 硬件

      請查看 硬件文檔.

      5. 🙏 鳴謝

      該代碼基於以下開源代碼庫構建。。。。請訪問以下鏈接查看各自的許可證:

      1. https://github.com/OpenTeleVision/TeleVision
      2. https://github.com/dexsuite/dex-retargeting
      3. https://github.com/vuer-ai/vuer
      4. https://github.com/stack-of-tasks/pinocchio
      5. https://github.com/casadi/casadi
      6. https://github.com/meshcat-dev/meshcat-python
      7. https://github.com/zeromq/pyzmq
      8. https://github.com/Dingry/BunnyVisionPro
      9. https://github.com/unitreerobotics/unitree_sdk2_python
      10. https://github.com/ARCLab-MIT/beavr-bot

      6. 📝 引用

      @misc{xr-teleoperate,
        author       = {{Unitree Robotics}},
        title        = {{XR-Teleoperate}: An Open-Source Teleoperation Framework and Data Collection Toolkit for Embodied Intelligence},
        howpublished = {\url{https://github.com/unitreerobotics/xr_teleoperate}},
        year         = {2024},
        note         = {Accessed: 2026-02}
      }
      
      來源文件:開發幫助_03020402.md
      Q

      unitree_sdk2添加自定義消息類型

      unitree_sdk2基於Cyclone DDS進行進程間通信,,,,通過IDL文件定義消息類型,,並通過IDL編譯器將其轉換為相應的CPP與HPP文件,,供相應程序調用。。。在使用unitree_sdk2過程中,,,,如需自定義消息類型,,,進行相應的進程間通信功能,,可參照本文檔完成。。。。

      一、、、安裝Cyclone DDS組件

      1.通過git工具下載0.10.2版本的Cyclone DDS源碼,,,,第一行為核心功能源碼,,僅支持C語言開發,,,,第二行為C++拓展功能源碼,,,,支持通過C++進行開發。。。。

      ```bash git clone –branch 0.10.2 https://github.com/eclipse-cyclonedds/cyclonedds.git git clone –branch 0.10.2 https://github.com/eclipse-cyclonedds/cyclonedds-cxx.git ````

      2.先編譯核心功能源碼,,,再編譯C++拓展包源碼。。。。

      cd cyclonedds
      mkdir build install
      cd build
      cmake -DCMAKE_INSTALL_PREFIX=<install-locations> -DBUILD_EXAMPLES=ON ..
      cmake --build . --parallel
      cmake --build . --target install
      

      <install-locations>填寫期望安裝路徑,,,建議填寫絕對路徑。。。。本文將其安裝在install文件夾中,,即/home/username/cyclonedds/install。。。

      cd cyclonedds-cxx
      mkdir build install
      cd build
      cmake -DCMAKE_PREFIX_PATH=<core-install-locations> -DCMAKE_INSTALL_PREFIX=<install-locations> -DBUILD_EXAMPLES=ON ..
      cmake --build . --parallel
      cmake --build . --target install
      

      <core-install-locations>填寫上一步中cyclonedds的安裝路徑,,,<install-locations>填寫cyclonedds-cxx的期望安裝路徑。。。本文將其安裝在install文件夾中,,,,即/home/username/cyclonedds-cxx/install。。。

      二、、、、設計消息類型描述文件

      1.在C++拓展包中,,,創建用於自定義消息類型的包,,,並添加IDL消息類型描述文件與CMakeLists.txt文件,,,,本文將包命名為robot,,,消息類型命名為RobotData,,,,讀者可根據需求自定義名稱。。。

      cd cyclonedds-cxx/examples
      mkdir robot
      cd robot
      touch CMakeLists.txt RobotData.idl
      

      2.按照如下示例設計IDL消息類型描述文件

      module RobotData
      {
        struct Msg
        {
          long userID;
          string message;
        };
      };
      

      3.按照如下示例編寫CMakeLists.txt文件,,用於生成CPP與HPP文件。。。。

      project(robot LANGUAGES C CXX)
      cmake_minimum_required(VERSION 3.16)
      
      if(NOT TARGET CycloneDDS-CXX::ddscxx)
        find_package(CycloneDDS-CXX REQUIRED)
      endif()
      
      idlcxx_generate(
        TARGET RobotData
        FILES RobotData.idl
        WARNINGS no-implicit-extensibility
      )
      
      add_custom_target(generate_robotdata_idl ALL
        DEPENDS RobotData
        COMMENT "Generate C++ code from RobotData.idl"
      )
      

      4.修改上級目錄中的CMakeLists.txt文件,,,添加剛才創建的robot文件夾。。。。

      # 文件路徑: ./cyclonedds-cxx/examples/CMakeLists.txt
      set(CMAKE_INSTALL_EXAMPLESDIR "${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/examples")
      
      include("${CMAKE_SOURCE_DIR}/src/idlcxx/Generate.cmake")
      
      install(
        FILES helloworld/publisher.cpp
              helloworld/subscriber.cpp
              helloworld/HelloWorldData.idl
              helloworld/CMakeLists.txt
              helloworld/readme.rst
        DESTINATION "${CMAKE_INSTALL_EXAMPLESDIR}/helloworld"
        COMPONENT dev)
      
      add_subdirectory(helloworld)
      add_subdirectory(robot)
      

      5.編譯生成CPP與HPP文件。。。。

      cd cyclonedds-cxx/build
      cmake ..
      make
      

      6.編譯成功後,,可以在cyclonedds-cxx/build/examples/robot目錄下找到所需的CPP與HPP文件。。

      三、、、移植、、、創建程序

      1.在unitree_sdk2下創建用於自定義消息類型的包,,並創建相應的應用程序源碼及CMakeLists.txt,,,本文將包命名為robot。。

      cd unitree_sdk2/example
      mkdir robot
      cd robot
      touch CMakeLists.txt robot_pub.cpp robot_sub.cpp
      

      2.將上述步驟中生成的消息類型頭文件RobotData.cpp與RobotData.hpp覆制到該目錄下。。。。

      3.編寫應用源碼。。。

      robot_pub.cpp

      #include <unitree/robot/channel/channel_publisher.hpp>
      #include <unitree/common/time/time_tool.hpp>
      #include "RobotData.hpp"
      
      #define TOPIC "Robot"
      
      using namespace unitree::robot;
      using namespace unitree::common;
      
      int main(){
          ChannelFactory::Instance()->Init(0);
          ChannelPublisher<RobotData::Msg> publisher(TOPIC);
      
          publisher.InitChannel();
      
          while (true){
              RobotData::Msg msg(unitree::common::GetCurrentTimeMillisecond(), "Hello Robot.");
              publisher.Write(msg);
              sleep(1);
          }
      
          return 0;
      }
      

      robot_sub.cpp

      #include <unitree/robot/channel/channel_subscriber.hpp>
      #include <unitree/common/time/time_tool.hpp>
      #include "RobotData.hpp"
      
      #define TOPIC "Robot"
      
      using namespace unitree::robot;
      using namespace unitree::common;
      
      void Handler(const void* msg){
          const RobotData::Msg* pm = (const RobotData::Msg*)msg;
      
          std::cout << "userID:" << pm->userID() << ", message:" << pm->message() << std::endl;
      }
      
      int main(){
          ChannelFactory::Instance()->Init(0);
          ChannelSubscriber<RobotData::Msg> subscriber(TOPIC);
          subscriber.InitChannel(Handler);
      
          while (true){
              sleep(10);
          }
      
          return 0;
      }
      

      4.編寫CMakeLists.txt文件。。。。

      add_executable(robot_pub
          robot_pub.cpp
          RobotData.cpp
      )
      target_link_libraries(robot_pub unitree_sdk2)
      
      add_executable(robot_sub
          robot_sub.cpp
          RobotData.cpp
      )
      target_link_libraries(robot_sub unitree_sdk2)
      

      5.修改上級目錄CMakeLists.txt,,,,將robot包添加至編譯範圍內。。。。

      # 文件路徑: unitree_sdk2/example/CMakeLists.txt
      add_subdirectory(helloworld)
      add_subdirectory(wireless_controller)
      add_subdirectory(jsonize)
      add_subdirectory(state_machine)
      
      add_subdirectory(go2)
      add_subdirectory(b2)
      add_subdirectory(h1)
      add_subdirectory(g1)
      add_subdirectory(go2w)
      add_subdirectory(b2w)
      
      add_subdirectory(robot)
      

      6.編譯自定義消息類型包

      cd unitree_sdk2/build
      cmake ..
      make
      

      7.運行、、、測試

      打開兩個終端,,分別運行unitree_sdk2/build/bin目錄下的robot_pub與robot_sub,,,可以看到此時robot_sub每隔1秒彈出一次“Hello Robot.”信息。。至此,,,,自定義消息類型成功。。

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

      運行程序報錯3104

      錯誤號 錯誤描述 備注
      3104 請求超時 客戶端返回

      錯誤原因:

      沒有服務器處理這個請求,,,出現這個錯誤可能是 1.網口接觸不良 2.高頻請求

      解決方法:

      1. 檢查網口的連接有沒有松動情況
      2. 代碼發送API請求頻率不能太高,,,設置50Hz即可
      來源文件:開發幫助_030401.md
      Q

      運行程序報錯3102

      錯誤號 錯誤描述 備注
      3102 請求發送錯誤 客戶端返回

      錯誤原因:

      API 請求時傳的參數數據結構不對。。。

      解決方法:

      參考 中的例程代碼,,,,檢查一下自己的代碼中的問題。。

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

      運行程序報錯3203

      錯誤號 錯誤描述 備注
      3203 API 在服務端未實現 服務端返回

      錯誤原因:

      服務端檢查到請求的 API 不存在,,,,是設備固件版本與 SDK 版本不匹配導致的。。。。

      解決方法:

      把設備固件版本和 SDK 更新到最新即可。。。

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

      運行程序報錯libddsc.so.0: file too short

      運行SDK例程出現類似報錯:

      unitree@ubuntu:~/unitree_sdk2/build/bin$ sudo ./go2_stand_example eth0
      ./go2_stand_example: error while loading shared libraries: /home/unitree/unitree_sdk2/thirdparty/lib/aarch64/libddsc.so.0: file too short
      

      問題原因

      主要有兩個原因:

      1. 使用的文件傳輸軟件有問題,,在把 SDK 文件傳到拓展塢或 PC2 時文件出現損壞

      2. 報錯中的庫文件沒有正確鏈接

      解決方法

      若問題原因為文件損壞:

      重新下載 unitree_sdk2

      使用scp命令傳輸文件:

      scp -r ./unitree_sdk2 unitree@192.168.123.18:~/
      

      重新編譯運行。。。

      若問題原因為軟連接丟失

      在 SDK 對應的文件夾中手動連接對應的軟鏈接。。

      首先需要分辨運行程序的 PC 的系統架構。。在 SDK2 中的 thirdparty/lib 文件夾中有 aarch64 和 x86_64 兩個文件夾。。aarch64對應了 arm64 系統架構,,,x86_64 對應了 x86 系統架構。。

      根據 PC 的系統架構進入對應的文件夾。。。

      x86 架構
      cd unitree_sdk2/thirdparty/lib/x86_64
      arm64 架構
      cd unitree_sdk2/thirdparty/lib/aarch64
      

      進入對應文件夾後

      ln -sf libddscxx.so libddscxx.so.0
      ln -sf libddsc.so libddsc.so.0
      

      重新手動連接之後重新執行程序即不會出現 file too short 報錯。。。。

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

      運行程序報錯undefined symbol: ddsi_sertype_v0

      運行程序的命令前面加 sudo

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

      運行程序報錯core dumped(核心轉存)

      ROS2 和 SDK2 的 CycloneDDS 底層有沖突。。在單個程序內無法同時初始化 ROS2 和 SDK2,,也不能在一個終端進程里執行 source unitree_ros2/setup.sh 之後運行 SDK2 編譯出的例程程序,,都會造成 core dumped核心已轉存 報錯。。

      解決方法

      1. 不要激活 ROS2 環境,,,在新建終端時若提示選擇 ROS 版本,,,,直接摁回車跳過。。。。

      2. 取消激活 ROS2 環境,,執行命令:

      unset ROS_PACKAGE_PATH
      unset LD_LIBRARY_PATH
      
      來源文件:開發幫助_030406.md
      Q

      為什麼模擬發送遙控器信號話題無法控制機器人

      模擬發送遙控器信號(例如向 rt/lowstate 或相關話題發布數據)無法直接控制機器人,,,原因如下:

      1. lowstate 是狀態反饋話題(輸出端): 在 Unitree SDK2 的架構中,,,,帶有 state 的話題(如 rt/lf/lowstate、、、、rt/sportmodestate)是機器人向外廣播自身狀態的“只讀”話題。。。您的編寫的程序向機器人發布數據,,,機器人的底層或運動控制核心也不會從這里讀取控制指令,,,,它只會不斷地用自身的真實狀態覆蓋你的數據。。

      2. 遙控器數據的真實鏈路: 機器人的內置運動控制器是直接從底層的硬件接口(負責接收遙控器信號的數傳信號)讀取原生的遙控器數據,,而不是通過 DDS 節點來訂閱遙控器話題。。。話題中暴露出的 wirelesscontroller 數據僅僅是為了讓開發者能夠監聽和讀取當前遙控器的按鍵狀態變動。。。。

      如何通過代碼正確控制機器人??

      如果你想要通過代碼來模擬遙控器的行為(比如控制機器人前後左右移動):

      • 高層控制(推薦,,,類似遙控器操作): 你應該使用 SDK 提供的 SportClient (運動客戶端)。。。通過它可以發送帶有明確目的的 API 請求(如:前進、、、、後退、、、轉彎、、站立、、、、趴下)。。。你可以參考工作空間中的高層控制示例代碼(例如 go2_sport_client、、、go2w_sport_clientg1_loco_client 等文件夾下的例子)。。。

      • 底層控制(直接控制各個關節): 如果你需要控制每個電機的角度、、、、速度和力矩,,你需要向 rt/lowcmd 話題發布 LowCmd_ 消息,,並且在控制前要確保機器人處於正確的底層控制模式。。。。相關代碼可以參考 go2_low_levelg1_low_level_example。。

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

      用戶pc開發環境需要什麼系統???

      系統最低需求

      操作系統: Linux kernel >= 5.15 的任意發行版 計算架構: ARMv8/ARM64 或者 x86-64

      系統推薦配置

      操作系統:Ubuntu20.04 / Ubuntu22.04 計算架構:ARMv8/ARM64 或者 x86-64

      注意事項

      SDK包只支持Linux系統,,,,不支持Windows/MacOS。。。

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

      為什麼topic list里只有兩行

      問題原因:

      ROS2中沒有機器人話題相關的消息類型,,無法識別機器人話題。。。。

      解決方法:

      https://github.com/unitreerobotics/unitree_ros2

      按照README編譯好這個 unitree_ros2 項目後,,,,修改 unitree_ros2/setup.sh 里面的 NetworkInterface name 字段改為連接機器人的網口名,,,,執行 source unitree_ros2/setup.sh ,,,之後就可以獲取到話題了。。。

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

      unitree_ros2中添加接口教程

      宇樹產品的軟件服務接口的改動一般優先更新在 ,,,若您發現 中的接口沒更新,,可以自行按照下面的教程添加接口代碼。。

      其中接口的聲明和實現需要參考 中的代碼。。。

      添加接口教程

      本教程教你如何在 Unitree ROS2 項目中各個的 Client 類中添加接口函數。。

      example/src 中已有的部分 Client:

      文件 適用機器人
      include/g1/xxx_clinet.hpp + src/g1/xxx_client.cpp G1
      include/common/ros2_sport_client.h + src/common/ros2_sport_client.cpp Go2
      include/common/ros2_b2_sport_client.h + src/common/ros2_b2_sport_client.cpp B2 / B2W

      兩者的架構完全相同,,,教程以 Go2 版為例進行說明。。。


      1. 架構解析

      核心機制

      Client 通過 ROS2 Topic 發布/訂閱 與機器人通信:

      xxx是API名(比如sport、、、audio等),,XXX是函數名。。。。
      
      你的代碼 → xxx_client_.XXX(req_) → publish("/api/xxx/request")
                                               ↓
                                            機器人 SDK
                                               ↓
                                subscribe("/api/xxx/response") → 返回結果
      

      關鍵文件

      example/src/
      ├── include/common/
      │   └── ros2_sport_client.h    ← ① 頭文件:API ID 常量 + 類聲明
      ├── src/common/
      │   └── ros2_sport_client.cpp  ← ② 實現文件:函數具體實現
      ├── src/go2/
      │   └── go2_sport_client.cpp       ← ③ 調用者:實際使用 client 的節點
      

      數據流詳解

      Move 函數為例,,調用 sport_client_.Move(req_, vx, vy, vyaw) 時:

      // 1. 把參數打包為 JSON 字符串
      nlohmann::json js;
      js["x"] = vx;
      js["y"] = vy;
      js["z"] = vyaw;
      req.parameter = js.dump();
      
      // 2. 設置 API ID,,,告訴機器人"執行 Move"
      req.header.identity.api_id = ROBOT_SPORT_API_ID_MOVE;
      
      // 3. 發布 Request 消息
      req_puber_->publish(req);
      

      其中 requnitree_api::msg::Request 類型,,核心字段:

      字段 含義
      req.header.identity.api_id 32位整型 API ID,,標識調用哪個功能
      req.parameter JSON 字符串,,攜帶函數參數

      2. 函數接口的 3 種模式

      根據是否需要參數,,,有 3 種實現模式:

      模式 A:無參數調用

      只設置 api_id,,,不傳參數。。適合觸發類動作(站立、、、、趴下等)。。。。

      // === 頭文件 (.h) ===
      void Damp(unitree_api::msg::Request &req);
      
      // === 實現文件 (.cpp) ===
      void SportClient::Damp(unitree_api::msg::Request &req) {
        req.header.identity.api_id = ROBOT_SPORT_API_ID_DAMP;
        req_puber_->publish(req);
      }
      

      模式 B:帶簡單參數(int / float / bool)

      將參數打包為一個 "data" 鍵的 JSON。。。。

      // === 頭文件 (.h) ===
      void SpeedLevel(unitree_api::msg::Request &req, int level);
      void SwitchJoystick(unitree_api::msg::Request &req, bool flag);
      
      // === 實現文件 (.cpp) ===
      void SportClient::SpeedLevel(unitree_api::msg::Request &req, int level) {
        nlohmann::json js;
        js["data"] = level;                  // 簡單類型用 "data" 鍵
        req.parameter = js.dump();
        req.header.identity.api_id = ROBOT_SPORT_API_ID_SPEEDLEVEL;
        req_puber_->publish(req);
      }
      

      模式 C:帶多個參數

      參數以具體鍵名打包進 JSON。。。。

      // === 頭文件 (.h) ===
      void Move(unitree_api::msg::Request &req, float vx, float vy, float vyaw);
      
      // === 實現文件 (.cpp) ===
      void SportClient::Move(unitree_api::msg::Request &req, float vx, float vy, float vyaw) {
        nlohmann::json js;
        js["x"] = vx;        // 多個參數用語義化鍵名
        js["y"] = vy;
        js["z"] = vyaw;
        req.parameter = js.dump();
        req.header.identity.api_id = ROBOT_SPORT_API_ID_MOVE;
        req_puber_->publish(req);
      }
      

      3. 完整步驟:添加一個新接口

      假設要為 Go2 的 SportClient 添加一個 ExampleInterface(舉例,,該接口並不存在)接口。。。。

      步驟 1:確定 API ID

      unitree_sdk2 的 可以獲取 Go2 的 SportClient 的所有 API ID:

      const int32_t ROBOT_SPORT_API_ID_DAMP               = 1001;
      const int32_t ROBOT_SPORT_API_ID_BALANCESTAND       = 1002;
      const int32_t ROBOT_SPORT_API_ID_STOPMOVE           = 1003;
      // ... 假如里面有您需要用的 ExampleInterface
      const int32_t ROBOT_SPORT_API_ID_EXAMPLEINTERFACE   = 6666; // 示例
      

      注意:API ID 必須與 unitree_sdk2 中的定義一致!!不能隨意編造。。。

      步驟 2:在頭文件中添加 API ID 常量

      編輯 include/common/ros2_sport_client.h,,,,在常量區域末尾添加:

      const int32_t ROBOT_SPORT_API_ID_EXAMPLEINTERFACE = 6666;   // <-- 新增
      

      步驟 3:在頭文件中添加函數聲明

      在同一頭文件的 class SportClient 內部,,,,按 Doxygen 風格添加聲明:

        /*
         * @brief ExampleInterface    ← 函數功能描述
         * @api: 6666           ← 對應的 API ID
         */
        void ExampleInterface(unitree_api::msg::Request &req, ...);
      

      接口函數的參數請與 unitree_sdk2 中的函數聲明對齊。。

      步驟 4:在實現文件中添加函數體

      編輯 src/common/ros2_sport_client.cpp,,,添加實現:

      void SportClient::ExampleInterface(unitree_api::msg::Request &req, ...) {
        nlohmann::json js;
        js["..."]  = ...;     // 若接口有參數則這里設置
        req.parameter = js.dump();
        req.header.identity.api_id = ROBOT_SPORT_API_ID_EXAMPLEINTERFACE;
        req_puber_->publish(req);
      }
      

      步驟 5:編譯

      cd unitree_ros2/example
      colcon build
      source install/setup.bash
      

      5. 總結

      添加一個 SportClient 函數接口需要修改 3 個位置:

      # 文件 操作
      include/common/ros2_XX_sport_client.h 添加 const int32_t API_ID = XXXX; 常量
      include/common/ros2_XX_sport_client.h class SportClient 中添加函數聲明
      src/common/ros2_XX_sport_client.cpp 添加函數實現

      關鍵提醒:

      1. API ID 必須與 unitree_sdk2 的一致,,,不能隨意編造。。。。
      2. 修改後必須 colcon buildsource setup.bash。。。
      來源文件:開發幫助_030504.md
      Q

      如何獲取SLAM點雲地圖

      使用B2的建好圖後,,,點雲地圖是保存在PC1上的,,用戶可以通過訂閱話題的方式獲取地圖數據。。。。全局地圖點雲數據話題:rt/lio_sam_ros2/mapping/cloud_map_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 "/lio_sam_ros2/mapping/cloud_map_map"  // B2全局地圖話題
      
      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
      
      1. 創建package並添加代碼:
      ros2 pkg create --build-type ament_cmake global_map_saver
      # 將上面的C++代碼保存為 src/global_map_saver.cpp
      # 將CMakeLists.txt和package.xml替換為上面的內容
      
      1. 安裝PCL庫:
      sudo apt-get install libpcl-dev
      
      1. 編譯:
      cd ~/ros2_ws
      colcon build --packages-select global_map_saver
      source install/setup.bash
      
      1. 使用方法:

        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 = '/lio_sam_ros2/mapping/cloud_map_map'  # B2全局地圖話題
      
      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
      
      1. 開啟定位,,,,使用SLAM導航服務接口開啟定位
      2. 等待數據接收:腳本會一直等待直到接收到全局地圖數據
      3. 自動保存並退出:接收到數據後會自動保存並關閉

      驗證保存的文件

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

      B2/B2-W產品資料&開發資料

      手冊、、說明書

      • B2/B2-W 說明書(App下載頁面最下面):

      • B2/B2-W 教學視頻(App下載頁面下面):

      • B2/B2-W 開發文檔:

      模型、、圖紙

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

      • B2/B2-W URDF(開發文檔 - 應用開發 - 獲取SDK):

      • B2/B2-W 導軌圖(開發文檔 - 關於B2 - 背部負載安裝孔位圖):

      • B2導軌結構尺寸簡圖:

      • B2/B2-W 電氣接口(開發文檔 - 關於B2 - 電氣接口):

      • B2/B2-W 對外供電容量(開發文檔 - 關於B2 - 電氣接口):

      • B2/B2-W 8+2、、2+2線纜接口定義(開發文檔 - 關於B2 - 線纜接口含義):

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

      B2開發板卡的IP、、用戶名和密碼是多少????

      B2有主控PC和用戶PC,,用戶PC可選配多塊,,默認配置為1塊。。。。 主控PC IP為192.168.123.161,,不可登錄不可開發。。 用戶PC IP為192.168.123.164,,,,用戶名unitree,,,,密碼Unitree0408。。。。 可選配的開發PC,,,,地址為192.168.123.162/163/165,用戶名unitree,,密碼Unitree0408。。

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

      AGX拓展模塊的IP地址、、用戶名、、、、密碼是多少

      AGX拓展模塊最多有兩塊AGX模組,,,,IP地址分別為192.168.123.167和192.168.123.168,,,,用戶名為unitree,,,,密碼為Unitree0408

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

      B2電池數據怎麼獲取????

      可以通過底層狀態接口 rt/lowstate 獲取電池信息,,電池數據為 BmsState_.idl。。。

      BmsState_.idl

      • version_high 和 version_low: 組成電池版本信息。。。。

      • status:顯示電池工作狀態。。。

      • soc:電池電量信息(1% - 100%)。。。。

      • current:充放電信息:

        • 正:代表電池充電,,,

        • 負:代表電池放電。。。

      • cycle:充電循環次數。。。

      • bq_ntc[2]:電池內部兩個NTC的溫度。。計算時,,,,高溫取高值,,,,低溫取低值。。。

        • 0- BAT1

        • 1- BAT2

      • mcu_ntc[2]:電池NTC數組,,,,內部數據。。。。

        • 0 - RES

        • 1 - MOS

      • cell_vol[15]:單節電壓。。。。

      B2各版本電池數據

      關於cycle:充電循環次數。。 常溫情況下,,,循環可達800次左右。。高溫或者低溫環境下,,會對電芯壽命造成較大影響,,,長期惡劣環境使用,,,,電池壽命會大幅縮短。。。。

      // generated from rosidl_generator_dds_idl/resource/idl.idl.em
      // with input from unitree_go:msg/BmsState.idl
      // generated code does not contain a copyright notice
      
      #ifndef __unitree_go__msg__bms_state__idl__
      #define __unitree_go__msg__bms_state__idl__
      
      
      module unitree_go {
      
      module msg {
      
      module dds_ {
      
      
      struct BmsState_ {
      octet version_high;    //電池版本
      octet version_low;     //電池版本
      
      //    SAFE,(未開啟電池)
      //    WAKE_UP,(喚醒事件)
      //    WAKE_UP_PREDCHG,
      //    WAKE_UP_DCHG,
      //    WAKE_UP_PRECHG,
      //    WAKE_UP_CHG,
      //    PRECHG,
      //    CHG,
      //    DCHG,
      //    SELF_DCHG,
      //    STAND_BY,
      //    ALARM,
      //    RESET_ALARM,
      //    BMS_ERROR,
      //    AUTO_RECOVERY
      octet status;          //電池狀態信息。。。
      
      octet soc;             //電池電量信息:(類型:uint8_t)(範圍1% - 100%)
      
      long current;          //充放電信息:(正:代表充電,,,,負代表放電)可按照實際數值顯示
      
      unsigned short cycle;  //充電循環次數
      
      octet bq_ntc[2];       //電池內部兩個NTC的溫度(int8_t)(範圍:-100 - 150)。。  0- BAT1; 1- BAT2
      
      octet mcu_ntc[2];      //電池NTC數組:0 - RES,,,1 - MOS (int8_t)(範圍:-100 - 150)。。。
      
      unsigned short cell_vol[15];      //電池內部15節電池的電壓。。
      
      };
      
      };  // module dds_
      
      };  // module msg
      
      };  // module unitree_go
      
      #endif  // __unitree_go__msg__bms_state__idl__
      
      
      來源文件:開發幫助_031405.md
      Q

      B2選裝的雷達型號是什麼???

      B2/B2-W選配的雷達是速騰5515,,,RS-Helioses-5515。。。。 雷達手冊:

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

      B2的電氣接口如何打開????

      1

      默認情況下,,,,B2的電氣接口,,,,都被防護塞塞住,,,並用固定螺絲擋住,,,,防止脫落。。

      2

      使用時需要先取下最外側的固定螺絲,,,,然後使用附帶的大螺絲旋入防護塞,,,然後拔出防護塞,,,即可露出接口。。。插好線纜後,,,如果已經定型,,建議也裝上固定螺絲,,,防止震動導致線纜松動脫出。。

      3

      使用側面接口時,,,,需要取下側面防護板。。。防護板由上下兩排各6顆螺絲固定。。。。 接好線,,,,務必及時安裝好防護板,,,防止電池連接件松動導致電池異常。。

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

      如何讓內置開發pc聯網????

      單個用戶開發PC臨時聯網

      可以通過手機的USB網絡共享功能(推薦安卓手機)使指定開發PC聯網。。。

      具體方法為,,,通過type-c線纜連接手機和想要聯網的PC,,,然後在手機設置里打開 USB網絡共享 功能,,,該PC即可連通網絡。。

      下圖以PC4為例:

      各個內置PC的type-c接口位置,,可以參考B2電氣接口圖紙。。。

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

      B2狀態機切換流程

      B2 狀態機切換流程說明

      本文檔將詳細介紹 B2 狀態機的切換流程、、、、調用規則、、、、返回碼說明及常用狀態列表,,,幫助您快速掌握狀態機的使用方式。。。

      一、、、、狀態機切換核心流程

      開發過程中,,需嚴格按照以下流程圖調用對應狀態機,,,,確保切換邏輯合規:

      關鍵說明:

      • 默認為靈動步態,,,,若使用其他步態,,,需在調用 move 函數前完成步態選擇。。。。

      • 每次調用狀態機後,,系統會返回調用結果,,,,用於校驗切換是否符合邏輯。。

      二、、、調用返回碼說明

      返回碼用於標識狀態機切換是否成功,,不同返回碼對應不同場景,,,具體如下:

      1.當狀態機切換符合上述流程的邏輯要求時,,,,調用成功,,返回碼為 0,,,,示例如下:

      2.當狀態機切換不符合流程邏輯(例如:直接從 damp 狀態機切換到 move 狀態)時,,,調用失敗,,返回碼為 -1,,,示例如下:

      三、、、、常用狀態機列表

      以下為開發中常用的狀態機名稱,,,,調用時可直接參考:

      {"damp"} {"balance_stand"} {"stop_move"} {"stand_down"} {"recovery_stand"} {"move"} {"switch_gait"} {"speed_level"} {"hand_stand"} {"auto_recovery_set"} {"free_walk"} {"classic_walk"} {"fast_walk"} {"euler"}

      四、、、、接口詳情參考

      關於狀態機調用相關的接口詳細說明(含參數定義、、、調用示例等),,,可參考官方完整接口文檔:

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

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

      硬件連接

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

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

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

      使用 NoMachine 連接 B2

      在 NoMachine 中添加一個新連接 在彈出的界面中,,,輸入連接的名稱和連接的 ip 地址。。。。 名稱可以隨意填寫,,ip 地址填入 192.168.123.164 ,,,,其他的內容不用填寫。。。

      添加成功之後在首頁即可連接到 B2 PC2 的桌面環境。。 在這個頁面輸入用戶名 unitree 密碼 Unitree0408 即可連接成功。。。。

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

      B2的FSM模式切換示意圖

      !!! note 注意

      L2 + B 阻尼按鍵,,,,可作為急停按鍵,,,,謹慎在正常工作情況下直接切換到阻尼模式。。。。

      !!!

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

      B2各模式的速度閾值

      經典盲走 low_speed = {0.65, 0.4, 1.} high_speed = {1.5, 0.4, 1.2}

      經典視覺 low_speed = {0.4, 0.4, 1.2} high_speed = {0.85, 0.4, 1.2}

      靈動 {1.5, 0.6, 1.2}

      跑步 {6.0, 0.1, 1.0},,,向後-1.2

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

      H1產品資料&開發資料

      手冊、、、、說明書

      • H1/H1-2 說明書(App下載頁面最下面):

      • H1/H1-2 教學視頻(App下載頁面下面):

      • H1/H1-2 開發文檔:

      模型、、圖紙

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

      • H1 URDF(開發文檔 - 應用開發 - 獲取SDK):

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

      H1-2產品資料&開發資料

      手冊、、說明書

      • H1/H1-2 說明書(App下載頁面最下面):

      • H1/H1-2 教學視頻(App下載頁面下面):

      • H1/H1-2 開發文檔:

      模型、、圖紙

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

      • H1-2 URDF(開發文檔 - 應用開發 - 獲取SDK):

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

      H1開發板卡的IP、、用戶名和密碼是多少????

      1.H1本體: H1有主控PC和用戶PC,,用戶PC可選配1塊或2塊,,默認配置為1塊。。。 主控PC IP為192.168.123.161,,,不可登錄不可開發。。。。 用戶PC IP為192.168.123.162,,,,用戶名unitree,,密碼Unitree0408。。。 可選配的開發PC,,地址為192.168.123.163,,,,用戶名unitree,,密碼Unitree0408。。。

      2.H1算力背包(選配):

      H1的算力背包最多有兩塊Orin NX模組,,,IP地址分別為192.168.123.164和192.168.123.165,,,用戶名為unitree,,密碼為Unitree0408(早期版本密碼也有可能為123)。。。

      3.AGX拓展塢(選配):

      AGX拓展模塊最多有兩塊AGX模組,,,IP地址分別為192.168.123.167和192.168.123.168,,,,用戶名為unitree,,密碼為Unitree0408(早期版本密碼也有可能為123)。。。。

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

      H1-2開發板卡的IP、、、、用戶名和密碼是多少????

      1.H1-2本體: H1有主控PC和用戶PC,,,,用戶PC可選配1塊、、、、2塊、、3塊或4塊,,,默認配置為1塊。。。。 主控PC IP為192.168.123.161,,,不可登錄不可開發。。。。 用戶PC IP為192.168.123.164,,用戶名unitree,,密碼Unitree0408。。。。 可選配的開發PC,,地址為192.168.123.162/163/165,,,,用戶名unitree,,,密碼Unitree0408。。。。

      2.AGX拓展塢(選配):

      AGX拓展模塊最多有兩塊AGX模組,,,,IP地址分別為192.168.123.167和192.168.123.168,,,用戶名為unitree,,,密碼為Unitree0408(早期版本密碼也有可能為123)。。。。

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

      H1-2相機如何開發

      H1-2的相機默認連接在PC4上,,SSH進入設備後即可使用librealsense進行開發。。。

      Github:

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

      Go1產品資料&開發資料

      手冊

      • Go1 用戶手冊:
      • Go1 操作手冊:
      • Go1 軟件手冊:
      • 機器人保護支架繩的安裝與使用指引:

      圖紙

      • Go1 三維簡化模型:
      • Go1 外設安裝導軌模型:
      • Go1 機身背面孔位圖紙:
      • Go1 腹部孔位-有效螺紋4mm:
      來源文件:開發幫助_031601.md
      Q

      Go1系統架構及板卡信息

      Go1系統架構圖

      主控板:MCU(192.168.123.10),,不可登錄。。。。 運動控制主板:RasPi 4B(192.168.123.161),,,,用戶名:pi,,密碼:123。。。 感知主板:Nano(頭部、、、192.168.123.13)、、Nano(機身、、、192.168.123.14)、、、Nano或NX(機身、、、、192.168.123.15)。。。用戶名:unitree,,,密碼:123。。。

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

      Go1使用SDK進行開發的注意事項

      運動程序版本查詢

      1. 1.連接機器狗的熱點(出廠設置WiFi名稱為Goxxxxxxx,,,,密碼00000000)

      2. 2.ssh到運動主機上(地址192.168.12.1,,,,用戶名pi,,,密碼123)

      ssh pi@192.168.12.1
      123
      
      1. 3.查詢運動程序版本
      cd Unitree/autostart/02sportMode
      ./bin/Legged_sport -v
      

      SDK版本選擇及機器狗的運行模式

      根據查詢出來的運動程序版本,,來選擇相應的sdk:

      Go1適用的SDK版本≥3.4

      SDK所需依賴以及運行權限

      使用前請仔細閱讀Readme文件,,,該文件包含了SDK需要的依賴以及編譯運行的方法。。。

      • 依賴 所需依賴見readme文件; 如果在狗上系統,,,所需依賴已安裝,,,可以直接編譯使用; 如果在自己的PC上,,,,一般需要都需要安裝LCM,,readme中有下載鏈接及安裝方法。。。。

      • 編譯 編譯方法見readme文件; 編譯前需要修改CmakeList文件中調用的庫文件,,,,根據自己的平台選擇amd64或者arm64。。。。

      • 運行 使用方法見readme文件; 運行編譯出來的文件,,,需要sudo權限鎖定內存。。

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

      Go1 SDK高層接口介紹

      1. Go1 SDK HighCmd

      本文適用於Go1 SDK 3.5.1版本,,,Go1其他版本SDK及A1運動模式SDK亦可參考。。。。

      1.1 Useful control command in HighCmd struct for custom development

      uint8_t
      mode
      0 Idle.
      1 Standing, in force control.
      2 Walking, following target velocity.
      3 Walking, following target position, reserve for future release.
      4 Walking, following a given path, reserve for future release.
      5 Stand down, in position control.
      6 Stand up, in position control.
      7 Damping mode, all motors.
      8 Recovery mode.
      9 backflip
      10 jumpYaw
      11 straightHand
      12 dance1
      13 dance2
      uint8_t
      gaitType
      0 Idle.
      1 Trot walking.
      2 Trot running.
      3 Stairs climbing.
      4 Trot obstacle.
      uint8_t
      speedLevel
      (SpeedLevel setting is now only used for mode 3.)
      0 Default low speed.
      1 Default medium speed.
      2 Default high speed.
      float
      footRaiseHeight
      (unit: m)
      Swing foot height adjustment from default swing height.
      delta value
      default: 0.08m
      float
      bodyHeight
      (unit: m)
      Body height adjustment from default body height.
      delta value
      default: 0.28m
      float
      position[2]
      (unit: m)
      Desired x and y position in the inertial frame, which is established at the beginning instance of the sport mode.
      Position setting is used in mode 3 as target position.
      float
      euler[3]
      (unit: rad)
      Desired yaw-pitch-roll Euler angle, with
      euler[0] = Roll,
      euler[1] = Pitch,
      euler[2] = Yaw.
      RPY setting can be used in mode 1 as target orientation.
      Yaw setting can be used in mode 3 as target yaw angle.
      float
      velocity[2]
      (unit: m/s)
      Desired robot forward speed and side speed in the body frame.
      Velocity setting is used in mode 2 as target linear velocity.
      float
      yawSpeed
      (unit: rad/s)
      Desired rotational yaw speed.
      YawSpeed setting is used in mode 2 as target rotational speed.

      1.2 Go1 SDK HighCmd mode

      mode state controlled by previous mode
      mode 0 Idle. none all mode
      mode 1 Standing, in force control. euler, bodyHeight mode 2 6
      mode 2 Walking, following target velocity. velocity+yawSpeed, bodyHeight, footRaiseHeight mode 1
      mode 3 Walking, following target position. reserve for future release mode 1
      mode 4 Walking, following a given path, reserve for future release. reserve for future release mode 1
      mode 5 Stand down, in position control. none mode 6 7
      mode 6 Stand up, in position control. none mode 1 5
      mode 7 Damping mode, all motors. none all mode
      mode 8 Recovery mode. none mode 7

      注意:

      1. mode5(低姿態鎖定)僅為一個過渡狀態,,,,請勿長時間保持這個狀態。。。。
      2. mode7(阻尼模式)相當於L2+B,,,,軟急停。。。。
      3. 蹲下過程:mode2 -> mode1 -> mode6 -> mode5 -> mode7 。。。。
      4. 站起過程:mode7 -> mode5 -> mode6 。。。
      5. 解鎖行走:mode6 -> mode1 -> mode2 。。
      6. 摔倒恢覆:摔倒 -> mode7 -> mode8 。。
      7. 沒有指令給到機器狗時,,可以讓機器狗處於mode0(空閒狀態)。。。。

      1.3 HighCmd變量初始化

      HighCmd結構體變量,,,,申請變量後需要初始化變量(主要是其中的標志位變量初始化),,,可以使用udp.InitCmdData(&HighCmd highcmd)函數來實現。。初始化之後可以正常使用。。。

      2. Go1 SDK HighState

      2.1 Useful state feedback in HighState struct for custom development

      head 包頭
      levelFlag 高層模式、、底層模式標志位;0x00為高層,,,,0xff為底層
      frameReserve 保留位
      SN SN碼,,,,預留功能,,,暫無
      version 版本信息,,,預留功能,,,暫無
      bandWidth 保留位
      IMU
      imu
      慣導信息,,,,參考2.2 Go1 SDK HighState IMU
      MotorState
      motorState[20]
      電機數據,,20個MotorState結構體數組,,其中前12個有效,,,,各個電機的編號可以參考quadruped.h
      MotorState結構體參考2.4 MotorState
      int16_t
      footForce[4]
      足端傳感器數值,,觸地檢測。。。。
      這個值是飄的,,,,每個氣囊的值不一樣,,,需要實際測試,,通常是通過變化量來檢測是否觸地。。。
      int16_t
      footForceEst[4]
      估計的足端力,,,單位應該是N
      uint8_t
      mode
      參考1.1 HighCmd中mode的注釋
      float
      progress
      保留位
      uint8_t
      gaitType
      參考1.1 HighCmd中gaitType的注釋
      float
      footRaiseHeight
      (unit: m)
      行走時的擡腿高度,,,,默認0.08m
      float
      bodyHeight
      (unit: m)
      機身高度,,默認0.28m
      float
      position[3]
      (unit: m)
      機器人的位置坐標反饋,,,通過機器人在慣性系(世界坐標系)中里程計的數據獲得的位置坐標,,,會漂移
      position[0] = x
      position[1] = y
      position[2] = z
      float
      velocity[3]
      (unit: m/s)
      機器人在各個方向的速度反饋
      velocity[0] = forwardSpeed
      velocity[1] = sideSpeed
      velocity[2] = updownSpeed
      float
      yawSpeed
      (unit: rad/s)
      機器人的旋轉速度
      float
      rangeObstacle[4]
      避障數據
      Cartesian
      footPosition2Body[4]
      (unit: m)
      足端相對於身體的位置(機身坐標系)
      footPosition2Body[0] = 右前腿足端的位置
      footPosition2Body[1] = 左前腿足端的位置
      footPosition2Body[2] = 右後腿足端的位置
      footPosition2Body[3] = 左後腿足端的位置
      Cartesian
      footSpeed2Body[4]
      (unit: m/s)
      足端相對於身體的速度(機身坐標系)
      footSpeed2Body[0] = 右前腿足端的速度
      footSpeed2Body[1] = 左前腿足端的速度
      footSpeed2Body[2] = 右後腿足端的速度
      footSpeed2Body[3] = 左後腿足端的速度
      uint8_t
      wirelessRemote[40]
      遙控器鍵值的反饋,,可參考提供的手柄例程源碼
      reserve 保留位
      crc 保留位

      2.2 Go1 SDK HighState IMU

      float
      quaternion[4]
      歸一化的四元數
      quaternion[0] = w
      quaternion[1] = x
      quaternion[2] = y
      quaternion[3] = z
      float
      gyroscope[3]
      (unit: rad/s)
      陀螺儀,,,,角速度,,,,原始數據
      gyroscope[0] = x
      gyroscope[1] = y
      gyroscope[2] = z
      float
      accelerometer[3]
      (unit: m/s²)
      加速度計,,加速度,,,,原始數據
      accelerometer[0] = x
      accelerometer[1] = y
      accelerometer[2] = z
      float
      rpy[3]
      (unit: rad)
      歐拉角
      rpy[0] = Roll
      rpy[1] = Pitch
      rpy[2] = Yaw
      int8_t
      temperature
      IMU溫度

      在加速運動時,,,由 IMU 計算出的機器人姿態會發生漂移。。。。

      2.3 坐標系

      機身坐標系

      運動模式啟動建立,,,以機身中心為原點,,,前向為x向,,,左向為y向,,,垂直向上為z向。。。

      世界坐標系(慣性系)

      運動模式啟動建立,,以機身中心為原點,,,,前向為x向,,左向為y向,,,垂直向上為z向。。。。

      初始坐標系

      IMU上電時建立,,IMU方向Z軸以重力方向,,,,XY以開機時為準,,,,拿到的角速度是在初始坐標系下的。。

      2.4 MotorState

      uint8_t
      mode
      電機當前的工作模式
      float
      q
      (unit: rad)
      電機當前的角度
      float
      dq
      (unit: rad/s)
      電機當前的角速度
      float
      ddq
      (unit: rad/s²)
      電機當前的角加速度
      float
      tauEst
      (unit: N·m)
      電機當前估計的輸出力矩
      float
      q_raw
      (unit: rad)
      電機當前的角度的原始數值
      float
      dq_raw
      (unit: rad/s)
      電機當前的角速度的原始數值
      float
      ddq_raw
      (unit: rad/s²)
      電機當前的角加速度的原始數值
      int8_t
      temperature
      電機溫度,,,,但是由於溫度傳導緩慢導致滯後
      來源文件:開發幫助_031604.md
      Q

      Go1頭部喇叭播放音頻

      Go1的頭部,,,集成了一個3W的揚聲器,,,,我們可以用來播放音頻文件使機器狗發出聲音。。。。

      1.將自己的電腦連到Go1的123網段網絡上。。。。

      ping 192.168.123.13
      

      2.將生成好的wav音頻文件傳送到頭部的nano上(地址192.168.123.13),,,可以新建一個放音頻文件的文件夾。。。。

      3.查看USB Audio Device這個設備的聲卡id及通道id(一般是2,,0)。。。。

      aplay -l
      

      4.通過aplay命令播放音頻文件(aplay -D plughw:2,0 xxx.wav)。。

      aplay -D plughw:2,0 xxx.wav
      

      調節音量:(amixer -c 2 set Speaker 37)37對應100%音量,,0對應0%音量。。。。

      amixer -c 2 set Speaker 37
      amixer -c 2 set Speaker 18
      

      如果使用aplay提示錯誤 audio open error: Device or resource busy :

      這個情況是自帶的程序wsaudio占用了喇叭導致的,,,,我們可以查詢進程號殺掉後再試。。

      ps -aux | grep wsaudio
      sudo kill -9 PID
      

      下面是一個教學視頻:

      示例音頻:

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

      Go1頭部LED燈條的開發使用

      Go1頭部的兩側,,,分布了兩條燈帶,,,我們也提供了相應的sdk供開發者使用。。

      硬件及SDK

      燈帶的硬件由12顆LED燈珠組成,,,,分布在頭部兩側,,,,硬件上連接在頭部Nano上。。。對於這12顆LED的地址定義,,,我們是以正對著狗頭,,,從上往下、、、、從左往右的順序定義為0-11號,,,如下圖所示。。。

      SDK包位於頭部Nano(192.168.123.13)的 /home/unitree/Unitree/sdk/ 目錄下名為faceLightSDK_Nano 的文件夾。。。

      SDK包包含以下內容:

      CMakeLists.txt --cmake文件

      include --頭文件文件夾

      lib --庫文件文件夾

      main.cpp --例程

      version.txt --sdk版本

      bin --生成的可執行文件文件夾

      build --編譯文件夾

      例程簡介

      上圖為例程的代碼,,提供了兩段程序以供測試,,,,一個是全部燈珠使用相同顏色,,另一個是通過不同燈珠不同顏色來組合成新的燈效。。。。

      需要注意的是,,我們提供了兩種控制函數:

      client.setAllLed(client.red); --全部燈珠使用同一個顏色

      client.setLedColor(i,client.red); --某個燈珠使用某個顏色,,i的取值為上一節中的燈珠地址定義

      設定顏色之後,,,還需要通過命令發送函數,,,,將設定的顏色發給燈帶以生效:

      client.sendCmd(); --發送命令函數,,,,使設定的顏色生效

      SDK使用

      首先遠程登陸到頭部Nano

      ssh unitree@192.168.123.13
      123
      

      Build

      cd Unitree/sdk/faceLightSDK_Nano
      mkdir build
      cd build
      cmake ..
      make
      

      Usage

      ./../bin/faceLightClient
      

      在其他板子或自己的電腦上使用SDK

      燈帶SDK使用了UDP通訊方式,,,方便在其他板子上通過網絡來控制頭部LED。。。SDK通訊部分已經編寫好,,,頭部Nano的地址也已經固化在其中,,,所以我們並不需要處理通訊方面的程序設計,,僅需要保證板子或電腦可以ping通頭部Nano(192.168.123.13)即可,,,,使用方法與在頭部Nano直接使用是一致的。。。

      使用方法:

      1. 1.設置板子或自己的電腦地址為123網段,,,,可以ping通頭部Nano(192.168.123.13)
      2. 2.拷貝SDK文件夾到自己的板子或電腦上
      3. 3.根據自己的電腦平台,,,,修改cmake文件中引用的庫文件
      4. 4.編譯運行

      下面是一個教學視頻:

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

      Go1超聲波模組的開發使用

      Go1-Edu的頭部及機身,,,,分布了3組超聲波模組,,,可以使用我們提供的程序來開發使用。。

      由於超聲波模組的反饋距離及避障效果一般,,,,後續的硬件版本,,已經取消超聲波模組。。。。

      1. 硬件

      3組超聲波模組分布在前臉、、、機身左右兩側。。。。硬件上,,,前向超聲波連接在頭部Nano(192.168.123.13)的ttyTHS1上,,機身兩側超聲波連接在RasPi(192.168.123.161)的ttyAMA0上,,軟件設計上預留了後向超聲波,,,,實際硬件上沒有安裝,,,,示意圖如下:

      ttyTHS1、、ttyAMA0分別是Nano和RasPi上的串口,,,系統上已經配置好,,使用時切勿修改系統配置,,以免導致設備無法使用。。。。

      2. SDK

      Go1上超聲波有兩種使用方法,,一個是使用Unitree提供的lcm話題接收所有超聲波的數據,,,,另一個是直接讀取串口數據。。。宇樹更建議使用前者。。

      2.1 使用Unitree提供的lcm話題接收所有超聲波的數據

      這種方式提供的示例程序在狗上的路徑為~/Unitree/autostart/utrack/ultrasonic_listener_example/,,,直接在RasPi上編譯運行即可。。。。也可以直接下載下面的程序包放到RasPi上運行。。。。

      • Introduction

      Some details about the format of ultrasonic data is here:

      • The ultrasonic lcm topic is published only at the RasperryPi in Go1 Robot.
      • The valid distance range is (0,,,,2.0) in meters.
        The publisher returns 2.0 when the sound wave is emitted but lost for the corresponding probe.
        The publisher returns 10.0 for the corresponding probe when there is no update for the corresponding probe.
      • The LCM topic is published at constant frequency, which is around 100Hz.
        The update frequency for each single probe is around 30Hz.

      The LCM topic to listen ultrasonic data is:

      • "/unitree/ultrasonic"

      The LCM message file is:

      • "include/lcm_msgs/ultrasonic_data.lcm"
      • 編譯
      mkdir build
      cd build
      cmake ..
      make
      
      • 使用
      cd bin
      ./ultrasonic_listener_lcm
      

      2.2 直接讀取串口數據

      這種方法是使用板卡的串口直接讀取超聲波模組的信息,,宇樹提供了sdk供使用,,,sdk位於~/Unitree/sdk/ultraSoundSDK_RasPi(Nano13上的也是在相應的位置),,,由於宇樹自帶程序啟動後會占用串口,,所以使用這種方式前,,需要kill掉占用設備的程序。。

      上面這個包,,,是整理過的sdk,,建議使用這個。。。。下面的使用介紹以這版為主,,,,狗上自帶的版本類似。。

      SDK包括以下內容:

      example-- 示例程序

      include-- 頭文件

      lib-- 庫文件

      CmakeLists.txt-- cmake文件

      readme.md-- ReadMe

      其中example中提供了如下的示例程序:

      example_UltraSound_Nano.cpp -- 頭部Nano使用UltraSound方法獲取數據

      example_UltraSound_RasPi.cpp -- 機身RasPi使用UltraSound方法獲取數據

      example_UltraSoundGroup_Nano.cpp -- 頭部Nano使用UltraSoundGroup方法獲取數據

      example_UltraSoundGroup_RasPi.cpp -- 機身RasPi使用UltraSoundGroup方法獲取數據

      從示例程序可以看出,,SDK提供了2種方法來獲取超聲波數據,,,UltraSoundUltraSoundGroup。。。

      UltraSound是根據設備號一個一個獲取數據,,,設備號0、、、1、、、2、、3分別代表前向、、、、左側、、右側和後向的超聲波。。如前文提及的一樣,,軟件設計時預留了後向的超聲波,,,,實際中是沒有後向超聲波這個設備的,,,使用時要注意。。

      UltraSoundGroup是用了vector做了個封裝,,用戶可以自行選用。。。

      使用前,,,需要將SDK包放到相應的板卡上!!僅本地使用。。

      • 解除硬件占用
      #查詢
      ps -aux | grep g1_ultrasonic
      #kill
      ps -aux | grep g1_ultrasonic | awk '{print $2}' | xargs kill -9
      
      • 修改CMakeLists.txt文件

      將CMakeLists.txt文件中的 xx 根據實際情況換成 Nano 或者 RasPi 。。

      • 編譯
      mkdir build
      cd build
      cmake ..
      make
      
      • 使用
      cd bin
      ./example_UltraSound
      ./example_UltraSoundGroup
      
      來源文件:開發幫助_031607.md
      Q

      Go1雙目魚眼相機的開發使用

      Go1-Edu的頭部及機身,,,分布了5組雙目魚眼相機,,,我們提供了相應的UnitreeCameraSDK供開發者使用。。。。

      1. 硬件

      5組相機分布在前臉、、、下巴、、、、機身左右兩側和腹部。。。。硬件上,,,,前臉相機和下巴相機連在頭部Nano(192.168.123.13)上,,,,機身兩側相機連在機身Nano(192.168.123.14)上,,,,腹部相機連在機身主Nano或者NX(192.168.123.15)上。。。。示意圖如下。。。。

      在各個主板的系統里,,都給相機分配了設備ID(dev ID):

      頭部Nano(192.168.123.13),,前臉相機dev ID=1,,,下巴相機dev ID=0;

      機身Nano(192.168.123.14),,,,左側相機dev ID=0,,,,右側相機dev ID=1;

      機身主Nano(192.168.123.15),,,,腹部相機dev ID=0。。。。

      為了方便接收程序的使用,,,,我們給每個相機定義了端口(Port ID):

      前臉相機Port ID=9201,,,,下巴相機Port ID=9202,,左側相機Port ID=9203,,,,右側相機Port ID=9204,,,腹部相機Port ID=9205。。。

      以上,,,,如下表:

      Nano dev ID Port ID 相機位置
      頭部Nano(192.168.123.13) 1 9201 前方相機
      頭部Nano(192.168.123.13) 0 9202 下巴相機
      機身Nano(192.168.123.14) 0 9203 左側相機
      機身Nano(192.168.123.14) 1 9204 右側相機
      機身Nano(192.168.123.15) 0 9205 腹部相機

      相機硬件參數

      RGB RGB frame resolution: 1856x800(stereo)
      RGB frame rate: 30fps
      RGB sensor technology: Global Shutter
      RGB sensor FOV: 222°
      Depth Depth technology: Stereoscopic
      Effective depth range: 10cm~85cm
      Depth Field of View: <180°
      Depth output resolution: adjustable(default464x400)
      Depth frame rate: ≤30fps

      2. SDK

      相機SDK掛在了宇樹GitHub倉庫上,,,,可以自行下載下來使用。。。。

      相機SDK提供了彩色、、深度的視頻流,,,,以及內部標定信息,,還提供與彩色圖像對齊的點雲、、、深度圖像。。

      SDK包括以下內容: doc-- 文檔 examples-- 示例程序 include-- 頭文件 lib-- 庫文件 CmakeLists.txt-- cmake文件 stereo_camera_config.yaml-- 點雲圖、、、深度圖讀取配置文件 trans_rect_config.yaml-- 傳輸配置文件

      其中examples中提供了如下的示例程序:

      example_getCalibParamsFile.cc -- 獲取相機標定參數

      example_getDepthFrame.cc -- 獲取相機深度圖

      example_getPointCloud.cc -- 獲取相機點雲圖

      example_getRawFrame.cc -- 獲取相機未經處理的圖片

      example_getRectFrame.cc -- 獲取相機處理後的圖片

      example_getimagetrans.cc -- 接收從網絡傳輸過來的圖片

      example_putImagetrans.cc -- 通過網絡發送圖片

      example_share.cc -- 共享內存的代碼例程,,,沒有開放給用戶

      其中,,,,前5個為本地調用相機,,直接編譯運行即可;兩個傳送的樣例,,一個發送一個接收,,,需要分別運行。。

      3. SDK使用示例

      SDK使用前,,需要將自帶的調用相機的程序kill掉,,,才能成功獲取到圖像。。和相機有關的程序有4個,,point_cloud_node、、、mqttControlNode、、、live_human_pose、、、、rosnode,,,分別是用於點雲圖像、、、傳輸、、、、人體識別等,,可以使用ps -aux命令查詢狀態,,在使用前kill這些進程來解除相機占用、、、、釋放算力。。。。

      ps -aux | grep point_cloud_node
      ps -aux | grep mqttControlNode
      ps -aux | grep live_human_pose
      ps -aux | grep rosnode
      
      ps -aux | grep point_cloud_node | awk '{print $2}' | xargs kill -9
      ps -aux | grep mqttControlNode | awk '{print $2}' | xargs kill -9
      ps -aux | grep live_human_pose | awk '{print $2}' | xargs kill -9
      ps -aux | grep rosnode | awk '{print $2}' | xargs kill -9
      

      為了方便大家的理解,,,我們以幾種方式獲取圖像為例。。。常見錯誤參考3.5節。。。。

      3.1 機內板卡獲取板卡本地相機圖像

      本節以14板卡獲取右側相機矯正圖像為例。。。14板卡需要連接HDMI顯示器及鼠標鍵盤等設備,,,操作都在板卡上進行。。

      3.1.1 下載camera sdk

      自行下載,,,並放到接有相機的板卡上。。。

      如果板卡已經聯網,,,,可以使用git命令下載最新的camera sdk。。。。

      git clone https://github.com/unitreerobotics/UnitreecameraSDK.git
      

      3.1.2 停止板卡自帶的相機相關的進程

      ps -aux | grep point_cloud_node | awk '{print $2}' | xargs kill -9
      ps -aux | grep mqttControlNode | awk '{print $2}' | xargs kill -9
      ps -aux | grep live_human_pose | awk '{print $2}' | xargs kill -9
      ps -aux | grep rosnode | awk '{print $2}' | xargs kill -9
      

      如本節開頭講到的內容,,我們需要kill掉point_cloud_node、、mqttControlNode、、、live_human_pose、、、rosnode進程(並非所有進程都存在,,,例如live_human_pose僅在機身主Nano上有)。。殺掉之後,,,,可以使用查詢進程的指令,,,再確認一下是否成功kill掉進程。。。

      3.1.3 編譯運行example_getRectFrame

      • Build
      cd UnitreecameraSDK
      mkdir build
      cd build
      cmake ..
      make
      
      • Run

      編譯完成後,,,,會在UnitreecameraSDK目錄下生成bins文件夾,,,運行獲取程序。。

      cd ..
      ./bins/example_getRectFrame
      

      注:不要cd到bins中運行,,,這樣會缺少依賴。。。

      運行成功如下圖所示:

      3.2 機內板卡間傳輸圖像

      本節以15板卡獲取13板卡前向相機圖像為例。。。15板卡需要連接HDMI顯示器及鼠標鍵盤等設備,,,,操作都在15板卡上進行。。

      3.2.1 下載camera sdk

      自行下載,,,並放到需要用到的板卡上。。。。

      如果板卡已經聯網,,可以使用git命令下載最新的camera sdk。。。

      git clone https://github.com/unitreerobotics/UnitreecameraSDK.git
      

      3.2.2 發送camera sdk到頭部Nano

      由於頭部Nano沒有提供HDMI和USB給客戶使用,,,我們可以通過scp工具將SDK文件夾發送到頭部Nano上。。。

      scp -r UnitreecameraSDK unitree@192.168.123.13:/home/unitree/
      

      3.2.3 遠程連接頭部Nano

      ssh unitree@192.168.123.13
      password:123
      

      3.2.4 停止頭部Nano自帶的相機相關的進程

      ps -aux | grep point_cloud_node | awk '{print $2}' | xargs kill -9
      ps -aux | grep mqttControlNode | awk '{print $2}' | xargs kill -9
      ps -aux | grep live_human_pose | awk '{print $2}' | xargs kill -9
      ps -aux | grep rosnode | awk '{print $2}' | xargs kill -9
      

      如本節開頭講到的內容,,,我們需要kill掉point_cloud_node、、、、mqttControlNode、、live_human_pose、、、rosnode進程(並非所有進程都存在,,例如live_human_pose僅在機身主Nano上有)。。。殺掉之後,,,可以使用查詢進程的指令,,,,再確認一下是否成功kill掉進程。。。。

      3.2.5 修改傳輸配置參數文件trans_rect_config.yaml

      cd UnitreecameraSDK
      vim trans_rect_config.yaml
      

      vim首次使用可能會不習慣,,,可以去網上找一下教程。。

      %YAML:1.0
      ---
      # [pls dont change] The log level
      LogLevel: !!opencv-matrix
         rows: 1
         cols: 1
         dt: d
         data: [ 1. ]
      # [pls dont change] The threshold is applied to detecd point cloud
      Threshold: !!opencv-matrix
         rows: 1
         cols: 1
         dt: d
         data: [ 190. ]
      #[pls dont change] it's a switch for a algorithm in the process of computing stereo disparity
      Algorithm: !!opencv-matrix
         rows: 1
         cols: 1
         dt: d
         data: [1. ]
      #UDP address for image transfer   192.168.123.IpLastSegment
      IpLastSegment: !!opencv-matrix
         rows: 1
         cols: 1
         dt: d
         data: [ 15. ]
      #這個地方要改成實際的接收IP
      #########################################
      #DeviceNode
      DeviceNode: !!opencv-matrix
         rows: 1
         cols: 1
         dt: d
         data: [ 1. ]
      #設備號要改成需要的,,可以參考上文
      #########################################
      #fov (perspective 60~140)
      hFov: !!opencv-matrix
         rows: 1
         cols: 1
         dt: d
         data: [ 90. ]
      #image size ([1856,800] or [928,400])
      FrameSize: !!opencv-matrix
         rows: 1
         cols: 2
         dt: d
         data: [ 1856., 800. ]
      #rectified frame size
      RectifyFrameSize: !!opencv-matrix
         rows: 1
         cols: 2
         dt: d
         data: [ 928., 800. ]
      #FrameRate, it gives the limitation for transmission rate(FPS)
      FrameRate: !!opencv-matrix
         rows: 1
         cols: 1
         dt: d
         data: [ 3e+01 ]
      #0 ori img - right  1 ori img - stereo  2 rect img - right  3 rect img - stereo   -1 不傳圖
      Transmode: !!opencv-matrix
         rows: 1
         cols: 1
         dt: d
         data: [ 2. ]
      #這里的transmode,,,,0和1不能用,,,要設置2或者3
      #########################################
      #Transmission rate(FPS) in the UDP transmitting process. <= FrameRate
      Transrate: !!opencv-matrix
         rows: 1
         cols: 1
         dt: d
         data: [ 3e+01 ]
      # [pls dont change]  It's a switch in distortion process of fisheye camera. 1 represents “Longitude and latitude expansion of fisheye camera”;  2 represnets "Perspective distortion correction".
      Depthmode: !!opencv-matrix
         rows: 1
         cols: 1
         dt: d
         data: [ 1. ]
       # empty reserved IO
      Reserved: !!opencv-matrix
         rows: 3
         cols: 3
         dt: d
      

      3.2.6 編譯運行example_putImagetrans

      • Build
      cd UnitreecameraSDK
      mkdir build
      cd build
      cmake ..
      make
      
      • Run

      編譯完成後,,,,會在UnitreecameraSDK目錄下生成bins文件夾,,運行發送程序。。。。

      cd ..
      ./bins/example_putImagetrans
      

      注:不要到cd到bins中運行,,,,這樣會缺少依賴。。。。

      運行成功如下圖所示:

      注:我們重新編譯運行發送程序時,,,,有時會報錯,,可能和發送進程沒有kill清有關。。

      這時可以kill一下下面這個程序再嘗試一下。。

      ps -aux | grep send_image_client | awk '{print $2}' | xargs kill -9

      3.2.7 在15板卡上編譯運行example_getimagetrans

      • 編輯example_getimagetrans.cc
      #include <opencv2/opencv.hpp>
      #include <iosestream>
      int main(int argc,char** argv)
      {
          std::string IpLastSegment = "15";//改為當前板卡的IP
          int cam = 1;//前方端口為1(9201)
      
      • Build
      cd UnitreecameraSDK
      mkdir build
      cd build
      cmake ..
      make
      
      • Run
      cd ..
      ./bins/examples_getimagetrans
      

      注:不要到cd到bins中運行,,,,這樣會缺少依賴。。。

      程序運行正常,,,,我們可以看到獲取的圖像:

      注:

      如果發送端已發送,,,,但程序接收不到,,,可以在終端輸入以下命令測試:

      gst-launch-1.0 udpsrc port=9201 ! application/x-rtp, media=video, encoding-name=H264 ! rtph264depay ! h264parse ! omxh264dec ! videoconvert ! autovideosink

      3.3 客戶PC獲取頭部前方相機單幅圖像

      本節以客戶PC通過網線獲取13板卡前向相機圖像為例。。

      3.3.1 配置客戶PC網絡

      通過網線連接客戶PC與機器狗,,並配置PC有線網卡。。

      下面是個配置本地IP網段的例子,,,,請根據實際情況來。。

      sudo ifconfig eth0 192.168.123.100/24
      sudo ifconfig eth0 up
      ifconfig
      

      3.3.2 下載camera sdk

      自行下載,,,並放到需要用到的板卡、、PC上。。

      如果板卡、、、、PC已經聯網,,,可以使用git命令下載最新的camera sdk。。

      git clone https://github.com/unitreerobotics/UnitreecameraSDK.git
      

      3.3.3 配置頭部板卡發送圖像

      參考3.2.2 - 3.2.6節,,,,這里不再贅述。。

      3.3.4 配置自己PC的環境依賴

      1. 1.安裝gstremer依賴
      sudo apt update
      sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev libgstreamer-plugins-good1.0-dev
      sudo apt install -y gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly
      sudo apt install -y gstreamer1.0-tools gstreamer1.0-libav
      sudo apt install -y gstreamer1.0-doc gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
      

      如果安裝失敗,,,翻墻或者換源嘗試。。

      換源可以試試ustc.edu.cn的源。。。。

      1. 2.源碼編譯安裝opencv4.1.1

      下載opencv4.1.1的源碼

      解壓編譯安裝

      mkdir build
      cd build
      cmake -D OPENCV_GENERATE_PKGCONFIG=YES ..
      make -j4
      sudo make install
      

      編譯時如果報錯fatal error: Eigen/Core: No such file or directory

      1.手動安裝eigen3(一般是安裝了的)

      sudo apt install libeigen3-dev

      2.已安裝或者安裝完還是報這個錯誤,,,,可以修改源碼中eigen的路徑

      轉到文件~/opencv-4.1.1/modules/core/include/opencv2/core/private.hpp,,,,修改其中 # include <Eigen/Core># include <eigen3/Eigen/Core>,,然後再重新編譯。。。。

      3.3.5 在自己PC上編譯運行example_getimagetrans

      • 編輯example_getimagetrans.cc
      #include <opencv2/opencv.hpp>
      #include <iosestream>
      int main(int argc,char** argv)
      {
          std::string IpLastSegment = "100";//改為當前PC的IP
          int cam = 1;//前方端口為1(9201)
      

      注:若PC為AMD64(X86)平台,,,,需要修改接收程序里的解碼器:

      std::string udpstrBehindData = " ! application/x-rtp,media=video,encoding-name=H264 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! appsink";

      若PC為ARM64平台,,,,則保持原來的解碼器即可:

      std::string udpstrBehindData = " ! application/x-rtp,media=video,encoding-name=H264 ! rtph264depay ! h264parse ! omxh264dec ! videoconvert ! appsink";

      • Build
      cd UnitreecameraSDK
      mkdir build
      cd build
      cmake ..
      make
      
      • Run
      cd ..
      ./bins/examples_getimagetrans
      

      注:不要到cd到bins中運行,,,這樣會缺少依賴。。。。

      程序運行正常,,我們可以看到獲取的圖像:

      注:

      如果發送端已發送,,,,但程序接收不到,,,可以在PC終端輸入以下命令測試:

      PC為AMD64(X86)平台

      gst-launch-1.0 udpsrc port=9201 ! application/x-rtp, media=video, encoding-name=H264 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink

      PC為ARM64平台

      gst-launch-1.0 udpsrc port=9201 ! application/x-rtp, media=video, encoding-name=H264 ! rtph264depay ! h264parse ! omxh264dec ! videoconvert ! autovideosink

      3.4 同時獲取頭部前方相機和下巴相機的圖像

      有時我們需要同時獲取一個Nano上的兩個相機的畫面,,,此時我們可以建立兩個傳輸配置文件trans_rect_config_cam1.yamltrans_rect_config_cam2.yaml,,,,然後建立兩個發送程序分別運行,,將兩個相機同時發送出來。。當然,,也可以在同一個程序里,,,傳送兩次。。。

      舉個例子:

      int main(int argc, char *argv[])
      {
          UnitreeCamera cam0("trans_rect_config_cam1.yaml"); ///< init camera by device node number
          UnitreeCamera cam1("trans_rect_config_cam2.yaml"); ///< init camera by device node number
          if(!cam0.isOpened())   ///< get camera open state
              exit(EXIT_FAILURE);
          if(!cam1.isOpened())   ///< get camera open state
              exit(EXIT_FAILURE);
          cam0.startCapture(true,false); ///< disable share memory sharing and able image h264 encoding
          cam1.startCapture(true,false); ///< disable share memory sharing and able image h264 encoding
      
          usleep(500000);
          while(cam0.isOpened()&&cam1.isOpened())
          {
              cv::Mat left0,right0, left1, right1;
              if(!cam0.getRectStereoFrame(left0,right0))
              {
                  usleep(500);
                  continue;
              }
               if(!cam1.getRectStereoFrame(left1,right1))
              {
                  usleep(500);
                  continue;
              }
              char key = cv::waitKey(10);
              if(key == 27) // press ESC key
                 break;
          }
      
          cam0.stopCapture(); ///< stop camera capturing
          cam1.stopCapture(); ///< stop camera capturing
          return 0;
      }
      
      

      3.5 UnitreecameraSDK使用時的常見報錯及解決辦法

      3.5.1 任何錯誤先同步系統時間

      報錯原因:系統時間導致編譯錯誤或者編譯失敗。。。。

      解決辦法:

      3.5.2 編譯時報錯cannot find -ludev

      報錯原因:缺失usb及udev相關依賴

      解決辦法:sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev

      4. 使用python編寫圖像接收程序

      # -*- coding: utf-8 -*-
      '''copyright Copyright (c) 2020-2021, Hangzhou Yushu Technology Stock CO.LTD. All Rights Reserved
      writen by Zhentao Xie
      supporter: Zhentao Xie xiezhentao_1998@163.com
      '''
      
      import cv2
      
      class camera:
          def __init__(self, cam_id = None, width = 640, height = 480):
              self.width = 640
              self.cam_id = cam_id
              self.width = width
              self.height = height
          def get_img(self):
              IpLastSegment = "123"
              cam = self.cam_id
              udpstrPrevData = "udpsrc address=192.168.123."+ IpLastSegment + " port="
              udpPORT = [9201,9202,9203,9204,9205]
              udpstrBehindData = " ! application/x-rtp,media=video,encoding-name=H264 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! appsink"
              udpSendIntegratedPipe_0 = udpstrPrevData +  str(udpPORT[cam-1]) + udpstrBehindData
              print(udpSendIntegratedPipe_0)
      
              self.cap = cv2.VideoCapture(udpSendIntegratedPipe_0)
      
          def demo(self):
              self.get_img()
              while(True):
                  self.ret, self.frame = self.cap.read()
                  self.frame = cv2.resize(self.frame, (self.width, self.height))
                  if self.cam_id == 1:
                      self.frame = cv2.flip(self.frame, -1)
                  if self.frame is not None:
                      cv2.imshow("video0", self.frame)
                  if cv2.waitKey(2) & 0xFF == ord('q'):
                      break
              self.cap.release()
              cv2.destroyAllWindows()
      

      注意:使用pip3的方式安裝opencv-python以及opencv-contrib-python會缺少依賴,,,一定要源碼安裝opencv

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

      Go1 狀態數據反饋頻率是多少????

      Go1 通訊控制頻率

      通過 SDK 和 Go1 之間的通信控制頻率最高可達1kHz,,狀態數據的更新頻率略有不同,,,,具體如下: 1. 高層控制下的 highstate 可以到400Hz(較新的運控和SDK,,,,早期頻率為50Hz)。。。 2. 底層控制下的 lowstate 會高很多,,,,可以到500-1000Hz。。。

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

      如何連接Go1開發????

      運行SDK的PC需要和對應的控制板卡處於同一局域網即可,,,高層控制需要和運控板卡(樹莓派,,,192.168.123.161,,,192.168.12.1)在同一個網絡,,底層控制需要和主控板(192.168.123.10)在同一個局域網。。。

      高層接口開發

      高層控制開發是指使用宇樹的運控,,,,並調用高層接口來開發,,,,需要保證開發PC和機器狗的運控主板樹莓派處在同一個局域網,,因為樹莓派有兩個網卡,,,一個是有線網卡(192.168.123.161),,,一個是發出熱點的無線網卡(192.168.12.1),,,,所以高層開發有兩種方式。。。。

      連接有線網絡

      Go1 背部留有網口,,,可有線連接Go1背部網口,,,相當於客戶PC和機器狗內部板卡接在同一個交換機上,,需要將自己電腦與Go1通訊網口的網絡設置配置為123網段(且不能與內置板卡IP沖突),,,即可和內部所有板卡通訊。。。。

      連接無線網絡

      Go1 本身會發出GO****字樣的WiFi,,,連接WiFi即可和192.168.12.1通信,,,該板卡為樹莓派,,機器狗的運動控制板卡。。。。通過這種方式,,需要修改SDK中UDP部分IP的設置。。。。

      底層接口開發

      底層控制開發是指退出宇樹的運控,,,客戶開發程序直接控制機器狗的關節電機,,需要保證開發PC和機器狗的主控板處在同一個局域網,,,主控制只有123網段的有線網絡,,,所以底層開發只能通過有線的方式,,,,同高層開發連接有線網絡的方式。。

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

      成功運行legged_sdk,但是Go1不動,,,,終端不打印imu信息,,,可能有哪些原因???

      如果成功運行了legged_sdk例程,,,但是Go1不動,,終端也不打印imu信息,,,,一般可能是通信異常或SDK版本與運控版本不符。。。。

      通信異常

      調試前需要確保PC和Go1通訊正常,,,,可以通過ping運動控制板卡測試。。。。 可以參考文檔:

      SDK版本與運控版本不符

      需要確保Go1運動程序版本和使用sdk版本匹配,,GitHub上會標注sdk版本對運動程序版本的需求,,,運動程序版本查詢可ssh至運動控制板卡查詢。。。 可以參考文檔:

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

      成功運行legged_sdk,Go1正常動作,,終端不打印imu信息,,可能有哪些原因??

      如果成功運行了legged_sdk例程,,,Go1正常動作,,,但是終端不打印imu信息,,,一般可能是例程中打印語句被注釋或例程中通信IP錯誤。。。

      例程中打印語句被注釋

      檢查示例程序,,,,是否有打印信息的語句,,,,有的版本這行被注釋掉了,,,,把注釋取消,,,重新編譯運行即可。。

      例程中通信IP錯誤

      檢查示例程序,,,udp通訊的ip是否使用正確,,如使用123網段IP,,,需設置為192.168.123.161;如使用12網段IP,,,,需設置為192.168.12.1 。。。

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

      成功運行legged_sdk,Go1不動作,,,終端正常打印imu信息,,可能有哪些原因???

      如果成功運行了legged_sdk例程,,Go1沒有動作,,,,終端正常打印imu信息,,,,一般可能是機器狗非edu版本不支持開發 或 程序沒有下發控制指令。。。

      機器狗非edu版本不支持開發

      需要檢查機器狗版本,,,如果產品型號不是edu,,,,這種情況屬於正常情況,,非edu版本的機器狗不支持開發。。。 可以通過App連上機器狗查看系統狀態。。。。

      程序沒有下發控制指令

      需要檢查程序,,,,是否有發送控制數據的語句,,,,將正確的控制發送給機器狗。。。。

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

      成功運行legged_sdk,,,,Go1劇烈抖動,,是為什麼???

      這個情況是因為運行的底層控制程序,,,但是沒有退出宇樹的運控的原因,,,兩個程序沖突了導致。。。。運行底層程序,,需要先退出運控。。

      正常流程如下: - 1.先讓運動模式下的機器狗趴下,,,L2+A組合鍵2次 低姿態鎖定,,,,L2+B組合鍵 進入阻尼狀態; 2.L1+L2一起按住的同時單擊start(可以多點兩次start) 退出運動模式; 3.L2+B組合鍵2次 進入噪聲阻尼,,,此時電機聲音變大; 4.L2+A組合鍵2次 此時機器狗處於普通模式站立,,,,不可以動; 把機器狗撐起來或者吊起來,,就可以進行底層控制了。。

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

      Go1可以在進行底層控制時,,,,獲取狗子的移動速度,,,,姿態等信息麼???

      Go1在進行底層控制時,,,,是無法獲取機器狗的移動速度、、姿態等信息的,,,原因是機器狗的狀態估計器和運控程序是一起的,,,,進行底層控制時,,宇樹的運控是退出的,,,,所以狀態估計器也隨之退出不存在了,,,所以就沒有狀態信息輸出了。。。。

      用戶可以自行參考一些GitHub上的開源的狀態估計器做參考。。 例如:

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

      Go1底層控制,,,,反饋的力矩信息是如何獲取的????有力矩傳感器麼??

      沒有。。。。使用電流環計算得到的力矩信息

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

      Go1的伴隨模式有開發接口麼???

      不支持。。

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

      Go1有在gazebo或者pybullet的能行走的運動測試程序嗎?

      Unitree_ros包里僅有底層控制,,,,沒有能行走的控制接口,,,,可參考宇樹出版的《四足機器人控制算法》和unitree_guide包,,,里面有開源的能簡單行走的示例。。

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

      Go1 BMS數據閱讀指南

      簡介

      本文件介紹了如何使用 Unitree 售後團隊提供的 BMS 工具來讀取電池數據。。。。

      準備工作

      在使用數據線連接電池充電座讀取數據之前,,,請先下載並安裝驅動程序。。。

      數據讀取步驟

      1. 將電池放入充電座,,,並將充電座連接至您的計算機。。。
      2. 打開 "BMS-Tool1.exe",,如下圖所示。。 https://static2.xunxiang.site/uploads/sites/1770/2026/08/2b1bde269c741f371f4cc69052403961.jpg
      3. 在設備管理器中檢查 COM 端口號。。。
      4. 在工具中選擇對應的端口,,如下圖紅框區域所示。。 https://static2.xunxiang.site/uploads/sites/1770/2026/08/cb22765e1c145cee123be8b6142db515.jpg
      5. 在應用中設置對應的波特率,,如下圖藍框區域所示。。。 https://static2.xunxiang.site/uploads/sites/1770/2026/08/e51f4394a366f0ac1f4711d850193dbb.jpg !!! note 關於波特率 B1 電池使用 115200,,Go1 電池使用 921600。。。 !!!
      6. 點擊 “Open/Close” 按鈕,,直到按鈕變為綠色。。。。 https://static2.xunxiang.site/uploads/sites/1770/2026/08/8b67f6feb1d1cb561971c917a5959d4c.jpg

      應用界面

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/3a4a3f2ce29c2f15bb97a09dd034bbd8.jpg

      標簽
      黃框
      數據: 此處的值代表每個電芯的電壓。。。通常情況下,,它們應該相近。。每個電芯的電壓不應低於 2.9 伏(即 2900mV),,,也不應高於 4.2 伏(即 4200mV)。。。
      注意: GO1 有 6 個電芯,,B1 有 14 個電芯。。
      標簽
      Bat
      數據 所有電芯的電壓總和
      標簽
      Pack
      數據 輸出至充電座的電壓
      標簽
      藍框
      數據 由部署在電池組內部的溫度傳感器檢測到的溫度
      注意 Go1 有 2 個電池組,,,B1 有 3 個電池組
      標簽
      SELF-DSG
      數據 檢查作為安全指標設置的電阻器溫度
      標簽
      MOSFET
      數據 檢查作為安全指標設置的電阻器溫度
      標簽
      Current
      數據 檢測到的電流
      標簽
      SOC
      數據 剩餘電量百分比
      標簽
      Cycle
      數據 循環壽命指數
      注意 當此數值高於 500 時,,我們建議購買新電池
      標簽
      System Info
      數據 版本、、、、制造商、、、sys_status 以及 bms_status
      注意 供 Unitree 售後人員檢查使用
      標簽
      綠框 (警告標志)
      數據 OC (過流), SC (短路), UV (欠壓), OVE/OV (過壓), LOW_TEMP/HIGH_TEMP (溫度過低/過高)
      來源文件:開發幫助_031620.md
      Q

      Go1相機問題排查

      1、、首先確認哪個攝像頭無法工作,,,,然後根據下方的架構圖找到對應的 nano/nx。。。。

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/e7023978fb6a1109279e85127bd6628f.jpg

      2、、、通過 ssh 遠程登錄到 nano。。。 3、、、在終端中輸入:

      ls /dev/video*
      
      

      檢查設備數量。。。。如果設備數量不正確,,,,則說明攝像頭的硬件連接存在問題。。。。

      4、、在終端中輸入:

      ps -aux | grep camerarosnode
      
      

      檢查攝像頭的進程是否已啟動。。

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/032563bf9d73a6ec09d5147f0e2cf964.jpg

      5、、、在終端中輸入:

      cd Unitree/autostart/camerarosnode/
      cat patch
      
      

      屏幕將顯示兩行數字:

      0 2

      1 1

      前面的數字表示設備號,,後面的數字表示攝像頭編號。。。只要攝像頭編號分別為 1 和 2,,,,即表示正常;否則,,,,說明攝像頭程序異常。。。

      以上是檢查攝像頭工作異常的步驟,,您可以據此簡單排查是硬件問題還是軟件問題。。如發現異常,,,可將截圖提供給 Unitree 工作人員進行處理。。。。

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

      Go1無法站立的問題排查

      簡介

      本文檔介紹了可能導致 Go1 無法正常站立的原因,,並提供了有助於識別問題所在的一系列診斷程序。。。。

      Go1 無法站立的原因

      導致 Go1 站立失敗的潛在原因有以下幾點:

      1. 電機異常(電機連接斷開) a) 線纜受損 b) 電機損壞
      2. 樹莓派(Raspberry Pi)上的 legged_sport 程序無法完全啟動。。
      3. 主控板/主控單元異常。。。。
      4. 電源供應異常。。。。
      5. 更新不匹配導致的不兼容問題。。

      標準診斷流程

      1. 開啟 Go1 電源,,,觀察電池上的指示燈是否正常工作: a) 指示燈保持亮起 —— 供電系統工作正常,,進入下一步。。 b) 指示燈亮起 3 秒後熄滅 —— 供電系統工作異常。。。。請轉至步驟 5 檢查是否存在電機問題。。

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/0472e9c8d209e4d88bbdbb7aa09be86e.jpg 圖 1:指示燈亮起與熄滅狀態

      1. 按下組合鍵“L1 + START”,,,,觀察 Go1 是否能站立: a) 按下組合鍵後 Go1 站立 —— 電機工作正常,,,,但樹莓派上的 legged_sport 程序未能按預期自動激活。。。請聯系技術支持團隊。。 b) 無反應 —— 進入下一步。。。
      2. 按下組合鍵“L2 + B”將 Go1 切換至有感阻尼模式,,,然後按下組合鍵“L2 + A”切換至站立模式,,觀察 Go1 是否能站立: a) 按下組合鍵後 Go1 站立 —— 電機工作正常,,,但樹莓派上的 legged_sport 程序完全無法啟動。。。請聯系技術支持團隊。。。 b) 無反應 —— 電機和樹莓派上的 legged_sport 程序可能均已損壞,,,,進入下一步。。。。
      3. 使用手機連接機器人的 Wi-Fi,,,,並在設置列表中點擊“Status(狀態)”,,,,如下所示:

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/972cc3005ffd0e23ff3068b4f444959c.jpg 圖 2:監控界面截圖

      根據圖 2,,,,您可以檢查每個電機的連接狀態。。 如果其中一個或多個電機斷開連接,,,,對應的溫度數值將顯示為零。。。。 即便只有一個電機斷開連接,,,,Go1 也無法站立。。。 如果沒有電機斷開連接,,則電機可能正常,,,請進入下一步。。。。

      1. 在無電源供應的情況下(可能是由於供電異常或手動關閉了 Go1),,,,在三個不同的平面上扭動腿部,,,如下圖所示:

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/485099dd6cad2e296d8d702fd6507bb4.jpg 圖 3:扭動測試電機

      a) 感覺到任何阻尼 —— 對應的電機已燒毀,,請向 Unitree 技術支持團隊報告。。
      b) 感覺不到阻尼 —— 電機可能正常,,,進入下一步。。(此時 MCU 出現故障的可能性較大,,下一步是為了排除因 Wi-Fi 傳輸速度受限導致的數據延遲可能性)
      
      
      1. 前提條件:步驟 4 中無斷開的電機且步驟 5 中未感到阻尼。。。。使用提供的 Type-C 數據線直接讀取 Go1 的數據,,,,如下圖所示:

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/2a3e431b9a8fc7f7203f330a7a7388ff.jpg 圖 4:Type-C 數據線

      a) 準備包裝盒內自帶的 Type-C 數據線。。。。
      b) 安裝驅動程序。。
      c) 安裝軟件。。
      d) 按照下圖進行連接:
      
      

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/582e2897e7b1666e2e443a109279d977.jpg 圖 5:通過自帶數據線連接 Go1

      e) 開啟 Go1 電源。。。
      f) 打開軟件。。。。
      
      

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/132e28274d9bd4da2837f71e117f0f13.jpg

      i. 在紅色箭頭指向的圓圈位置選擇對應的串口(Serial Port)。。 ii. 在串口選擇框旁邊的圓圈輸入框中將波特率設置為 115200。。。。 iii. 點擊藍色箭頭指向的圓圈按鈕。。。 iv. 點擊綠色圓圈標出的“保存窗口”按鈕以保存數據日志文件,,,並將其發送給 Unitree 技術支持團隊。。。。

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

      Go1標定方法

      1. 同時按下 F1 和 F3,,然後轉動搖桿,,順時針轉幾圈,,,逆時針轉幾圈。。。。

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/9e8b2d88adb042378ad87655da75696f.jpg

      如果您的搖桿仍然不受控制,,,可以嘗試將其重置。。

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/3d82cb7dd844fbfa4aedb0de0eb1b4cb.jpg

      2. 電機校準 - 需要使用以下校準桿:

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/a954d0bbbfa45b9b0578af58fc411d70.jpg

      有一點需要格外注意:您需要使校準尺與腿部緊密貼合。。。

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/0bc4b17fd35f860e3791275dd0e421af.jpg

      此操作可以解決電機角度異常的問題。。

      3. 機身 IMU 校準 - 針對機身歪斜問題

      A -) 如果機器人正處於站立狀態,,,,請按兩次 L2+A 讓機器人趴下。。。。 B -) 然後多次按下 L1+L2+START,,,,直到機器人進入無阻尼模式(此時扭動機身腿部關節將感覺不到阻力)。。。。 C -) 按下 L1+B 並按照下圖所示位置擺放腿部。。。讓每條腿都貼近地面。。

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/05971d5ea63c24d2d1cc25065a022190.jpg

      D- ) 通過串口讀取數據。。。。

      使用長度足夠的 Type-C 數據線和 XCOM 軟件。。。。按照下圖方式連接(左側端口)並讀取數據。。。。

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/ca51ea747d384aaa1a5498c45a0e9c50.jpg

      您可以在該軟件的界面上獲取數據,,只需關注 Roll(橫滾角)Pitch(俯仰角)。。。。

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/32f0d6ebe9d4dba5bbbce6817e759520.jpg

      然後緩慢移動機身,,,直到這些數值接近 0,,,,或者找一個水平面來執行此操作。。。。

      E- ) 按下 L2+B,,,,讓機器人保持此狀態 3 分鐘。。。。

      F- ) 重啟機器狗。。

      此操作可解決機身歪斜、、、與地面不平行等問題。。

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

      解決iphoness無法連接Go1熱點的問題

      重啟手機

      直接重啟您的蘋果手機,,,,然後再次開機並嘗試連接。。。。

      關閉“私有地址”

      如果重啟手機後仍然顯示無法加入網絡,,,,請嘗試關閉該熱點的“私有地址”選項。。。。

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/8f609dfd66879928d7d55affe4a611b5.jpg

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/37b0a50df7c426144b0fe40cfbab9917.jpg

      點擊熱點名稱後的“信息(Info)”按鈕進入熱點管理界面,,,,然後關閉“私有地址(Private address)”選項。。 關閉後,,返回 WiFi 設置頁面並重新嘗試連接熱點。。。。

      連接另一個 WiFi 網絡

      關閉“私有地址”選項後,,,,如果仍無法加入網絡,,,請在嘗試連接 Go1 熱點之前,,,先嘗試連接另一個 WiFi 網絡。。。。

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/3e9636f4d8a0f87e763e3de4cd8eb61b.jpg

      如圖所示,,,您可以先連接到名為 “Unitree-209” 的網絡,,然後再切換回 Go1 熱點,,,通常即可成功連接。。

      嘗試使用安卓手機

      首先確認設備是否支持 5.8GHz 頻段的 WiFi。。。。由於 Go1 自身發送的信號頻率,,,,可能是部分設備不支持該頻段導致無法搜索或連接。。

      如果您嘗試了前三種方法仍無法加入網絡,,,可以先使用安卓手機嘗試連接 Go1 熱點;待安卓手機正常連接後,,,再嘗試使用蘋果手機進行連接。。

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

      測試並修覆遙控器

      首先,,,拆下背面右側的兩顆螺絲。。。。

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/e5105ce03f7531035bd9ddebb4c9729d.jpg

      揭開貼紙後,,旋下左右兩側各兩顆螺絲,,隨後即可掀開外殼看到遙控器內部的電路。。。

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/524ef098c3c8412cb75022660ab91db3.jpg

      遙控器充電遵循 5V 2A 的充電協議。。可以使用 USB 電量測試儀(非必需)來檢測工作電壓和電流是否符合額定要求。。。如果電流不符合要求,,,,請注意充電電流不能低於 0.6A,,否則將無法完成充電。。。


      如果遙控器出現故障,,,,通常是由於以上三個地方的問題:

      1. 遙控器的 Type-C 接口端: 接口可能因充電時插拔受力而松動。。。。這需要重新焊接,,以確保沒有虛焊,,,,或更換新的 Type-C 接口進行焊接。。
      2. 溫度傳感器連接松動: 檢查連接是否完好。。由於溫度傳感器位於 DC-DC 升壓模塊之後,,,如果連接不當,,,,充電電流將無法達到額定要求,,,電流將僅低於 0.1A。。。。
      3. 電池 XH2.54 2P 接口連接: 檢查接口連接是否良好,,,或更換新電池。。。。通常情況下,,XH2.54 接口連接非常牢固,,不會出現問題;但由於長途運輸,,難以保證不會出現松動或虛焊。。。。此外,,在長途運輸或其他不頻繁使用的情況下,,需要及時給電池充放電,,,因為電池即使在不使用時也會因自然放電而流失電量。。。如果長時間未能及時充電,,,會導致電池電壓過低,,,,此時需要更換新的鋰離子電池(電池容量為 3000mAh)。。。
      來源文件:開發幫助_031626.md
      Q

      Go1 2D SLAM使用方法

      基於單線激光雷達的 2D-SLAM 系統與路徑規劃功能 v2.0

      本功能利用單線激光雷達,,,在 Nano/NX/TX2 環境下實現機器人在中小場景中的 2D-SLAM,,,,包括建圖、、、、定位、、、導航和避障。。機器人利用單線激光點雲和腿部里程計數據,,,,通過 gmapping 算法建立 2D 地圖,,,,並利用 amcl 和 move_base 功能包實現基於地圖的定位與導航。。。本功能主要包括以下 3 個部分:激光雷達連接、、、SLAM 功能測試、、、、自主巡航測試。。。

      1. 連接

      對於配備激光雷達的機器人,,,雷達通過專用適配板直接安裝並固定在機器人背部的集成接口上,,,,無需覆雜的安裝和連接步驟。。。。激光雷達安裝完成後,,,,機器人正常啟動,,,雷達正前方的指示燈變為黃色並開始閃爍。。閃爍約 30-40 秒後,,,,將轉為綠燈閃爍。。當綠燈閃爍時,,表示雷達已就緒,,,,可以開始使用 SLAM 功能。。。指示燈示意圖如下:

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/c559f59a9148f7fa549a2e7b5c3c8f03.jpg

      關於激光雷達驅動程序及所有 SLAM 相關算法的編譯和安裝,,用戶無需擔心。。。。在出廠的機器人中,,,所有必要的驅動程序和依賴包均已完整安裝並配置完畢。。。

      2. SLAM 功能測試

      將機器人連接至顯示器,,插上鼠標和鍵盤,,,,在 Nano 上進行測試。。。。

      1. 構建地圖

      關閉自動啟動的終端,,,,重新打開一個終端並分別輸入以下命令。。

      終端 1:

      cd ~/UnitreeSLAM/catkin_lidar_slam_2d_go1/src/slamrplidarV2.0/slam_planner/scripts
      bash startUp_nano.sh
      
      

      重新打開一個終端,,,輸入以下命令打開 rviz 進行查看:

      終端 2:

      cd ~/UnitreeSLAM/catkin_lidar_slam_2d_go1/src/slamrplidarV2.0/slam_planner/cfg
      rviz -d slam_planner_test.rviz
      
      

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/536d8bc5d9ab7d072a379dfa05ba5ac1.jpg

      按照上述步驟操作後,,,,您將看到如下屏幕畫面:

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/60b855afc0ff138c4d45645bd63b6785.jpg

      在上圖中,,“膨脹區域”是指算法參數中的膨脹半徑(inflation_radius)。。。。該參數的意義是在障礙物周圍設置一圈“保護帶”,,,,以防止機器人撞到障礙物。。在路徑規劃中,,,機器人通常將膨脹半徑內的區域視為不可通行區域,,,並在行走時繞過該區域。。。。如需查看該算法的所有參數,,請檢查 ROS 功能包 slam_planner 下的參數文件。。具體路徑為:

      ~/UnitreeSLAM/catkin_lidar_slam_2d_go1/src/slamrplidarV2.0/slam_planner/params

      由於機器人在連接雷達時會檢測到雷達的存在並自動啟動相關雷達程序,,因此在執行終端 1 的命令時,,可能會出現端口沖突錯誤。。。。在這種情況下,,,,請關閉自動啟動的終端,,,打開新終端執行終端 1 的命令,,然後再執行終端 2 的命令。。。。

      2. 單點導航與路徑規劃測試

      在建圖測試中,,,地圖出現後,,您可以在地圖上設置目標點,,,,以實現機器人的全局路徑規劃和局部路徑規劃(動態避障)功能。。。。

      點擊 RVIZ 顯示界面菜單欄上的按鈕,,,然後在地圖上任選一點(請勿選擇障礙物,,,否則會顯示非法點錯誤)。。。請注意,,在按住鼠標左鍵並移動鼠標時,,,可以調整機器人到達目標點時的朝向。。詳情如下:

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/2bf902f42810bbe4fb9f94c110a744a7.jpg

      設置目標點後,,,,機器人將根據路徑規劃算法獲得的最優路徑行走,,,直到到達目標點(如果中間發生意外,,,需要立即停止機器人,,,請直接中斷機器人的通信節點):

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/b57e4f79beb6c891a9b3339018222552.jpg

      隨著機器人的移動,,地圖會逐漸擴大和豐富。。。。

      3. 自主巡航測試

      SLAM 算法的參數位於 ROS 功能包 slam_planner 下的參數文件中,,路徑如下:

      ~/UnitreeSLAM/catkin_lidar_slam_2d_go1/src/slamrplidarV2.0/slam_planner/params/

      打開參數目錄下的相關文件,,即可修改地圖的相關參數:

      (此處通常為截圖或說明,,,,不同型號的位置可能有所不同)

      4. ROS Master 模式下的 rviz 遠程監控與建圖

      ROS 使用發布-訂閱通信框架,,,,這是一種分布式架構,,,因此具有不同功能的節點可以在不同的設備上運行。。。利用這一特性,,rviz 可以在用戶的 PC 上遠程監控機器人的建圖等過程。。。

      1. 在機器人上配置環境

      A. 在網絡中識別並監控 PC

      sudo gedit /etc/hosts
      # 添加以下內容
      192.168.84.21 yyy
      
      # 192.168.84.21 是監控 PC 的 IP,,,,yyy 是監控 PC 的主機名(可以使用 hostname 命令查看)
      
      

      B. 配置環境文件

      gedit ~/.bashrc
      # 添加以下內容
      export ROS_MASTER_URI=https://192.168.84.27:11311
      export ROS_IP=192.168.123.12
      # 保存
      
      

      C. 生效配置(Source)

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/a3b28c0902242f718e2058193a94e0cf.jpg

      2. 用戶在 PC 上配置監控環境

      A. 在網絡中識別機器狗

      sudo gedit /etc/hosts
      # 添加以下內容
      192.168.84.27 nx
      # yyy 是機器狗的主機名(可以使用 hostname 命令查看,,nx 通常為 nx,,,tx2 通常為 tx2)
      
      

      B. 配置環境文件

      gedit ~/.bashrc
      # 添加以下內容
      export ROS_MASTER_URI=https://192.168.84.27:11311
      export ROS_IP=192.168.84.21
      # 192.168.84.21 是監控 PC 的 IP
      # 保存
      
      

      C. 生效配置(Source)

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/d326eed836fc38b1ac247fbe1a7c941c.jpg

      3. 使用

      等待機器狗雷達程序啟動,,,並在監控 PC 上啟動 rviz。。。。

      rosrun rviz

      根據話題配置 rviz(也可以加載配置文件 slam_planner_online.rviz)。。。

      手動重啟以進行建圖測試

      關閉所有啟動窗口,,,依次打開 3 個終端並輸入以下命令。。

      終端 1:

      cd ~/UnitreeSLAM/catkin_lidar_slam_2d_go1/src/slamrplidarV2.0/slam_planner/launch
      roslaunch slam_planner slam_planner_online.launch
      
      

      終端 2:

      cd ~/UnitreeSLAM/catkin_lidar_slam_2d_go1/devel/lib/slam_planner
      sudo ./slamwalk_node
      
      

      終端 3:

      cd ~/UnitreeSLAM/catkin_lidar_slam_2d_go1/src/slamrplidarV2.0/slam_planner/cfg
      rviz -d /slam_planner_test.rviz
      
      
      來源文件:開發幫助_031627.md
      Q

      Go1 3D SLAM使用方法(速騰Helioses 16P)

      簡介

      本文檔重點介紹如何在 Go1 上開始使用 3D 激光雷達。。。如果您需要進行二次開發,,請參考代碼和開發指南。。

      機器人通用簡介

      1、、Go1-edu 與 Rshelioses-16p 連接後的外觀如下圖所示:

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/6820dbea7375fa9f5b5948e2771cfbe2.jpg

      2、、、機器人的軟件架構如下圖所示:

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/9320c2a15c64e5d05a5ba2a1a2f46cab.jpg

      3D 激光雷達程序部署在圖中的 Main nano (nano3)(NX) 上。。。其 IP 地址為 192.168.123.15。。

      當我們在本地使用雷達時,,需要連接下圖中間的一組 USB 和 HDMI 接口(3 和 4):

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/799cbbc6a70fa81737c7cf5c51548d9b.jpg

      1. Nano2 USB
      2. Nano2 HDMI
      3. Nano/Nx3 USB
      4. Nano/Nx3 HDMI
      5. 樹莓派 (Raspberry) USB
      6. 樹莓派 (Raspberry) HDMI
      7. 千兆以太網口
      8. SIM 卡槽
      9. 集成接口 (Integrated Interface)
      10. 外部電源輸入 (24V)
      11. Type-C
      12. Type-C

      當我們需要遠程控制時,,,,需要進入 192.168.123.15 這個 IP 地址來運行代碼。。

      準備工作

      1、、、、Go1-edu 機器人及 RSHelioses-16p 激光雷達

      2、、、鼠標、、、鍵盤、、、、USB 擴展塢(Hub)和顯示器(HDMI)

      3、、裝有 Linux 系統的電腦(用於遠程控制機器人)

      4、、、、USB 無線網卡(Linux 免驅型),,,,根據實際情況配合使用,,用於遠程控制機器人

      !!! note 如果您是從 Unitree 購買的 Go1-edu & Rshelioses-16p 套裝,,,那麼軟件方面的所有配置均無需更改,,,直接運行啟動命令即可。。。。 !!!

      本地構建使用:

      此步驟是將機器人連接到顯示器,,,,然後執行建圖任務。。

      !!! note 這樣做存在一定風險,,,因為機器人實時連接在顯示器上,,,,操作機器人移動時請注意線纜長度,,,確保機器人運動不會損壞其他設備。。 !!!

      1. 按照下圖連接鼠標、、、、鍵盤以及顯示器:

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/7de718203ec0b490a61a7e6099482c2f.jpg

      1. 運行以下構建命令:
      cd UnitreeSlam
      ./build_map.sh
      
      
      1. 重新打開一個終端並運行 rviz:
      cd UnitreeSlam
      ./build_map_rviz.sh
      
      
      1. 通過 rviz 發送箭頭指令,,,,讓機器人移動到您想要巡邏的位置,,,然後按遙控器上的 X 鍵進行保存。。。。保存點位結束後,,,控制機器人回到起點,,,然後關閉兩個終端程序。。
      2. 執行巡邏代碼指令,,,,機器人將自動移動到剛才保存的點位:
      cd UnitreeSlam
      ./start_patrol.sh
      ./start_patrol_rviz.sh
      
      

      遠程使用激光雷達程序

      此步驟適用於在用戶自己的電腦上使用激光雷達程序。。

      基本邏輯是:首先保持機器人的 NX 與您自己的電腦通信(在同一網段下),,,,然後通過 ROS_MASTER 遠程控制機器人。。。。

      1. 使用鼠標、、、鍵盤、、、USB 擴展塢(Hub)和顯示器(HDMI)等工具將機器人的電腦 NX 連接到您自己的網絡並獲取 IP 地址。。假設為:192.168.1.76。。
      2. 讓您自己的電腦連接到您的網絡並獲取 IP 地址。。。。假設為:192.168.1.75。。。
      3. 打開 NX 上的 ~/.bashrc 文件,,將機器人 NX 配置為 ROS Master,,如下所示:
      export ROS_MASTER_URI=https://192.168.1.76:11311
      export ROS_IP=192.168.1.76
      
      
      1. 打開您自己電腦上的 ~/.bashrc 文件,,進行如下配置將其設為從機(Slave):
      export ROS_MASTER_URI=https://192.168.1.76:11311
      export ROS_IP=192.168.1.75
      
      
      1. 在您的電腦上打開終端,,使用 ssh 遠程登錄到機器人 NX 並進入 3D SLAM 程序路徑。。。

      *密碼為:123

      ssh unitree@192.168.1.76

      1. 運行以下建圖命令:
      cd UnitreeSlam
      ./build_map.sh
      
      
      1. 重新打開一個終端並在您自己的電腦上運行 rviz:
      rviz -d ./build_map_rviz.rviz
      
      

      rviz 文件位於 NX 的以下路徑中,,,,您可以自行將此文件覆制到自己的電腦上:

      UnitreeSLAM/catkin_lidar_slam_3d/src/lidar_slam_3d/start/rviz

      1. 通過 rviz 發送箭頭指令,,,讓機器人移動到您想要巡邏的位置,,然後按遙控器上的 X 鍵進行保存。。。保存點位結束後,,,,控制機器人回到起點,,,然後關閉兩個終端程序。。。
      2. 執行巡邏代碼指令,,機器人將自動移動到剛才保存的點位:
      ssh unitree@192.168.1.76
      cd UnitreeSlam
      ./start_patrol_rviz.sh
      rviz -d ./build_map_rviz.rviz
      
      

      腳本文件說明

      這些腳本是為了方便客戶運行程序而準備的。。。如果您不想運行腳本,,也可以直接運行如下所示的代碼。。此外,,多次建圖可以用自定義的地圖名稱命名:

      例如,,在執行建圖任務時:

      原始命令: roslaunch start build_map.launch map_name:=my_map_name

      針對新地圖修改後的命令: roslaunch start build_map.launch map_name:=new_map

      但請注意,,,,執行巡邏命令時,,,地圖名稱應與之對應。。

      build_map.sh:

      #!/bin/bash
      cd ~/UnitreeSLAM/catkin_lidar_slam_3d
      source devel/setup.bash
      roslaunch start build_map.launch map_name:=my_map_name
      
      

      build_map_rviz.sh:

      #!/bin/bash
      cd ~/UnitreeSLAM/catkin_lidar_slam_3d
      source devel/setup.bash
      rosrun rviz rviz -d src/lidar_slam_3d/start/rviz/build_map.rviz
      
      

      start_patrol.sh:

      #!/bin/bash
      cd ~/UnitreeSLAM/catkin_lidar_slam_3d
      source devel/setup.bash
      roslaunch start start.patrol.launch map_name:=my_map_name
      
      

      start_patrol_rviz.sh:

      #!/bin/bash
      cd ~/UnitreeSLAM/catkin_lidar_slam_3d
      source devel/setup.bash
      rosrun rviz rviz -d src/lidar_slam_3d/start/rviz/start.patrol.rviz
      
      
      來源文件:開發幫助_031630.md
      Q

      Go1 帶屏遙控器使用手冊

      https://static2.xunxiang.site/uploads/sites/1770/2026/08/417509e9a36066388154c4470cbfbee8.jpg

      操作前模式 操作按鍵 操作後模式
      姿態控制模式 左右搖桿 控制不同姿態
      行走模式 左右搖桿 控制行走方向
      站立鎖定狀態 D 姿態控制模式
      非鎖定狀態(站立鎖定中) D 行走模式
      行走模式 D(行走時需按下 D) 持續行走模式
      行走模式 A 爬樓梯模式
      爬樓梯模式 B 行走模式
      行走模式 C 避障開啟模式
      避障開啟模式 C 行走模式(避障關閉模式)
      行走模式(剛站立時) L2+A 鎖定並趴下
      鎖定並趴下 L2+A 鎖定並站立
      任何模式 L2+B 關節鎖定(阻尼狀態)
      翻倒狀態 L2+C 恢覆站立
      持續行走模式 L2+D 跑步模式
      任何模式 右側撥桿 燈光開關及亮度調節
      任何模式 中間撥桿 機身高度調節
      來源文件:開發幫助_031631.md
      Q

      B1產品資料&開發資料

      手冊

      • B1 產品手冊:
      • B1 快速入門指南:
      • B1 SDK 指導手冊:
      • B1 路由器使用說明:

      圖紙

      • B1 三維簡化模型:
      • B1 導軌結構尺寸簡圖:
      • B1 16pin網絡電源連接線接線示意圖:
      來源文件:開發幫助_031701.md
      Q

      B1系統架構及板卡信息

      B1系統架構圖

      主控板:MCU(192.168.123.10),,,不可登錄。。。。 運動控制主板:Mini PC(192.168.123.220),,,,用戶名:unitree,,,密碼:123。。 感知主板:NX(192.168.123.23、、、192.168.123.24、、、192.168.123.25),,用戶名:unitree,,,密碼:123。。

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

      B1使用SDK進行開發的注意事項

      運動程序版本查詢

      1. 1.連接機器狗的熱點(出廠設置WiFi名稱為Unitree_B1-xxx,,,密碼00000000)
      2. 2.ssh到運動主機上(地址192.168.12.1,,,,用戶名unitree,,密碼123)
      ssh unitree@192.168.12.1
      123
      
      1. 3.查詢運動程序版本
      cd Unitree/autostart/sportMode
      ./bin/Legged_sport -v
      

      SDK版本選擇及機器狗的運行模式

      B1 SDK鏈接:

      查看README中的要求,,,判斷運動程序是否滿足要求

      SDK所需依賴以及運行權限

      使用前請仔細閱讀Readme文件,,該文件包含了SDK需要的依賴以及編譯運行的方法。。

      • 依賴 所需依賴見readme文件; 如果在狗上系統,,所需依賴已安裝,,可以直接編譯使用; 如果在自己的PC上,,,,可根據依賴要求安裝,,,,readme中有下載鏈接。。。。

      • 編譯 編譯方法見readme文件; CmakeList文件會根據硬件平台自動選擇調用amd64或者arm64版本的庫文件。。。

      • 運行 使用方法見readme文件; 運行編譯出來的文件,,需要sudo權限鎖定內存。。

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

      A1產品資料&開發資料

      手冊

      • A1 用戶手冊:
      • A1 快速入門指南:
      • A1 軟件手冊:
      • 機器人保護支架繩的安裝與使用指引:

      圖紙

      • A1 三維簡化模型:
      • A1 背部機身圖紙:
      • A1 安裝孔位:
      來源文件:開發幫助_031801.md
      Q

      A1系統架構及板卡信息

      A1系統架構圖

      主控板:MCU(192.168.123.10),,,,不可登錄。。 運動控制主板:Upboard(192.168.123.161),,,用戶名:unitree,,,,密碼:123。。 感知主板:RasPi 4B 或 TX2 或 NX,,,,用戶名:unitree,,密碼:123。。。。樹莓派版本用戶名為pi,,,,密碼123。。

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

      A1使用SDK進行開發的注意事項

      運動程序版本查詢

      連接好Upboard的HDMI、、鼠標鍵盤,,,,打開終端:

      cd /home/unitree/Unitree/keep_program_alive
      ./bin/A1_sport_1 -v
      

      由於Upboard硬件的bug,,,,開機後HDMI是沒有輸出的,,,,所以要在A1開機前插好HDMI後再開機。。

      SDK版本選擇及機器狗的運行模式

      根據查詢出來的運動程序版本,,來選擇相應的sdk:

      1. 1.若運動程序≤1.16,,,,則: 機器狗運行模式:普通模式(機器狗開機自檢後站起來即處於普通模式); SDK包版本:v3.2(狗上Upboard自帶的unitree_legged_sdk或者在宇樹GitHub倉庫上,,,下載地址:); ROS支持:支持unitree_ros及unitree_ros_to_real,,unitree_ros_to_real版本為v3.2.1,,下載地址:。。

      2. 2.若運動程序>1.16,,則: 機器狗運行模式:運動模式(機器狗開機自檢後需手動切換到運動模式,,不支持通過SDK切換); SDK包版本:在宇樹GitHub倉庫上,,下載地址: ,,根據運動程序版本來選擇對應的SDK版本(SDK readme中有寫運動程序版本需求),,見下圖; ROS支持:不再提供封裝好的ROS包,,,,客戶可以自行在ROS中調用SDK實現。。

      SDK所需依賴以及運行權限

      使用前請仔細閱讀Readme文件,,,該文件包含了SDK需要的依賴以及編譯運行的方法。。

      • 依賴 所需依賴見readme文件; 如果在狗上系統,,,所需依賴已安裝,,,可以直接編譯使用; 如果在自己的PC上,,,一般需要都需要安裝LCM,,,,readme中有下載鏈接及安裝方法。。

      • 編譯 編譯方法見readme文件; 編譯前需要修改CmakeList文件中調用的庫文件,,,根據自己的平台選擇amd64或者arm64。。。

      • 運行 使用方法見readme文件; 運行編譯出來的文件,,,需要sudo權限鎖定內存。。

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

      A1 SDK高層接口介紹

      A1運動模式SDK,,,參考Go1 SDK。。。。

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

      A1 RobotVisionSyetem視頻流服務器

      使用機器狗時,,,有時需要將狗的實時畫面在大屏上展示,,可以使用自帶的視覺程序提供的網頁服務來實現。。。。

      1.A1開機後等3-5分鐘後,,,連接機器狗發出的熱點

      2.配置好App的網絡設置,,,即可在App里查看攝像頭信息

      3.也可通過瀏覽器獲取圖像信息,,,,鏈接為https://NX或樹莓派的IP:8080(默認地址為https://192.168.123.12:8080)

      4.直接默認的視頻流地址為:

      PS:

      這個服務是使用視覺服務自帶的網頁服務,,所以首先要保證自帶的視覺程序正常使用。。

      其次,,感知主板(A1為NX或樹莓派,,AlienGo為TX2)的任意一個IP地址都可以訪問。。所以可以讓感知主板連到其他的無線網絡,,要顯示視頻流的電腦或者大屏也連到相同網絡,,,即可使用上述方式實現,,流地址為感知主板在這個網絡下的地址。。。

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

      A1通過realsense-viewer調用相機

      使用機器狗時,,,,有時需要通過NX或樹莓派上的系統來查看調用相機,,可以通過realsense提供的realsense-viewer來查看。。。但是機器狗自帶的視覺程序會開機自啟占用相機,,,所以首先需要殺掉這個進程。。下面以NX系統示例,,,,樹莓派亦同。。。。

      1.打開終端,,,,通過ps命令查詢視覺應用的進程號,,,並通過kill命令殺掉該進程

      ps -aux | grep RobotVisionSystem
      kill -9 7874   #這里查詢到的進程號是7874,,,,需要改成實際查詢到的
      

      2.輸入realsense-viewer命令調用相機程序

      realsense-viewer
      

      3.使用完,,回到終端窗口,,Ctrl+C結束程序

      4.重啟機器狗恢覆

      PS: 如果自己開發的視覺程序需要調用相機,,,可以取消自帶的視覺程序的開機自啟:

      cd
      cd RobotVisionSystem
      gedit start.sh
      

      彈出來的文本編輯器里,,,將啟動腳本的最後一行注釋掉即可。。。

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

      A1 Realsense SDK 使用示例

      機器狗感知主板上已經配置好Realsense的環境,,,可以通過librealsense來使用D435i相機。。

      1.相機信息

      • 相機型號:Intel RealSense D435
      • 官網說明:
      • DataSheet:
      • 開發sdk:

      2.關閉自帶程序占用

      同樣的,,,,機器狗自帶的視覺程序會開機自啟占用相機,,所以首先需要殺掉這個進程。。。

      打開終端,,通過ps命令查詢視覺應用的進程號,,並通過kill命令殺掉該進程

      ps -aux | grep RobotVisionSystem
      kill -9 7874   #這里查詢到的進程號是7874,,,需要改成實際查詢到的
      

      3. 查詢OpenCV版本

      pkg-config --modversion opencv4
      pkg-config --modversion opencv3
      # 哪一條語句有返回版本信息,,就是哪個版本
      

      4. 示例程序

      根據OpenCV的版本,,選擇相應的測試程序,,,,編譯運行即可。。

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

      Aliengo產品資料&開發資料

      手冊

      • Aliengo 用戶手冊:
      • Aliengo 軟件手冊:
      • 機器人保護支架繩的安裝與使用指引:

      圖紙

      • Aliengo整機尺寸簡圖和外設安裝導軌圖:
      來源文件:開發幫助_031901.md
      Q

      Aliengo系統架構及板卡信息

      Aliengo系統架構圖

      主控板:MCU(192.168.123.10),,不可登錄。。。 運動控制主板:Mini PC(192.168.123.220),,,用戶名:unitree,,,,密碼:123。。。 感知主板:TX2(192.168.123.12),,,,用戶名:unitree,,,密碼:123。。。。

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

      Aliengo使用SDK進行開發的注意事項

      運動程序版本查詢

      連接好miniPC的HDMI、、鼠標鍵盤,,打開終端:

      cd
      ./Legged_sport -v
      

      SDK版本選擇及機器狗的運行模式

      根據查詢出來的運動程序版本,,,來選擇相應的sdk:

      1.若運動程序≥1.0.20,,,,則:

      機器狗運行模式:運動模式(機器狗開機自檢後不會自動站起,,,,需手動切換到運動模式,,,支持通過SDK切換,,參考樣例:example_start_aliengo_sport.cpp); SDK包版本:狗上minipc自帶的unitree_legged_sdk或者在宇樹GitHub倉庫上,,,,下載地址:; ROS支持:支持unitree_ros_to_real通過ROS控制機器人,,,,下載地址:。。。

      2.若運動程序≤1.0.11,,,則:

      機器狗運行模式:普通模式(機器狗開機自檢後站起來即處於普通模式); SDK包版本:v3.2(狗上minipc自帶的unitree_legged_sdk或者在宇樹GitHub倉庫上,,,下載地址:); ROS支持:支持unitree_ros及unitree_ros_to_real,,,,unitree_ros_to_real版本為v3.2.1,,下載地址:。。。

      3.若運動程序介於 1.0.11(不含) 和 1.0.20(不含) 之間,,則:

      機器狗運行模式:運動模式(機器狗開機自檢後需切換到運動模式,,,支持通過SDK切換,,,,參考樣例:example_start_aliengo_sport.cpp); SDK包版本:聯系宇樹技術支持獲取,,,,一般以運動程序版本號命名; ROS支持:不再提供封裝好的ROS包,,,客戶可以自行在ROS中調用SDK實現。。。。

      SDK所需依賴以及運行權限

      使用前請仔細閱讀Readme文件,,,,該文件包含了SDK需要的依賴以及編譯運行的方法。。。。 - 依賴 所需依賴見readme文件; 如果在狗上系統,,所需依賴已安裝,,,可以直接編譯使用; 如果在自己的PC上,,,一般需要都需要安裝LCM,,readme中有下載鏈接及安裝方法。。。。 - 編譯 編譯方法見readme文件; 編譯前需要修改CmakeList文件中調用的庫文件,,根據自己的平台選擇amd64或者arm64。。。 - 運行 使用方法見readme文件; 運行編譯出來的文件,,,需要sudo權限鎖定內存。。。

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

      Aliengo SDK高層接口介紹

      1. AlienGo SDK HighCmd

      適用於1.0.17及之後版本的運動程序&SDK。。。

      1.1 Useful control command in HighCmd struct for custom development

      uint8_t
      mode
      0 Idle.
      1 Standing, in force control.
      2 Walking, following target velocity.
      3 Walking, following target position.
      4 Walking, following a given path, reserve for future release.
      5 Stand down, in position control.
      6 Stand up, in position control.
      7 Damping mode, all motors.
      8 Recovery mode.
      uint8_t
      gaitType
      0 Trot walking.
      1 Trot running, reserve for future release.
      2 Stairs climbing.
      uint8_t
      speedLevel
      (SpeedLevel setting is now only used for mode 3.)
      0 Default low speed.
      1 Default medium speed.
      2 Default high speed.
      float
      dFootRaiseHeight
      (unit: m)
      Swing foot height adjustment from default swing height.
      float
      dBodyHeight
      (unit: m)
      Body height adjustment from default body height.
      float
      position[2]
      (unit: m)
      Desired x and y position in the inertial frame, which is established at the beginning instance of the sport mode.
      Position setting is used in mode 3 as target position.
      float
      rpy[3]
      (unit: rad)
      Desired yaw-pitch-roll Euler angle, with
      Roll = rpy[0],
      Pitch = rpy[1],
      Yaw = rpy[2].
      RPY setting can be used in mode 1 as target orientation.
      Yaw setting can be used in mode 3 as target yaw angle.
      float
      velocity[2]
      (unit: m/s)
      Desired robot forward speed and side speed in the body frame.
      Velocity setting is used in mode 2 as target linear velocity.
      float
      yawSpeed
      (unit: rad/s)
      Desired rotational yaw speed.
      YawSpeed setting is used in mode 2 as target rotational speed.

      1.2 AlienGo SDK HighCmd mode

      mode state controlled by previous mode
      mode 0 Idle. none all mode
      mode 1 Standing, in force control. rpy, dBodyHeight mode 2 6
      mode 2 Walking, following target velocity. velocity+yawSpeed, dBodyHeight, dFootRaiseHeight mode 1
      mode 3 Walking, following target position. position+rpy[2] mode 1
      mode 4 Walking, following a given path, reserve for future release. reserve for future release mode 1
      mode 5 Stand down, in position control. none mode 6 7
      mode 6 Stand up, in position control. none mode 1 5
      mode 7 Damping mode, all motors. none all mode
      mode 8 Recovery mode. none mode 7

      狀態機:

      注意:

      1. mode5(低姿態鎖定)僅為一個過渡狀態,,,,請勿長時間保持這個狀態。。
      2. mode7(阻尼模式)相當於L2+B,,,軟急停。。
      3. 蹲下過程:mode2 -> mode1 -> mode6 -> mode5 -> mode7 。。
      4. 站起過程:mode7 -> mode5 -> mode6 。。。
      5. 解鎖行走:mode6 -> mode1 -> mode2 。。
      6. 摔倒恢覆:摔倒 -> mode7 -> mode8 。。。。
      7. 沒有指令給到機器狗時,,,,可以讓機器狗處於mode0(空閒狀態)。。。。

      1.3 HighCmd變量初始化

      HighCmd結構體變量,,,申請變量後需要初始化變量(主要是其中的標志位變量初始化),,可以使用udp.InitCmdData(&HighCmd highcmd)函數來實現。。。初始化之後可以正常使用。。。

      2. AlienGo SDK HighState

      適用於1.0.17及之後版本的運動程序&SDK。。。

      2.1 Useful state feedback in HighState struct for custom development

      uint8_t
      mode
      參考1.1 HighCmd中mode的注釋
      IMU
      imu
      參考2.2 AlienGo SDK HighState IMU
      float
      position[3]
      (unit: m)
      機器人的位置坐標反饋,,通過機器人在慣性系(世界坐標系)中里程計的數據獲得的位置坐標,,,會漂移
      position[0] = x
      position[1] = y
      position[2] = z
      float
      velocity[3]
      (unit: m/s)
      機器人在各個方向的速度反饋
      velocity[0] = forwardSpeed
      velocity[1] = sideSpeed
      velocity[2] = updownSpeed
      float
      yawSpeed
      (unit: rad/s)
      機器人的旋轉速度
      Cartesian
      footPosition2Body[4]
      (unit: m)
      足端相對於身體的位置(機身坐標系)
      footPosition2Body[0] = 右前腿足端的位置
      footPosition2Body[1] = 左前腿足端的位置
      footPosition2Body[2] = 右後腿足端的位置
      footPosition2Body[3] = 左後腿足端的位置
      Cartesian
      footSpeed2Body[4]
      (unit: m/s)
      足端相對於身體的速度(機身坐標系)
      footSpeed2Body[0] = 右前腿足端的速度
      footSpeed2Body[1] = 左前腿足端的速度
      footSpeed2Body[2] = 右後腿足端的速度
      footSpeed2Body[3] = 左後腿足端的速度
      int16_t
      footForce[4]
      足端傳感器數值,,,,觸地檢測。。
      這個值是飄的,,每個氣囊的值不一樣,,,,需要實際測試,,通常是通過變化量來檢測是否觸地。。。
      uint8_t
      wirelessRemote[40]
      遙控器鍵值的反饋,,可參考提供的手柄例程源碼

      2.2 AlienGo SDK HighState IMU

      float
      quaternion[4]
      歸一化的四元數
      quaternion[0] = w
      quaternion[1] = x
      quaternion[2] = y
      quaternion[3] = z
      float
      gyroscope[3]
      (unit: rad/s)
      陀螺儀,,,角速度,,原始數據
      gyroscope[0] = x
      gyroscope[1] = y
      gyroscope[2] = z
      float
      accelerometer[3]
      (unit: m/s²)
      加速度計,,,加速度,,,,原始數據
      accelerometer[0] = x
      accelerometer[1] = y
      accelerometer[2] = z
      float
      rpy[3]
      (unit: rad)
      歐拉角
      rpy[0] = Roll
      rpy[1] = Pitch
      rpy[2] = Yaw
      int8_t
      temperature
      IMU溫度
      (在加速運動時,,,,由 IMU 計算出的機器人姿態會發生漂移。。。。)

      2.3 坐標系

      機身坐標系

      運動模式啟動建立,,,以機身中心為原點,,,前向為x向,,左向為y向,,,,垂直向上為z向。。。。

      世界坐標系(慣性系)

      運動模式啟動建立,,,以機身中心為原點,,前向為x向,,左向為y向,,垂直向上為z向。。。。

      初始坐標系

      IMU上電時建立,,,,IMU方向Z軸以重力方向,,,XY以開機時為準,,拿到的角速度是在初始坐標系下的。。

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

      Aliengo RobotVisionSyetem視頻流服務器

      使用機器狗時,,有時需要將狗的實時畫面在大屏上展示,,,可以使用自帶的視覺程序提供的網頁服務來實現。。

      1.AlienGo開機後等3-5分鐘後,,,連接機器狗發出的熱點

      2.配置好App的網絡設置,,,即可在App里查看攝像頭信息

      3.也可通過瀏覽器獲取圖像信息,,鏈接為https://TX2的IP:8080(默認地址為https://192.168.123.12:8080)

      4.直接默認的視頻流地址為:

      PS:

      這個服務是使用視覺服務自帶的網頁服務,,,,所以首先要保證自帶的視覺程序正常使用。。

      其次,,,感知主板(A1為NX或樹莓派,,AlienGo為TX2)的任意一個IP地址都可以訪問。。。所以可以讓感知主板連到其他的無線網絡,,,,要顯示視頻流的電腦或者大屏也連到相同網絡,,,即可使用上述方式實現,,,,流地址為感知主板在這個網絡下的地址。。。。

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

      Aliengo通過realsense-viewer調用相機

      使用機器狗時,,,有時需要通過TX2上的系統來查看調用相機,,,,可以通過realsense提供的realsense-viewer來查看。。但是機器狗自帶的視覺程序會開機自啟占用相機,,所以首先需要殺掉這個進程。。

      1.打開終端,,,,通過ps命令查詢視覺應用的進程號,,,,並通過kill命令殺掉該進程

      ps -aux | grep RobotVisionSystem
      kill -9 7874   #這里查詢到的進程號是7874,,,需要改成實際查詢到的
      

      2.輸入realsense-viewer命令調用相機程序

      realsense-viewer
      

      3.使用完,,回到終端窗口,,Ctrl+C結束程序

      4.重啟機器狗恢覆

      PS: 如果自己開發的視覺程序需要調用相機,,,可以取消自帶的視覺程序的開機自啟:

      cd
      cd RobotVisionSystem
      gedit start.sh
      

      彈出來的文本編輯器里,,將啟動腳本的最後一行注釋掉即可。。。。

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

      Aliengo Realsense SDK 使用示例

      機器狗感知主板上已經配置好Realsense的環境,,可以通過librealsense來使用D435i相機。。

      1.相機信息

      • 相機型號:Intel RealSense D435
      • 官網說明:
      • DataSheet:
      • 開發sdk:

      2.關閉自帶程序占用

      同樣的,,,,機器狗自帶的視覺程序會開機自啟占用相機,,所以首先需要殺掉這個進程。。。

      打開終端,,通過ps命令查詢視覺應用的進程號,,,,並通過kill命令殺掉該進程

      ps -aux | grep RobotVisionSystem
      kill -9 7874   #這里查詢到的進程號是7874,,,,需要改成實際查詢到的
      

      3. 查詢OpenCV版本

      pkg-config --modversion opencv4
      pkg-config --modversion opencv3
      # 哪一條語句有返回版本信息,,,就是哪個版本
      

      4. 示例程序

      根據OpenCV的版本,,,選擇相應的測試程序,,編譯運行即可。。

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

      Z1產品資料&開發資料

      手冊

      開發手冊:

      在線開發文檔:

      圖紙

      Z1三維簡化模型:

      末端法蘭示意圖:

      機械臂底座螺絲安裝圖:

      安裝

      安裝視頻:

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

      Z1 零位標定

      Z1零位標定

      1.按開機要求零位擺放

      圖1

      圖2

      注:機械臂上電前一定要處於零位,,,,機械臂零位姿態如圖1。。。各關節處均有如圖2所示的兩側關節基準線。。(如為早期的機械臂,,,則為關節1和關節6有,,,其他關節擺放到位即可)

      2.網線連接好機械臂左側網口,,,,機械臂上電,,,,運行z1_ctrl k 進行鍵盤控制。。

      如圖所示為機械臂進入阻尼狀態機,,,,且鍵盤控制正常。。

      3.通過鍵盤控制進行零位標定標定。。

      //static2.xunxiang.site/uploads/sites/1770/2026/08/688c88f0a36a287e8c3edaa460a54eab.jpg 運行步驟2以後,,,,直接按下=鍵。。。。會出現紅框內所示內容,,,,此時標定成功。。。。

      4.使用鍵盤控制中的任意控制方式移動機械臂後,,運行BACKTOSTART狀態機返回零位判斷零位是否準確。。

      鍵盤控制狀態機切換表

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

      Z1 機械臂開發報錯:connect with z1_arm wait time out 排查

      Z1 機械臂開發報錯:connect with z1_arm wait time out 排查

      在 Z1 機械臂開發過程中,,,,若出現 connect with z1_arm wait time out 連接超時報錯,,,,可按照以下順序逐項排查,,定位並解決問題。。。。

      原因一 硬件連接或 IP 配置異常

      排查要點:確認 PC 與機械臂為直連狀態;使用 ping 命令測試與機械臂的網絡連通性,,,,默認目標 IP 為 192.168.123.110,,,若曾修改過機械臂 IP,,,則以修改後的地址為準。。

      解決辦法:檢查硬件連接線是否松動,,,核對 PC 網卡 IP 與機械臂 IP 是否處於同一網段,,,確保二者網絡通信正常。。。

      原因二 配置文件 IP 不匹配

      排查要點:打開 SDK 對應的 config 配置文件,,,,檢查文件內填寫的機械臂 IP,,,是否與實際可 ping 通的機械臂 IP 完全相同(默認 IP 為 192.168.123.110)。。。。

      解決辦法:將配置文件中的 IP 修正為機械臂主網口的實際 IP,,,,確保二者完全匹配。。。。

      原因三 硬件通訊網口選擇錯誤

      Z1 機械臂的通訊網口有明確限制,,,,錯誤使用網口會導致連接失敗。。。

      排查要點:確認與 PC 連接的網口為機械臂左側主網口,,該網口為唯一支持與上位機通訊的接口。。。 解決辦法:將 PC 網線接入機械臂左側主網口,,,使用正確網口建立通訊連接。。。

      原因四 更換控制電腦未重啟機械臂

      機械臂上電後會自動與當前上位機綁定端口號,,,更換控制電腦後直接連接會觸發端口綁定沖突。。。

      排查要點:本次連接是否更換了控制機械臂的電腦設備。。。。 解決辦法:將機械臂斷電,,等待 10~20 秒後重新上電,,,完成端口號的重新綁定。。。

      原因五 udp沖突問題

      設備後台存在其他占用 UDP 端口的程序,,會與 SDK 爭奪機械臂的控制權限,,,導致連接超時。。。。

      排查要點:檢查是否存在以下程序: 與機械臂聯動的機器狗設備中,,是否有遙控器自啟文件在控制機械臂; 當前控制 PC 的後台,,,是否有未關閉的 ctrl 控制程序或其他曾運行過的機械臂控制進程。。。。 解決辦法:關閉所有Z1的相關程序,,,,再將機械臂斷電重啟,,即可恢覆正常連接。。。

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

      Z1機械臂關鍵參數速覽

      機械臂電機關鍵參數速覽

      基本參數

      參數項 參數值
      電機波特率 4.8M
      電機減速比 65
      供電電壓 寬壓20-28V(推薦24V)
      電機保護溫度 85°

      通信頻率

      • z1_ctrl與機械臂通訊頻率:250Hz
      • z1_sdk與z1_ctrl通訊頻率:500Hz

      建模方法

      • 方法:旋量法
      • 模型文件:URDF文件
      • 備注:不提供DH參數
      來源文件:開發幫助_032004.md
      Q

      B2 機器狗機械臂自啟服務說明

      B2 機器狗機械臂自啟服務說明

      本文檔適用於宇樹 B2 機器狗 + Z1 機械臂配套設備,,,主要說明 PC4 上機械臂相關自啟服務的作用、、使用方式及注意事項。。。。

      一、、、、服務概述

      B2 機器狗配套 Z1 機械臂在 PC4 端運行兩個關鍵系統服務,,,,分別負責機械臂控制核心程序與遙控器手柄控制功能,,,,均以 systemd 自啟服務形式運行。。

      二、、、、服務列表與功能說明

      z1_ctrl.service

      • 作用:機械臂控制核心服務,,,,負責機械臂運動控制、、狀態機管理、、、日志輸出等核心邏輯。。
      • 日志功能:終端實時輸出機械臂工作日志,,,可通過日志判斷機械臂當前狀態(如 passive 待機狀態)、、運行情況及異常報錯。。。。
      • 依賴關系:機械臂正常工作的基礎服務,,為上層控制提供底層支撐。。。。

      z1_joystick.service

      • 作用:宇樹原裝遙控器(手柄)控制機械臂的專用服務。。
      • 使用場景:僅在使用原廠遙控器操控機械臂時需要運行。。。。
      • 沖突說明:與第三方 / 自主開發程序互斥,,,,同一時間僅允許一套控制程序生效。。。。

      三、、、常用操作命令

      所有操作均在設備 PC4 中執行,,需使用 sudo 權限。。

      1. 查看服務狀態

      sudo systemctl status z1_ctrl.service
      sudo systemctl status z1_joystick.service
      

      2.啟動服務

      sudo systemctl start z1_ctrl.service
      sudo systemctl start z1_joystick.service
      

      3. 停止服務

      sudo systemctl stop z1_ctrl.service
      sudo systemctl stop z1_joystick.service
      

      4.設置開機自啟 / 禁用自啟

      # 啟用開機自啟
      sudo systemctl enable z1_ctrl.service
      sudo systemctl enable z1_joystick.service
      
      # 禁用開機自啟
      sudo systemctl disable z1_ctrl.service
      sudo systemctl disable z1_joystick.service
      

      四、、使用注意事項

      1.出廠默認配置 標準出廠設備 PC4 已默認部署並啟用上述兩個服務,,開機自動運行。。。 2.單程序獨占控制 機械臂同一時間僅支持單一程序控制,,不支持多程序同時占用。。 3.自主開發 / 調試說明 若需要進行二次開發、、、、SDK 調試或自定義控制機械臂: 必須先停止原廠服務,,,,避免端口占用、、、指令沖突。。 建議關閉服務:

      sudo systemctl stop z1_ctrl.service
      sudo systemctl stop z1_joystick.service
      

      4.日志排查 z1_ctrl.service 會持續輸出機械臂狀態日志,,,可直接用於: - 判斷機械臂是否正常上線 - 查看當前狀態機(如 passive 模式) - 定位通信異常、、、運動報錯等問題

      五、、、、典型場景建議

      使用原裝遙控器操控機械臂:保持兩個服務默認啟動即可,,,無需手動操作。。。。 使用自己寫的程序控制機械臂:關閉 z1_joystick.service 和 z1_ctrl.service,,,,再運行自定義程序。。 排查機械臂無法控制:先用 status 命令檢查服務是否正常運行,,,,再查看日志判斷異常原因。。

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

      D1產品資料

      開發及使用資料

      在線開發及使用文檔:

      urdf文件:

      連接Go2

      D1機械臂安裝在Go2上參考: 安裝示意圖:

      常見問題

      1、、、D1供電正常指示燈(如圖): 如果供電指示燈不亮可能是接口有問題,,建議走工單和技術支持確定下是否需要返廠檢修。。。

      2、、SDK編譯完成後運行程序報錯截圖(找不到dds庫相關組件): 排查:使用ldd命令檢查程序依賴的共享庫: 在終端手動指定相關庫解決:

      export LD_LIBRARY_PATH=/opt/ros/foxy/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
      

      3、、、關於在線開發文檔中指令接受&反饋使用:

      這個只有在給機械臂發命令的時候調用例程中

      get_arm_joint_angle.cpp: 獲取機械臂關節角度值示例程序才會在終端有反饋,,如圖:

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

      GO-M8010-6

      Q:GOM電機官網上寫最大相電流是40A,,,這個是指有效值還是峰值??另外就是扭矩系數0.63895Nm/A,,它的定義中是輸出扭矩除以相電流有效值還是幅值??

      A:都是峰值

      Q:GOM電機485線序是多少

      A:線序如下圖所示

      Q:GOM電機波特率能支持其他嗎? 串口芯片可以不用官方的嗎????

      A: 只能支持4000000波特率。。 芯片可以不使用官方的,,,但是需要支持到這麼高的波特率。。

      Q:A1 與 GOM電機背隙是多少??

      A: 所有電機背隙為±0.2°。。

      Q:A1 與 GOM最高通信頻率各是多少???

      A: GOM通信頻率最高6k,,A1最高3k

      Q:XT30(2+2)信號線電源線AWG各是多少?

      XT30信號線是26AWG。。。。電源是17AWG

      Q:如何校準零位?

      A: 建議使用軟件校準。。電機上電,,,,讀一下當前位置(需要在0到6.28弧度,,,,具體原理參考上圖單圈絕對編碼器斷電丟失記錄圈數),,,,在電機輸出軸做下標記,,下次上電的時候位置在軟件上設置成上次讀取的電機位置(相當於手動標記0位),,,,並前轉軸也轉到相應上次標記的位置,,電機不轉;然後跑準你指定的位置的話在讀取的電機位置的地方做相應弧度偏移就可以。。。。

      Q:特征曲線輸出力矩是轉子端還是輸出端???

      A: 是轉子端的,,,要轉化為輸出端需要乘以減速比。。。。

      Q:A1電機波特率能支持其他嗎? 串口芯片可以不用官方的嗎????

      A: 只能支持4800000波特率。。。。 芯片可以不使用官方的,,但是需要支持到這麼高的波特率。。

      Q:額定扭矩與額定功率各是多少????

      A: A1電機的額定扭矩在9N/M,,,額定功率在150W。。。 GOM電機的額定扭矩在4.1N/M,,額定功率在103W。。。。

      Q:上位機工具有哪些???

      A: 暫時只有GOM電機有windows上的圖形化上位機程序。。。 A1只有命令行上位機程序。。。。

      Q: 電機報錯信息代表什麼意思???

      A: A1電機返回報錯信息如下: 0 無錯誤 ;1 過流保護 ; 2 繞組漏電 ; 4 溫度保護 ; 64 編碼器異常。。。。GOM電機錯誤代碼:0 無錯誤; 1過熱; 2過流; 3 過壓; 4編碼器錯誤; 5欠壓;6繞組過熱。。。。

      Q: GOM電機輸出端最大空載轉速是多少????

      A:輸出端輸出軸空載最大轉速:235rpm

      Q: A1電機與GOM電機有驅動器的PVT功能嗎????

      A: A1電機、、、GOM電機均不支持驅動器的PVT功能,,也沒有插補功能。。。

      Q: A1電機與GOM電機的限位各是什麼樣的????

      A: 請參考下圖。。。。

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

      GOM電機螺絲固定深度

      GOM電機螺絲深度請根據結構圖來確定

      外殼前後的螺孔

      輸出端的螺孔

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

      GOM/A1電機常見問題

      Q:GOM電機官網上寫最大相電流是40A,,,這個是指有效值還是峰值???另外就是扭矩系數0.63895Nm/A,,它的定義中是輸出扭矩除以相電流有效值還是幅值???

      A:都是峰值

      Q:GOM電機485線序是多少

      A:線序如下圖所示

      Q:GOM電機波特率能支持其他嗎? 串口芯片可以不用官方的嗎????

      A: 只能支持4000000波特率。。 芯片可以不使用官方的,,,,但是需要支持到這麼高的波特率。。

      Q:A1 與 GOM電機背隙是多少????

      A: 所有電機背隙為±0.2°。。。。

      Q:A1 與 GOM最高通信頻率各是多少????

      A: GOM通信頻率最高6k,,A1最高3k

      Q:XT30(2+2)信號線電源線AWG各是多少?

      XT30信號線是26AWG。。電源是17AWG

      Q:如何校準零位?

      A: 建議使用軟件校準。。。。電機上電,,,,讀一下當前位置(需要在0到6.28弧度,,,具體原理參考上圖單圈絕對編碼器斷電丟失記錄圈數),,,,在電機輸出軸做下標記,,,下次上電的時候位置在軟件上設置成上次讀取的電機位置(相當於手動標記0位),,,,並前轉軸也轉到相應上次標記的位置,,電機不轉;然後跑準你指定的位置的話在讀取的電機位置的地方做相應弧度偏移就可以。。。

      Q:特征曲線輸出力矩是轉子端還是輸出端???

      A: 是轉子端的,,要轉化為輸出端需要乘以減速比。。。

      Q:A1電機波特率能支持其他嗎? 串口芯片可以不用官方的嗎???

      A: 只能支持4800000波特率。。。。 芯片可以不使用官方的,,,,但是需要支持到這麼高的波特率。。。

      Q:額定扭矩與額定功率各是多少???

      A: A1電機的額定扭矩在9N/M,,,額定功率在150W。。 GOM電機的額定扭矩在4.1N/M,,,,額定功率在103W。。

      Q:上位機工具有哪些???

      A: 暫時只有GOM電機有windows上的圖形化上位機程序。。 A1只有命令行上位機程序。。。。

      Q: 電機報錯信息代表什麼意思???

      A: A1電機返回報錯信息如下: 0 無錯誤 ;1 過流保護 ; 2 繞組漏電 ; 4 溫度保護 ; 64 編碼器異常。。GOM電機錯誤代碼:0 無錯誤; 1過熱; 2過流; 3 過壓; 4編碼器錯誤; 5欠壓;6繞組過熱。。

      Q: GOM電機輸出端最大空載轉速是多少???

      A:輸出端輸出軸空載最大轉速:235rpm

      Q: A1電機與GOM電機有驅動器的PVT功能嗎??

      A: A1電機、、、、GOM電機均不支持驅動器的PVT功能,,,,也沒有插補功能。。

      Q: A1電機與GOM電機的限位各是什麼樣的????

      A: 請參考下圖。。。

      Q: GOM電機的欠壓過壓閾值是多少?

      欠壓11 過壓45

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

      GOM電機SDK常見問題

      • unitree官方只提供linux上的SDK。。。。您這邊需要使用其他平台控制,,,請自行根據編寫。。 這邊有串口協議的c語言封裝。。。。 頭文件:

        ifndef UNITREEMOTORGOM_H

      define UNITREEMOTORGOM_H

      ifdef __cplusplus

      extern "C" {

      endif

      include

      include

      include

      pragma pack(push, 1)

      struct MotorCmdGom { uint16_t head; uint8_t mod; int16_t t; int16_t w; int32_t pos; uint16_t kp; uint16_t kd; uint16_t crc16; }; struct MotorDataGom { uint16_t head; uint8_t mod; int16_t t; int16_t w; int32_t pos; uint8_t temp; uint16_t reserve; uint16_t crc16; };

      pragma pack(pop)

      uint16_t crc_ccitt(uint16_t crc, uint8_t const buffer, size_t len); bool generate_crc16_cmd(struct MotorCmdGom cmd); bool verify_crc16_data(struct MotorDataGom data); bool initMotoCmdGom(struct MotorCmdGom cmd, const unsigned short ID, const unsigned short MODE, const float T, const float W, const float POS, const float K_P, const float K_W); bool depackMotoDataGom(const struct MotorDataGom , unsigned short ID, unsigned short MODE, float T, float W, float POS, int TEMP, int ERROR, int FOOFORCE);

      ifdef __cplusplus

      }

      endif

      endif

      源文件:

      include "unitreeMotorGom.h"

      define PI 3.14159265358979323846f

      define CRC16_CCITT_POLY 0x1021

      define CRC16_CCITT_INIT 0x0000

      static uint16_t crc16_ccitt_table[256] = { 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78}; static uint16_t crc_ccitt_byte(uint16_t crc, const uint8_t c) { return (crc >> 8) ^ crc16_ccitt_table[(crc ^ c) & 0xff]; } uint16_t crc_ccitt(uint16_t crc, uint8_t const buffer, size_t len) { while (len--) crc = crc_ccitt_byte(crc, buffer++); return crc; } bool generate_crc16_cmd(struct MotorCmdGom cmd) { // 生成MotorCmdGom結構體的CRC16校驗碼 uint16_t crc = CRC16_CCITT_INIT; crc = crc_ccitt(crc, (uint8_t )cmd, sizeof(struct MotorCmdGom) - sizeof(uint16_t)); cmd->crc16 = crc; return true; // 返回生成是否成功 } bool verify_crc16_data(struct MotorDataGom data) { // 驗證MotorDataGom結構體的CRC16校驗碼 uint16_t crc = CRC16_CCITT_INIT; crc = crc_ccitt(crc, (uint8_t )data, sizeof(struct MotorDataGom) - sizeof(uint16_t)); return (crc == data->crc16); // 返回驗證結果 } bool initMotoCmdGom(struct MotorCmdGom cmd, const unsigned short ID, const unsigned short MODE, const float T, const float W, const float POS, const float K_P, const float K_W) { // 初始化MotorCmdGom結構體 // 具體實現根據協議進行數據轉換和賦值 if (MODE > 2 || MODE < 0) return false; if (ID > 15 || ID < 0) return false; if (T < -127 || T > 127) return false; if (W < -804 || W > 804) return false; if (POS < -411774 || POS > 411774) return false; if (K_P < 0 || K_P > 25.5) return false; if (K_W < 0 || K_W > 25.5) return false; cmd->head = 0xEEFE; cmd->mod = ((MODE & 0x0F) << 4) | (ID & 0x0F); float t_val = (T) * 256; cmd->t = (int16_t)(t_val); float w_val = (W) / (2 * PI) * 256; cmd->w = (int16_t)(w_val); float pos_val = (POS) / (2 * PI) * 32768; cmd->pos = (int32_t)(pos_val); float kp_val = (K_P) * 1280; cmd->kp = (uint16_t)(kp_val); float kw_val = (K_W) * 1280; cmd->kd = (uint16_t)(kw_val); return generate_crc16_cmd(cmd); // 返回初始化是否成功 } bool depackMotoDataGom(const struct MotorDataGom data, unsigned short ID, unsigned short MODE, float T, float W, float POS, int TEMP, int ERROR, int FOOFORCE) { // 解包MotorDataGom結構體 // 具體實現根據協議進行數據轉換和賦值 if (!verify_crc16_data((struct MotorDataGom )data)) { return false; // CRC校驗失敗,,,,返回解包失敗 } if (data->head != 0xEEFD) { return false; // 數據頭錯誤,,,返回解包失敗 } MODE = (data->mod >> 4) & 0x0F; ID = (data->mod) & 0x07; T = ((data->t)) / 256.0f; W = (((data->w)) / 256.0f) * 2 * PI; POS = (((data->pos)) / 32768.0f) * 2 * PI; TEMP = (int)(data->temp); ERROR = (int)(data->reserve >> 13) & 0x07; *FOOFORCE = (int)(data->reserve >> 1) & 0xFFF; return true; // 返回解包是否成功 }

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

      GoM電機轉子慣量

      unit: kg, meter coordinate: Z axis is the same as rotation axis, positive direction is from big end to little end. Origin point is the same as motor. mass: 0.089 COM: 0, 0, -0.0026; Inertia: 0.000059647, 0.000000000, 0.000000000, 0.000000000, 0.000059647, 0.000000000, 0.000000000, 0.000000000, 0.000111842;

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

      A2

      遇到雷達發生絲狀畸變或吸引畸變的情況,,,可以參考以下方案進行雷達固件更新。。。。

      首先,,,,下載,,,,得到兩個文件:

      • LidarUtilities_Sample_JT128_3.0.3_db4e558_ubuntu22.out
      • 雷達上位機調試軟件
      • PRE_NO_APP(15.AF.B0.00.02.L)_BIT(1.b.0028)_PBL(15.BF.B0.00.01.0)_TBIT(2.b.0563)_26-03-12_BE2CE1BC_RELEASE_1.patch
      • 雷達最新版固件

      需要在你的電腦上安裝Nomachine(Windows或Linux都可以)

      隨後,,,,需要連接A2,,,進入PC2的終端,,啟動用戶根目錄下的nomachine。。

      ssh unitree@192.168.123.162
      (密碼Unitree#24226)
      ./nomachine.sh
      

      在主界面選擇對應的IP進行連接。。如果沒有掃描到設備,,,則點擊左上角Add手動添加192.168.123.162。。

      新建一個終端,,使用scp將之前下載的壓縮文件傳入PC2,,,,並解壓

      scp 壓縮包位置.zip unitree@192.168.123.162:/home/unitree
      ssh unitree@192.168,.123.162
      unzip 壓縮包名稱
      

      在Nomachine的圖形界面進入終端,,進入解壓的文件夾內,,賦予上位機權限並運行。。

      cd ~/解壓位置
      chmode +x ./LidarUtilities_Sample_JT128_3.0.3_db4e558_ubuntu22.out
      ./LidarUtilities_Sample_JT128_3.0.3_db4e558_ubuntu22.out
      

      在彈出的界面中,,,填入需要更新固件的雷達IP地址(前:192.168.124.20/後:192.168.124.21),,點擊Connect

      連接成功如圖所示

      點擊左邊邊框的Upgrade,,,,再點擊Upload,,,,選擇文件夾中的固件包。。

      等待進度條走到100%視為完成,,,點擊右上角進行重啟後生效。。

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

      A2雷達進行固件更新的說明

      遇到雷達發生絲狀畸變或吸引畸變的情況,,,,可以參考以下方案進行雷達固件更新。。。。

      首先,,,,下載,,得到兩個文件:

      📥雷達上位機調試軟件: LidarUtilities_Sample_JT128_3.0.3_db4e558_ubuntu22.out

      📖雷達最新版固件: PRE_NO_APP(15.AF.B0.00.02.L)_BIT(1.b.0028)_PBL(15.BF.B0.00.01.0)_TBIT(2.b.0585)_26-03-17_9445D9DE_RELEASE.patch

      隨後,,,,需要在您的電腦上安裝Nomachine。。。 |

      隨後,,需要連接A2

      !!! note 連接A2的方式

      連接A2一共兩種方式。。。

      一、、、、將A2設置為AP模式。。此時,,您可以在周圍搜索到名稱為A2-*的熱點。。。。默認密碼為88888888。。。。您也可以在設置AP模式時使用您指定的SSID和密碼。。。。 連接此熱點(不提供網絡訪問),,,,可以進入內部局域網。。。。

      二、、、、參考的方法有線連接A2.

      !!!

      進入PC2的終端

      ssh unitree@192.168.123.162
      (密碼Unitree#24226)
      

      啟動用戶根目錄下的nomachine。。

      
      ./nomachine.sh
      

      在主界面選擇對應的IP進行連接。。。。如果沒有掃描到設備,,則點擊左上角Add手動添加192.168.123.162。。

      將之前下載的壓縮文件傳入PC2

      !!! note 將文件傳入PC2的方式

      您可以在您的機器上(Windows和Linux都支持)使用SCP工具,,將文件傳入PC2後解壓。。

      scp 壓縮包位置.zip unitree@192.168.123.162:/home/unitree
      ssh unitree@192.168,.123.162
      unzip 壓縮包名稱
      

      或者,,您可以使用Nomachine遠程內置的文件傳輸將文件傳入。。。。您需要先解壓壓縮包,,然後逐個按照圖示的步驟,,分別點擊左上角-Transform a file,,,,Upload file from the client。。

      隨後將解壓出的文件一個一個傳入:

      !!!

      隨後,,,在Nomachine的圖形界面進入終端,,,,進入傳遞文件的文件夾內,,賦予上位機權限並運行。。。

      cd ~/解壓位置
      chmod +x ./LidarUtilities_Sample_JT128_3.0.3_db4e558_ubuntu22.out
      ./LidarUtilities_Sample_JT128_3.0.3_db4e558_ubuntu22.out
      

      在彈出的界面中,,,填入需要更新固件的雷達IP地址(前:192.168.124.20/後:192.168.124.21)

      點擊Connect

      連接成功如圖所示

      點擊左邊邊框的Upgrade,,再點擊Upload,,,選擇文件夾中的固件包。。

      等待進度條走到100%視為完成,,,點擊右上角進行重啟後生效。。。。

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

      A2/A2-W產品資料&開發資料

      手冊、、說明書

      • A2/A2-W 說明書:

      • A2/A2-W 開發文檔:

      模型、、、圖紙

      • A2/A2-W 三維簡化模型(A2 SDK 開發指南 - 應用開發 - 獲取SDK與開發資源):

      • A2/A2-W URDF(A2 SDK 開發指南 - 應用開發 - 獲取SDK與開發資源):

      • A2/A2-W 導軌圖(A2 SDK 開發指南 - 關於A2 - 背部負載安裝孔位圖):

      • A2/A2-W 電氣接口(A2 SDK 開發指南 - 關於A2 - 電氣接口):

      • A2/A2-W 2+2線纜接口定義(A2 SDK 開發指南 - 關於A2 - (2+2) 功率線接口含義):

      • A2/A2-W 8+2線纜接口定義(A2 SDK 開發指南 - 關於A2 - (8+2) 信號線接口含義):

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

      A2開發板卡的IP、、、、用戶名和密碼是多少????

      A2有一塊運控計算單元和一塊用戶開發單元。。。 運控計算單元 IP為192.168.123.161,,,,不可登錄不可開發。。。 用戶開發單元 IP為192.168.123.162,,用戶名unitree,,,,密碼為Unitree#24226 或 Unitree0408。。。。

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

      A2選裝的雷達型號是什麼??

      A2選用的激光雷達為Hesai JT128。。。。開發接口可以參考:

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

      A2雷達IP及如何判斷雷達是否正常工作

      一、、、、雷達IP地址

      1. A2(單雷達配置)

      A2型號配備一個前雷達,,,IP地址為:

      雷達位置 IP地址
      前雷達 192.168.124.20

      2. A2 Pro(雙雷達配置)

      A2 Pro型號配備兩個雷達,,IP地址分別為:

      雷達位置 IP地址
      前雷達 192.168.124.20
      後雷達 192.168.124.21

      二、、判斷雷達是否正常工作的兩種方法

      方法一:通過PC2交換機網口(6號口)Ping檢測

      操作步驟:

      1.將調試電腦網線接入機器狗的6號口(PC2交換機網口)。。。

      2.將電腦接A2的網口ip改成192.168.124.222 3.執行ping命令檢測對應雷達的IP地址:

      • A2(單雷達):ping 192.168.124.20
      • A2 Pro(雙雷達):
        • 檢測前雷達:ping 192.168.124.20
        • 檢測後雷達:ping 192.168.124.21

      判斷標準:

      • 能ping通 → 雷達網絡連接正常,,雷達基本工作狀態正常
      • ping不通 → 雷達可能存在網絡連接問題或設備故障

      方法二:通過安卓手機攝像頭檢測紅光

      操作步驟:

      1.打開安卓手機的相機應用。。 2.將手機攝像頭對準雷達發射窗口。。 3.通過手機屏幕觀察雷達發射窗口是否有紅光發出。。。

      判斷標準:

      • 能觀察到紅光 → 雷達激光發射模塊正常工作
      • 觀察不到紅光 → 雷達工作異常
      來源文件:開發幫助_032305.md
      Q

      能否在PC1 Ethernet(123)上安裝路由器???

      絕對不允許!!!!!!!路由器會破壞內部交換機的拓撲關系,,,,影響內部程序。。。會導致機器狗間歇性全部電機失聯。。。。千萬不要這麼做!!

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

      拓展塢網絡拓撲圖

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

      H2產品資料&開發資料

      手冊、、、說明書

      • H2 教學視頻:

      • H2 開發文檔:

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

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

      模型、、、圖紙

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

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

      • H2 末端圖紙、、模型、、、裝配示意:

      H2假手法蘭圖紙:

      H2手腕抱箍模型:

      H2 使用手冊:

      H2-遙控器:

      H2 電池&遙控器:

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

      H2用戶接口模塊-typec接口介紹

      H2用戶接口模塊——type-c接口介紹

      H2設備支持選配不同數量的PC模塊,,不同PC配置下,,機身Type-C接口的功能劃分、、接口定義存在對應差異。。。用戶可根據自身設備的PC配置,,,,對應參考接口示意圖與功能介紹。。。。

      內部包含 PC2

      PC2接口:type-c接口[3]、、、、[4]、、、[5]、、、[7]、、[8]、、、[9](紅框內接口),,,type-c接口[3]帶DP輸出。。。

      內部包含 PC2+PC3

      PC2接口:type-c接口[3]、、、[5]、、、[7]、、[9](紅框內接口),type-c接口[3]帶DP輸出。。。。

      PC3接口:type-c接口[4]、、、[8](藍框內接口),type-c接口[4]帶DP輸出。。

      內部包含 PC2+PC3+PC4

      PC2接口:type-c接口[3]、、、[7](紅框內接口),type-c接口[3]帶DP輸出。。

      PC3接口:type-c接口[4]、、[8](藍框內接口),type-c接口[4]帶DP輸出;

      PC4接口:type-c接口[5]、、[9](綠框內接口),type-c接口[5]帶DP輸出;

      注: 1.帶DP輸出指可使用該接口接外部顯示器,,通常推薦使用type-c轉hdmi後,,,使用hdmi線接顯示器。。

      2.H2拓撲圖:

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

      H2用戶接口模塊-網口介紹

      H2用戶接口模塊-網口介紹

      H2設備用戶接口模塊搭載兩個獨立RJ45網口,,,兩個網口對應不同的專屬網段IP,,,,具體接口定義與使用規範如下。。。

      網口網段對應關系:

      網口[12]:對應 192.168.123.x 網段

      網口[15]:對應 192.168.124.x 網段

      設備內部PC2適配雙網段架構,,,兩個RJ45網口分別對應獨立的123網段、、、124網段,,,網段相互獨立。。。

      網口使用場景區分:

      1、、、網口[12](192.168.123.x網段):為設備常規調試通用網口,,,,主要用於設備整機調試、、、與192.168.123.161等123網段板卡進行跨板卡通信,,,日常設備調試優先使用該網口。。。。

      2、、網口[15](192.168.124.x網段):為PC2專屬拓展網口,,適用於PC2二次開發場景,,,,可外接雷達等外部傳感設備;僅需單獨與PC2通信、、、、無需對接其他板卡的場景,,,也可使用該網口,,,實現獨立網段通信,,,規避其他設備通信幹擾。。。。

      調試說明

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

      Step 2: User PC 通過以太網線,,,根據需求連接設備的RJ45口, 即可進行通信調試。。。(同行情況下使用網口[12]即可)

      !!! 注: - 兩個網段相互獨立,,,,不可跨網段通信,,,接線調試時需保證電腦IP與設備網口網段一致; - 日常常規調試優先選用123網段網口[12],,,是設備默認通用調試網口; - 124網段網口[15]專屬服務於PC2獨立開發,,,,可有效隔離整機板卡通信數據,,,,保障算法開發、、、、外設調試的穩定性。。。。

      H2-拓撲圖

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

      H2用戶接口模塊-電氣接口介紹

      H2用戶接口模塊-電氣接口介紹

      H2搭載兩類可對外供電接口,,分別為Type-C和GXT30(2)-M接口,,,,具體接口定義與使用規範如下:

      1.Type-C接口

      參數:5V / 2A 電源輸出

      2. GXT30 (2)-M 接口(重要提示:≠ XT30 接口,,,嚴禁直接使用 XT30 插頭安裝,,,,必須使用原廠配套配件並按標識接線)

      GXT30(2)-M 接口具體功率如下: [1] GXT30(2)-M VBAT+485 54V/10A電池電源輸出 (此處直連電池電源) +485通信(連接到pc2) [2] GXT30(2)-M 24V+CAN 24V/10A電源輸出+CAN(連接到pc2) [10]GXT30(2)-M 12V+485 12V/10A電源輸出+485通訊(連接到pc2) [11]GXT30(2)-M 24V+CAN 24V/10A電源輸出+CAN(連接到pc2)

      GXT30 (2)-M 實物照片:

      GXT30 (2)-M 引腳定義圖:

      串口名稱 /dev/ttyUN0 /dev/ttyUN1 /dev/can0 /dev/can1

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

      As2/As2-W產品資料&開發資料

      手冊、、說明書

      • As2/As2-W 說明書:

      • A2/A2-W 開發文檔:

      模型、、、、圖紙

      • As2/As2-W 三維簡化模型(As2 SDK 開發指南 - 應用開發 - 獲取SDK與開發資源):

      • As2/As2-W URDF(As2 SDK 開發指南 - 應用開發 - 獲取SDK與開發資源):

      • As2/As2-W 導軌圖(As2 SDK 開發指南 - 關於As2 - 背部負載安裝孔位圖):

      • As2/As2-W 電氣接口(As2 SDK 開發指南 - 關於As2 - 電氣接口):

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

      人形機器人的應用場景

      包括但不限於工業流水線,,,教育開發,,,,強化學習等

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

      按遙控器沒反應

      連app看電機是否失聯,,,,如果電機正常聯系技術支持

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

      首次開機姿勢怪異

      聯系技術支持進行標定

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

      A1電機轉子慣量

      [ 0.000064001,,0,,,0,,, 0,,0.000064001,,,0,,, 0,,,,0,,,,0.000119086 ]

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

      mid360雷達的ip是多少,,,,如何進行開發???

      1.基本介紹: 目前Unitree在H1,H1-2並沒有提供相關API,,,,暫時沒有功能可以展示,,可以按照下文自行進行硬件連接/開發 2.硬件連接: 如下圖為Mid360以及相機末端線纜,,,TypeC為相機線,,另外一根為Mid360通信線纜 需要根據自身開發需求進行硬件連接,,,,如下圖為H1機身側面的硬件接口圖,,,可以將相機線連接到圖中"Switch Ethernet"以及"PC2 Ethernet",,,,"PC3 Ethernet"的位置 Mid360的ip地址是:192.168.123.120.如果可以ping通,,,那麼就可以進一步開發。。 3.sdk以及上位機:

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

      H1如何使用遙操作

      apple vision版本的遙操作適配H1-2,,,,Kinect camera版本的遙操作適配H1,,,具體操作見文檔中心

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

      H1有ros以及ros2接口嘛??

      ros有 需要自己開發,,,,ros2目前只有底層,,參考文檔

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

      H1相機如何開發???

      ROS需自行開發接口。。。。 ROS2目前有底層接口,,,參考文檔:

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

      unitreeros庫中的urdf模型和unitreer gym庫中的urdf模型有什麼區別?

      unitree_ros是給一個盡可能反應機械結構的urdf,,,unitree_rl_gym是為了rl專門改的,,有的地方幾何形狀是不一樣的。。所以做了一些近似處理,,,可能不完全準確

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

      Unitree是否提供H1控制的Pid參數??

      RL例程一套推薦參數,,,站立和簡單移動的例程:

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

      H1整機的控制頻率是多少????

      H1整機以及所有單電機的數據更新頻率都是500HZ

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

      H1各個電機的減速比是多少???

      H1的小電機(GoM8010高壓電機)上肢的pitch、、roll以及腳踝電機減速比約等於18.296,,,其餘的大約為6.33 H1的大電機M107電機減速比,,,膝關節電機減速比為24,,,,其餘關節大約為15

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

      遙控器是否支持python二次開發?

      遙控器本身不支持開發,,可以通過sdk獲取按鍵是否被按下。。。。 可以使用python接口獲取遙控器狀態。。。。 要實現”按下遙控器的某個鍵後控制機器狗趴下“,,,可以通過接口獲取按鍵狀態,,,和通過接口控制機器狗趴下,,實現這個功能場景。。

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

      sdk程序和遙控器的通信是通過wifi網絡的mqtt協議完成的嗎?

      遙控器按鍵獲取不是通過wifi網絡的mqtt協議。。。。遙控器和狗直接相連,,,,可以通過狗的sdk,,,獲取遙控器的按鍵狀態。。。。

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

      H1如何切換motion_switch?

      1. 將關於motion_switcher的頭文件拷貝到H1機器人的頭文件中。。。

      具體要將

      unitree_sdk2/include/unitree/robot_b2/motion_switcher

      路徑下的如下三個文件:

      motion_switcher_api.hpp motion_switcher_client.hpp motion_switcher_error.hpp

      拷貝到如下路徑:

      unitree_sdk2/include/unitree/robot/h1/loco/

      2.修改cpp:

      進入example中新建文件夾motion_switcher,然後新建一個.cpp文件,,這里也命名為motion_switcher在其中編寫:

      ``` bash

      include

      include

      include

      int main() { // 初始化 ChannelFactory unitree::robot::ChannelFactory::Instance()->Init(0);

      // 創建 MotionSwitcherClient 實例
      unitree::robot::b2::MotionSwitcherClient msc;
      
      // 設置超時並初始化
      msc.SetTimeout(5.0f);
      msc.Init();  // 執行初始化
      
      
      // 提示用戶選擇操作
      char choice;
      std::cout << "Would you like to (e)nable or (d)isable Silent Mode? (e/d): ";
      std::cin >> choice;
      
      bool enableSilent = (choice == 'e' || choice == 'E');
      int ret = msc.SetSilent(enableSilent);
      
      if (ret == 0) {
          std::cout << (enableSilent ? "Silent mode enabled successfully." : "Silent mode disabled successfully.") << std::endl;
      } else {
          std::cerr << "Failed to change Silent mode status." << std::endl;
          return -1;
      }
      
      // 檢查靜音模式是否已成功切換
      bool isSilent = false;
      if (msc.GetSilent(isSilent) == 0) {
          std::cout << "Current Silent mode: " << (isSilent ? "On" : "Off") << std::endl;
      } else {
          std::cerr << "Failed to retrieve Silent mode status." << std::endl;
      }
      

      ``` 3.修改Cmakelist:

      ``` bash

      add_executable(h1_loco_client high_level/h1_loco_client_example.cpp) target_link_libraries(h1_loco_client unitree_sdk2)

      add_executable(h1_low_level_example low_level/humanoid.cpp) target_link_libraries(h1_low_level_example unitree_sdk2)

      add_executable(h1_27dof_example low_level/h1_27dof_example.cpp) target_link_libraries(h1_27dof_example unitree_sdk2)

      add_executable(h1_2_ankle_track low_level/h1_2_ankle_track.cpp) target_link_libraries(h1_2_ankle_track unitree_sdk2)

      add_executable(h1_arm_sdk_dds_example high_level/h1_arm_sdk_dds_example.cpp) target_link_libraries(h1_arm_sdk_dds_example unitree_sdk2)

      add_executable(h1_2_arm_sdk_dds_example high_level/h1_2_arm_sdk_dds_example.cpp) target_link_libraries(h1_2_arm_sdk_dds_example unitree_sdk2)

      add_executable(h1_motion_switcher motion_switcher/ h1_motion_switcher.cpp) target_link_libraries(h1_motion_switcher unitree_sdk2) ``` 4.編譯運行:

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

      App點擊ota升級顯示ap連接無法升級

      ap連接下無法升級,,在app中點擊設備-機器狗設置,,,選擇WiFi連接模式後再進行ota升級

      來源文件:通用排障_190.md
      Q

      App顯示版本過低,,需要升級,,,如何處理??

      請保證APP是最新版本,,,嘗試自行升級,,如果失敗請聯系官方技術支持進行升級

      來源文件:通用排障_209-.md
      Q

      APP顯示欠費或者account insufficient

      如需充值,,,請淘寶搜索宇樹科技,,,,找客服充值,,,或聯系sales_hzy@unitree.com

      來源文件:通用排障_210-.md
      Q

      APP無法顯示圖傳

      確認相機運行情況,,,,具體參照文檔中的幫助進行排查

      來源文件:通用排障_211-.md
      Q

      遙控器正常開機了,,,但是無法控制機器狗是什麼原因

      檢查遙控信號指示燈是否正常亮起,,,若未連接,,請檢查遙控器是否和設備對應;其他情況請提交售後工單聯系技術支持

      來源文件:通用排障_63-64.md
      Q

      遙控器無法控制機器狗

      使用前需要先配對,,,可以使用App對go2和遙控器進行配對

      來源文件:通用排障_65-66.md
      Q

      遙控器匹配問題

      當前Go2 H1 B2 G1 都提供了配對遙控器的功能,,,,如果您的遙控器遺失了,,,剛好手里有另一款產品可以通過APP來配對,,,當然Go1 A1B1的部分遙控器也支持配對。。

      來源文件:通用排障_66-67.md
      站点地图
      站点地图