This repository was archived by the owner on Mar 20, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 8
Home
Miau Shiauwe edited this page Oct 26, 2017
·
4 revisions
这是为南京大学软件学院2017-2018学年度第一学期《嵌入式系统概论》的课程大作业编写的最基本的示例。在这个示例中,我们使用OpenCV直接处理从普通的USB摄像头获取到的前方画面信息,并判断出赛道的边缘位置。之后提供的操纵电机、舵机等外设的封装静态库,可以被用于根据由视觉上得到的信息进行下一步的自身姿态调整。
参见此项目的Readme文件。
- 以L298N为代表的直流电机驱动电路采用经典的H桥对直流电机进行控制。每组H桥基本电路内包含四个二极管,通过适当的外部信号控制对角线上的两个二极管同时导通,电流就能正向或反向地通过直流电机,从而驱使电机正转或反转。
- 在H桥电路外围再添加一组PWM电路,向其发送PWM信号,根据PWM信号不同的占空比,就可以改变流过电机的等效电流,起到调节电机转速的效果。
- 机器人的后轮分别由一个直流电机控制,前轮不连接动力。当后轮两个电机同时正转时,机器人即可前进;同时反转时,即可后退。
- 使机器人转向大体上有两种方式。一是使两个后轮以不同的方向,或不同的速度运作,二是操纵用连杆与两个前轮相连的舵机转过一定角度。
这两种方法既可以单独使用,也可以组合使用。可以根据喜好和实际需求选用。
这一部分的基本处理流程,在树莓派端的主程序文件注释中也有说明。
- 测试地面基本可以认为是纯白色,两个的边缘标志线都是黑色。这样的高反差环境对计算机视觉提取相关特征尤其有利。
- 对摄像头捕捉到的每帧图像,首先应用Canny算子完成边缘检测。
原始图像中地面与标志线已经有了明显的反差,因此边缘检测结果得到的边缘,几乎都是黑色标志线的边缘。 - 对边缘检测的结果施行Hough变换,检测出图像中的所有直线。
- 应用适当的滤波方法过滤掉水平线、垂直线等干扰因素。
- 通过检测出的所有直线的斜率关系,判定机器人下一步的前进方向。
OpenCV官方推荐使用CMake生成Makefile
文件。相关脚本的使用方法请参见OpenCV网站。
- 所有API的用法和参数列表均已在头文件和示例代码中明确地展示出来,这里不再具体描述。
- 操作GPIO端口需要
root
权限。编译出的程序同样需要在root
权限下执行。
在普通用户下运行GPIO控制的代码,可能会造成Raspbian的系统崩溃。有必要时,请手动断开总电源重新通电。
- 假设源程序文件名为
main.cpp
,需要链接的静态库与这个文件处在同一目录下 - 假设希望生成的可执行文件文件名为
test
则需要执行以下命令:
g++ -o test main.cpp -L. -lwiringPi -lGPIO -lpthread
通常情况下,如果没有其它问题,生成的可执行文件是可以直接运行的,不再需要添加执行权限。
- 对两个后轮的速度控制,可写入的速度值为0~100。初赛阶段为保证安全,静态库中已经限制允许写入的最大PWM值为50,这一速度限制可能会在后续比赛中根据各组的完成情况逐渐开放。
- 前轮安装的舵机为180度舵机,即前轮可以在逻辑上左转/右转各90度。受到空间限制和其它元件的相对位置影响,可以旋转的角度限定在了-45°~45°之间。但是,实际的代码中,建议使用的旋转角度不要超过正负30°。
- 受软PWM库执行时的内部时序问题影响,对后轮两个电机调速的PWM操作可能不会一次产生对应的效果,需要反复操作多次。
- 同一PWM值,对不同车辆上装载的电机而言几乎都会对应不完全相同的速度。这是由直流电机的物理结构决定的固有属性,不属于这里提供的静态库的软件缺陷。
需要实现左右两电机转速的同步控制,请自行使用合适的闭环控制算法进行自适应调整。
参见此项目的Readme文件。
- 这个示例真的只是示例而已。所有代码的目标都是为了展现提供的API的功能,而非真正实现某一需求。
- 也正由于这只是一个示例,实际完成时,还请不要被这份源代码中使用的方法禁锢住思维,可以多多尝试其它思路。
- 实验过程中请务必注意人身安全。无论任何情况,请始终把你自己和周围人的人身安全放在第一位。