jetson nano 思岚雷达A1 QT

环境

机器 jetson nano
雷达 思岚A1
平台 Linux Ubuntu 18.04

电脑不在身边 手打吧

一、额 准备工作?

先插入雷达的USB 然后应该会在Linux 底下产生一个/dev/tyyUsb*(*代表的是不确定 可能 0 1 2 3 看你自己的)好像是全大写 自己去查一下
然后给予雷达权限

sudo chmod 777 /dev/ttyUSB0

这会编译完了需要去官网底下下载他的库
Gihtub官方
官网底下有针对Windows 跟 Linux 的编译出来方法

请确保您已经安装了 make 和 g++,然后只需在根目录中调用 make,即可在 获得编译结果,例如 。output/PLATFORM/SCHEMEoutput/Linux/Release
make
默认情况下,Makefile 会编译发布版本,你还可以使用它来编译调试版本。make DEBUG=1

直接照着他这官网的提示make 编译即可 我下载的版本是1.91
然后 Pro 文件记得添加他的头文件跟库

二、额 代码?

然后就是代码编写
代码的编写不会包含类的使用

//首先是头文件
//看你的看法 如果你头文件直接包含#include "rplidar.h"
//那么你不进行前向声明直接声明也可以 看你喜欢 这里用的是前向声明 cpp里面包含头文件
namespace rp
{
    namespace standalone
    {
        namespace rplidar
        {
            class RPlidarDriver;
        }
    }
}
rp::standalone::rplidar::RPlidarDriver *_lidarDriver;

//初始化
//这里的Connect(usbName,baudrate) 跟 ReadData() 都是函数 在下面会有
//usbName 跟 baudrate 是串口名称跟波特率
//如果你确定了波特率跟usbName 你也可以写死
void Init(QString usbName,int baudrate)
{
_lidarDriver = rp::standalone::rplidar::RPlidarDriver::CreateDriver(rp::standalone::rplidar::DRIVER_TYPE_SERIALPORT);
bool isConnect = Connect(usbName,baudrate);
if(!isConnect)
{
	return;
}
ReadData();
}
//连接雷达
void Connect(QString usbName,int baudrate)
{
	bool isConnect = true;
	rplidar_response_device_info_t devInfo;
	u_result opResult;
	opResult = _lidarDriver->connect(usbName.toUtf8(),baudrate);
	//他这个你可以F2自己跳进去看
	//他都是英文直译的好像 我是有道翻译看的意思
	if(opResult & RESULT_FAIL_BIT)
	{
		isConnect = false;	
		return isConnect;
	}
	opResult = _lidarDriver->getDeviceInfo(devInfo);
	if(opResult & RESULT_FAIL_BIT)
	{
		isConnect = false;
		return isConnect;
	}
	//开启雷达扫描
	_lidarDriver->startMotor();
	//使用RPLIDAR的典型扫描模式
	opResult = _lidarDriver->startScan(0,1);
	if(opResult & RESULT_FAIL_BIT)
	{
		isConnect = false;
		return isConnect;
	}
	return isConnect;
}
//读取数据
//根据官方的描述
//该 API 向后兼容旧的 LIDAR 模型和旧固件。因此,我们建议始终使用此 API,并且仅用于兼容性。grabScanDataHq()grabScanData()
void ReadData()
{
	while(1)
	{
		float stopAngle = 0;
		rplidar_response_measurement_node_hq_t nodes[8192];
		size_t count = (sizeof(nodes) / sizeof(nodes[0]));
		u_result res = _lidarDriver->grabScanDataHq(nodes,count);
		if(res & RESULT_FAIL_BIT)
        {
            qDebug() << "Error in scanning";
            continue;
        }
        res = _lidarDriver->ascendScanData(nodes,count);
        if(res & RESULT_FAIL_BIT)
        {
            qDebug() << "Error in scanning";
            continue;
        }
        //这里要说一下的 第一个是角度 因为他的q14我记得是2的14次方
        //这个angle就是360°的角度
        //第二个是距离 q2 代表2的2次方
        //这个distance就是距离 
        for(int pos = 0; pos < static_cast<int>(count); ++pos)
        {
        	float angle = nodes[pos].angle_z_q14 * 90.f / 16384.f;
        	float distance = nodes[pos].dist_mm_q2 / 1000.0f / 4.0f;
            QPointF f = QPointF(angle,distance);
            //得到角度跟距离你就可以做你想做的事情
            //比如判断0°的时候有东西停下来之类的
            #if 0
         	if(angle > 0 && angle < 1)
         	{
         		doSomething;
			}
			#endif
        }
        QThread::usleep(100);
	}
}

总结

如果嫌卡的话记得拉线程 这边是选择拉了线程处理


版权声明:本文为qq_42590121原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。