第一步:先去官网下载ros驱动包
第二步:将ros驱动包里得ce30_driver-master进行编译,过程:
cd ce30_driver-master
mkdir build
cd build
cmake ..
make
sudo make install
第三步:将ros驱动包里得ce30_driver_ros-master放在ROS里的工作空间下,进行编译
catkin_make
这样驱动已经安装完成。
如何运作还需进行进一步得实验!
补充:如果是利用ROS,则在接上雷达后直接运行ros节点即可
如果是linux,则直接运行ce30_demo即可,
调用教程:
第一个:调用点云教程
#include <iostream>//C++输入输出头文件
#include <ce30_driver/ce30_driver.h>//ce30调用都需要的头文件,包括ce30的所有驱动
using namespace std;
using namespace ce30_driver;
void DataReceiveCB(shared_ptr<PointCloud> cloud) {
for (Point& point : cloud->points) {
cout << point.x << " " << point.y << " " << point.z << endl;
}
}//输出点云子函数
int main() {
UDPServer server;//先实例化一个UDPServer类
server.RegisterCallback(DataReceiveCB);//注册数据接收器功能。 每当扫描点云数据准备就绪时,就会调用接收器函数。
if (!server.Start()) {//boll函数,返回的是0,1//若是启动线程函数,则值为1//实质为判断传感器是否启动
return -1;
}
while (true) {
server.SpinOnce();//,当点云准备就绪是,在spinonce中调用此函数将雷达传过来的数据放入cloud中
}
}
第二个:控制激光雷达教程
#include <iostream>
#include <ce30_driver/ce30_driver.h>
using namespace std;
using namespace ce30_driver;
int main() {
UDPSocket socket;//实例化一个“ UDPSocket”对象
if (!Connect(socket)) {
return -1;//,然后创建与设备的连接,连接失败返回-1
}
VersionRequestPacket version_request;//实例化一个请求数据类
if (!SendPacket(version_request, socket)) {
return -1;//发送请求数据包以获取设备版本,并立即收听响应
}
VersionResponsePacket version_response;//实例化一个接受响应类
if (!GetPacket(version_response, socket)) {
return -1;//获得设备版本时,表明我们能够与该设备进行交互
}
cout << "CE30-D Version: " << version_response.GetVersionString() << endl;//输出版本号
/* 到目前为止,激光雷达还没有开始工作
/*下面发送开始命令使其开始工作*/
StartRequestPacket start_request;//实例化一个开始请求的类
if (!SendPacket(start_request, socket)) {
return -1;//过发送`StartRequestPacket`来让其正常工作
}
// Now it's ready to receive measurement data
/*以下为接受测量的数据包的代码块*/
Packet packet;
while (true) {
if (!GetPacket(packet, socket)) {
continue;
}
unique_ptr<ParsedPacket> parsed = packet.Parse();//对接收到的数据包进行解析
if (parsed) {
for (Column& column : parsed->columns) {
for (Channel& channel : column.channels) {
// Print "(distance, amplitude) [x, y, z]"
cout <<
"(" << channel.distance << ", " << channel.amplitude << ") "
"[" <<
channel.point().x << ", " <<
channel.point().y << ", " <<
channel.point().z << "]" << endl;
}//输出该幅图像的距离,幅度,坐标
}
}
}
/*上面具体的写法见下一个教程*/
StopRequestPacket stop_request;//希望CE30-D停止测量,发送一个“ StopRequestPacket”
SendPacket(stop_request, socket);
}
第三个教程:处理接收到的数据信息(承接上一个教程的接受测量数据方法)
#include <iostream>
#include <ce30_driver/ce30_driver.h>
using namespace std;
using namespace ce30_driver;
int main() {
... ...
// Now it's ready to receive measurement data
Packet packet;
Scan scan;//实例化一个完整的数据类
while (true) {
if (!GetPacket(packet, socket)) {
continue;
}//得到数据包
unique_ptr<ParsedPacket> parsed = packet.Parse();//对接收到的数据进行解析
if (parsed) {
scan.AddColumnsFromPacket(*parsed);//讲数据包的信息传入SCAN类中
if (!scan.Ready()) {
continue;
}
for (int x = 0; x < scan.Width(); ++x) {
for (int y = 0; y < scan.Height(); ++y) {
Channel channel = scan.at(x, y);
cout <<
"(" << channel.distance << ", " << channel.amplitude << ") "
"[" <<
channel.point().x << ", " <<
channel.point().y << ", " <<
channel.point().z << "]" << endl;
}
}//输出所有通道的距离,幅度,以及点坐标
scan.Reset();
}
}
... ...
}
补充:关于激光雷达结构的一些信息:
CE30-D具有一个3D-ToF成像器芯片,带有320 * 20个感光单元。 每个单元都可以通过距离和幅度来射线追踪对象。 同样,每个单元所感测到的射线都有方向。 我们通过水平方位角和垂直方位角分解方向。 为简单起见,我们将水平方位角称为“方位角”,而垂直方位角仍保留其自己的名称。 给定水平方位角,垂直方位角和距离,我们能够计算出指示物体存在的3D点。 我们将距离,幅度和3D点捆绑在一起,并为此集合命名:通道。 对于由具有相同垂直对齐方式的单元所测量的通道的集合,我们称为“列”。 根据前面的上下文,我们知道一列包含20个通道。 然后将320列的集合称为“扫描”。 下图显示了扫描的所有通道的索引组织。
Channel [0, 0] | Channel [1, 0] | … | Channel [318, 0] | Channel [319, 0] |
---|---|---|---|---|
Channel [0, 1] | Channel [1, 1] | … | Channel [318, 1] | Channel [319, 1] |
… | … | … | … | … |
Channel [0, 18] | Channel [1, 18] | … | Channel [318, 18] | Channel [319, 18] |
Channel [0, 19] | Channel [1, 19] | … | Channel [319, 19] | Channel [319, 19] |