整体设计思路如下:
图片 1.png
机体使用奥松机器人提供的机体平台(电机+L298N电机驱动),控制器部分采用arduino+富芮坤蓝牙开发板作为主控
其上搭载手机作为图像采集部分,使用easydarwin基于wifi进行图传,并在PC部分进行图像识别和跟踪
控制部分使用arduino+ 富芮坤蓝牙开发板方案,arduino部分代码
int speed_A=0;
int speed_B=0;

int PMW_A=6;
int DIGIT_A_HIGH=7;
int DIGIT_A_LOW=8;
int PMW_B=11;
int DIGIT_B_HIGH=9;
int DIGIT_B_LOW=10;


void straight(int time,int speed){
     analogWrite(PMW_A,speed);
     analogWrite(PMW_B,speed);
     digitalWrite(DIGIT_A_HIGH,HIGH);
     digitalWrite(DIGIT_A_LOW,LOW);
     digitalWrite(DIGIT_B_HIGH,HIGH);
     digitalWrite(DIGIT_B_LOW,LOW);
     delay(time);
}

void back(int time,int speed){

     digitalWrite(DIGIT_A_HIGH,LOW);
     digitalWrite(DIGIT_A_LOW,HIGH);
     digitalWrite(DIGIT_B_HIGH,LOW);
     digitalWrite(DIGIT_B_LOW,HIGH);
          analogWrite(PMW_A,speed);
     analogWrite(PMW_B,speed);
     delay(time);
}

void turn_left(int time,int speed){
     analogWrite(PMW_A,speed);
     analogWrite(PMW_B,speed);
     digitalWrite(DIGIT_A_HIGH,LOW);
     digitalWrite(DIGIT_A_LOW,LOW);
     digitalWrite(DIGIT_B_HIGH,HIGH);
     digitalWrite(DIGIT_B_LOW,LOW);
     delay(time);
}


void turn_right(int time,int speed){
     analogWrite(PMW_A,speed);
     analogWrite(PMW_B,speed);
     digitalWrite(DIGIT_A_HIGH,HIGH);
     digitalWrite(DIGIT_A_LOW,LOW);
     digitalWrite(DIGIT_B_HIGH,HIGH);
     digitalWrite(DIGIT_B_LOW,HIGH);
     delay(time);
}


void stop_run(int time,int speed){
     analogWrite(PMW_A,speed);
     analogWrite(PMW_B,speed);
     digitalWrite(DIGIT_A_HIGH,LOW);
     digitalWrite(DIGIT_A_LOW,LOW);
     digitalWrite(DIGIT_B_HIGH,LOW);
     digitalWrite(DIGIT_B_LOW,LOW);
     delay(time);
}
void setup() {

  pinMode(PMW_A,OUTPUT);
  pinMode(PMW_B,OUTPUT);
  pinMode(DIGIT_A_HIGH,OUTPUT);
  pinMode(DIGIT_A_LOW,OUTPUT);
  pinMode(DIGIT_B_HIGH,OUTPUT);
  pinMode(DIGIT_B_LOW,OUTPUT);

  Serial.begin(9600);
}

void loop() {
  int c;
  while(Serial.available()>0){
      c=Serial.parseInt();
      Serial.println("hello");
      if(c==1){
          straight(5000,255);
        }
        else if(c==6){

            back(5000,255);

          }
          else if(c==3){
            turn_left(5000,255);
            }
            else if(c==4){
              turn_right(5000,255);
              }
              else if(c==5){
                stop_run(5000,255);

                }

   }
}

图传部分采用EasyDarwin,搭建一套流媒体服务,并在电脑端获取视频信息
easypusher,部署Android端,是简单、高效、稳定、免费的一款标准RTSP/RTP协议直播推送库,支持将H.264/H.265/G.711/G.726/AAC等音视频数据推送到RTSP流媒体服务器(例如EasyDarwin)进行低延时直播或者视频通信,支持Windows、Linux、ARM、Android、iOS等平台,EasyPusher配套EasyDarwin流媒体服务器
EasyDarwin Server端,高性能开源RTSP流媒体服务器,基于go语言研发,维护和优化:RTSP推模式转发、RTSP拉模式转发、录像、检索、回放、关键帧缓存、秒开画面、RESTful接口、WEB后台管理、分布式负载均衡

图片 3.png
图片 2.png

图像识别,通过screencapture命令抓取每一帧图像,通过PC下位机的守护进程对每一帧图像调用OPENCV的方法进行图像识别
#include "opencv2/opencv.hpp"
#include"opencv2/core/core.hpp"
#include"opencv2/highgui/highgui.hpp"
#include<iostream>
#include<stdio.h>
#include<unistd.h>
using namespace cv;
using namespace std;
int main(int argc, char **argv){
    namedWindow("MyWindow", CV_WINDOW_NORMAL);
    while(1){
        int ret;
    ret=system("screencapture -T 0  -R 50,50,430,650 /Users/test/Downloads/1.png");
     //   printf("%d",ret);
  //  usleep(2000);
        double scale=0.5;
    Mat img = imread("/Users/test/Downloads/1.png");
         Size dsize = Size(img.cols*scale,img.rows*scale);
        Mat image2 = Mat(dsize,CV_32S);
        resize(img, image2,dsize);


        HOGDescriptor defaultHog;
        defaultHog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
        vector<Rect> found;
        //进行检测
        defaultHog.detectMultiScale(image2, found);
        for(int i = 0; i < found.size(); i++){
            Rect r = found;
            rectangle(image2, r.tl(), r.br(), Scalar(0, 0, 255), 3);
        }


    Mat grayImage,edge;
         cvtColor(image2, grayImage, COLOR_BGR2GRAY);
        blur(grayImage, edge, Size(3,3));
         Canny(edge, edge, 120, 120);


    imshow("MyWindow",edge);



if (waitKey(30) >= 0) break;


    }

  }

目前整体进度完成70%