开发者套件连接的显示器不显示
问题现象:
- 开发者套件启动后,通过HDMI接口连接的显示器不亮。
- 该显示器连接到 Windows 台式机,是可以正常显示的。
解决方案:
- 参考昇腾论坛帖子(本机显示模式时,HDMI0接显示器无桌面输出 ),远程 ssh 登录开发者套件后,运行 /usr/local/bin/toggle_graphical_desktop.sh 即可。
- 不常用开发者套件连接的显示器,先暂不将上述 toggle_graphical_desktop.sh 加到 ~/.bashrc 中。
使用手机摄像头
电脑转发(iPhone)
主要设备:mac笔记本,iPhone 手机,昇腾开发板
方案概述:
1、用 Mac笔记本自带的 QuickTime Player 获取 iPhone 手机的摄像头视频流。
2、在 Mac笔记本上运行 ffmpeg,将 iPhone 手机的摄像头视频流,推送到昇腾开发板上。
3、在昇腾开发板上接收 iPhone 手机的摄像头视频流,并推理。
主要步骤如下:
1、连接相关设备。
(1)用苹果数据线,将 iPhone 手机连接到 Mac 笔记本。
(2)用网线,连接 Mac笔记本和昇腾开发板。网线插在昇腾开发板上下排列的2个网口的上面那个网口,昇腾开发板的 IP地址则固定为 192.168.137.100。
2、在 Mac 笔记本上,运行系统自带的 QuickTime Player。
3、在 QuickTime Player 界面上,选择 File | New Movie Recording。将弹出界面,画面为 iPhone 摄像头拍摄到的视频画面。
4、在 Mac笔记上启动 Terminal 应用,并在 Terminal 窗口中执行
ffmpeg -f avfoundation -list_devices true -i "",列出有哪些音视频设备。ffmpeg 如不存在,则需要自行安装。如何安装 ffmpeg
可自行搜索指南,此处从略。
如下显示的 George’s iPhone14 Camera,就是要使用的 iPhone 摄像头名称。
~ % ffmpeg -f avfoundation -list_devices true -i ""
...
[AVFoundation indev @ 0x7fb407804580] AVFoundation video devices:
[AVFoundation indev @ 0x7fb407804580] [0] FaceTime HD Camera (Built-in)
[AVFoundation indev @ 0x7fb407804580] [1] George’s iPhone14 Camera
[AVFoundation indev @ 0x7fb407804580] [2] Capture screen 0
[AVFoundation indev @ 0x7fb407804580] AVFoundation audio devices:
[AVFoundation indev @ 0x7fb407804580] [0] Built-in Microphone
[AVFoundation indev @ 0x7fb407804580] [1] screen-record-input
[AVFoundation indev @ 0x7fb407804580] [2] BlackHole 2ch
[AVFoundation indev @ 0x7fb407804580] [3] George’s iPhone14 Microphone
[AVFoundation indev @ 0x7fb407804580] [4] BlackHole 64ch
...
5、在 Mac 笔记本的 Terminal 界面中,执行
ffmpeg -f avfoundation -framerate 30 -video_size 1280x720 -pix_fmt uyvy422 -i "George’s iPhone14 Camera" -preset ultrafast -b:v 2M -f mpegts udp://192.168.137.100:1234
6、在昇腾开发板启动 jupyter notebook,然后在本机浏览器窗口中,修改 /01-yolov5/main.ipynb,增加对手机摄像头视频流的推理。
6.1 复制 infer_camera 函数,约 25行(含空行)
6.2 粘贴。把函数名 infer_camera 改成 infer_phone_camera
6.3 注释掉以下2行。在行首输入 #;或者选中2行,按 CTRL + / 键(CTRL 和 / 同时按下)。
# camera_index = find_camera_index()
# cap = cv2.VideoCapture(camera_index)
6.4 在注释掉的2行下面,插入以下4行
cap = cv2.VideoCapture("udp://127.0.0.1:1234", cv2.CAP_FFMPEG)
if not cap.isOpened():
print("无法打开手机视频流。")
else:
6.5 选中函数的余下部分,从
# 初始化可视化对象到结束,按 CTRL + ] 键缩进。新增的
infer_phone_camera 如下:
def infer_phone_camera(model, labels_dict, cfg):
"""外设手机摄像头实时推理"""
# 获取摄像头
# camera_index = find_camera_index()
# cap = cv2.VideoCapture(camera_index)
cap = cv2.VideoCapture("udp://127.0.0.1:1234", cv2.CAP_FFMPEG)
if not cap.isOpened():
print("无法打开手机视频流。")
else:
# 初始化可视化对象
image_widget = widgets.Image(format='jpeg', width=1280, height=720)
display(image_widget)
while True:
# 对摄像头每一帧进行推理和可视化
_, img_frame = cap.read()
image_pred = infer_frame_with_vis(img_frame, model, labels_dict, cfg)
image_widget.value = img2bytes(image_pred)
6.6 复制
elif infer_mode == 'camera':
infer_camera(model, labels_dict, cfg)
粘贴后改成:
elif infer_mode == 'phone':
infer_phone_camera(model, labels_dict, cfg)
然后修改
infer_mode = 'phone'
执行样例程序,就可以看到结果。
电脑转发(安卓)
1、打开开发者模式。进入 [设置 | 关于手机],在 [版本] 处点击数次,会出现提示“您正处于开发者模式”。
2、设置 [开发者选项]
2.1 进入 [系统和更新 | 开发者选项]
2.2 打开 [USB调试]
2.3 设置 [选择USB配置] 为 [MTP(多媒体传输)]
2.4 通过数据线,将安卓手机和 Windows 电脑连接。
3、下载 scrcpy-win64-v3.2.zip,解压后放到本地 windows 电脑的目录中。
4、下载 ffmpeg-2025-05-19-git-c55d65ac0a-full_build.7z,解压后放到本地 windows 电脑的目录中。
5、启动一个终端(CMD或powershell),转到 scrcpy 所在目录,执行
.\scrcpy --no-audio --max-fps 30 --video-bit-rate 2M
5.1 顺利的话,Windows 电脑上将出现手机界面。
5.2 如果提示找不到设备,则重复上述第2步。然后在 scrcpy 所在目录中,执行 .\adb devices,看看是否招到设备了。
6、再启一个终端,转到 ffmpeg\bin
所在目录,执行.\ffmpeg -f gdigrab -i title="tas-an00" -preset ultrafast -f mpegts udp://192.168.137.100:1234
- 如果把 ffmpeg\bin 目录加入了环境变量PATH中,则在任意目录执行即可,ffmpeg 前面也不用加 .\
7、修改样例程序,可参考 使用 iPhone 摄像头 的 第6步。
通用(IP摄像头)
【简介】将手机作为视频服务器。开发板从手机(视频服务器)上拉流,从而得到手机的视频画面。要组成局域网,开发板要能连通手机(视频服务器)的IP地址。
1、手机下载安装“IP摄像头”(IP Camera) App(作者:沈垚yao)
1.1 安卓:https://www.downxia.com/downinfo/196291.html
1.2 iPhone:App Store 搜索 IP Camera
2、运行 IP摄像头 App,进入设置页面设置[用户名][密码]。
2.1 安卓:点击首页右上角[齿轮],可进入设置界面。
2.2 iPhone:点击有野右上角[三条横线],再点击[设置],可进入设置页面。
3、设置完成后回App首页,点击底部 [打开IP摄像头服务器],并打开[RTSP服务器]
3.1 安卓:在界面上勾选 [RTSP]
3.2 iPhone:点击底部齿轮,再点击[RTSP服务器]
4、设置视频画面分辨率为 640 x 480(这样,开发板使用该视频时相对比较流畅)
4.1 找一个和手机(IP摄像头服务器)在同一个局域网的手机或电脑,打开浏览器,输入手机(IP摄像头服务器)界面上显示的
http网址,比如 http://192.168.43.132:8081/。如需要输入用户名和密码,请输入第2步中设置的用户名和密码。
4.2 浏览器会出现手机画面。点击画面右小角[分辨率],选择 640 x 480
5、在开发板上 ping 手机(IP摄像头服务器)的地址,如果能 ping 通,则进入下一步。比如 ping 192.168.43.132
6、在昇腾开发板启动 jupyter notebook,然后在本机浏览器窗口中,修改 /01-yolov5/main.ipynb
以下是修改后的 infer_phone_camera,供参考。
url = 'rtsp://gdv2:Lily093897@192.168.43.132:8554/live'中,要替换为你自己的用户名:密码@IP地址:(RTSP)端口号。
def infer_phone_camera(model, labels_dict, cfg):
"""外设手机摄像头实时推理"""
# 获取摄像头
# camera_index = find_camera_index()
# cap = cv2.VideoCapture(camera_index)
url = 'rtsp://gdv2:Lily093897@192.168.43.132:8554/live'
cap = cv2.VideoCapture(url)
if not cap.isOpened():
print("无法打开手机视频流。")
else:
# 初始化可视化对象
image_widget = widgets.Image(format='jpeg', width=640, height=480)
display(image_widget)
while True:
# 对摄像头每一帧进行推理和可视化
_, img_frame = cap.read()
image_pred = infer_frame_with_vis(img_frame, model, labels_dict, cfg)
image_widget.value = img2bytes(image_pred)
驱动机械臂报 xxx I2C error
问题现象:
- 运行机械臂底层控制的样例(比如控制RGB灯、控制蜂鸣器、控制1个舵机、控制6个舵机灯),屏幕显示 xxx I2C error(其中xxx是对应的控制函数)。
- 运行已调通的华为机械臂样例程序,也报xxx I2C error,机械臂无法运动。
解决过程:
- 为深入了解机械臂底层控制,单独安装了机械臂厂家提供的底层驱动。应该与此有关。还按了机械臂扩展板上的K1键、K2键、RESET键,可能关系不大。
- 咨询机械臂客服,说可能是上位机和机械臂扩展板连接的 40PIN 排线松了,关机断电后重插试试。试了,问题依旧。其实看机械臂扩展板上的 1蓝3红 指示灯的状态,i2c 应该是正常的。
- 继续咨询机械臂客服,说运行命令
i2cdetect -y -r 1检查 i2c 是否正常。运行后显示一堆---,表示 i2c 设备不正常。 -
在华为昇腾开发者套件上运行命令
i2cdetect -l,发现有很多 i2c 总线,从 i2c-0 到 i2c-3、i2c-5 到 i2c-9、i2c-13。i2cdetect -y -r 1表示检查 i2c-1 是否正常。 -
通过插上和拔掉华为昇腾开发者套件和机械臂扩展板的 40PIN 排线,运行命令
i2cdetect -y -r {x}({x}是 i2c 总线号码,取值0、1、2、3、5、6、7、8、9、13)逐个检查 i2c 总线,确定机械臂扩展板应该是挂在 i2c-7 上(拔掉了,运行命令显示一堆---;插上了,运行命令后有 2 处显示了数字),而不是机械臂客服说的 1 号总线。 -
继续请教机械臂客服。客服说,上位机不是在他家买的,无法定位。然后开始和客服讲道理,并提供相关解决建议,以及实在不行可否退货:
- 首先机械臂扩展板文档说,是可以移植到自己(即客户)的系统。既然如此,那肯定要找个不是从贵司买的上位机,当前我就使用了一个 Linux 开发板作为上位机。
- 为了控制机械臂,客户自己的系统只需要调用机械臂厂家封装好的 python API。当前我调用 python API 时得到 xxx I2C error 的报错,总要指导指导吧,不能不管吧。
- 貌似上位机认为机械臂在 i2c-7 总线上,而不是底层驱动 Arm_Lib.py 中写死的 1 号总线。可以如何修改下试试。
-
机械臂客服说可以修改 Arm_Lib.py,将 1 改成 7 号总线。然后运行样例程序比如控制蜂鸣器的,依旧不行。记得要
sudo python3 setup.py install,执行后,再执行样例程序,OK了。 - 解决后,技术支持群中有好心人也说:华为昇腾开发者套件,是把机械臂挂在 i2c 7 号总线的。
解决方案:
- 是由底层驱动 Python 程序中的 i2c 总线号(1号),和机械臂在上位机中的真正的 i2c 总线号(7号)不一致导致的。当前修改了底层驱动 Python 程序中的总线号(从1修改为7)解决的。
- 可能是安装了机械臂厂家提供的底层驱动,导致了上述问题。比如:华为昇腾开发者套件的机械臂样例,已经将底层驱动的总线号修改为正确的7号;机械臂厂家默认的是1号,安装后覆盖了正确的7号,导致报 xxx I2C error。未进一步详查证实。