自制树莓派无人机
设计思路
灵感来源于watch dogs里面的黑客无人机,以树莓派+pixhawk为主体,搭载大疆F450机架,配以2000毫安锂电池,可以凭借pixhawk出色的飞控能力,以及树莓派优秀的运算能力,在空中完成近源渗透,人脸识别,数据转发(星链),无人机送货等多项功能。
注意:建议先给pixhawk和树莓派刷入固件,调试好各项参数(根据情况可以无线调试,建议先调试完可以无线调试的项目),再组装飞机(gps,电机电调调试必须先组装好飞机),不一定要按照文章顺序来做
材料准备
大概要这些
F450机架(动力套装)
如果懂得焊接可以更自由的购买电机电调来组装,不懂焊接的建议直接咸鱼(淘宝上很少或者没有组装好的)买F450的动力套装,因为动力套装插上飞控就可以操作,不需焊接,购买前请注意是否真的不需要焊接。
减震板
用于给pixhawk和树莓派减震,不同的机架组装方式会有不同的减震组装方案,对飞机的保护起重要作用。
电池
2000毫安4S足够了,电池尺寸长155mm宽45mm高28mm已经很极限了,建议买以下这种款式的电池
机载电脑(树莓派或其他嵌入式开发设备)
经费足够所以采用了8G树莓派4b做机载电脑,记载电脑建议配套散热措施
pixhawk套件(也可其他飞控但pixhawk配件较为齐全)
经费足够所以购买了全套的pixhawk套件,包括M8NGPS以及支架,电流计,pixhawk飞控,减震板
游戏手柄(或遥控器)
买个便宜的就行,游戏手柄可以连接手机,手机4g控制无人机,没有距离限制,但对网络稳定性有要求。遥控器稳定性会比4g好,但是控制距离十分有限,而且要额外加装接收机。
摄像头
购买十几块钱的树莓派配套摄像头(或者其他机载电脑的配套摄像头)
随身WIFI
随身WIFI用于树莓派上网,也可以用4g模块,但随身WIFI可以插手机卡,而且可以很方便的插入usb口
其他
锂电池T插转usb,锂电池T插一公分二母,平衡充,BB响,3M胶或者强力双面胶若干,扎带若干,魔术贴带子一条,无线网卡(渗透用)……可以根据需要设计模块来购买,任君想象,任君选择
购物清单
这里是我为项目购买的所有东西,供参考
硬件组装
机架焊接(如果不用焊接可以跳过)
第一步:底板焊接
将4个电调,XT60电源线,和2根JST公头线如图所示焊接在底板上。如下所示:
注意:
1.电调与底板之间的焊点不能虚焊。飞行器启动后电流比较大,虚焊会导致发热严重并脱落,造成飞行中的严重事故!
2.前后四个焊点(上图)不能太大,否则会阻挡以后电池的安装。
3.JST公头线作为预留给云台和图传供电的接口。以往的教程没有提及这点,在后期加装云台图传时稍显不便,需要重新焊接电源线比较麻烦。
焊点要光滑饱满,焊锡覆盖整个焊点和接线。焊接好以后用手拖拽测试是否牢固。
第二步:电机香蕉头焊接和套上热缩管
很多电机出厂都没有焊接香蕉头,需要自己焊接。香蕉头焊接也是组装过程中一个重要的地方。香蕉头焊接不好,通电后会导致电机缺相烧毁。
香蕉头用纸巾包裹好,夹在老虎钳上。用纸巾的目的是防止焊锡里面的松香融化后流到插头部分,会造成接触不好。焊接时先将焊锡融入香蕉头内并填满,然后再插入电机线。如下图所示:
焊接好冷却后,用手拖拽测试是否牢固。
确认没有问题,就可以将热宿管套上,用热风枪或则电吹风高温档或则打火机,吹烤包裹部分。使其紧贴。如下所示:
2812电机焊接好香蕉头如下:
机架组装
1.将电机固定在机臂上。注意:用机架里面配套的银色大螺丝安装电机。如下所示:
2.用机架里面的银色小螺丝将机臂固定在底板上,螺丝先不用拧得太紧,方便后面调节,如下图:
注意:银色头电机和黑色头电机的安装位置不能装错!!!
银色电机螺帽是反丝,以后是顺时针旋转;黑色电机螺帽是正丝,以后是逆时针旋转,这样安装以后才不会射桨!
- 安装机架上板
4.上板安装好以后,再拧紧底板螺丝!紧固所有螺丝。
5.连接电机与电调
将电机焊接好的香蕉头分别插到电调的3个香蕉头里面
注意:先任意连接。要无人机正常飞行对电机的旋转方向是有要求的。但做到这步电机还无法启动,等后面飞控调试好以后,我们再来调整电机的旋转方向。
四个电机和电调都要分别接好。
安装飞控以及机载电脑(两种减震方案)
首先先将减震板组装好,两种减震方案都需要先将减震板这样安装好:
先把减震板和减震球组装好,小技巧:先将减震球安装于小板上,然后再连接大板。注意:减震球不可用尖锐的工具安装,减震球破损后就没有减震的功能了。(小球硬塞进去)
取一块3M胶,将减震板粘在机架上板中心。可在四个角用尼龙扎带绑扎一下,进一步加固减震板。
然后,在减震板上方也贴上胶:
第一种(材料少,美观,对机载电脑的保护性更好,成本高)
先将机载电脑贴在减震板上,树莓派4b要将usb口朝向机头(即机架红色臂的方向)随后在机载电脑上用螺丝安装一块装载飞控的塑胶板,再将飞控贴在塑胶板上(飞控箭头方向为机头方向),塑胶板的3D打印文件在下方给出,这个方案贵就贵在这个3d打印板,普遍要50+一块
飞控装载板(点击下载)
第二种(材料体积大,不太美观,对飞控板的保护性更好,对机载电脑的减震效果不太好,成本稍微便宜)
按照第一种的方法,不过是先将飞控板安装在减震板上,然后再加装上文购物清单中的碳钎维扩展版,再将机载电脑装载在扩展版上
我的成品一开始采用的是方案一,后来操作不当炸机后因为经费不足,改用了方案二,实测两种方案对飞行影响不大,不过个人更喜欢方案一
安装GPS支架,蜂鸣器,安全开关等
这些的安装十分简单,用扎带和胶等工具固定即可。需要注意的是,GPS支架有高矮两种,建议选择高的那种,我的成品一开始也是选高款,但炸机之后我就选了矮款(轻信了淘宝商家的“防屏蔽”,其实感觉没啥用)以下附上成品关于这些细节的图片:
(图片拍的不好请见谅,但足够清晰,可以使用)
注意图中没有安装bb响,bb响的安装要求锂电池引出的pin从左到右插入bb响(或者从右到左,不记得了,都试试吧),树莓派采用的是锂电池T插转usb供电(注意输出电压,不然会烧坏树莓派)
Pixhawk的连接
像蜂鸣器,安全开关,gps等都要与pixhawk连接,具体的连接如下:
器件 | pixhawk接口1 | pixhawk接口2 |
---|---|---|
蜂鸣器 | buzzer | —— |
安全开关 | switch | —— |
GPS | GPS | I2C |
6pin线数传(连接机载电脑) | telem 2 | —— |
电流计 | power | —— |
电调与飞控的连接
这里直接摘录:
按照下图上面的电机标识,将电机对应的电调连接到飞控主要输出口(main out)14通道。电调线从机臂之间穿过到飞控后方。注意:main out接口是从右边开始第7针脚开始(前面是AUX1AUX6辅助接口)
电调连接飞控的顺序不能接错。否则会导致飞机解锁推油门就翻跟斗。
和S500机架的接线一样,注意黑色负极在上,白色信号在下:
下面再附上一张跟桨动力有关的图片,方便理解与调试:
正桨—CCW—逆时针旋转 反桨—CW—顺时针旋转
判断方法一:用桨叶迎风面区分正反桨:螺旋桨横着放,桨叶有字的一面向上,右边桨叶的迎风面在后面的是正桨,右边桨叶的迎风面在前面的是反桨。
判断方法二:桨叶平放,左高右低为反桨,反之为正桨
飞控与机载电脑连接(以树莓派为例)
通过pixhawk侧边的micro-usb与树莓派的usb连接是最方便最稳定的,但是usb线不够美观而且很占位置,于是我采用了serial串口连接方式,以下给出树莓派接口图和pixhawk数传的接口图
树莓派:
图片下方是树莓派USB接口的朝向
pixhawk:
pixhawk的图可能有点看不清,解释一下:telem2口右6个pin,pixhawk箭头朝下,telem从左往右数前三个分别是:5V,Tx,Rx 最右边的是Ground。在连接时,如果pixhawk连接了电流计,则不需要将5V供电和Ground连接树莓派,如果没有连接电流计,则需要将5V和Ground连接树莓派,让树莓派给pixhawk供电。连接时,将pixhawk的5V和树莓派的5V连接,将Ground与Ground连接,将pixhawk的Tx与树莓派的Rx连接,将pixhawk的Rx与树莓派的Tx连接(图片中的连接方式是错的)
摄像头与树莓派连接
将摄像头相机朝向树莓派usb口的方向(金手指朝着typec口,即与usb口反向),缕直摄像头的数据线,直接将金手指插入树莓派靠近usb口的那个插摄像头的接口(大力出奇迹)
软件设置
烧录pixhawk
在以下网址下载mission planner到电脑:
https://ardupilot.org/planner/docs/mission-planner-installation.html
打开mission planner后,将烧录好的sd卡(4G以上,FAT32格式)插入pixhawk的卡槽内,将pixhawk通过usb线连接电脑。点击初始设置-安装固件-All Options 记住上方相应飞机的最新支持版本(例如copter v4.4.0)
在跳出的弹窗里最上一栏版本选择相应的版本,platform选择Pixhawk 1,下面version选择与最上一栏相应的,最下面firmware选择相应的apj文件(比如我选择的是copter)
这套配置适合pixhawk2.4.8的硬件使用
最后点击upload firmware上传固件到pixhawk
离线烧录
可能有时会因为网路问题无法联网烧录,可以选择load costume firmware加载本地固件,文件我放在下面:
离线固件(点击下载)
烧录树莓派
在网上下载树莓派官方烧录工具:https://www.raspberrypi.com/software/
根据树莓派的不同,选择相应位数的带桌面版本的pi os镜像,(可以在官方烧录工具中联网烧录,也可以使用本地镜像,如果使用本地镜像,先到给出网址下载相应镜像文件)我购买的8G树莓派,可以选择64位的镜像:https://www.raspberrypi.com/software/operating-systems/
找一张32G以上的sd卡,使用官方烧录软件格式化(选择操作系统-擦除),格式化后,选择相应系统,先别急着烧录,在烧录界面找到一个高级设置之类的东西,将树莓派初始的账户,连接WiFi等设置好再烧录,不然可能出现无法登录,无法联网等问题(无法连接wifi还可以接网线后ssh,进入桌面连接wifi,但无法登录只能重新烧录)
烧录完成后将sd卡插入树莓派卡槽,给树莓派上电开机,如果树莓派红灯常亮,绿灯不定时闪烁则正常启动。
设置树莓派
ssh进入树莓派,敲入:
sudo raspi-config #这个config还可以改很多东西,比如修改分配给相机的内存大小,或者优化性能
在出来的界面选择interface options,将Legacy camera打开,将vnc打开,进入serial port,将通过serial登录shell关闭,将serial port hardware打开,然后树莓派会询问是否要重启,先不要重启,修改/boot/config.txt,在末尾加上:
enable_uart=1
dtoverlay=disable-bt
保存修改后重启树莓派
安装motion以及飞控软件
在树莓派上执行以下命令
sudo apt-get install motion python3 python3-dev python3-opencv python3-wxgtk4.0 python3-pip python3-matplotlib python3-lxml python3-pygame
pip3 install PyYAML mavproxy --user
echo 'export PATH="$PATH:$HOME/.local/bin"' >> ~/.bashrc #这一行我印象中没用过,算式非必要?
安装好motion后,将树莓派/etc/motion/motion.conf文件中的内容改成以下内容:
# Rename this distribution example file to motion.conf
#
# This config file was generated by motion 4.5.1
# Documentation: /usr/share/doc/motion/motion_guide.html
#
# This file contains only the basic configuration options to get a
# system working. There are many more options available. Please
# consult the documentation for the complete list of all options.
#
############################################################
# System control configuration parameters
############################################################
# Start in daemon (background) mode and release terminal.
daemon on
# Start in Setup-Mode, daemon disabled.
setup_mode off
# File to store the process ID.
; pid_file value
# File to write logs messages into. If not defined stderr and syslog is used.
log_file /var/log/motion/motion.log
# Level of log messages [1..9] (EMG, ALR, CRT, ERR, WRN, NTC, INF, DBG, ALL).
log_level 6
# Target directory for pictures, snapshots and movies
target_dir /var/lib/motion
# Video device (e.g. /dev/video0) to be used for capturing.
video_device /dev/video0
# Parameters to control video device. See motion_guide.html
; video_params value
# The full URL of the network camera stream.
; netcam_url value
# Name of mmal camera (e.g. vc.ril.camera for pi camera).
; mmalcam_name value
# Camera control parameters (see raspivid/raspistill tool documentation)
; mmalcam_params value
############################################################
# Image Processing configuration parameters
############################################################
# Image width in pixels.
width 640
# Image height in pixels.
height 480
# Maximum number of frames to be captured per second.
framerate 15
# Text to be overlayed in the lower left corner of images
text_left CAMERA1
# Text to be overlayed in the lower right corner of images.
text_right %Y-%m-%d\n%T-%q
############################################################
# Motion detection configuration parameters
############################################################
# Always save pictures and movies even if there was no motion.
emulate_motion off
# Threshold for number of changed pixels that triggers motion.
threshold 1500
# Noise threshold for the motion detection.
; noise_level 32
# Despeckle the image using (E/e)rode or (D/d)ilate or (l)abel.
despeckle_filter EedDl
# Number of images that must contain motion to trigger an event.
minimum_motion_frames 1
# Gap in seconds of no motion detected that triggers the end of an event.
event_gap 60
# The number of pre-captured (buffered) pictures from before motion.
pre_capture 3
# Number of frames to capture after motion is no longer detected.
post_capture 0
############################################################
# Script execution configuration parameters
############################################################
# Command to be executed when an event starts.
; on_event_start value
# Command to be executed when an event ends.
; on_event_end value
# Command to be executed when a movie file is closed.
; on_movie_end value
############################################################
# Picture output configuration parameters
############################################################
# Output pictures when motion is detected
picture_output off
# File name(without extension) for pictures relative to target directory
picture_filename %Y%m%d%H%M%S-%q
############################################################
# Movie output configuration parameters
############################################################
# Create movies of motion events.
movie_output off
# Maximum length of movie in seconds.
movie_max_time 60
# The encoding quality of the movie. (0=use bitrate. 1=worst quality, 100=best)
movie_quality 45
# Container/Codec to used for the movie. See motion_guide.html
movie_codec mkv
# File name(without extension) for movies relative to target directory
movie_filename %t-%v-%Y%m%d%H%M%S
############################################################
# Webcontrol configuration parameters
############################################################
# Port number used for the webcontrol.
webcontrol_port 8080
# Restrict webcontrol connections to the localhost.
webcontrol_localhost off
# Type of configuration options to allow via the webcontrol.
webcontrol_parms 0
############################################################
# Live stream configuration parameters
############################################################
# The port number for the live stream.
stream_port 8081
# Restrict stream connections to the localhost.
stream_localhost off
##############################################################
# Camera config files - One for each camera.
##############################################################
; camera /usr/etc/motion/camera1.conf
; camera /usr/etc/motion/camera2.conf
; camera /usr/etc/motion/camera3.conf
; camera /usr/etc/motion/camera4.conf
##############################################################
# Directory to read '.conf' files for cameras.
##############################################################
; camera_dir /usr/etc/motion/conf.d
stream_maxrate 15
更改后键入:
vcgencmd get_camera
如果返回:
supported=1 detected=1, libcamera interfaces=0
则说明成功,使用sudo motion
来启动motion服务,并在浏览器中打开相应ip的8080端口来管理摄像头,通过打开8081端口来查看摄像头画面,使用sudo motion stop
来停止motion的服务
我也尝试过很多其他的摄像头方案,但motion是最稳定同时也还算方便的,于是采用了motion
树莓派连接地面站以及内网穿透
在手机谷歌商店中下载mission planner和qgc(qgc也可以在其官网下载app),将地面站安装至手机。确保pixhawk和树莓派均已上电,并且pixhawk已经连接好树莓派,打开树莓派键入:
mavproxy.py --master=/dev/ttyAMA0 --aircraft=test --out=127.0.0.1:14550
这句命令的语法是:
mavproxy.py --master=pixhawk连接的端口文件 --aircraft=自己选一个名字 --out=ip:端口
这里推流到本地端口,然后将本地端口映射出去,就可以通过qgc访问了,推流对带宽的需求不高,2m已经很足够了(你也可以将手机的端口通过natapp映射出去,然后推流到qgc)
注意事项:
1.qgc默认使用14550端口
2.地面站软件和mavproxy默认使用udp协议推流,如果要使用tcp协议则要写成--out=tcpin:0.0.0.0:<port>
这点会影响到你在内网穿透时隧道的选择(比如natapp不限流量隧道只有tcp)
除了与地面站的通讯需要内网穿透,ssh以及motion也要内网穿透,具体操作不赘述,课自行查看natapp官网:https://natapp.cn/
飞机调试
一切连接好设置好之后还不能起飞,我们可以根据以下的教程在mission planner里调试(注意飞行模式一定要设置,一定要在mission planner里面设置)同时因为我们没有配遥控器,于是就省去了遥控器调试的部分,建议在mission planner里设置完飞行模式后到qgc里调试,调试方法大同小异,在调试完加速度计,罗盘,地平线,电池等后(需要电流计):
飞控连接地面站以后,初始设置 页面会多出 必要硬件,选择 机架类型 ,选择与图片相应的类型
注意:新版固件如果不设置机架类型,就会警报:check firmware or FRAME_CLASS
第三步:加速度校准
初始设置 页面,点 加速度计校准
做加速度计校准前,将飞机水平放置,校准过程会执行 6个动作,每次按电脑回车键或则空格键确认,点击 校准加速度计
- Place vehicle level and press any key(水平放置)完成后回车
- Place vehicle on its LEFT side and press any key(向左边放置)完成后回车
- Place vehicle on its RIGHT side and press any key(向右边放置)完成后回车
- Place vehicle nose DOWN and press any key(向下放置)完成后回车
- Place vehicle nose UP and press any key(向上放置)完成后回车
- Place vehicle on its BACK and press any key(反过来放置)完成后回车
校准完成,会显示calibration Successful。
如果校准失败,请重新校准。
第四步:指南针校准
点击初始设置下的必要硬件菜单,请确保GPS接线正确。
选择指南针菜单,按下图勾选对应的设置以后点击开始,如下所示:
飞控里面和GPS模块里分别各有一个指南针。
GPS里集成的指南针一般叫做外置罗盘是1#,飞控里面的指南针叫内置罗盘是2#。
注意:校准罗盘请远离金属构件、喇叭等强磁性东西。
校准时要求将飞机每个面都朝上旋转1~2圈(正反均可)。
1.水平放置旋转1~2周
旋转的时候注意USB线打结,可顺时针旋转一周,逆时针旋转一周。
或则用数传模块代替USB线,就能避免USB线缠绕。
2.左侧朝下旋转1~2周
3.右侧朝下旋转1~2周
4.机头朝下旋转1~2周
5.机头朝上旋转1~2周
6.底朝上旋转1~2周
校准过程会伴随着2个进度条的行进,当进度条行进完毕,校准就完成了。如果不能校准,请断开连接检查接线是否正确,重新执行校准。
校准完成后要求重启飞控。
重新连接USB后,再连接地面站,指南针页面就能看到指南针的数据。数值小于 400 为绿色代表数值正常可用,当大于 400 黄色代表警告,当超过 600为红色完全不可用。大于400数值需要重新校准。
然后,在对飞行模式,手柄等进行调试和设置,以下给出我的一些设置参考:
调试好后装上螺旋桨,在电机一栏以很小的速度旋转电机,确保风是吹向地下的,飞机才能起飞
起飞时刻
起飞前先使用screen -R 喜欢的名字
创建一个screen来运行mavproxy,以防mavproxy掉线,这里的演示时是没有装螺旋桨的,这样不会太危险,实际上电机的转速是非常快的,所以装上螺旋桨飞行时要远离人群,而且要通过练习操作熟练
(视频飞机电机的声音会有些大,提前调小一点音量,因为是用github pages做的博客,视频可能加载不出来)
飞机保养
注意以下两点:
1.飞机的锂电池一定要使用专门的充电器,这样可以监测电压不至于过充,如果充电器不支持监测电压,那就人工监测bb响的数值,充电时一定要清楚电池是什么电池(比如纳米聚合物电池),每一节电池的满电电压是4.2V,最低电压是3.6V,保存电压是3.8V到3.9V,过放和过充都会影响电池的寿命和性能。
2.飞机的四个着陆位置均装上防震海绵胶,有钱的可以买个脚架,但不可以不装任何防护措施
反思总结
1.飞机的成本还可以压缩,比如可以购买更小的机架,更便宜的机载电脑和飞控
2.可以研究更好更方便,可以直接在地面站观看,基于推流的飞行摄像系统
3.飞机的飞行并不好,怀疑是电磁屏蔽导致的,也可能是没有调试好
4.应该在电源处加装开关,而不是靠插拔电源线来启动或关闭飞机电源