尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Jetson Nano ARM平台部署海康MVS工业相机SDK全流程实战

Jetson Nano ARM平台部署海康MVS工业相机SDK全流程实战 1. 项目缘起为什么要在Jetson Nano上折腾海康MVS最近在做一个基于边缘计算的视觉项目核心硬件是Jetson Nano需要接入几台海康威视的工业相机。本以为这事儿很简单不就是装个客户端软件嘛。结果一上手就发现事情远没有想象中顺利。海康官方的MVSMachine Vision Software客户端默认只提供了x86架构的安装包而Jetson Nano用的是ARM架构的处理器直接运行.deb安装包会报架构不兼容的错误。网上搜了一圈发现遇到这个问题的朋友不少但完整的解决方案却零零散散。所以我决定把这次从踩坑到成功安装、配置的完整过程记录下来。这不仅仅是一个安装教程更是一次在ARM边缘设备上搞定专业工业软件的全流程实战。如果你也正在或即将在Jetson Nano、Orin NX等其他ARM平台上部署海康视觉生态这篇内容或许能帮你省下大把的摸索时间。我们将从原理分析开始一步步走到软件安装、环境配置最后实现相机连接与基础功能验证。2. 核心挑战解析ARM架构下的软件兼容性困局在x86的Ubuntu电脑上安装海康MVS通常就是下载一个.deb包双击或者sudo dpkg -i一下几分钟就搞定了。但把这个过程搬到Jetson Nano上第一个拦路虎就是处理器架构。2.1 ARM与x86的根本差异Jetson Nano搭载的是NVIDIA的Tegra系列SoC其CPU核心是基于ARMv8架构的Cortex-A57/A72。而我们的个人电脑和服务器绝大多数使用的是Intel或AMD的x86_64也叫amd64架构。这两种架构在指令集层面是互不兼容的。简单来说为x86编译的程序其二进制指令ARM处理器“看不懂”反之亦然。海康官方发布的MVS for Linux安装包通常命名为类似MVS-2.1.0_x86_64_20231212.deb的文件从其文件名就能看出这是针对x86_64平台编译的。直接尝试在Jetson Nano上安装dpkg会直接报错package architecture (amd64) does not match system (arm64)。2.2 海康的官方支持策略海康威视作为一家硬件设备厂商其软件支持策略通常是优先保障主流平台。对于Linux平台x86服务器和工控机是绝对的主流因此提供x86_64的预编译包是最高效的方式。对于ARM平台官方并非完全不支持但往往不会提供开箱即用的便捷安装包而是通过提供SDK软件开发工具包的方式让开发者自行在目标平台上编译。这就引出了我们解决问题的核心思路放弃直接安装预编译的客户端转而使用海康提供的SDK进行本地编译安装。MVS的图形化客户端本身也是基于其SDK开发的我们通过SDK不仅能获得驱动和库文件还能编译出命令行工具甚至自己的应用程序灵活性更高。2.3 准备工作理清需求与备好环境在开始动手前我们需要明确目标并准备好环境。核心目标在Jetson NanoARM64 Ubuntu 18.04/20.04上成功安装海康威视的机器视觉软件套件实现识别并连接到海康USB3.0/GigE工业相机。能够进行图像采集、参数设置、固件更新等基本操作。为后续使用Python如OpenCV或C调用相机SDK打下基础。环境确认硬件Jetson Nano开发者套件已连接显示器、键盘鼠标或已配置好SSH远程登录。系统确认系统版本。通常Jetson Nano出厂为Ubuntu 18.04但很多项目已升级到20.04。执行cat /etc/os-release或lsb_release -a查看。本文以Ubuntu 18.04为例20.04流程几乎一致。网络确保设备可以正常访问互联网以下载必要的工具和SDK。存储空间编译过程需要一定空间建议系统剩余空间大于2GB。必要工具安装首先更新软件源并安装编译所需的工具链。sudo apt update sudo apt upgrade -y sudo apt install -y build-essential cmake git libusb-1.0-0-dev pkg-configbuild-essential: 包含GCC、G、make等核心编译工具。cmake: 跨平台的编译构建工具海康SDK使用CMake管理。git: 用于下载SDK源码如果官方提供Git仓库不过海康通常是压缩包。libusb-1.0-0-dev: USB相机驱动所需的开发库。pkg-config: 帮助编译器查找链接库的工具。3. 实战第一步获取与编译海康MVS SDK这是整个过程中最关键、最核心的一步。我们无法使用图形化安装包必须从源码构建。3.1 寻找正确的SDK版本前往海康威视机器视觉官网的“下载中心”或“服务与支持”板块。寻找“机器视觉软件(MVS) SDK”或类似的条目。特别注意要选择Linux版本并且寻找是否提供“ARM”或“AARCH64”架构的SDK包或者提供完整的源代码包。根据我的经验海康有时会提供一个名为“MVS SDK for Linux (ARM)”的独立压缩包有时则会提供一个包含所有平台代码的通用SDK包。如果找不到明确的ARM版本可以尝试下载标有“Full”或“Source”的版本里面通常包含了所有平台的构建文件。假设我们下载到的文件是MVS_SDK_V2.1.0_20231212.tar.gz。3.2 解压与探索SDK结构将下载的SDK压缩包通过U盘、SCP或者直接在Jetson Nano上用浏览器下载等方式放到Jetson Nano的某个目录下例如~/Downloads。cd ~/Downloads tar -xzvf MVS_SDK_V2.1.0_20231212.tar.gz cd MVS_SDK_V2.1.0_20231212 ls -la解压后仔细查看目录结构。一个典型的MVS SDK目录可能包含以下关键部分MVS_SDK_V2.1.0_20231212/ ├── README.txt # 必读包含版本信息和编译说明 ├── MVS/ │ ├── Include/ # 头文件编程时引用 │ ├── Libraries/ # 预编译的库文件可能有x86和ARM子目录 │ │ ├── ARM64/ # 希望看到这个ARM64的预编译库 │ │ └── x64/ # x86_64的库 │ └── Samples/ # 示例代码C C# Python等 ├── Driver/ # 相机驱动相关 │ ├── USB/ # USB相机驱动 │ └── GigE/ # 千兆网相机驱动 └── Tools/ # 一些工具如固件更新工具最理想的情况在Libraries/下直接存在ARM64/目录里面已经放好了编译好的.so动态库文件。这样我们就不需要编译库只需要编译示例程序或安装驱动即可。更常见的情况Libraries/下只有x64/目录或者根本没有预编译库。这时我们需要在Samples/或SDK根目录寻找CMakeLists.txt文件这意味着需要从源码编译整个SDK包括库和示例。3.3 编译SDK与库文件我们假设遇到的是需要从源码编译的情况。首先寻找编译指南。查看README.txt或Samples/目录下的ReadMe_Linux.txt。通常的编译步骤是创建一个构建目录然后使用CMake配置最后make编译。# 1. 进入SDK根目录或Samples目录根据说明 cd ~/Downloads/MVS_SDK_V2.1.0_20231212 # 2. 创建并进入一个构建目录保持源码目录干净 mkdir build cd build # 3. 运行CMake进行配置。关键是指定安装前缀方便后续管理。 # -DCMAKE_INSTALL_PREFIX/usr/local 表示安装到系统目录 # 也可以安装到用户目录如 /home/nvidia/MVS cmake .. -DCMAKE_INSTALL_PREFIX/usr/local # 4. 开始编译。使用 -j4 参数利用Jetson Nano的四核进行并行编译加快速度。 make -j4 # 5. 编译成功后安装库文件和头文件到系统 sudo make install编译过程可能遇到的问题与解决找不到CUDA如果SDK的某些高级功能依赖CUDA而CMake报错找不到CUDA可以尝试在CMake命令中指定CUDA路径或者暂时关闭CUDA选项如果允许。Jetson Nano的CUDA通常安装在/usr/local/cuda。cmake .. -DCMAKE_INSTALL_PREFIX/usr/local -DCUDA_TOOLKIT_ROOT_DIR/usr/local/cuda权限问题安装到/usr/local需要sudo权限。确保sudo make install成功。依赖库缺失如果编译报错缺少某些库如libavcodec,libswscale等根据错误信息使用apt安装对应的-dev包即可。例如sudo apt install libavcodec-dev libswscale-dev。编译安装完成后海康的库文件如libMvCameraControl.so会被复制到/usr/local/lib头文件被复制到/usr/local/include。系统运行时链接器能够找到它们。3.4 安装相机驱动USB/GigE仅有SDK库还不够操作系统需要特定的内核模块驱动来与海康的USB3.0或千兆网相机通信。进入SDK包内的Driver/目录。这里通常有详细的驱动安装说明ReadMe.txt。USB驱动对于USB3.0相机海康提供的是uvc扩展驱动。安装步骤通常是cd ~/Downloads/MVS_SDK_V2.1.0_20231212/Driver/USB # 查看ReadMe通常包含加载现有驱动或编译安装新驱动的脚本 sudo ./install_driver.sh # 或类似的脚本名这个脚本可能会将特定的固件和规则文件复制到系统并加载内核模块。安装后插入海康USB相机使用lsusb命令应该能看到对应的设备Hangzhou Hikvision Digital Technology Co., Ltd.。GigE驱动对于千兆网相机海康使用标准的gev协议。驱动安装通常涉及配置网络接口和安装genicam相关的库。同样遵循Driver/GigE/下的说明文件操作。关键步骤可能是设置网卡的MTU最大传输单元为9000以支持大数据流传输sudo ifconfig eth0 mtu 9000并将该命令添加到/etc/rc.local或网络配置中使其开机生效。重要提示驱动安装可能需要重启系统或者手动加载内核模块。务必仔细阅读驱动目录下的说明文档这是成功连接相机的关键。4. 验证安装从命令行到图像采集库和驱动都装好了怎么验证是否成功呢海康SDK通常提供命令行工具和丰富的示例程序。4.1 使用命令行工具发现设备进入SDK的Tools/或Utilities/目录或者编译生成的build/bin/目录寻找名为MvUsbCameraList、MvGigECameraList或通用的DeviceList的可执行文件。# 假设工具在编译输出目录 cd ~/Downloads/MVS_SDK_V2.1.0_20231212/build/bin ./DeviceList或者如果工具已安装到系统路径MvUsbCameraList运行后如果一切正常你应该能看到连接到Jetson Nano的所有海康相机列表包括设备型号、序列号、IP地址对于网口相机等信息。这是第一个里程碑式的成功信号4.2 编译并运行示例程序SDK的Samples/目录下提供了多种语言的示例C的是最直接的选择。我们编译并运行一个简单的图像采集示例。# 进入C示例目录 cd ~/Downloads/MVS_SDK_V2.1.0_20231212/Samples/C/GrabImage # 查看是否有编译脚本或CMakeLists.txt ls # 如果有CMakeLists.txt则用CMake编译 mkdir build cd build cmake .. make # 运行生成的可执行文件 ./GrabImage如果示例程序成功运行打开了相机并开始显示实时图像或者将图像保存为文件那么恭喜你整个MVS SDK在Jetson Nano上的部署就完全成功了你已经拥有了通过程序控制相机的能力。4.3 解决常见的运行时问题即使编译安装顺利第一次运行时也可能碰壁。问题运行程序报错error while loading shared libraries: libMvCameraControl.so: cannot open shared object file原因系统找不到动态链接库。解决虽然我们用sudo make install装到了/usr/local/lib但系统可能没有刷新动态链接库缓存。# 首先确认库文件是否存在 ls /usr/local/lib/libMvCameraControl* # 刷新动态库缓存 sudo ldconfig # 再次运行程序问题USB相机可以列出但打开时提示“无权限”或“资源繁忙”原因普通用户没有访问USB设备的权限。解决创建udev规则让特定设备的所有用户都可读写。使用lsusb找到相机的厂商ID和产品ID例如ID2bdf:xxxx。创建规则文件sudo nano /etc/udev/rules.d/99-hikvision-usb.rules写入以下内容替换idVendor和idProduct为你的设备值SUBSYSTEMusb, ATTR{idVendor}2bdf, ATTR{idProduct}xxxx, MODE0666, GROUPplugdev重新加载udev规则并重新插拔设备sudo udevadm control --reload-rules sudo udevadm trigger问题GigE相机能发现但连接超时原因防火墙阻挡、网络配置不当如MTU未设置、或相机IP与主机不在同一网段。解决检查IP确保相机IP如169.254.x.x和Jetson Nano的以太网口IP在同一子网。海康相机默认可能启用DHCP或使用链路本地地址169.254.x.x。设置MTU如前所述sudo ifconfig eth0 mtu 9000。关闭防火墙sudo ufw disable仅用于测试生产环境需谨慎。使用海康IP配置工具如果SDK里有IpConfig之类的工具可以用它来修改相机IP使其符合你的网络规划。5. 进阶集成在Python项目中调用海康相机对于很多Jetson Nano项目最终目的是在Python环境中例如搭配OpenCV、PyTorch进行AI推理使用相机。海康SDK通常也提供Python接口。5.1 安装Python接口在SDK目录中寻找Python或PyMVSCam之类的文件夹。里面应该有setup.py或requirements.txt。cd ~/Downloads/MVS_SDK_V2.1.0_20231212/Samples/Python # 查看安装说明 cat README.md # 通常的安装方式是使用pip安装当前目录的包 pip3 install . # 或者 python3 setup.py install安装完成后在Python中尝试导入import MvImport # 或者可能是 import hikvision_mvs 等具体名称参考SDK文档5.2 编写一个简单的Python采集脚本以下是一个基于海康Python SDK的极简示例框架用于验证功能#!/usr/bin/env python3 import sys import cv2 import numpy as np # 根据实际SDK的Python模块名导入 from MvImport.MvCameraControl_class import * def main(): # 1. 创建设备列表 deviceList MV_CC_DEVICE_INFO_LIST() ret MvCamera.MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, deviceList) if ret ! 0: print(fEnum devices fail! ret[0x{ret:x}]) return if deviceList.nDeviceNum 0: print(No camera found!) return # 2. 选择第一个设备并创建句柄 cam MvCamera() device_info deviceList.pDeviceInfo[0] ret cam.MV_CC_CreateHandle(device_info) # ... 错误处理省略 # 3. 打开设备 ret cam.MV_CC_OpenDevice() # ... 错误处理省略 # 4. 开始取流 ret cam.MV_CC_StartGrabbing() # ... 错误处理省略 # 5. 循环获取图像并显示使用OpenCV data_buf (c_ubyte * (1920*1080*3))() # 根据相机分辨率调整缓冲区 while True: stFrameInfo MV_FRAME_OUT_INFO_EX() memset(byref(stFrameInfo), 0, sizeof(stFrameInfo)) ret cam.MV_CC_GetOneFrameTimeout(data_buf, len(data_buf), stFrameInfo, 1000) if ret 0: # 将原始数据转换为numpy数组 img_array np.frombuffer(data_buf, dtypenp.uint8) # 根据帧信息重塑数组 (height, width, channel) img img_array.reshape((stFrameInfo.nHeight, stFrameInfo.nWidth, -1)) # 使用OpenCV显示 cv2.imshow(Hikvision Camera, img) if cv2.waitKey(1) 0xFF ord(q): break # 6. 停止取流关闭设备销毁句柄 cam.MV_CC_StopGrabbing() cam.MV_CC_CloseDevice() cam.MV_CC_DestroyHandle() cv2.destroyAllWindows() if __name__ __main__: main()注意这只是一个框架实际使用时需要仔细查阅海康Python SDK的API文档处理每个函数的返回值并正确解析图像数据可能涉及像素格式转换如BayerRG8转RGB。5.3 与OpenCV的无缝衔接成功通过海康SDK获取到图像数据numpy数组后你就可以像使用普通摄像头一样用OpenCV进行后续处理了边缘检测、色彩空间转换、画框、保存或者送入YOLOv5、TensorRT等模型进行推理。这标志着你的Jetson Nano视觉项目硬件链路已经完全打通。6. 性能调优与稳定性保障在资源受限的Jetson Nano上运行视觉应用性能调优至关重要。6.1 Jetson Nano性能模式设置确保Nano运行在最大性能模式以获得最佳的CPU和GPU性能。# 查看当前运行模式 sudo nvpmodel -q # 设置为最大性能模式模式010W sudo nvpmodel -m 0 # 同时开启风扇如果有并设置最大时钟 sudo jetson_clocks6.2 相机参数优化在海康MVS软件或通过SDK设置相机参数以减轻Jetson Nano的负载降低分辨率如果AI模型输入是640x640就没必要采集2592x2048的图像。降低帧率根据应用需求设置合适的帧率如30fps而非120fps。使用硬件触发或软触发代替连续自由运行模式只在需要时采集图像可以大幅降低平均数据吞吐量。启用图像压缩如果相机和SDK支持如H.264可以考虑启用但会增加解码延迟。选择合适的数据格式例如Mono8比RGB8数据量小三分之二。如果只是做灰度图像处理这是很好的优化点。6.3 内存与缓冲区管理在Python/C程序中要妥善管理图像缓冲区。避免在循环中频繁申请释放大块内存。可以预分配缓冲区重复使用。对于高帧率应用考虑使用生产者-消费者模型将图像采集和图像处理放在不同的线程中中间用队列连接防止丢帧。6.4 长期运行的稳定性工业应用要求7x24小时稳定运行。需要注意异常处理在代码中完善所有SDK调用的错误检查和异常捕获。网络相机尤其要做好断线重连机制。看门狗可以编写一个简单的看门狗脚本监控相机采集进程如果进程挂掉则自动重启。散热Jetson Nano散热压力大长期高负载运行必须保证良好的散热环境最好使用主动散热风扇套件。7. 总结与避坑心得回顾回过头看在Jetson Nano上安装海康MVS核心思路就一条绕开预编译的客户端直击SDK源码编译。这个过程虽然比在x86上直接双击安装复杂但让你对海康视觉系统的底层有了更深的掌控力。我踩过最大的坑起初就是固执地想找ARM版的.deb安装包浪费了大量时间。后来转变思路从官网下载完整的SDK一切才豁然开朗。另一个坑是驱动安装后忘记重新加载udev规则导致USB相机权限问题折腾了好久。对于后来者的建议是第一仔细阅读SDK包里的每一个ReadMe.txt尤其是驱动部分的第二编译时善用CMake的-D选项来应对不同的环境第三验证阶段从命令行工具开始步步为营不要一上来就跑复杂的示例程序。最后成功在Jetson Nano上跑通海康相机只是边缘视觉智能项目的第一步。接下来如何将稳定的图像流高效地送入你的AI模型如何管理多路相机如何与云端协同才是更具挑战也更有价值的课题。这套ARM平台工业相机的组合为在严苛、低功耗、实时性要求高的场景下部署机器视觉解决方案提供了一个非常扎实的起点。
返回列表