在玩树莓派小车的过程中遇到的问题记录嗷。
工具:
- 电脑,Linux,ubuntu 16.04
- 树莓派3B
目录:
- 电脑连接树莓派
- 查看opencv的版本
- 电脑传文件到树莓派
- Opencv的使用
- CMake的使用
- Qt的安装
- Qt的使用
- 树莓派系统的安装
- 树莓派新系统启动ssh
- 树莓派重装系统后电脑ssh连接树莓派时被告知不安全
- 树莓派系统设置
- CMake的安装
- 树莓派更换清华源
- OpenCV的安装
- 各种压缩文件的解压方式
- 删除文件或文件夹
- 修改文件或文件夹名称
- 树莓派开热点
- 树莓派配置wifi
- 扩展树莓派SWAP分区
- 两台电脑间用nfs远程传输文件
0. 注意事项
00. 血泪史
00.1 为了关掉树莓派连接到电脑的wlan0
1. 电脑连接树莓派
通过ssh(Secure shell,建立在应用层基础上的网络安全协议)。
可以通过电脑连接树莓派热点,再ssh树莓派的ip比如: 192.168.12.1,但是这样电脑就不能上网了。
所以为了电脑可以上网,又可以远程控制树莓派,选择用一根网线将树莓派和电脑连接起来。以下是配置方法:
- 命令
ps -e|grep ssh
可以用来查看是否安装了ssh服务,如果显示sshd则表示已安装,如果没有的话,先去安装吧。 - 打开电脑右上角wifi配置,选择底部“编辑连接...”,下拉至“以太网”部分,选择那个“有线连接”,“编辑”,在“IPv4设置”中将“方法(M)”改为“与其他计算机共享”。电脑与树莓派之间的连接就建立好了。
- 注意不是编辑电脑正在使用的那个wifi,而是编辑下边以太网中连着树莓派的有线连接。
- 在电脑终端中输入
arp -a
或sudo arp -a
命令,可以看到局域网下本机和树莓派的ip信息。其中192.168.1.1在是所在路由器,另外一个(比如10.42.0.78)是树莓派。- 前者位于wlsp2s0,后者位于enp3s0是什么意思?
- 这个时候就可以
ssh pi@树莓派的ip
了。- 注意,是
ssh [email protected]
,@前面是目标的用户名。不要直接ssh+ip。
- 注意,是
- 输入树莓派的密码,就好了。
还有一种方法,就是把树莓派通过网线连接到路由器,电脑上打开浏览器进入192.168.1.1
,查看路由器配置,可以找到树莓派的ip地址,此时电脑和树莓派也在同一局域网下。这个时候可以ssh [email protected](树莓派的ip,因情况而异)
- 退出ssh可以用
logout
或exit
命令。
2. 查看opencv的版本
- 命令行中输入
python
(默认使用的python版本)或python3
(如果装了python3.x的话)进入python。python --version
或python3 --version
可查看已有python的版本。
import cv2
,如果不报错则表明装上了,如果报错则没装上,安装opencv的方法见第X点。- 命令
cv2.__version__
可查看已安装的opencv版本。- 我们的咋才2.4.9.1?包的名字上写的3.4.1呢?。。。重装重装
3. 电脑传文件到树莓派
- 使用scp(secure copy)命令,该命令用于在Linux下远程拷贝文件。
- 格式为:
scp local_file remote_username@remote_ip:remote_folder
(不改变文件名)
或
scp local_file remote_username@remote_ip:remote_file
(改变文件名)
4. Opencv的使用
-
OpenCV(Open Source Computer Vision)
-
投向OpenCV的官网。OpenCV官网
果然有Online Documentation和Tutorials! -
打开Tutorials。
-
先跳过安装步骤。(已经安装好了,安装见第X点)
-
Let’s see Using OpenCV with gcc and CMake。它说,用OpenCV最简单的方法就是使用CMake,因为它不仅兼容多平台(Linux和Windows),还可以使很容易和其他工具结合起来(比如Qt,ITK和VTK)。
- 官网也很贴心地链接了CMake的使用教程!见第5点。
-
笔者的opencv安装在了
usr/local/include
里
5. CMake的使用
- CMake官网传送门:CMake的使用教程
- 学习一下手册吧。手册
6. Qt的安装
-
Qt是…
-
使用命令行安装Qt:
sudo apt-get install qt5-default
sudo apt-get install qtcreator
7. Qt的使用
- 终端命令行输入
qtcreator
可打开Qt - 选择要创建的项目类别,这里选择’console`控制台类别,接下来按照提示步骤依次设置项目名称和项目地址(location)、设置要包含的包(kits)(kit是干什么的?)、确认项目信息(summary)。
8. 树莓派系统的安装
- 工具:
- 树莓派一个,笔者使用的是树莓派3B(目前最新版是树莓派4);
- Micro SD卡一张,笔者使用的是32G的Micro SD卡;
- 电源,用于给树莓派供电,树莓派4需要至少3A的电源,树莓派4则是2.5A;
- 键盘和鼠标(初次配置需要USB连接的键鼠,以后可以使用蓝牙连接的)(我没有);
- 显示器 (我没有);
- 到树莓派官网,下载最新的树莓派系统到SD卡里,然后烧写到树莓派上。下面是详细步骤(参考官方教程Setting up your Raspberry Pi):
- 格式化(format)SD卡。
- 这里是一个Formatter,名为SD Association,有6M,下载到电脑上后安装。
- 下载树莓派系统源码。
- 官网的教程里推荐NOOBS(New Out Of the Box Software),这是适合新手的树莓派系统,里面有Raspbian和LibreELEC。(我想下的版本是2019年9月30日发布的NOOBS 3.2.1,压缩包有2.3G,因为网速原因,怎么都下不下来。找朋友要了已经下载好的压缩包,通过电脑发给我。ubuntu下两台电脑间远程文件传输方法见第8点。。。啊,最后我没有下那NOOBS,下的是2019-09-26发布的raspbian-baster,有2.7G,包含桌面和一些相关软件)
- 现在得到了树莓派最新系统的源码压缩包。
- 下载balenaEtcher镜像制作软件。将系统源码做到SD卡里很方便,运行这个软件选择系统源码压缩包,选择要写入的移动设备,确认开始(FLASH)就可以了。
- 我在制作镜像的时候遇到了问题,检测不到我的卡呃。
- 一气之下关电脑去睡觉,第二天重启电脑之后就可以正常使用这个软件了。重启大法好。
- 如果有键盘鼠标显示屏的话,先把它们接到树莓派上,然后树莓派上电启动。树莓派默认不开ssh。
- 有显示屏的话,树莓派很容易就配置了。进入树莓派桌面(用网线将电脑和树莓派连接起来,在里面
sudo raspi -config
,在里面找找怎么开启ssh。 - 如果没有显示屏,可以给树莓派系统的根目录里新建一个名称为ssh的空文件,没有后缀,再把SD卡插进树莓派,就开启了ssh。
- 有显示屏的话,树莓派很容易就配置了。进入树莓派桌面(用网线将电脑和树莓派连接起来,在里面
9. 树莓派新系统启动ssh
- 因为树莓派新系统默认不开ssh(据说是16年以后的版本会这样),所以电脑连接树莓派的时候会被拒绝。解决方式是:
- 烧写好系统的SD卡通过读卡器连接到电脑;
- 在根目录boot下新建一个空文件,名为ssh,不要后缀;
- 弹出SD卡,插入树莓派;
- 上电启动,则开启了ssh。
10. 树莓派重装系统后电脑ssh连接树莓派时被告知不安全
- 报错信息如下:
- 这是因为树莓派系统被重装了
- 更新一下电脑里存储的host key即可,命令为:
ssh-keygen -R 树莓派的ip
- 树莓派的初始密码是
raspberry
。
11. 树莓派系统设置
- 命令
sudo raspi-config
:
- 第一行可以给它改密码。我的密码改成了
raspberry1
(记下来备忘)。 - 第二行里的第一项可以设置树莓派的名称(hostname)。我的名字改成了
lovelypi
。
12. CMake的安装
- 如果有旧版本,则先卸载旧版本:
sudo apt-get autoremove cmake
- 到官网下载安装包(cmake官方下载地址)或者使用wget命令:
wget https://github.com/Kitware/CMake/releases/download/v3.15.4/cmake-3.15.4.tar.gz
+ wget是a non-interactive network retriever,用法是:
wget [OPTION]... [URL]...
比如:
+ 用wget指令如果下载到一半僵死了,可以使用Ctrl + z暂停下载(不是 + c),然后wget -c url
继续下载。正在下载(进度条好可爱呀):
- 解压:
tar -xvzf cmake-3.15.4.tar.gz
- 进入目录:
cd cmake-3.15.4
- 该文件夹中有一个README.rst文件(cat指令可打开该文件),里面有cmake使用方法,包括编译方法:
- 首先得有gcc和g++(一般都有)
- 然后依次run以下三个指令:
./bootstrap
(我的电脑太慢了,这一步执行了好久)
make
(这一步也执行了好久)
sudo make install
- 最后检验是否装好:
cmake --version
如果这样就是ok了:
13. 树莓派更换清华源
- 参考清华大学开源软件镜像站:https://mirror.tuna.tsinghua.edu.cn/help/raspbian/
- 选择自己树莓派系统对应的版本,根据提示更改两个文件:
- 注意: 一定要选择自己的pi对应的版本,别瞎换!之前我在网上找了一个教程,人家对应的是上一代Debian,stretch版本。以至于后来我apt-get install东西的时候一堆依赖库的问题,以及broken package。
14. OpenCV的安装
- 可以参考官网的安装教程:安装教程
- 先安装编译软件及依赖库等:
[compiler] sudo apt-get install build-essential
[required] sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
[optional] sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
- 下载源码并解压
- 从官网下载:https://opencv.org/releases/
- 或从git仓库下载,比如:
cd ~/<my_working_directory> git clone https://github.com/opencv/opencv.git git clone https://github.com/opencv/opencv_contrib.git
- 进入解压后的文件夹,创建一个名为build的文件夹用于存放临时文件,并进入:
cd opencv-4.1.1
mkdir build
cd build
- Configuring一下,比如:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
- Build一下,建议多开几个核,比如:
make -j4 # runs 4 jobs in parallel
(教程给的是j7,但我担心我电脑跑崩,所以只开了j4)
不幸的是 ,这一步在运行过程中有报错:
我的解决方法是sudo make -j4
,继续试一遍。。。
运行了一会儿,又有问题了:
和刚才一样。走了一会儿,又出错了:
过了会儿,又:
搜索解决方案无果,我头铁地准备再来一次,这次去掉了-j4,用的sudo make
好像问题都出在了那个atomic上。
参考了这篇文章:https://www.lizenghai.com/archives/29641.html
重新cmake,加了一句-DCMAKE_SHARED_LINKER_FLAGS='-latomic
还是不行,
改成
cmake -D CMAKE_BUILD_TYPE=RELEASE
-D CMAKE_INSTALL_PREFIX=/usr/local
-D OPENCV_EXTRA_MODULES_PATH=~/Downloads/opencv-4.1.1/modules
-D ENABLE_NEON=ON
-D ENABLE_VFPV3=ON
-D BUILD_TESTS=OFF
-D OPENCV_ENABLE_NONFREE=ON
-D INSTALL_PYTHON_EXAMPLES=OFF
-DCMAKE_SHARED_LINKER_FLAGS=’-latomic’
-D BUILD_EXAMPLES=OFF …
还是不ok。认真读报错信息,发现:
Linking CXX executable …/…/bin/opencv_test_core
执行sudo apt-get install libgtk-3-dev
后解决了找不到gtk的问题,但是其他几个还是有问题。部分报错信息粘贴如下,似乎很明了,但是我现在不想看了:
-- Could not find OpenBLAS include. Turning OpenBLAS_FOUND off
-- Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off
-- Could NOT find Atlas (missing: Atlas_CBLAS_INCLUDE_DIR Atlas_CLAPACK_INCLUDE_DIR Atlas_CBLAS_LIBRARY Atlas_BLAS_LIBRARY Atlas_LAPACK_LIBRARY)
-- Could NOT find BLAS (missing: BLAS_LIBRARIES)
-- LAPACK requires BLAS
-- A library with LAPACK API not found. Please specify library location.
-- Found apache ant: /usr/bin/ant (1.10.5)
-- Could NOT find JNI (missing: JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH)
-- VTK is not found. Please set -DVTK_DIR in CMake to VTK build directory, or to VTK install subdirectory with VTKConfig.cmake file
> /home/pi/Downloads/opencv-4.1.1/modules/calib3d
目前尝试的解决方法是重新建一个build文件夹(原来的可以删掉,也可以改个名儿扔在原来地方),在里面重新编译。
这次还make的时候还没有报错,不过每次到百分之八十多的一个地方就卡住不动了:
我对树莓派swap进行了扩容(参考第20点)。耐心等了一下午,终于没有error地make完了。
进行下一步!
(一般来说直接make不会出这么多破问题,要是有了上述问题,删掉这个build文件夹,重新建一个,再来一遍就好了。)
6. sudo make install
安装好之后可以自己测试一下,官网上有方法。
15. 各种压缩文件的解压方式
$ xz -d ***.tar.xz
$ tar -xvf ***.tar
$ tar -zxvpf ***.tar.gz
$ tar -jxvpf ***.tar.bz2
$ unzip ***.zip
16. 删除文件或文件夹
- 删除文件
- 带提示的:
rm -i filename
- 不带提示的:
rm filename
或rm -f filename
- 带提示的:
- 删除文件夹
- 带确认的:
rm -ir filedir
- 不带确认的:
rm -rf filedir
- 带确认的:
17. 修改文件或文件夹名称
- 使用mv(move)指令,格式为:
mv 原文件名 目标文件名
18. 树莓派开热点
- 配置ap热点及自启动,参考文章:用树莓派3B+开AP热点
- 首先关掉wlan0,因为Your adapter can not be a station (i.e. be connected) and an AP at the same time:
sudo ifconfig wlan0 down
- 创建WiFi热点使用GitHub上一个开源项目: https://github.com/oblique/create_ap
- 将代码copy到本地,安装:
sudo git clone https://github.com/oblique/create_ap
cd create_ap
sudo make install
- 安装依赖的库
sudo apt-get install util-linux procps hostapd iproute2 iw haveged dnsmasq
- 输入ifconfig显示网络接口
- 打开热点
sudo create_ap --no-virt wlan0 eth0 lovelypi raspberry123
- 其中–no-virt是一个参数,如果没有的话我这边会报warning;wlan0是要发出去的口,eth0是我连了网线的口。
- 将代码copy到本地,安装:
- 开机自启动
- 在/etc/rc.local最后添加
sudo create_ap --no-virt wlan0 eth0 lovelypi raspberry123 &
重启树莓派。
还有一个方法,我还没试:树莓派3B开热点并自动启动
给树莓派的eth0配置一个静态ip地址:sudo ifconfig eth0 192.168.12.1
(我也不知道这步要干啥,先别做吧。。。)
- 在/etc/rc.local最后添加
19. 树莓派配置wifi
sudo iwlist wlan0 scan
列出所有可连接wifi- 更改wifi配置文件:
sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
- 在文件的底部添加下面内容:
network={
ssid="Your_wifi_ssif"
psk="Your_wifi_password"
}
-
保存退出(
:wq
) -
几秒钟后应该就会连接上wifi
- 附:开关wifi的方式:
sudo ifconfig wlan0 down sudo ifconfig wlan0 up
-
更多内容可以参考文章:树莓派 3B+ 配置无线WiFi
-
另一个更简便的方法是直接进树莓派系统设置,在里面连接wifi:
sudo raspi-config
20. 扩展树莓派SWAP分区
- 参考文章:how-to-change-raspberry-pis-swapfile-size-on-rasbian
top
指令可以查看CPU、内存等的使用情况- 整个流程如下图,其中在nano的那一步把默认的SWAP大小由100改成1024:
21. 两台电脑间用nfs远程传输文件
- nfs(Network File System,网络文件系统),可以在两台电脑上共享文件。(包括树莓派和电脑之间)
- 以下分为两部分,一是电脑把文件挂载上去,二是树莓派获取文件
- 电脑将文件挂载上去:
- 先安装相关服务:
sudo apt-get install nfs-common nfs-kernel-server
sudo apt-get install portmap
- 第二条指令执行完显示下面这个,所以这条语句可能没啥用。
- 第二条指令执行完显示下面这个,所以这条语句可能没啥用。
- 修改export里面的设置,命令为:
sudo vim /etc/exports
- 将原文注释掉,加上要共享的文件夹。语法为:
- 前面是文件夹路径;
- 注意:一定要每一步都写对写完整,并且和后面树莓派要访问的路径一致,否则在后面
mount
时会出现reason given by server: No such file or directory
这样的报错。
- 注意:一定要每一步都写对写完整,并且和后面树莓派要访问的路径一致,否则在后面
- *表示所有ip均可共享,若要指定某个ip则用其具体ip地址替代;
- 括号里面是选项,参数说明:
- ro 只读访问
- rw 读写访问
- sync 所有数据在请求时写入共享
- async nfs在写入数据前可以响应请求
- secure nfs通过1024以下的安全TCP/IP端口发送
- nsecure nfs通过1024以上的端口发送
- subtree_check 如果共享/usr/bin之类的子目录时,强制nfs检查父目录的权限(默认)
- no_subtree_check 不检查父目录权限。
- 举例如下图:
- 前面是文件夹路径;
- 冒号加wq,保存并退出编辑;
- 启动nfs服务:
sudo /etc/init.d/nfs-kernel-server restart
- 检查是否启动:
showmount –e
- 至此电脑就将nfs服务设置好了。
- 先安装相关服务:
- 树莓派端设置:
- 第一次需要安装nfs相关服务(pi可能自带了)
sudo apt install nfs-common
- 接收文件:
- 在本地建一个文件夹用于挂载发送方的节点,比如
mkdir pcshare
- 用mount指令将发送方节点挂载到该文件夹下,格式为:
sudo mount 发送方的ip:发送方文件夹路径 本地要挂载到的文件夹
比如:
sudo mount 192.168.1.107:/home/glourier/picar/pishare pcshare
- 此时,刚才新建的文件夹就变成一个共享文件夹。打开该文件夹,可以看到里面的共享文件:
cd pcshare
ls
- 将共享文件夹里的内容拷贝到本机其他地方即可,用cp指令(copy):
cp [选项] 源文件或目录 目标文件或目录
- 拷贝结束后,为了检查传输是否出错,可以核对双方md5信息。
- md5是……
md5sum 文件名称
可以查看该文件md5信息。- checksum指令可以核对,恩,怎么用呢?
- 拷贝结束后,为了检查传输是否出错,可以核对双方md5信息。
- 在本地建一个文件夹用于挂载发送方的节点,比如
- 第一次需要安装nfs相关服务(pi可能自带了)
- 结束服务
使用umount指令加共享文件夹名称即可结束该文件夹的共享状态,比如
sudo umount pcshare
0. 注意事项
- 为避免树莓派因不正常关机造成的系统错误,树莓派关机时不要直接拔掉电源,而是使用
shutdown
命令先关机。 - 显示没有权限的时候可以
sudo
嗷。
00. 血泪史
00.1 为了关掉树莓派连接到电脑的wlan0
- 树莓派不可以同时连接wifi和开热点。所以为了让树莓派开热点,我需要关掉之前树莓派连接到电脑的wlan0,我参考了一种更改配置文件的方法。
(可能是我没有理解到更改配置的精髓,所以在下面这个文件里加了后面那两句之后小车就挂了)
- 后面我用了reboot命令让树莓派重启,可是它断开之后就再也连不上了。
- 树莓派之前一直是通过网线连接电脑,电脑开了共享网络。
- 现在
arp -a
看不到树莓派的MAC地址了,那里显示incomplete,ping不通,ssh不上; - 通过网线把树莓派连接到路由器上,尽管路由器的DHCP里有它,但是已连设备里没有,而且依旧ping不通,ssh不上,显示no route to host;
- 取下树莓派的内存卡,通过读卡器连接到电脑上,到树莓派系统里找到我改了关键文件的地方(/etc/network/interfaces),直接鼠标双击打开文件,显示是只读文件,没有权限更改;
- 在命令行打开文件所在目录,用sudo把加了的那两行删掉,保存,弹出。
- 重新把SD卡装回树莓派,就可以了。
- 现在
- 幸好挽回了,不然就要重装系统了。