踩坑记录:Unitree Go1运动板卡安装opencv以及通过SDK获取各Nano凸图传

切换到opencv下载目录以及编译目录:

cd /home/opencv/opencv4.1.1
cd build

删除已有的编译文件:

rm -rf *

由于默认的cmake之后执行make编译速度非常慢,设定cmake选项减少不必要的依赖和示例编译:

默认的CMake选项编译速度非常慢,通过

cmake -D CMAKE_BUILD_TYPE=RELEASE  -D CMAKE_INSTALL_PREFIX=/usr/local  -D INSTALL_PYTHON_EXAMPLES=OFF  -D INSTALL_C_EXAMPLES=OFF  -D PYTHON3_EXECUTABLE=/usr/bin/python3.7  -D PYTHON_EXECUTABLE=/usr/bin/python  -D WITH_TBB=ON  -D WITH_V4L=ON  -D WITH_QT=ON  -D WITH_GTK=ON  -D WITH_VTK=ON  -D WITH_OPENGL=ON  -D WITH_OPENMP=ON -D BUILD_EXAMPLES=OFF  -D WITH_CUDA=OFF  -D BUILD_TIFF=ON  -D ENABLE_PRECOMPILED_HEADERS=OFF -D INSTALL_PYTHON_EXAMPLES=OFF  -D OPENCV_GENERATE_PKGCONFIG=ON  -DOPENCV_ENABLE_NONFREE=OFF ..

关闭非必要的编译选项

/usr/bin/ld: CMakeFiles/opencv_gapi.dir/src/backends/cpu/gcpuimgproc.cpp.o: file not recognized: file truncated
collect2: error: ld returned 1 exit status
make[2]: *** [modules/gapi/CMakeFiles/opencv_gapi.dir/build.make:703: lib/libopencv_gapi.so.4.1.1] Error 1
make[1]: *** [CMakeFiles/Makefile2:3804: modules/gapi/CMakeFiles/opencv_gapi.dir/all] Error 2
make: *** [Makefile:163: all] Error 2

经过一番操作也是安装上Opencv了。

但是运行示例程序的时候遇到各种各样的错误。

首先是安装完OPENCV之后在python中导入提示:

ImportError: /usr/lib/aarch64-linux-gnu/libgomp.so.1: cannot allocate memory in static TLS block

我去各种搜索各种提示都没有解决这个问题,包括设置环境变量,重新安装依赖,扩大缓存区等,就差翻opencv源代码了,仍然没有解决这个问题,最后,重启板卡发现这个错误没了?????我在export PD_PRELOAD="/usr/lib/aarch64-linux-gnu/libgomp.so.1"之后通过source ~/.bashrc没有生效,包括新建终端也没有起作用,果然重启解决99%的问题。

随后尝试运行C++和Python示例程序获取外部板卡搭载的摄像头发送的UDP数据来获取图像,这里通过Gstreamer管道来接收UDP数据流,在我运行示例程序时,仅仅输出:

udpSendIntegratedPipe:udpsrc address=192.168.123.161 port=9201 ! application/x-rtp,media=video,encoding-name=H264 ! rtph264depay ! h264parse ! omxh264dec ! videoconvert ! appsink

这是C++的输出,我不明白这是为何,随后我通过Python类似的功能,爆出错误:

cv2.error: OpenCV(4.1.1) /home/pi/opencv/opencv-4.1.1/modules/imgproc/src/resize.cpp:3720: error: (-215:Assertion failed) !ssize.empty() in function 'resize'

在我阅读源代码之后,发现这里对图像的resize源是UDP管道发送来的数据进行处理,大概可以得到是因为没有得到UDP管道传输的数据然后手动执行gst-lunch命令获取视频流:

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

错误:

WARNING: erroneous pipeline: no element "omxh264dec"

提示没有名为omxh264dec的节点,omxh264dec是用于处理H.264编码视频流的硬件解码器。在GStreamer等多媒体处理框架中,omxh264dec作为一个元素(element)或插件,被包含在视频处理管道中。

但是实际上在GStreamer包含的基础插件包括能够支持omxh264dec的插件我都进行了安装,其中考虑到需要ffmpeg支持,昨晚上花费了将近三个小时编译安装ffmpeg相关的依赖和主体,但是仍然无法正确执行gst-lunch。
参考文章:centos 安装 ffmpeg 并添加 libx264库 libfdk-aac库 openssl库_centos ffmpeg unknown encoder ‘libx264-CSDN博客

后来考虑到运行平台支持性,我去查阅了raspberry相关的硬件解码器支持,在腾讯云技术社区中查询到:

有两种方法可以使用硬件编解码器-使用较新的h264_v4l2m2m或基于h264_omx的OMX。注意:/boot/config.txt中的gpu_mem设置需要大于16 -否则两个编解码器都会出现错误。

后来又根据其他途径查阅资料,在编译ffmepg时需要指定--enable-omx-rpi选项,对于这个选项貌似在之前编译时没有指定,或许是因为这个导致无法使用h264omx解码器。

注意到在编译ffmpeg时指定了:--enable-libx264 并且在这之前安装了libx264,猜测h264_v4l2m2m解码器是可用的。

随后修改gst-lunch启动选项:

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

成功运行。

接下来就是在示例程序中二次开发同时获取五个摄像头的图像并通过opencv进行处理结合legged_sdk实现运动控制喽。

小杜的个人图床