TA的每日心情 | 无聊 2020-10-2 17:20 |
---|
签到天数: 33 天 [LV.5]常住居民I
|

楼主 |
发表于 2017-2-20 11:27
|
显示全部楼层
本帖最后由 hzpyj 于 2017-2-20 11:40 编辑
========== 2017.02.19 ============
初步完成了巡线小车。当然还是需要修改的,但基本达到既定要求了。
走直线偏离会自动调整归位。曲线暂时好不成熟。
根据实际的数据分析,提交些个人在过程中的知识点供大家参考:
这是要讲解的知识点示意图(线模式),
1、X轴:指横向轴,MU视觉传感器是以50为中心点,左右分各50。实际数据以此划分,可以判断当前的偏移量。
2、Y轴:暂时没用到,应该是景深的意思,即距离感。
3、左、右斜趋势:是小车在巡线中可能偏移的情况示意。但实际控制点却仅仅是最后的顶点位置。
下面说下怎么用:
小车巡线,往往因为轮差导致小车逐渐偏移位置,但偏移量过大,则小车找不到线了。
如果在运行中我们就把某条趋势进行采点存储,则我们就能知道小车的运行偏移趋势,在小车找不到线的时候让其对数据进行分析,进行偏移补偿,则小车又会回到正确的巡线路径上。
[mw_shl_code=bash,true]#include "VisionSensor.h"
/*小车运动代码*/
//++++++++此为扩展板已有定义,无法更改
int INA = 4; //电机A正反转控制端
int PWMA = 5; //电机A调速端
int INB = 7; //电机B正反转控制端
int PWMB = 6; //电机B调速端
//++++++++小车运行变量定义
int value_L, value_R;
int L_run;
int R_run; //小车电机驱动运行值
int x1, x2, x3, x_temp;
VisionSensor MU(Serial, 115200);
//=========== 电机动作 ===============//
//低速前进
void go()
{
value_L = L_run ;
value_R = R_run ;
Go_run();
}
//左转弯
void left()
{
value_L = 0 ;
value_R = 170 ;
Serial.println("left");
Go_run();
delay(300);
}
//右转弯
void right()
{
value_L = 170 ;
value_R = 0 ;
Serial.println("right");
Go_run();
delay(300);
}
//停止
void stop()
{
value_L = 0 ;
value_R = 0 ;
analogWrite(PWMA, value_L); //PWM调速
analogWrite(PWMB, value_R);
}
//后退
void back()
{
value_L = L_run ;
value_R = R_run ;
digitalWrite(INA, LOW); //反转
digitalWrite(INB, LOW); //
analogWrite(PWMA, value_L); //PWM调速
analogWrite(PWMB, value_R);
}
//电机驱动
void Go_run()
{
digitalWrite(INA, HIGH); //HIGH为前进,LOW为后退
digitalWrite(INB, HIGH);
analogWrite(PWMA, value_L); //PWM调速
analogWrite(PWMB, value_R);
// digitalWrite(PEER,0);
}
void setup()
{
pinMode(INA, OUTPUT);
pinMode(INB, OUTPUT);
Serial.begin(115200);
MU.begin(); //initialize
}
void L_R()
{
//================ 右斜趋势 ===========
if ((x1 > x2) && (x2 > x3)) { //左偏移趋势
if (x3 < 50) { //在X轴左侧,右拐
if ((50 - x3) < 20) //小幅右转
{ right();
}
else {
if ((x3 - 50) > 20) { //趋前
L_run = 150;
R_run = 120;
go();
}
}
}
//==================== 左斜趋势 ==========
if ((x1 < x2) && (x2 < x3)) { //右偏移趋势
if (x3 < 50) { //在X轴左侧,右拐
if ((50 - x3) < 20) { //趋前
L_run = 120;
R_run = 150;
go();
}
else {
if ((x3 - 50) > 20) { //小幅左转
left();
}
}
}
}
}
}
void loop()
{
int M;
MU.search();
if (MU.valid() > 0)
{
if (MU.detected() == true)
{
if (MU.getWidth() > 5) {
x1 = MU.getX();
delay(10);
x2 = MU.getX();
delay(10);
x3 = MU.getX();
Serial.print("Width");
Serial.println(MU.getWidth());
Serial.print("X:");
Serial.print(x1);
Serial.print("=");
Serial.print(x2);
Serial.print("=");
Serial.println(x3);
if ((x3 > 40) || (x3 < 60)) {
L_run = 190;
R_run = 190;
go();
delay(500);
}
if (x3 < 30) {
M = 50 - x3;
Serial.print("M:");
Serial.println(M);
if (M >= 8) {
left();
}
}
else {
if ( x1 > 60) {
M = x1 - 50;
Serial.print("M==");
Serial.println(M);
if (M >= 8) {
right();
}
}
}
}
}
else {
stop();
L_R();
}
}
else {
stop();
L_R();
}
}[/mw_shl_code]
以上仅供参考,大牛们一定有更好的方法。
|
|