环境
机器 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版权协议,转载请附上原文出处链接和本声明。