0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何为树莓派 FPV 战斗无人机构建自动驾驶仪的“眼睛”!

上海晶珩电子科技有限公司 ? 2025-06-08 08:33 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

学习如何为FPV战斗无人机构建一个视频模块,该模块能够从模拟FPV摄像机捕获视频流,利用这些视频流执行计算机视觉任务,并将图像传输到飞行控制器进行进一步处理(OSD)以及通过VTX进行视频传输。

本文是我一年多来一直在进行的研发工作的自然延续,该研发工作专注于为FPV战斗无人机构建自动驾驶仪。

当我开始探索如何向FPV操作员通知自动驾驶仪的当前状态和飞行参数时,我意识到在基于Betaflight固件的飞行控制器中没有可用的软件解决方案。这促使我考虑一个软硬件结合的解决方案。

在评估不同选项时,有两个关键因素脱颖而出:首先,保持与Betaflight固件和流行的FPV无人机配置的兼容性,而不改变它们,这一点很重要。其次,解决方案需要具备修改FPV视频源和OSD(屏幕显示)的能力,以显示计算机视觉模型识别的目标,以及其他自动驾驶仪状态和飞行参数。

在本文中,我将分享我在这一过程中发现的内容。

架构

最初的想法是在FPV摄像机和飞行控制器(FC)之间创建一个“中间人”,以便在FPV屏幕上叠加额外的控制和消息,同时处理图像以执行人工智能驱动的计算机视觉任务。对于这个角色,我选择了一台树莓派以及两个加密狗:一个AV2USB加密狗(用于从FPV摄像机获取数字MJPEG图像)和一个HDMI2AV加密狗(用于以PAL/NTSC模拟格式将修改后的图像传输到FC)。

2598064c-4400-11f0-986f-92fbcf53809c.png

视频模块接线图

为了在FPV摄像机和飞行控制器之间实现“中间人”功能,我决定支持常用的接口,特别是JST 3针电缆。在此设置中,一条JST电缆将AV2USB加密狗连接到FPV摄像机,而另一条JST电缆则将飞行控制器连接到HDMI2AV加密狗。两个加密狗都连接到伴侣计算机(在我们的例子中是树莓派3),使其能够获取/传输带有特定于计算机视觉任务的视频叠加的FPV摄像机图像。

25b0e054-4400-11f0-986f-92fbcf53809c.jpg

AV2USB加密狗的焊接点

如上图所示,我将USB电缆的红色(5V)线焊接到加密狗上的5V焊盘上,同时还将JST电缆的红色线也焊接上去。这种设置允许USB电缆同时为加密狗和FPV摄像机供电。

JST电缆的接地线(黑色)和视频信号线(黄色)焊接到加密狗上的AV和G焊盘上。此外,USB电缆的接地线(灰色)也连接到加密狗上的G焊盘上。USB的蓝色线焊接到DP(数据+)焊盘上,而USB的白色线则焊接到DM(数据-)焊盘上。

适当的焊接确保了电路板的可靠运行。

25c25794-4400-11f0-986f-92fbcf53809c.jpg

4极3.5毫米AV2PAL电缆,CVBS信号线焊接至3针JST连接器

为了将HDMI2AV加密狗连接到FC,我使用了CVBS线(PAL输出中的黄色线),并将其连接到一条JST电缆上,该电缆通过用于FPV摄像机连接的相同3针JST线直接连接到FC板上。有关详细信息,请参考上面的接线图。

CVBS电缆中只有两条线连接到3针JST连接器上。黄色线是信号线(CAM),连接到另一侧的黄色线上。黑色线是接地线(GND),连接到另一侧对应的接地线上。红色线(5V)保持未连接状态,因为它通常用于为FPV摄像机供电。然而,在我们的设置中,我们以不同的方式为FPV摄像机供电。

让我们继续探讨软件部分。

导入

为了实现视频叠加功能,我们需要导入整个项目中将使用的两个包:cv2(用于计算机视觉任务,如从FPV摄像机捕获帧)和numpy(用于执行数组操作和数据操作)。

importcv2importnumpyasnp

如果你还没有安装它们,现在是时候安装了。

定义和状态

本节内容来源于Autopilot “BEE” 仓库中的适当文件,包括definitions.py和autopilot.py,该仓库针对FPV战斗无人机(模拟器版本)的跟踪目标功能。本节提供了应在FPV屏幕上显示的自动驾驶仪设置及当前状态这部分内容源自仓库中Autopilot "BEE" with target following for FPV Combat Drone(模拟器版本)的definitions.py和autopilot.py文件,提供了应在FPV屏幕上显示的自动驾驶仪的设置和当前状态。

https://github.com/under0tech/autopilot_bee_sim

# definitionsvideo_source =0video_full =1video_message_limit =60camera_width =720camera_height =480camera_fps =1# statestate= { 'bee_state':'OFF',# OFF, READY, ... 'rssi':0, 'rssi_msg':'Strong signal', 'frame': {}, 'video_msg':'[Manual control is ON]', 'video_msg_countdown':0}

定义——视频叠加模块的设置:

video_source = 0,指的是通过树莓派上的USB端口连接的摄像机,由于默认情况下没有安装摄像机,因此这是索引为0的第一个摄像机。

video_full = 1,表示视频叠加将以全屏模式显示。设为0用于调试。

video_message_limit = 60,限制在FPV屏幕上显示video_msg的帧数为60帧。

camera_width和camera_height,将分辨率设置为720x480像素。

camera_fps = 1,使用OpenCV(cv2)每秒捕获1帧。

自动驾驶仪的状态(当前状态):

rssi_msg,可以设置为“Strong signal”(强信号)或“No signal”(无信号)。根据此消息,RC标签和圆形符号将以红色或绿色显示在FPV屏幕上,指示信号强度。

video_msg,可以包含要在FPV屏幕上显示的任何消息,直到达到有限的帧数(在video_msg_countdown中计数)。

frame,保存当前帧,该帧可以由计算机视觉模型处理,以实现FPV无人机的自主操作。

当前状态和所有字段状态在自动驾驶仪运行期间由应用程序的其他组件更新。

视频叠加

该子系统的核心是视频叠加功能,这些功能会添加关于自动驾驶仪状态的额外组件和消息,例如RC信号强度、自定义消息、缩放后的目标以及用于瞄准的中心十字线,所有这些都显示在FPV屏幕上(FPV护目镜或FPV显示器)。

查看代码及其在列表下方的描述。

# Autopilot's overlaydef draw_rc_auto_status(frame): color_green = (0,255,0) color_red = (0,0,255) color = color_greenifstate['rssi_msg'] =='Strong signal'elsecolor_red cv2.circle(frame, (50,50),7, color, -1) font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(frame,"RC", (65,55), font,0.5, color,2) ifstate['bee_state'] =='OFF': cv2.putText(frame,'MANUAL', (110,55), font,0.5, color_red,1) else: cv2.putText(frame,'AUTO', (110,55), font,0.5, color_green,2)def draw_dotted_line(frame, start, end, color, thickness, gap): x1, y1 = start x2, y2 = end length=int(np.sqrt((x2 - x1) **2+ (y2 - y1) **2)) fori in range(0,length, gap *2): start_x =int(x1 + (x2 - x1) * i /length) start_y =int(y1 + (y2 - y1) * i /length) end_x =int(x1 + (x2 - x1) * (i + gap) /length) end_y =int(y1 + (y2 - y1) * (i + gap) /length) cv2.line(frame, (start_x, start_y), (end_x, end_y), color, thickness)def draw_cross_target(frame): color_white = (255,255,255) height, width,_= frame.shape center_x, center_y = width //2, height //2 draw_dotted_line(frame, (center_x -50, center_y), (center_x +50, center_y), color_white,2,5) draw_dotted_line(frame, (center_x, center_y -50), (center_x, center_y +50), color_white,2,5)def draw_scaled_target(frame): color_white = (255,255,255) rect_size =50 height, width,_= frame.shape center_x, center_y = width //2, height //2 top_left_x = center_x - rect_size //2 top_left_y = center_y - rect_size //2 center_region = frame[top_left_y:top_left_y + rect_size, top_left_x:top_left_x + rect_size] scaled_region = cv2.resize(center_region, (rect_size *2, rect_size *2), interpolation=cv2.INTER_LINEAR) overlay_x_start = width - rect_size *2-20 overlay_y_start =20 frame[overlay_y_start:overlay_y_start + rect_size *2, overlay_x_start:overlay_x_start + rect_size *2] = scaled_region cv2.rectangle(frame, (overlay_x_start, overlay_y_start), (overlay_x_start + rect_size *2, overlay_y_start + rect_size *2), color_white,1)def draw_video_message(frame): font = cv2.FONT_HERSHEY_SIMPLEX color_white = (256,256,256) ifstate['video_msg'] !='': cv2.putText(frame,state['video_msg'], (43,80), font,0.5, color_white,1) countdown =int(state['video_msg_countdown']) ifcountdown < video_message_limit:? ? ? ? ? ? state['video_msg_countdown'] = countdown +?1? ? ? ? else:? ? ? ? ? ? state['video_msg'] =?''? ? ? ? ? ? state['video_msg_countdown'] =?0

draw_rc_auto_status(frame)函数在视频叠加层上显示RC信号强度和自动驾驶仪模式。它使用绿色或红色圆圈来指示信号是强还是弱。如果自动驾驶仪关闭,它还会以红色显示“MANUAL”飞行模式;如果自动驾驶仪激活,则以绿色显示“AUTO”。

draw_dotted_line(frame, start, end, color, thickness, gap)函数在帧上的两点之间绘制一条虚线。它根据指定的间隔和厚度计算线段,绘制小线段以创建虚线效果。

另一个函数draw_cross_target(frame)在视频帧的中心绘制一个十字线。它使用draw_dotted_line创建一对水平和垂直的虚线,在中心相交。这个视觉辅助工具有助于在FPV无人机操作期间跟踪FPV屏幕的中心点(目标方向)。

draw_scaled_target(frame)函数提取并放大FPV视频源的中心区域,将其作为插图显示在右上角。它捕获一个方形区域,对其进行缩放,然后将其叠加到帧上。这提供了目标的更详细视图。

draw_video_message(frame)函数负责在视频叠加层上显示文本消息。如果在系统状态的video_msg字段中存在消息,则将其显示在RC信号强度下方。这包括一个倒计时计时器以控制消息的持续时间,并在计时器超过预设限制(默认:60)时清除它。此消息可以显示由FPV护目镜屏幕的视频叠加功能检索到的任何自定义文本。它对于显示自动驾驶仪操作的各个阶段非常有用。

运行点

main()函数实现了视频叠加功能所需的所有操作,处理其他函数的初始化和执行,以便在FPV屏幕上绘制额外的控制和消息。

#Mainfunctiondefmain(): cap = cv2.VideoCapture(video_source) if not cap.isOpened(): print("Error: Could not access the camera.") exit() cap.set(cv2.CAP_PROP_FRAME_WIDTH, camera_width) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, camera_height) cap.set(cv2.CAP_PROP_FPS, camera_fps) if video_full: cv2.namedWindow("BEE", cv2.WND_PROP_FULLSCREEN) cv2.setWindowProperty("BEE", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) print("Press 'q' to exit.") while True: ret, frame = cap.read() if not ret: print("Error: Could not read frame.") break # Save current frame to state for # Computer Vision tasks state['frame'] = frame draw_rc_auto_status(frame) draw_scaled_target(frame) draw_cross_target(frame) draw_video_message(frame) cv2.imshow('BEE', frame) if cv2.waitKey(1) &0xFF ==ord('q'): break cap.release() cv2.destroyAllWindows()

main()函数使用OpenCV初始化视频捕获设备(例如,我们之前连接的FPV摄像机),配置其分辨率和帧率。如果启用了video_full(设为1),则可选地将显示窗口设置为全屏模式。该函数进入一个循环以连续读取视频帧,为计算机视觉任务更新共享状态字典中的当前帧。

它随后应用几个视频叠加函数(draw_rc_auto_status、draw_scaled_target、draw_cross_target、draw_video_message)以在FPV屏幕上显示控制和消息。

如上所述实现的main()函数仅适用于实验目的。若要集成到自动驾驶仪中,此代码将被移动到单独的线程中,并由自动驾驶仪主进程管理。然而,那是另一个话题了。

启动和使用

完成所有接线和焊接后,我启动了FPV无人机以及安装在其上的伴侣计算机。然后,我运行了一个Python脚本以验证视频模块是否正常工作,成功地将FPV视频源从FPV摄像机传输到飞行控制器,并随后通过VTX传输到FPV护目镜。

25cd39ac-4400-11f0-986f-92fbcf53809c.jpg

带有视频叠加和OSD屏幕的FPV显示器

如上图所示,包括OSD、视频源和视频叠加在内的所有内容都正确地显示在FPV屏幕上。默认的PAL分辨率720x480像素导致图像质量不太理想。然而,对于搭载模拟FPV摄像机的FPV无人机来说,这种分辨率水平是相当常见的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 无人机
    +关注

    关注

    231

    文章

    10876

    浏览量

    187462
  • 自动驾驶
    +关注

    关注

    790

    文章

    14363

    浏览量

    171115
  • 树莓派
    +关注

    关注

    122

    文章

    2031

    浏览量

    107667
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    有朋友用PIC开发自动驾驶仪的吗

    有没有爱好者用PIC来开发无人机自动驾驶的?
    发表于 11-28 12:22

    The Drone Pi :用树莓无人机(一)——材料准备

    RaspiU盘:用来保存视频遥控和遥控接收器:把遥控接收器连到Multiwii尽请期待:用树莓无人机(二)——工作原理和框架构造用树莓
    发表于 12-29 15:24

    树莓无人机(三)——推进和飞行控制

    树莓无人机(一)——材料准备用树莓无人机(二)——工作原理和框架构造推进:飞行控制器和
    发表于 01-06 10:54

    树莓无人机(完)——树莓部分

    树莓无人机(一)——材料准备用树莓无人机(二)——工作原理和框架构造用
    发表于 01-06 11:32

    自动驾驶汽车+无人机 的车企新套路

    未来汽车业界的商业模式,除了各家都在布局的自动驾驶汽车组成的汽车共享服务车队,还有什么新模式?比如和无人机结合。今天的日内瓦车展上,路虎发布了一款特种车辆系统,简单来说,这是一款以路虎发现为原型
    发表于 07-14 15:43

    请问树莓如何利用Tensorflow实现小车的自动驾驶

    基于树莓的人工智能自动驾驶小车
    发表于 11-25 07:22

    基于ld303+树莓自动驾驶

    课设开题开太大扯到dan了。做了一个自动驾驶相关的东西 ,百度搜了下自动驾驶的两大模块,一个是毫米波雷达,一个是激光扫描雷达,激光扫描雷达太贵,以后有钱了再试,先在淘宝挑了一个最便宜的毫米波雷达模块
    发表于 08-18 06:02

    使用树莓Pico做了一个自动驾驶小车

    树莓Pico做了一个自动驾驶小车,连接上蓝牙,可以用手机控制它的移动了。
    发表于 01-05 07:32

    基于ARM处理器的小型无人机自动驾驶仪的设计

    自动驾驶仪无人机飞行控制系统的核心,采用ARM处理器和MEMS传感器件设计小型无人机自动驾驶仪符合飞控系统的高精度、小型化、数字化发展趋势,具有很好的应用前景。
    发表于 05-09 14:32 ?73次下载

    TU Delft已研发出世界上最小的微型自动驾驶仪

    随着“无人驾驶飞机”这个词变得如此普遍以至于你可以从任何东西上真正构建无人机,研究人员的目标是使这种技术在日常实践中更小、更实用。图尔夫特宇航工程学院微型飞行器实验室的项目经理Bart Remes带领一群研究人员创造了世界上最小
    的头像 发表于 04-30 09:21 ?1.1w次阅读

    自动驾驶仪开源分享

    电子发烧友网站提供《自动驾驶仪开源分享.zip》资料免费下载
    发表于 10-21 14:50 ?2次下载
    <b class='flag-5'>自动驾驶仪</b>开源分享

    帆船自动驾驶仪自动转向系统)开源分享

    电子发烧友网站提供《帆船自动驾驶仪自动转向系统)开源分享.zip》资料免费下载
    发表于 10-21 14:39 ?0次下载
    帆船<b class='flag-5'>自动驾驶仪</b>(<b class='flag-5'>自动</b>转向系统)开源分享

    使用 Betaflight 和树莓实现 FPV 无人机自主飞行!

    开始利用Betaflight飞行控制器、简单的10个Python文件和树莓,为你的FPV战斗无人机构建自己的
    的头像 发表于 06-07 08:32 ?845次阅读
    使用 Betaflight 和<b class='flag-5'>树莓</b><b class='flag-5'>派</b>实现 <b class='flag-5'>FPV</b> <b class='flag-5'>无人机</b>自主飞行!

    树莓打造无人机,你需注意的事项!

    能否将树莓装入无人机?使用树莓打造无人机是可行的。树莓
    的头像 发表于 07-14 17:49 ?559次阅读
    用<b class='flag-5'>树莓</b><b class='flag-5'>派</b>打造<b class='flag-5'>无人机</b>,你需注意的事项!

    翼辉信息重磅发布深度无人机自动驾驶仪DEEP UAV PILOT

    翼辉信息重磅发布深度无人机自动驾驶仪 DEEP UAV PILOT,该款产品采用先进的双脑结构设计,将主计算机系统(大脑)与飞行管理单元(小脑)集成于飞控之中,能够更加高效的完成智能化飞行任务。
    的头像 发表于 07-15 09:56 ?273次阅读