• 工科创 IIB 05 组


    本项目使用 OpenCV+Codeblocks 进行上位机的图像部分处理,使用 MSP430 单片机控制小车,使用 energine 进行单片机代码的编写调试,用sscom作为蓝牙串口调试工具。实现了通过计算机进行轨道识别和小车识别,自动追踪小车位置并发送蓝牙指令,完成小车走黑线的任务。

项目结构

本项目开发环境为 CodeBlocks + OpenCV2.4, 总体可分为硬件部分和软件部分。 项目整体结构如下图:

软件部分

程序处理流程如下:

硬件部分

在本次项目中,我们使用的是由实验室提供的小车。小车使用4节1.5V镍氢充电电池进行供电,且搭载Texas Instruments开发的MSP430单片机,由HC-07蓝牙模块接收输入指令。 小车的动力系统主要包括两个相互独立的后轮和一个前置的能够转向的舵机,前轮属于从动轮,不具有动力。

蓝牙模块 HC-07

该蓝牙模块可以直接接在小车上,接口是完全对应的,因此不需要外部飞线。接上并给小车供电后即可接收蓝牙指令。

小车控制

小车外观:

MSP430 单片机:

小车电路图:

小车使用了 Texas Instruments 开发的 MSP430 单片机。通过 Energia 对其进行编程,使其能够辨别输入的指令并对小车做出相应调整。
通过设置小车左右电机的高低电平控制小车的各种动作(我们的小车前轮为万向轮,所以我们通过左右轮的不同速度来实现转弯),设置占空比来控制前进后退速度或者转弯速度,设置delay时间控制前进后退或者转弯时间。 代码主要分为两个部分,一部分是对指令的接收,另一部分是对电机的控制。

问题与改进

蓝牙连接问题
蓝牙模块是硬件部分中最麻烦的一个环节。蓝牙模块、串口调试工具、指令发送代码、单片机、小车任何一个环节出现问题,都会导致蓝牙发送接收指令失败,很多时候很容易把硬件问题当成软件问题,一遍遍的检查代码。所以后来,我们采用全蓝牙自己给自己发指令的方式,先确保蓝牙串口是正常的,然后再解决小车不能正常运动的代码问题。很多时候是由于电源,接触不良等硬件问题导致的。
小车运动不稳定问题
可以控制的参数是左右两轮转速,高低电平状态,单次运动时间。对于小车转弯,由于我们的小车没有舵机,所以不能对角度进行控制。所以我们先采用一个轮子转,一个轮子不转的方法;后来发现小车转向不均匀而且会有很大的打滑,所以我们改为一个轮子正转,一个轮子反转的方法。同时,在与上位机配合的过程中发现小车一直运动会导致上位机多次发送指令时有的指令失效,所以我们设置了一个变量控制小车运动的时间,超过该时间后会调用停车的函数。同时,我们适当的降低了速度,使小车更便于控制。
环境光线问题
我们的程序在大多数情况下能够很好地识别地图和追踪小车,但在光线较暗地情况下有时无法稳定地识别小车上绿色的圆形纸片,进而错误地判断小车的位置。为了解决这个问题,我们对 HoughCircle 函数的参数进行了调整,使程序只识别与纸片大小相近的圆形,同时将给小车加装了白色外壳,减小车轮等部位对图像识别的干扰。
小车转弯角度问题
小车转弯时容易发生转弯角度过大的问题,为了解决这个问题,我们减小了小车单次转弯的角度,增加了发送蓝牙指令的频率,这样可以增加对小车位置的判断频率,避免小车在转到合适角度后仍然转弯。
地图标定问题
在我们最初版本的程序中,图像二值化后我们用 Canny 函数进行了取边缘操作,这导致 HoughLine 函数识别直线有时会漏掉几段轨道,通过用 erode 函数代替 canny 函数,我们在轨道细化之后的图像上进行直线识别,大大提高了准确率。

测试情况

经现场测试,我们的小车能够完成自动走黑线的任务,测试视频如下:



测试项 测试情况
小车能各方向自由运动? YES
小车可接受计算机指令? YES
可实时采集小车图像? YES
可标定跑道? YES
可控制小车走黑线? YES
能顺利走出跑道? YES
跑道复杂度 较复杂(存在岔路口)

项目源代码

我们组使用 Git 进行项目代码管理,请访问 Github 项目地址 查看项目源代码。

代码下载


代码结构

  • main.cpp: master
  • trackInit.h,trackInit.cpp: generate the map and determine the turning positions
  • traceCar.h,traceCar.cpp: recognize the position of the car
  • controlCar.h,controlCar.cpp: send the bluetooth instruction according to the car position.
  • BLE_CAR.h,BLE_PORT.h: support for bluetooth communication
  • board.ino: the code on MSP430 board

使用方法

  1. PC 端打开蓝牙,与小车蓝牙进行配对(默认密码1234)
  2. BLE_CAR.h中修改打开的串口为蓝牙串口
  3. 安装并配置 OpenCV
  4. 在 CodeBlocks 中打开 RUN.cbp 工程文件
  5. Build and run
  6. 按控制台提示进行操作