整体设计思路如下:
机体使用奥松机器人提供的机体平台(电机+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后台管理、分布式负载均衡
图像识别,通过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%