Skip to content
This repository was archived by the owner on Mar 20, 2020. It is now read-only.
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动态库的使用、编译与链接

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的功能,而非真正实现某一需求。
  • 也正由于这只是一个示例,实际完成时,还请不要被这份源代码中使用的方法禁锢住思维,可以多多尝试其它思路。
  • 实验过程中请务必注意人身安全。无论任何情况,请始终把你自己和周围人的人身安全放在第一位。