水竹院落

  • 2025-04-13
  • 发表了主题帖: BeagleY-AI单板计算机:系统配置,移植opencv-mobile和打开usb摄像头

    BeagleY-AI单板计算机:系统配置,移植opencv-mobile和打开usb摄像头 BeagleY®-AI 采用德州仪器新推出的 AM67A AI 视觉处理器。这款处理器集成了四个 64 位 Arm® Cortex®-A53 CPU 核心,时钟频率高达 1.4 GHz,两个通用 C7x DSP 和矩阵加速器(MMA),能提供 4 TOPS 的深度学习性能。此外,它还配备了视觉处理加速器、GPU 核心和多个专门用于实现低功耗、低延迟的 GPIO 控制 Arm Cortex-R5 核心。 # 开箱和系统配置 在官网下载镜像,按照快速上手文档,烧录镜像到tf卡,把tf卡插入开发板,插电启动 https://www.beagleboard.org/boards/beagley-ai https://docs.beagle.cc/boards/beagley/ai/02-quick-start.html headless启动可以先配置 ssh 的用户名密码:读卡器插到电脑上,挂载tf卡上的BOOT分区,修改sysconf.txt设置初始账户登录名和密码,后面直接ssh开发板ip就能登上了。ip地址可以从路由器里面找到 ``` user_name=nihui user_password=1234 ``` 网线插入后,自动连网,然后 apt 更新系统 ```shell apt update apt upgrade ``` 主要遇到的问题 ### wifi不稳定,并且开启后用网线也会不稳定 **千万不要用WIFI** 不仅仅wifi会频繁断线重连,还会造成整个network中间软件栈疯狂吃中断,导致即便用网线连接ssh也会非常卡和容易掉线,直到你把wifi配置彻底删除,一下子就清净了 进nmtui删除wifi! ```shell nmtui ``` 下面是一些dmesg日志 ``` [ 11.599403] ------------[ cut here ]------------ [ 11.599431] memcpy: detected field-spanning write (size 3) of single field "passive" at drivers/net/wireless/ti/cc33xx/scan.c:42 (size 2) [ 11.599555] WARNING: CPU: 0 PID: 496 at drivers/net/wireless/ti/cc33xx/scan.c:42 cc33xx_adjust_channels+0x1a4/0x1e0 [cc33xx] [ 11.599607] Modules linked in: algif_aead cc33xx mac80211 rpmsg_ctrl rpmsg_char libarc4 cfg80211 snd_soc_simple_card snd_soc_simple_card_utils crct10dif_ce cc33xx_sdio pwm_fan cpufreq_dt pvrsrvkm(O) e5010_jpeg_enc v4l2_jpeg pci_endpoint_test rti_wdt snd_soc_davinci_mcasp snd_soc_ti_udma at24 snd_soc_ti_edma snd_soc_hdmi_codec snd_soc_ti_sdma snd_soc_core snd_pcm_dmaengine snd_pcm wave5 ti_k3_r5_remoteproc videobuf2_dma_contig v4l2_mem2mem snd_timer videobuf2_memops videobuf2_v4l2 snd videodev ti_k3_dsp_remoteproc videobuf2_common mc soundcore omap_mailbox loop dm_mod efi_pstore [ 11.599771] CPU: 0 PID: 496 Comm: iwd Tainted: G O 6.6.58-ti-arm64-r24 #1 [ 11.599781] Hardware name: BeagleBoard.org BeagleY-AI (DT) [ 11.599787] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 11.599796] pc : cc33xx_adjust_channels+0x1a4/0x1e0 [cc33xx] [ 11.599819] lr : cc33xx_adjust_channels+0x1a4/0x1e0 [cc33xx] [ 11.599838] sp : ffff800083913430 [ 11.599842] x29: ffff800083913430 x28: ffff80007a8bd6e8 x27: ffff00080a184a18 [ 11.599857] x26: 0000000000000001 x25: ffff0008022f3c0e x24: ffff0008022f3c12 [ 11.599871] x23: ffff0008022f3c10 x22: ffff80007a8bd000 x21: ffff0008022f3c9d [ 11.599884] x20: ffff000808bcc800 x19: ffff0008022f3c13 x18: ffffffffffffffff [ 11.599898] x17: 2220646c65696620 x16: 656c676e69732066 x15: 6f20293320657a69 [ 11.599912] x14: 7328206574697277 x13: 293220657a697328 x12: 2032343a632e6e61 [ 11.599925] x11: 00000000ffffefff x10: ffff800081ff1bc0 x9 : ffff80008012de9c [ 11.599938] x8 : 0000000000017fe8 x7 : c0000000ffffefff x6 : 0000000000057fa8 [ 11.599951] x5 : ffff00084772adc8 x4 : 0000000000000000 x3 : 0000000000000027 [ 11.599966] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff000804b2f000 [ 11.599979] Call trace: [ 11.599985] cc33xx_adjust_channels+0x1a4/0x1e0 [cc33xx] [ 11.600008] cc33xx_scan+0x14c/0x3a8 [cc33xx] [ 11.600028] cc33xx_op_hw_scan+0xe0/0x120 [cc33xx] [ 11.600047] drv_hw_scan+0xb0/0x1d0 [mac80211] [ 11.600188] __ieee80211_start_scan+0x23c/0x720 [mac80211] [ 11.600266] ieee80211_request_scan+0x40/0x70 [mac80211] [ 11.600344] ieee80211_scan+0x70/0x108 [mac80211] [ 11.600421] rdev_scan+0x64/0x198 [cfg80211] [ 11.600552] cfg80211_scan+0x134/0x178 [cfg80211] [ 11.600623] nl80211_trigger_scan+0x428/0x778 [cfg80211] [ 11.600694] genl_family_rcv_msg_doit+0xd8/0x148 [ 11.600713] genl_rcv_msg+0x218/0x298 [ 11.600722] netlink_rcv_skb+0x64/0x138 [ 11.600731] genl_rcv+0x40/0x60 [ 11.600740] netlink_unicast+0x1cc/0x2d8 [ 11.600748] netlink_sendmsg+0x1d8/0x460 [ 11.600757] __sock_sendmsg+0x64/0xc0 [ 11.600767] __sys_sendto+0x114/0x178 [ 11.600776] __arm64_sys_sendto+0x30/0x48 [ 11.600784] invoke_syscall+0x78/0x108 [ 11.600798] el0_svc_common.constprop.0+0xc8/0xf0 [ 11.600808] do_el0_svc+0x24/0x38 [ 11.600817] el0_svc+0x34/0x108 [ 11.600828] el0t_64_sync_handler+0x100/0x130 [ 11.600838] el0t_64_sync+0x190/0x198 [ 11.600847] ---[ end trace 0000000000000000 ]--- ``` ### 温度非常高 没有安装风扇散热,空载 64~65 度,在多核满载编译软件时可达到 78度,整个开发板十分烫手,注意,我是说整个开发板,芯片位置不能摸,否则绝对起泡。这可能是TI AM67A的制造工艺比较保守,毕竟是面向工业的,我自己有个 BeagleBone-AI64 在安装超大散热模块的状态下也是超级烫手,或许TI就是这样的传统了 ```shell nihui@BeagleBone:~$ cat /sys/devices/virtual/thermal/thermal_zone*/temp 76313 77098 78659 ``` # 配置编译器和开发环境 ```shell apt install build-essential git cmake ``` # 移植 opencv-mobile opencv-mobile 通过调整编译参数,删减部分opencv源码,来最小化编译的 opencv 库 提供了 opencv 常用的功能,如读写图片,处理,矩阵操作等等,版本与上游同步,无第三方依赖 在绝大多数情况下,以 1/10 的体积无痛替换官方 opencv,尤其适合对体积有特殊要求的移动端和嵌入式环境 ```shell wget https://github.com/nihui/opencv-mobile/releases/latest/download/opencv-mobile-4.11.0.zip unzip -q opencv-mobile-4.11.0.zip cd opencv-mobile-4.11.0 ``` 从opencv-mobile项目中抄一个 cmake toolchain 文件放在 opencv-mobile-4.11.0 目录里 https://github.com/nihui/opencv-mobile/blob/master/toolchains/aarch64-linux-gnu.toolchain.cmake 接下来就是按照opencv-mobile的文档,cmake标准编译流程走一遍,添加 `-DWITH_KLEIDICV=ON` 开启 KleidiCV集成,进一步优化arm64的性能 opencv-4.11支持了KleidiCV库集成,KleidiCV利用了最新Arm CPU中的高性能图像处理功能,可被集成至各类计算机视觉框架中,从而简化并加速计算机视觉工作负载的性能优化,而无需开发者执行额外操作。 ```shell mkdir build cd build cmake -DCMAKE_TOOLCHAIN_FILE=../aarch64-linux-gnu.toolchain.cmake -DCMAKE_INSTALL_PREFIX=`pwd`/install -DCMAKE_BUILD_TYPE=Release `cat ../options.txt` -DBUILD_opencv_world=OFF -DWITH_KLEIDICV=ON .. make -j4 make install ``` # opencv-mobile 图片缩放测试 利用opencv-mobile实现图片读取,缩放,保存图片 新建一个cmake工程,引入刚才编译好的 opencv-mobile ```cmake project(opencv-mobile-test) set(OpenCV_DIR "/home/nihui/opencv-mobile-4.11.0/build/install/lib/cmake/opencv") find_package(OpenCV REQUIRED) add_executable(opencv-mobile-test main.cpp) target_link_libraries(opencv-mobile-test ${OpenCV_LIBS}) ``` cpp实现:读取 in.png 图片,保持图片透明通道,缩放到240x240,保存到 out.png ```cpp #include #include #include int main() { cv::Mat bgra = cv::imread("in.png", 1); cv::resize(bgra, bgra, cv::Size(240, 240)); cv::imwrite("out.png", bgra); return 0; } ``` # opencv-mobile 打开usb摄像头测试 opencv-mobile 支持通过 linux v4l2 打开兼容的usb摄像头 先把usb摄像头插在开发板上 ``` [ 2940.579238] usb 1-1.2: new full-speed USB device number 3 using xhci-hcd [ 2940.681399] usb 1-1.2: New USB device found, idVendor=303a, idProduct=8000, bcdDevice= 1.00 [ 2940.681422] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 2940.681431] usb 1-1.2: Product: ESP UVC Device [ 2940.681437] usb 1-1.2: Manufacturer: Espressif [ 2940.681443] usb 1-1.2: SerialNumber: 12345678UVC Interface [ 2940.862227] usb 1-1.2: Found UVC 1.50 device ESP UVC Device (303a:8000) [ 2940.867701] usbcore: registered new interface driver uvcvideo ``` 通过lsusb命令可以看到接入的摄像头信息 ``` nihui@BeagleBone:~/opencv-test/build$ lsusb Bus 002 Device 002: ID 0451:8140 Texas Instruments, Inc. TUSB8041 4-Port Hub Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 003: ID 303a:8000 Espressif ESP UVC Device Bus 001 Device 002: ID 0451:8142 Texas Instruments, Inc. TUSB8041 4-Port Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ``` 复用刚才的工程,cpp实现:打开摄像头,每隔1秒截图,拼接9格,保存到out.jpg ```cpp int main() { cv::VideoCapture cap; cap.set(cv::CAP_PROP_FRAME_WIDTH, 320); cap.set(cv::CAP_PROP_FRAME_HEIGHT, 240); cap.open(0); const int w = cap.get(cv::CAP_PROP_FRAME_WIDTH); const int h = cap.get(cv::CAP_PROP_FRAME_HEIGHT); fprintf(stderr, "%d x %d\n", w, h); cv::Mat bgr[9]; for (int i = 0; i < 9; i++) { cap >> bgr; sleep(1); } cap.release(); // combine into big image { cv::Mat out(h * 3, w * 3, CV_8UC3); bgr[0].copyTo(out(cv::Rect(0, 0, w, h))); bgr[1].copyTo(out(cv::Rect(w, 0, w, h))); bgr[2].copyTo(out(cv::Rect(w * 2, 0, w, h))); bgr[3].copyTo(out(cv::Rect(0, h, w, h))); bgr[4].copyTo(out(cv::Rect(w, h, w, h))); bgr[5].copyTo(out(cv::Rect(w * 2, h, w, h))); bgr[6].copyTo(out(cv::Rect(0, h * 2, w, h))); bgr[7].copyTo(out(cv::Rect(w, h * 2, w, h))); bgr[8].copyTo(out(cv::Rect(w * 2, h * 2, w, h))); cv::imwrite("out.jpg", out); } return 0; } ``` 运行输出信息 ``` nihui@BeagleBone:~/opencv-test/build$ ./opencv-test devpath = /dev/video3 driver = uvcvideo card = ESP UVC Device: bus_info = usb-xhci-hcd.5.auto-1.2 version = 6063a capabilities = 84a00001 device_caps = 4200001 fmt = Motion-JPEG 47504a4d size = 320 x 240 100.00 size = 640 x 480 85.00 size = 480 x 320 90.00 size = 320 x 240 100.00 fps = 1 / 15 ~ 1 / 15 (+1 +15) 15.00 cap_pixelformat = 47504a4d MJPG cap_width = 320 cap_height = 240 bytesperline: 0 cap_numerator = 1 cap_denominator = 15 requestbuffers.count = 3 320 x 240 ``` 最后打开开发板上图片,确认摄像头正常工作了

  • 2025-03-19
  • 回复了主题帖: 测评入围名单:BeagleBoard BeagleY®-AI单板计算机

    已查看我的测评计划,可在活动期间内完成并发帖分享

最近访客

< 1/1 >

统计信息

已有8人来访过

  • 芯积分:26
  • 好友:--
  • 主题:1
  • 回复:1

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言