调用opencv的库可以将x,y坐标直接标记在数组中,然后将数组转换成opencv 的mat图片就可以将轨迹非常快的
画出来非常方便。
#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <time.h>
#include <unistd.h>
#include <sys/time.h>
#include <stack>
#include <opencv2/opencv.hpp>
#include "sensor_model.h"
#include "occ_grid.h"
#include <fstream>
#include <sstream>
using namespace std;
using namespace cv;
string Trim(string& str)
{
str.erase(0,str.find_first_not_of(" \t\r\n"));
str.erase(str.find_last_not_of(" \t\r\n") + 1);
return str;
}
static double CalculateRadians(int degree)
{
//弧度
double current_angle = degree *M_PI/ 180 ; //角度
return current_angle;
}
#define Map_Size 300
unsigned char Sonars_logs[Map_Size][Map_Size]={128};
int main()
{
int mm_per_tick = 5 ;//Encoder resolution
int Xr = float(Map_Size/2);// #Set intial robot position
int Yr = float(Map_Size/2);
// 读文件
ifstream inFile("stepdata.csv", ios::in);
string lineStr;
int cnt =0;
int cellsize = 50 ;// #Set cell width and height in mm
float scale = float(1)/cellsize;// #Set map scale
Mat src(Map_Size, Map_Size, CV_8UC1, cv::Scalar(0));
int row = Map_Size;//src.rows;//300
int col = Map_Size;//src.cols;//300
Mat Map_log_sonar = Mat(row, col, CV_8UC1,cv::Scalar(127));
Mat Map_log_sonar2= Mat(row, col, CV_64F,cv::Scalar(0.0));
Mat Map_log_sonar_res= Mat(row, col, CV_64F,cv::Scalar(0.0));
Mat img3(Map_Size, Map_Size, CV_8UC1, cv::Scalar(128));
Mat img2(Map_Size, Map_Size, CV_8UC1, cv::Scalar(0));
memset(&Sonars_logs[0][0], 127, sizeof(Sonars_logs));
while (getline(inFile, lineStr))
{
// 打印整行字符串
// cout << lineStr << endl;
// 存成二维表结构
stringstream ss(lineStr);
string str;
vector<string> lineArray;
// 按照逗号分隔
while (getline(ss, str, ',')){
lineArray.push_back(str);
}
string angle_str = Trim(lineArray[2]) ;//Robot heading angle
int angle = atoi(angle_str.c_str());
//int inv_angle = angle +30 ;//angle for rear sonar sensor
///int left_angle = angle -30 ;
string a0 = Trim(lineArray[0]);
string a1 = Trim(lineArray[1]);
//int avencoder = (atoi(a0.c_str()) + atoi(a1.c_str()))/2 ;//Distance travelled by robot is approximated to average of both encoder readings
int linenumber = atoi(a0.c_str());
string Fsonar_str = Trim(lineArray[3]) ;//Sonar values are in cm, convert to mm by muliplying by 10
int Fsonar = atoi(Fsonar_str.c_str());
string Rsonar_str = Trim(lineArray[4]);
int Rsonar = atoi(Rsonar_str.c_str());
//string LIR = Trim(lineArray[5])*10 ;//Same for IR sensor values
//string RIR = Trim(lineArray[6])*10 ;
cout << " first linenumber : " << linenumber << endl;//
cout << "first x : " << Fsonar << endl;//
cout << " first y : " << Rsonar << endl;//
printf("convert end \n");
cv::Mat Aimg(Map_Size, Map_Size, CV_8UC1,cv::Scalar(0));
Sonars_logs[Yr][Xr] += 20;
std::memcpy(Aimg.data, Sonars_logs, Map_Size*Map_Size*sizeof(unsigned char));
Map_log_sonar = Aimg;
img3 = Map_log_sonar;
resize(img3,img3,Size(1000,1000));
imshow("Aimg",img3);
waitKey(1);
int Xrnext,Yrnext;
if(Fsonar < 300)
Xrnext = Fsonar; //Xr + float((cos(CalculateRadians(angle)) * (avencoder*mm_per_tick)*scale)) ;//
// Calculate new robot position from readings
if(Rsonar < 300)
Yrnext = Rsonar ;//Yr + float((sin(CalculateRadians(angle)) * (avencoder*mm_per_tick)*scale));
Xr = Xrnext;
Yr = Yrnext;
}
}