Unitree 1. 板间通信和数据获取

官方文档:

Go1 — Unitree_Docs 1.0rc documentation

GitHub - unitreerobotics/UnitreecameraSDK: Unitree GO1 camera SDK

CSDN:

宇树Unitree camera 双目鱼眼睛的使用_宇树a1 调用摄像头-CSDN博客

部署在Go1身上的手势识别_unitree go1-CSDN博客

1. 通信框架

1.1 IP地址

连接机器狗热点(出厂WiFi名称为Goxxxxxxxx,密码为00000000)

(1)进入Motion Control Board: RasPi 4B (192.168.123.161)

ssh pi@192.168.12.1
123

 进入此界面后,可以使用以下命令进入其他的板卡。注意不同板卡的切换需要使用exit退回pi的终端。

 (2)进入Main control board: MCU (192.168.123.10) Connection refused, 可能不被允许。

ssh unitree@192.168.123.10
123

(3)进入头部相机板卡: nano2gb (head, 192.168.123.13)

ssh unitree@192.168.123.13
123

(4)进入左右相机板卡:Nano (body, 192.168.123.14) unitree@unitree-desktop(背面接口的板卡)

ssh unitree@192.168.123.14
123

(5)进入下方相机板卡Sensing motherboard: Nano or NX (body, 192.168.123.15) 

ssh unitree@192.168.123.15
123

如果需要使用wifi连接go1,则必须连接树梅派。如果通过局域网连接go1,则需要设定用户ip地址为192.168.123.XXX。

2. 相机

进入各个板卡的主要目的是设定相关的相机设定。

2.1. 在unitree-desktop测试左右相机读取

首先下载GitHub - unitreerobotics/UnitreecameraSDK: Unitree GO1 camera SDK并发送到左右相机板卡:Nano (body, 192.168.123.14) unitree@unitree-desktop。

参考Go1 — Unitree_Docs 1.0rc documentation

在使用SDK之前需要先kill掉内置调用相机的程序才能成功获取图像。停止相关进程:

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

 测试左右双目鱼眼:

cd ..
./bins/example_getRectFrame

如果要修改观察的方向左//右,在 stereo_camera_config.yaml中修改data为0或1。

DeviceNode: !!opencv-matrix
   rows: 1
   cols: 1
   dt: d
   data: [ 0. ]

2.2. 头部板卡消息

需要先通过unitree-desktop或用户pc发送UnitreecameraSDK文件到head板卡:

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

进入头部相机板卡: nano2gb (head, 192.168.123.13)

ssh unitree@192.168.123.13
123

修改trans_rect_config.yaml,将相机发送数据的对象设定为unitree-desktop,192.168.123.15。或者设置为用户自己的ip地址。

#UDP address for image transfer   192.168.123.IpLastSegment
IpLastSegment: !!opencv-matrix
   rows: 1
   cols: 1
   dt: d
   data: [ 15. ]

编译后运行图片发送端,之后就可以在对应的IP(此处时192.168.123.15)运行接收代码。

cd UnitreecameraSDK/
./bins/example_putImagetrans

2.3. 配置发送

使用图像发送和接受,只需要配置在trans_rect_config.yaml中的参数。stereo_camera_config.yaml中主要用于在当前板卡验证相机的图像获取。

(1)配置IP地址

#UDP address for image transfer   192.168.123.IpLastSegment
IpLastSegment: !!opencv-matrix
   rows: 1
   cols: 1
   dt: d
   data: [ 15. ]

(2)配置需要传输的相机,使用0或1来切换身体的左右,头部的前和下视摄像头。

#DeviceNode
DeviceNode: !!opencv-matrix
   rows: 1
   cols: 1
   dt: d
   data: [ 0. ]

(3)配置传输图像的类型,据说双目的左右顺序反了。需要使用鱼眼消息可以看后文。

#0 右侧原始图像  1 双目原始图像  2 右侧矫正图像  3 双目矫正图像   -1 不传图
Transmode: !!opencv-matrix
   rows: 1
   cols: 1
   dt: d
   data: [ 0. ] 

#The transmode here, 0 and 1 cannot be used, you need to set 2 or 3

一些官方的代码使用解释:

/*
发送端:
方法概述:采用udp方法输出图片,传输方式已写入程序,由StereoCameraCommon::startCapture(true,false)中第一个参数控制定向udp传输,当其为true时打开udp264硬编码传输模式
参数:配置文件中IpLastSegment是接收端ip,接收端地址必须是192.168.123.IpLastSegment。
     配置文件中Transmode决定传输模式
     配置文件中Transrate决定传输速率,限制了传输速率小于图片速率
     端口9201~9205分别对应前方,下巴,左,右,腹部
     启动自定义图传时需使用kill.sh文件关闭Unitree/autostart/02camerarosnode程序来解除相机占用,Unitree/autostart/04imageai来释放算力。
     (也可使用以下几条指令
     ps -A | grep point | awk '{print $1}' | xargs kill -9
     ps -aux|grep mqttControlNode|grep -v grep|head -n 1|awk '{print $2}'|xargs kill -9
     ps -aux|grep live_human_pose|grep -v grep|head -n 1|awk '{print $2}'|xargs kill -9
     )
传输图片模式:由配置文件中Transmode决定,该值只可通过读取配置文件方式写入
0:传输左目原始图片
1:传输双目原始图片
2:传输左目畸变校正后图片,视野范围角度可调60~140
3:传输双目畸变校正后图片
※※※注意,双目图的最后的左右目输出位置是反的。左目->右图,右目->左图
4:不建议使用!!,Depthmode = 2时 可输出深度图和对应左目图片,不建议使用。
*/

2.4. 发送原始鱼眼数据

修改example_putImagetrans代码如下,并使用后序代码接收即可。发送原始数据可以让帧率达到20+。

int main(int argc, char *argv[])
{
   
    UnitreeCamera cam("trans_rect_config.yaml"); ///< init camera by device node number
    if(!cam.isOpened())   ///< get camera open state
        exit(EXIT_FAILURE);   
    cam.startCapture(true,false); ///< disable share memory sharing and able image h264 encoding

    usleep(500000);
    while(cam.isOpened())
    {
        cv::Mat frame;
        std::chrono::microseconds t;
        if(!cam.getRawFrame(frame, t)){ ///< get camera raw image
            usleep(1000);
            continue;
        }
        char key = cv::waitKey(10);
        if(key == 27) // press ESC key
           break;
    }
    
    cam.stopCapture(); ///< stop camera capturing
    
    return 0;
}

2.4. 图像接收

需要在代码中设定本机IP和需要获取的相机ID:

前脸相机portID=9201(cam=1),下巴相机portID=9202(cam=2)

左侧相机portID=9203(cam=3),右侧相机portID=9204(cam=4)

腹部相机portID=9205(cam=5)

在对应IP的机器上编译运行:

./bins/example_getimagetrans

也可以使用以下命令直接验证接受, 假设主机ip。

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

示例代码:

import numpy as np
import sys
import cv2

# print(cv2.getBuildInformation())
# print(cv2.__version__)
# print(cv2.__file__)
# print(sys.path)


def main():
    IpLastSegment = "102"
    cam = 5
    if len(sys.argv) >= 2:
        cam = int(sys.argv[1])

    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 = udpstrPrevData + str(udpPORT[cam - 1]) + udpstrBehindData
    print("udpSendIntegratedPipe:", udpSendIntegratedPipe)

    cap = cv2.VideoCapture(udpSendIntegratedPipe)#, cv2.CAP_GSTREAMER

    if not cap.isOpened():
        return
    while True:
        ret, frame = cap.read()
        frame = cv2.resize(frame, (640, 480))
        if frame is not None:
            cv2.imshow("video", frame)
        if cv2.waitKey(20) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()


if __name__ == "__main__":
    main()

3. 注意事项:OpenCV, GStreamer与Anaconda

使用conda安装的opencv虽然支持了GStreamer,但是运行代码无法启动。需要卸载opencv后源码编译安装opencv。参考以下link以在anaconda中安装cv2

python - Install Opencv from source to conda environment - Stack Overflow

部分报错:

Conda虚拟环境下libp11-kit.so.0: undefined symbol: ffi_type_pointer...问题解决-CSDN博客

# 设置环境变量
export CONDA_PREFIX=~/anaconda3/envs/YOUR_ENV_NAME
export PYTHON_VERSION=3.8
export CPLUS_INCLUDE_PATH=$CONDA_PREFIX/include/python$PYTHON_VERSION:$CONDA_PREFIX/lib/python$PYTHON_VERSION/site-packages/numpy/core/include

# 安装 NumPy
conda install numpy

# 创建构建目录并进入该目录
mkdir -p ~/Downloads/opencv_build
cd ~/Downloads/opencv_build

# 运行 CMake 配置
cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=$CONDA_PREFIX/ \
      -D OPENCV_EXTRA_MODULES_PATH=~/Downloads/opencv_contrib/modules \
      -D PYTHON3_LIBRARY=$CONDA_PREFIX/lib/libpython$PYTHON_VERSION.so \
      -D PYTHON3_INCLUDE_DIR=$CONDA_PREFIX/include/python$PYTHON_VERSION \
      -D PYTHON3_EXECUTABLE=$CONDA_PREFIX/bin/python \
      -D PYTHON3_PACKAGES_PATH=$CONDA_PREFIX/lib/python$PYTHON_VERSION/site-packages \
      -D PYTHON3_NUMPY_INCLUDE_DIRS=$CONDA_PREFIX/lib/python$PYTHON_VERSION/site-packages/numpy/core/include \
      -D BUILD_opencv_python2=OFF \
      -D BUILD_opencv_python3=ON \
      -D INSTALL_PYTHON_EXAMPLES=ON \
      -D INSTALL_C_EXAMPLES=OFF \
      -D OPENCV_ENABLE_NONFREE=ON \
      -D BUILD_EXAMPLES=ON \
      -D WITH_GSTREAMER=ON \
      -D WITH_FFMPEG=ON \
      ~/Downloads/opencv

# 编译和安装 OpenCV
make -j$(nproc)
sudo make install

更换python版本3.8.10

conda remove libffi
conda install python=3.8.10

运行成功:

4. 图像矫正

鱼眼摄像头的畸变矫正方法-python+opencv_鱼眼畸变矫正-CSDN博客

5. 常用指令记录

ssh unitree@192.168.123.15
123
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
scp -r UnitreecameraSDK unitree@192.168.123.13:/home/unitree/
cd UnitreecameraSDK/
./bins/putRawtrans
scp output_camCalibParams.yaml blamlight@192.168.123.102:/home/blamlight/Desktop

  • 25
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值