在qt上模拟ros去接收点云,并将点云数据3d可视化。不过本人并没有实现使用ros+qt的方法去订阅话题来获得点云,如有大佬实现可以留下链接。可以采用boost::asio去实现,这里采用简单易懂的tcp去接收点云。
服务端
服务器端是随机生成5000-10000个点云,并通过tcp发送给服务器。
tcp.cpp
#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <QThread>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/compression/octree_pointcloud_compression.h>
#include <pcl/io/io.h>
using PointCloud = pcl::PointCloud<pcl::PointXYZ>;
class Server : public QTcpServer {
Q_OBJECT
public:
Server(QObject *parent = nullptr) : QTcpServer(parent) {
if (!this->listen(QHostAddress::Any, 1234)) {
qCritical() << "Unable to start the server: " << this->errorString();
} else {
qDebug() << "Server started...";
}
}
protected:
void incomingConnection(qintptr socketDescriptor) override {
QTcpSocket *socket = new QTcpSocket(this);
socket->setSocketDescriptor(socketDescriptor);
connect(socket, &QTcpSocket::disconnected, socket, &QTcpSocket::deleteLater);
sendPointCloud(socket);
}
private slots:
void sendPointCloud(QTcpSocket *socket) {
while (socket->state() == QAbstractSocket::ConnectedState) {
PointCloud::Ptr cloud(new PointCloud);
generateRandomPointCloud(cloud, 5000 + qrand() % 5001); // 生成5000到10000个点
//压缩点云数据
std::stringstream compressedData;
pcl::io::OctreePointCloudCompression<pcl::PointXYZ>