//

// Created by PulsarV on 18-10-26.

//

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define _countof(_Array) (int)(sizeof(_Array) / sizeof(_Array[0]))

#define GL_WIDTH 480

#define MAX_RADAR_DIST 1500 //最大扫距离

#define RADAR_STEP 0.01 //雷达扫描线移动距离

using namespace rp::standalone::rplidar;

//雷达扫描线起始坐标

float p1_x = 0, p1_y = 0;

float p2_x = 0, p2_y = 0;

//雷达扫描线起始步长

float p1step = 1.75f;

float p2step = 2.25f;

RPlidarDriver *drv;

//扫描点

class DOT {

public:

double theta, dist;

DOT(double theta, double dist) {

this->dist = dist;

this->theta = theta;

}

};

std::vector dots;

//绘制线

void draw_line(float x1, float y1, float x2, float y2) {

GLfloat line_size = 3;

glLineWidth(line_size);

glBegin(GL_LINES);

glVertex2f(x1, y1);

glVertex2f(x2, y2);

glEnd();

}

//绘制点

void draw_point(float x, float y, float R, float G, float B, float alpha) {

GLfloat point_size = 5;

glPointSize(point_size);

glColor4f(R, G, B, alpha);

glBegin(GL_POINTS);

glVertex2f(x, y);

glEnd();

}

void draw_rader() {

glClear(GL_COLOR_BUFFER_BIT);

glClearColor(0, 0, 0, 0);

glColor4f(0, 1, 0, 0);

int n = 1000;

for (float scale = 1; scale > 0.1; scale -= 0.1) {

glBegin(GL_LINE_LOOP);

for (int i = 0; i < n; i++) {

glVertex2f(scale * cos(2 * PI * i / n), scale * sin(2 * PI * i / n)); //定义顶点

}

glEnd();

}

glColor4f(1, 0, 0, 0);

//绘制雷达界面

draw_line(0, 0, 0, 1);

draw_line(0, 0, 1, 1);

draw_line(0, 0, -1, 1);

draw_line(0, 0, 1, -1);

draw_line(0, 0, -1, -1);

draw_line(0, 0, 0, -1);

draw_line(0, 0, 1, 0);

draw_line(0, 0, -1, 0);

draw_point(p1_x, p1_y, 1, 1, 1, 0);

draw_point(p2_x, p2_y, 1, 1, 1, 0);

draw_line(0, 0, p1_x, p1_y);

draw_line(0, 0, p2_x, p2_y);

std::vector::iterator it;

//绘制扫描点

for (it = dots.begin(); it != dots.end(); ++it) {

float x = 0, y = 0;

x = cos(it->theta / 180 * PI) * (it->dist / MAX_RADAR_DIST);

y = sin(it->theta / 180 * PI) * (it->dist / MAX_RADAR_DIST);

draw_point(x, y, 0, 0, 1, 0);

}

glFlush();

glutSwapBuffers();

}

//通过坐标获取角度

float get_angle(float x, float y) {

float trangel = atan(x / y) * 180 / PI;

if (y < 0 && x > 0 || y < 0 && x < 0)

trangel = trangel + 180;

if (x < 0 && y > 0)

trangel = trangel + 360;

trangel = trangel == 360 ? 0 : trangel;

}

//超时函数

void TimerFunction(int value) {

p1_x = sin(PI * p1step);

p1_y = cos(PI * p1step);

p2_x = sin(PI * p2step);

p2_y = cos(PI * p2step);

if (p1step == 2.5 + 1.75)

p1step = 1.75;

if (p2step == 2.5 + 2.25)

p2step = 2.25;

p1step += RADAR_STEP;

p2step += RADAR_STEP;

rplidar_response_measurement_node_t nodes[360 * 22];

size_t count = _countof(nodes);

u_result op_result;

op_result = drv->grabScanData(nodes, count);

//获取扫描点并把它放到vector中

if (IS_OK(op_result)) {

drv->ascendScanData(nodes, count);

//清空之前的扫描点

dots.clear();

for (int pos = 0; pos < (int) count; ++pos) {

DOT dot(((nodes[pos].angle_q6_checkbit >> RPLIDAR_RESP_MEASUREMENT_ANGLE_SHIFT) / 64.0f),

(nodes[pos].distance_q2 / 4.0f));

dots.push_back(dot);

}

}

glutPostRedisplay();

glutTimerFunc(1, TimerFunction, 1);

// std::cout<

}

//雷达状态检测函数

bool checkRPLIDARHealth(RPlidarDriver *drv) {

u_result op_result;

rplidar_response_device_health_t healthinfo;

op_result = drv->getHealth(healthinfo);

if (IS_OK(op_result)) { // the macro IS_OK is the preperred way to judge whether the operation is succeed.

printf("RPLidar health status : %d\n", healthinfo.status);

if (healthinfo.status == RPLIDAR_STATUS_ERROR) {

fprintf(stderr, "Error, rplidar internal error detected. Please reboot the device to retry.\n");

return false;

} else {

return true;

}

} else {

fprintf(stderr, "Error, cannot retrieve the lidar health code: %x\n", op_result);

return false;

}

}

//OpenGL按钮事件 当按下q时,退出雷达

void KeyBoards(unsigned char key, int x, int y) {

switch (key) {

case 'q':

drv->stop();

drv->stopMotor();

RPlidarDriver::DisposeDriver(drv);

drv = NULL;

exit(0);

break;

}

}

int main(int argc, char **argv) {

const char *opt_com_path = NULL;

_u32 baudrateArray[2] = {115200, 256000};

_u32 opt_com_baudrate = 0;

u_result op_result;

bool useArgcBaudrate = false;

opt_com_path = "/dev/ttyUSB0";

bool connectSuccess = false;

rplidar_response_device_info_t devinfo;

drv = RPlidarDriver::CreateDriver(DRIVER_TYPE_SERIALPORT);

// 连接雷达

if (useArgcBaudrate) {

if (!drv)

drv = RPlidarDriver::CreateDriver(DRIVER_TYPE_SERIALPORT);

if (IS_OK(drv->connect(opt_com_path, opt_com_baudrate))) {

op_result = drv->getDeviceInfo(devinfo);

if (IS_OK(op_result)) {

connectSuccess = true;

} else {

delete drv;

drv = NULL;

}

}

} else {

size_t baudRateArraySize = (sizeof(baudrateArray)) / (sizeof(baudrateArray[0]));

for (size_t i = 0; i < baudRateArraySize; ++i) {

if (!drv)

drv = RPlidarDriver::CreateDriver(DRIVER_TYPE_SERIALPORT);

if (IS_OK(drv->connect(opt_com_path, baudrateArray[i]))) {

op_result = drv->getDeviceInfo(devinfo);

if (IS_OK(op_result)) {

connectSuccess = true;

break;

} else {

delete drv;

drv = NULL;

}

}

}

}

if (!connectSuccess) {

fprintf(stderr, "Error, cannot bind to the specified serial port %s.\n", opt_com_path);

exit(0);

}

printf("RPLIDAR S/N: ");

for (int pos = 0; pos < 16; ++pos) {

printf("%02X", devinfo.serialnum[pos]);

}

printf("\n"

"Firmware Ver: %d.%02d\n"

"Hardware Rev: %d\n", devinfo.firmware_version >> 8, devinfo.firmware_version & 0xFF,

(int) devinfo.hardware_version);

// 检测雷达状态

if (!checkRPLIDARHealth(drv)) {

exit(0);

}

signal(SIGINT, ctrlc);

drv->startMotor();

// 开启雷达扫描

drv->startScan(0, 1);

drv->startMotor();

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);//设置显示方式

glutInitWindowPosition(100, 100);

glutInitWindowSize(GL_WIDTH, GL_WIDTH);//设置窗口大小

glMatrixMode(GL_PROJECTION);//设定投影方式

glutCreateWindow("radar map");

glutKeyboardFunc(&KeyBoards);

glutDisplayFunc(draw_rader);

glutTimerFunc(1, TimerFunction, 1);

glutMainLoop();

return 0;

}

雷达扫描java,SLAM-OpenGL实现rplidar A2激光雷达扫描显示相关推荐

  1. Rplidar A2 激光雷达使用hector_slam进行建图

    手头上有一个Rplidar A2 激光雷达,通过其进行slam建图,如下. 环境: 1.Rplidar A2 激光雷达: 2.笔记本电脑: 3.Ubuntu 16.04; 4.ROS Kinetic. ...

  2. 思岚RPLIDAR A2激光雷达使用及问题解决

    思岚RPLIDAR A2激光雷达使用及问题解决1.下载源码第一步,下载雷达源代码,第一种方法是输入下列网址:http://slamtec.com/rplidar/a2/download,界面有雷达的说 ...

  3. ROS学习心得——正确运行RPLIDAR A2激光雷达(让它转起来吧!)

    ROS学习心得--正确运行RPLIDAR A2激光雷达 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: 产品相关数据与官方文档:http:// ...

  4. 思岚RPLIDAR A1激光雷达扫描测距的模式C语言实现(STM32)

    该产品激光雷达单次请求-多次应答模式对应着扫描测距模式,也是获取数据的环节. 该通讯模式用于RPLIDAR 进行扫描测距的模式下.外部系统在发送开始扫描 的请求后,RPLIDAR 将开始连续的扫描测距 ...

  5. ROS学习心得——定位-SLAM-hector_mapping(RPLIDAR A2)

    ROS学习心得--定位-SLAM-hector_mapping FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: 产品相关数据与官方文档:htt ...

  6. RPLIDAR A2 rviz显示雷达数据教程

    扣扣技术交流群:460189483 1. 简介   RPLIDAR A2的运行教程在这里不做重点讲解,官方教程已经介绍的很详细,在这里跟大家解释下例程中是怎么在RVIZ中事实显示图像的.   运行下面 ...

  7. JOGL   java调用openGL

    JOGL   java调用openGL JOGL   java调用openGL JOGL   java调用openGL JOGL   java调用openGL http://download.java ...

  8. JOGL - Java与OpenGl的绑定(转)

    JOGL - Java与OpenGl的绑定 默认分类 2009-11-22 20:31:05 阅读4 评论0 字号:大中小 在这篇文章里,摘录了<学习Java对于OpenGl的绑定>.作者 ...

  9. opengl java_android graphic(20)—java层OpenGL相关类

    在https://zhuanlan.zhihu.com/p/68782491中已经介绍了如何加载EGL和OpenGL具体软硬件实现,其中system\lib\libEGL.so是加载具体实现的桥梁. ...

最新文章

  1. ROS上同时预览depth,IR,RGB 调试记录
  2. Mysql5.5配置主从复制
  3. Java基础:成员变量的继承与覆盖
  4. Android——设置布局的背景颜色
  5. [转] 有什么郁闷的就看看这驴!
  6. git-ssh-keygen
  7. math.ceil带小数点_JavaScript中带有示例的Math.ceil()方法
  8. 论文浅尝 | 提取计数量词丰富知识库
  9. SpringMVC启动过程详解(li)
  10. 【转】在Windows中搭建iPhone开发环境
  11. Perl 日志分析W3A_system
  12. log4j的8个日志级别(OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL)
  13. oracle 插入时if,关于sql:ORACLE:如果不存在则插入行-重复键错误
  14. twig模板基本学习
  15. 迁移linux系统到新硬盘
  16. 永磁同步电机死区补偿C语言代码
  17. 硬件探索——数字钟的设计与制作
  18. 重启网卡 linux7.5,CentOS 7.5配置网络
  19. 基于Javaweb的社区门诊系统的设计与实现MIB信息采集
  20. BugKu ——WP(MISC[二])

热门文章

  1. v-distpicker 插件只要省市
  2. 一站式社区智慧路灯系统集成解决方案解析
  3. SQL-主键外键的定义
  4. 【Docker】 Ubuntu 18.04 LTS 一键安装docker并优化配置
  5. 齐夫定律, Zipf's law,Zipfian distribution
  6. Labview温度采集系统(状态机)
  7. 易语言python模块_Python获取指定模块基址
  8. 什么是SOA(service-oriented architecture)?
  9. Linux篇 一、香橙派Zero2设置开机连接wifi
  10. ha456.jar打开dump文件报Unsupported major.minor version 51.0异常