树莓派FPV机器人系统编译远程监控

  • 内容
  • ....
  • 相关

原计划使用最新版Node.js实现FPV,但由于其中一个npm模块 node-ads1x15,还是几年前的版本,不使用它本来也可以实现,但考虑到还需要用它完成电池电量检测,于是考虑降低Node.js版本。新版Node.js的安装请见:树莓派手动选择版本安装Node.js

树莓派监控测试
树莓派监控测试

Node.js安装

为了确保兼容性,树莓派 Raspbian 选择了 jessie 版本,jessie版本远程桌面VNC的设置与Buster版本完全一致,详见:树莓派FPV机器人系统编译之VNC 。同时Node.js版本选择 v8.17.0,它是Node.js v8版本的最后一个发布版,之后就是v9.x.x了。选择v8的原因是在安装后续的npm模块时,很多模块对v8之前的版本都不在支持了。

pi@raspberrypi:~ $ sudo apt-get remove nodejs
pi@raspberrypi:~ $ sudo apt-get purge nodejs
pi@raspberrypi:~ $ sudo rm /usr/bin/node
pi@raspberrypi:~ $ sudo rm /usr/bin/npm

使用上述命令删除Jessie默认安装的node.js,同时删除node和npm目录。

pi@raspberrypi:~ $ wget https://npm.taobao.org/mirrors/node/v8.17.0/node-v8.17.0-linux-armv7l.tar.xz
pi@raspberrypi:~ $ tar -xvf node-v8.17.0-linux-armv7l.tar.xz
pi@raspberrypi:~ $ sudo mv ./node-v8.17.0-linux-armv7l /usr/local/node
pi@raspberrypi:~ $ sudo ln -s /usr/local/node/bin/node /usr/bin/node
pi@raspberrypi:~ $ sudo ln -s /usr/local/node/bin/npm /usr/bin/npm
pi@raspberrypi:~ $ node -v
v8.17.0
pi@raspberrypi:~ $ npm -v
6.13.4

上述命令是手动安装Node.js v8.17.0的方法,第一行完成源码压缩包node-v8.17.0-linux-armv7l.tar.xz下载;第二行解压压缩包;第三行将解压文件全部拷贝到/usr/local/node;第四、第五行完成node和npm的软连接;最后验证node和npm是否安装成功。 更详细步骤请见:树莓派手动选择版本安装Node.js

安装 Apache2

要实现远程控制和监控,需要Apache2。安装请使用如下命令:

pi@raspberrypi:~ $ sudo apt-get install apache2

修改npm模块地址

因为后续需要使用npm安装express、socket.io等模块,如果采用默认官方地址的话,由于在外网速度会非常缓慢,因此需要对地址进行修改,采用下面的命令即可完成:

pi@raspberrypi:~ $ npm config set registry https://registry.npm.taobao.org

下载远程UI文件

制作有趣的树莓派FPV机器人 的介绍中,作者将远程控制的UI文件放到了Github仓库,下面就需要获取该远程代码,使用Git从github上同步到树莓派:

pi@raspberrypi:~ $ git clone https://github.com/CoretechR/ZeroBot Desktop/touchUI

同步完成后,在树莓派桌面上就多了一个touchUI文件夹,如下图:

 树莓派VNC桌面
树莓派VNC桌面

下面命令行进入到这个文件夹,并完成npm初始化:

pi@raspberrypi:~ $ cd Desktop/touchUI

项目初始化

pi@raspberrypi:~/Desktop/touchUI $ npm init

在node开发中使用npm init会生成一个pakeage.json文件,这个文件主要是用来记录这个项目的详细信息的,它会将我们在项目开发中所要用到的包,以及项目的详细信息等记录在这个项目中。方便在以后的版本迭代和项目移植的时候会更加的方便。也是防止在后期的项目维护中误删除了一个包导致的项目不能够正常运行。使用npm init初始化项目还有一个好处就是在进行项目传递的时候不需要将项目依赖包一起发送给对方,对方在接受到你的项目之后再执行npm install就可以将项目依赖全部下载到项目里。

如果不进行初始化,将会收到一系列npm警告,找不到package.json文件等,最终易导致模块安装失败!

未初始化
未初始化

初始化过程中需要填写以下信息:

package name:                     项目名字(必填,这里我直接package)
version:                          版本号,非必填
description:                      项目描述,非必填
entry point:                      项目入口文件(app.js)
test command:                     启动时执行脚本文件的命令(默认node app.js)
git repository:                   github仓库地址,非必填
keywords:                        项目关键字,非必填
author:                           作者名字,非必填
license:                          发行项目需要的证书,非必填
.....                             其他还有bugs和homepage等信息,非必填

初始化过程如下图:

npm init
npm init

安装必要的npm模块

初始化完成后,我们继续安装必要的模块,包括 node-ads1x15、express、socket.io、pi-gpio和pigpio。

pi@raspberrypi:~/Desktop/touchUI $ sudo npm install node-ads1x15
pi@raspberrypi:~/Desktop/touchUI $ sudo npm install express
pi@raspberrypi:~/Desktop/touchUI $ sudo npm install socket.io
pi@raspberrypi:~/Desktop/touchUI $ sudo npm install pi-gpio
pi@raspberrypi:~/Desktop/touchUI $ sudo npm install pigpio
npm安装必要的模块
npm安装必要的模块

细心地朋友会发现上图中安装node-ads1x15、express、socket.io、pi-gpio 时都顺利完成,但在安装pigpio时又出现了警告和错误,其原因是npm用户权限的问题导致,这里尝试使用“sudo npm install pigpio –unsafe-perm”命令安装依然失败。

npm  check permissions
npm check permissions

最后只能用修改相应文件夹权限的方式解决了。

修改相应文件夹权限

在上面的警告信息中,发现涉及需要修改的文件夹包含:“/node_modules”、“/node_modules/bindings”、“/node_modules/nan ”、“/node_modules/pigpio”和“/node_modules/file-uri-to-path”,使用下面的命令逐一修改:

pi@raspberrypi:~/Desktop/touchUI $ sudo chown -R $USER /home/pi/Desktop/touchUI/node_modules/bindings
pi@raspberrypi:~/Desktop/touchUI $ sudo chown -R $USER /home/pi/Desktop/touchUI/node_modules/nan             
pi@raspberrypi:~/Desktop/touchUI $ sudo chown -R $USER /home/pi/Desktop/touchUI/node_modules/pigpio
pi@raspberrypi:~/Desktop/touchUI $ sudo chown -R $USER /home/pi/Desktop/touchUI/node_modules
pi@raspberrypi:~/Desktop/touchUI $ sudo chown -R $USER /home/pi/Desktop/touchUI/node_modules/file-uri-to-path

权限修改完成后,在尝试使用“npm install pigpio”命令安装pigpio,这里因为已经修改了目录权限,所以“sudo”可以省略了。

pi@raspberrypi:~/Desktop/touchUI $ npm install pigpio

> pigpio@3.0.0 install /home/pi/Desktop/touchUI/node_modules/pigpio
> node-gyp rebuild

make: Entering directory '/home/pi/Desktop/touchUI/node_modules/pigpio/build'
  CXX(target) Release/obj.target/pigpio/src/pigpio.o
  SOLINK_MODULE(target) Release/obj.target/pigpio.node
  COPY Release/pigpio.node
make: Leaving directory '/home/pi/Desktop/touchUI/node_modules/pigpio/build'
+ pigpio@3.0.0
updated 1 package in 16.094s

成功!pigpio版本号为3.0.0 。

安装mjpg-streamer

为什么要安装mjpg-streamer? MJPG是MJPEG的缩写,但是MJPEG还可以表示文件格式扩展名。MJPEG 全名为 “Motion Joint Photographic Experts Group”,是一种视频编码格式, Motion JPEG技术常用与闭合电路的电视摄像机的模拟视频信号“翻译”成视频流。因此要实现视频流的实时监控,mjpg-streamer就是首选。要安装它,请参照下面的命令逐一完成。

pi@raspberrypi:~/Desktop/touchUI $ cd
pi@raspberrypi:~ $ sudo apt-get install libjpeg62-turbo-dev
pi@raspberrypi:~ $ sudo apt-get install cmake
pi@raspberrypi:~ $ git clone https://github.com/jacksonliam/mjpg-streamer.git ~/mjpg-streamer
pi@raspberrypi:~ $ cd mjpg-streamer/mjpg-streamer-experimental
pi@raspberrypi:~ $ make clean all
pi@raspberrypi:~ $ sudo mkdir /opt/mjpg-streamer
pi@raspberrypi:~ $ sudo mv * /opt/mjpg-streamer

自此,FPV机器人需要的软件基本安装完成了,下面需要完成必要的启动配置。

配置开机自启动

启动配置文件位于“/etc/rc.local”,nano打开它,

pi@raspberrypi:~ $ sudo nano /etc/rc.local
树莓派启动配置文件
树莓派启动配置文件

在 “exit 0” 前面插入:

cd /home/pi/Desktop/touchUI
bash start_stream.sh
sudo node app.js&
cd

现在尝试运行下面的命令,测试一下:

pi@raspberrypi:~ $ sudo node app.js
listening on *:3000

在远程PC或手机浏览器地址栏输入树莓派IP地址和端口号,我的是“http://192.168.1.81:3000”,顺利的话你能看到实时的监控画面了。

树莓派实时视频
树莓派实时视频

图中可看到,控制机器人拍照的圆形按钮,大灯开关,树莓派CPU温度和电量,因为本次只是测试远程图像监控,其余功能待部分元件到齐后测试。

*屏幕图像旋转

实时视频流实现了,那在一些特殊场景如何实现视频翻转呢?视频格式在哪设置呢?在树莓派桌面的touchUI文件夹下,有一个“start_stream.sh”文件,打开它可以看到

 start_stream.sh
start_stream.sh
LD_LIBRARY_PATH=/opt/mjpg-streamer/ /opt/mjpg-streamer/mjpg_streamer -i "input_raspicam.so -vf -hf -fps 15 -q 50 -x 640 -y 480" -o "output_http.so -p 9000 -w /opt/mjpg-streamer/www" > /dev/null 2>&1&

其中, 删除start_stream.sh文件中的-vf和-hf,可以将相机图片旋转180度。同时可以修改fps、刷新率和分辨率,具体设置待各位自行研究啦!