树莓派小车实验——谢谢车宝还挺乖巧

树莓派⼩车实验——谢谢车宝还挺乖巧
树莓派⼩车实验
课程简介
这是我们⼤四上开设的⼀门实践课程,最基本的实现⽬标是实现简单的⼩车循迹,有点像上学期计控实验但换了个环境且不⽤简单的传感器实现。
感觉逻辑都差不多哈,检测到该拐了就拐就好。不过计控实验⽤的环境是类似于数电模块的绘图式编程,感觉更直观些。之后这个代码写完后就知道是不是⼀样了,感觉⼋九不离⼗。
硬件介绍
树莓派(主板)
⼩车已经搭建完毕
树莓派
系统基于Linux(从未接触过)
基于ARM的微型电脑主板,以SD/MicroSD卡为内存硬盘,卡⽚主板周围有1/2/4个USB接⼝和⼀个10/100 以太⽹接⼝(A型没有⽹⼝),可连接键盘、⿏标和⽹线,同时拥有视频模拟信号的电视输出接⼝和HDMI⾼清视频输出接⼝,以上部件全部整合在⼀张仅⽐信⽤卡稍⼤的主板上,具备所有PC的基本功能只需接通电视机和键盘,就能执⾏如电⼦表格、⽂字处理、玩游戏、播放⾼清视频等诸多功能。Raspberry Pi B款只提供电脑板,⽆内存、电源、键盘、机箱或连线。
⼤概就是之前的实验都是在电脑上编程然后录⼊板⼦,这次是在板⼦上直接做,树莓派⾃⼰就是个主机,插个显⽰屏和键盘直接做就⾏了
前置⼯作
四个⼈⼀起买了⼀张sd卡,然后在sd卡上安装树莓派镜像⽂件,需要⽤到SDFormatter来格式化,以及32位的Diskmager来安装系统。准备⼯作:
准备SD卡,8GB以上(8G即可),最好是⾼速卡(class4以上,建议⽤10);
下载树莓派镜像⽂件;
Windows下安装镜像的⼯具:Win32DiskImager。
安装步骤:
解压系统镜像压缩⽂件,得到img镜像⽂件;
将SD卡连接到电脑(读卡器或卡托),格式化SD卡,⽤PanasonicSDFormatter_ha软件;
解压并打开Win32DiskImager⼯具,选择⼩车系统的镜像⽂件,选择SD卡的盘符,写⼊;
把写好的卡装⼊树莓派;
注意事项:
挂裤架Linux的分区在Windows下看不到,可以⽤分区软件看。所以安装完系统,内存卡显⽰剩余容量⼏⼗M是正常的;
Ext3属于Linux的⽂件系统;
swap区是Linux的虚拟内存区,在物理内存不够⽤的时候做缓存⽤。
安装完成后把卡插进⼩车,再去将树莓派连接到⽹络上,然后就可以使⽤Windows的远程桌⾯控制树莓派。
登录ID:pi
key:raspberry
在Linux中可以⽤cd命令切换⽬标⽬录
cd [dirName]
pwd:pwd命令以绝对路径的⽅式显⽰⽤户当前⼯作⽬录。(pwd = print working Directory)
总结:cd⽤来切换⽬录,pwd⽤来打印⼯作⽬录。这两个是初学Linux的第⼀个命令⾏,也是任何操作的基础。
在这⾥贴出Linux常⽤命令供之后参考使⽤
螺旋板冷凝器mkdir:mkdir命令⽤来创建⽬录。该命令创建由dirname命名的⽬录。如果在⽬录名的前⾯没有加任何路径名,则在当前⽬录下创建由dirname指定的⽬录;如果给出了⼀个已经存在的路径,将会在该⽬录下创建⼀个指定的⽬录。在创建⽬录时,应保证新建的⽬录与它所在⽬录下的⽂件没有重名。 (mkdir = make directory)
cp:cp命令⽤来将⼀个或多个源⽂件或者⽬录复制到指定的⽬的⽂件或⽬录。所有⽬标⽂件指定的⽬录必须是⼰经存在的,cp命令不能创建⽬录。如果没有⽂件复制的权限,则系统会显⽰出错信息。(cp = CoPy)
mv:mv命令⽤来对⽂件或⽬录重新命名,或者将⽂件从⼀个⽬录移到另⼀个⽬录中,将⼀组⽂件移⾄⼀个⽬标⽬录中。(mv = MoVe) touch:touch命令有两个功能:⼀是⽤于把已存在⽂件的时间标签更新为系统当前的时间(默认⽅式),它们的数据将原封不动地保留下来;⼆是⽤来创建新的空⽂件。
rm:rm命令可以删除⼀个⽬录中的⼀个或多个⽂件或⽬录,也可以将某个⽬录及其下属的所有⽂件及其⼦⽬录均删除掉。对于链接⽂件,只是删除整个链接⽂件,⽽原有⽂件保持不变。(rm = ReMove)
注意:使⽤rm命令要格外⼩⼼。因为⼀旦删除了⼀个⽂件,就⽆法再恢复它。所以,在删除⽂件之前,最好再看⼀下⽂件的内容,确定是否真要删除。rm命令可以⽤-i选项,这个选项在使⽤⽂件扩展名字符删除多个⽂件时特别有⽤。使⽤这个选项,系统会要求你逐⼀确定是否要删除。这时,必须输⼊y并按Enter键,才能删除⽂件。如果仅按Enter键或其他字符,⽂件不会被删除。
⼩组内的同学对摄像头的试⽤
在代码编译完成后使⽤sudo命令运⾏
Linux sudo命令以系统管理者的⾝份执⾏指令,也就是说,经由 sudo 所执⾏的指令就好像是 root 亲⾃执⾏。
使⽤权限:在 /etc/sudoers 中有出现的使⽤者。
命令为
sudo ./hjduino 2000
下⾯贴上⼀些常⽤的快速指令⽅便之后查阅使⽤
摄像头
打开摄像头软件位置
cd mjpg-streamer/mjpg-streamer-experimental
打开摄像头指令,复制到LX终端
./mjpg_streamer -i “./input_raspicam.so” -o “./output_http.so -w ./www”
指令说明
xxx.c是要编译的c⽂件,xxx是编译出来的执⾏⽂件,运⾏编译出来的程序是sudo ./xxx
WIFI程序hjduino.c
编译指令
gcc hjduino.c -o hjduino -lwiringPi -lpthread
运⾏命令
sudo -/hjduino 2000
循迹程序xj.c
编译指令
gcc xj.c -o xj -lwiringPi -lpthread
运⾏命令
sudo ./xj
红外避障程序bz.c
编译指令
gcc bz.c -o bz -lwiringPi -lpthread
运⾏命令
sudo ./bz
测距程序cj.c
编译指令
gcc cj.c -o cj -lwiringPi
运⾏命令
sudo ./cj
超声避障pwm csb.c
编译指令
gcc csb.c -o csb -lwiringPi -lpthread
运⾏命令
sudo ./csb
停车 .c
编译指令
gcc stop.c -o stop -lwiringPi -lpthread
运⾏命令
sudo ./stop
Opencv及QT的安装
第⼀步先更换源,⽹上有清华源即输⼊
sudo nano /etc/apt/sources.lest
后以
deb mirrors.tuna.tsinghua
deb-src mirrors.tuna.tsin
四巧板代替,保存后退出。
由于有时候会由于内存问题导致编译被挂起,所以以
sudo nano /etc/dphys-swapfile
命令增加交换空间,将CONF_SWAPSIZE从默认值100更改为1024
保存后退出,并运⾏
sudo /etc/init.d/dphys-swapflie r
omap4460
使其⽣效。
之后就可以下载opencv了。
先下载库及⼀些需要的⼯具,由于库要从Github捞出来,⽽Github服务器不在国内甚⾄不⽀持断点续传(仿佛回到了前⼏年的steam),只能靠拼脸下载好再拷贝到树莓派上。
下载好了就可以开始编译,运⾏安装,检查所需要的库有没有安装成功即可。
然后是QT的安装,相较opcv要简便很多,Opencv抓到的图经处理后我们在qt中编译。
主程序
⾸先我们对速度进⾏百分化处理,这样我们只需输⼊0-100间的数字来调整速度,便于我们把握速度快慢的程度。
在此只贴出前进的修改逻辑,左右转什么的都⼀样。其实没什么作⽤只是⾃⼰看的舒服⽅便后续编程。
void run(int n)// 前进函数,100 is maxium.
{
softPwmWrite(4,0);//左轮前进
softPwmWrite(1,5*n);
softPwmWrite(6,0);//右轮前进
softPwmWrite(5,5*n);
printf("run");
delay(100);
}
我们的想法是在正前⽅设置合理的距离,当在这个距离内时说明要拐弯,再去做左右判断。
由于我们Opencv处理后的图像为320*240,所以经过参数调试后我们选取120-200⾏的160列(即中间列)作为拐弯的判断距离。
由于防⽌噪声的影响,我们设置只有出现四个⿊像素点时才判定为需要拐弯,此时将拐弯标志位设置为1,同时还可以获得到底是第⼏⾏出现⿊点,将其返回为black_row,需要时可以打印。
for(int i =210,j =0;i>=118;i--)
{
if(f2.ptr<uchar>(i)[160]==0)
j++;
if(j>=4)
{
black_row = i;
center_black=1;
j=0;
break;
}
}
当判断出需要拐弯时,将发现的⾏数向下移动25格,再由中间向两边检索看边线出现在哪⼀边。判断逻辑同前。
if(center_black)
{
for(int i =160,j=0;i<=320;i++)
{
if(f2.ptr<uchar>(black_row+40)[i]==0)
{
j++;
}
if(j>=4)
{批量控制器
right_detected =1;
break;
}
}
得到置为1的标志位right_detected,在此情况下是160-320列检测到边线,即需要左拐。所以执⾏
left(TURNSPEED);
left_detected =0;
藤蔓根茎
right_detected =0;
center_black =0;
请务必记得将标志位清零。右拐同理。
以上编程主要由组内胡jh同学完成。
但在试跑后我发现,会出现两种意料外的情况:
但在试跑后我发现,会出现两种意料外的情况:
①如果⼩车速度偏快⽽来不及处理左右拐时,边线会到120-200⾏下⽅,这样⼩车会认为前⽅不需要拐弯就根本不会进⼊左右拐程序。
②⼩车在跑直线时如果有⼀点偏移,⽽前⽅是空⽩的赛道,那么⼩车会继续偏移压线直到离边线很近时将其识别为弯道,再作左右拐。两种情况都如下图Gif所⽰:
⽽在正常前进与拐弯时我注意到,由于我们摄像头位置较低,⼩车的最下⾯⼀⾏是不会出现⿊⾊区域的。如下图Gif及图⽚所⽰:

本文发布于:2024-09-21 13:35:13,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/137777.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:命令   系统   编译   拐弯
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议