Qt系列——Win10下LCM通讯库在Qt中的使用及问题解决

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 Qt系列——Win10下LCM通讯库在Qt中的使用及问题解决,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1. 说明

在windows10下Qt使用Lcm通讯库,以及数据传输测试,运行界面如下:
1)发送端:
请添加图片描述
2)接收端:
请添加图片描述

2. 主要代码段

1)发送端

void MainWindow::on_btn_select_clicked()
{
    QString path = QFileDialog::getOpenFileName(this, "选择 img", "./", "Image Files(*.jpg *.png *.jpeg)");
    if(path.isEmpty())
    {
        return;
    }

    QImage scaledimg;

    if(!(img.load(path))) //加载图像
    {
        QMessageBox::information(this,"failed","failed open image !");
        return;
    }
    img=img.convertToFormat(QImage::Format_RGB888);

    src_width=img.width();
    src_height=img.height();
    int scal_width=0;
    int scal_height=0;
    QString str_width,str_heigth;

    QRect originRect = ui->label_image->geometry();
    ui->label_image->setGeometry(originRect.x(),originRect.y(),400,300);
    int Mul=1;
    if(src_width/400>=src_height/300)
    {
        Mul=src_width/400;
    }
    else
    {
       Mul=src_height/300;
    }
    if(Mul>0)
    {
        scal_width=src_width/Mul;
        scal_height=src_height/Mul;
    }
    else
    {
        scal_width=src_width;
        scal_height=src_height;
    }

    scaledimg=img.scaled(scal_width,scal_height,Qt::KeepAspectRatio);


    ui->label_text->setText("src image: "+QString("width: ")+str_width.setNum(src_width)+QString(", height: ")+str_heigth.setNum(src_height));
    ui->label_image->setPixmap(QPixmap::fromImage(scaledimg));
	}


	void MainWindow::on_btn_send_clicked()
	{
	    //lcm feed msg
	    if(!mylcm.good())
	    {
	        QMessageBox::information(this,"lcm","lcm is not good!");
	        return;
	    }

    qint64 timestamp = QDateTime::currentDateTime().toMSecsSinceEpoch(); 
    std::string str_image_name;
    str_image_name=ui->lineEdit_image_name->text().toStdString();
    std::string str_channel_name;
    str_channel_name=ui->lineEdit_channel_name->text().toStdString();

    exlcm::test msg;
    msg.timestamp=timestamp;
    msg.position[0]=src_width;
    msg.position[1]=src_height;
    msg.position[2]=3;
    msg.orientation[0]=0;
    msg.orientation[1]=0;
    msg.orientation[2]=0;
    msg.orientation[3]=1;
    msg.num_datas=img.sizeInBytes();
    msg.datas.resize(msg.num_datas);
    memcpy(&msg.datas[0], img.bits(), msg.num_datas*sizeof (uchar));
    msg.name=str_image_name;
    msg.enabled=true;

    int rt = mylcm.publish(str_channel_name,&msg);
    //QMessageBox::information(this,"lcm pub",rt==0?"success":"failure");
    if(rt==0)
    {
        ui->textBrowser->append("timestamp:"+QString::number(timestamp)+" ---- success contens: channel name( "+QString::fromStdString(str_channel_name)+" ),"+
                                "image size: "+QString::number(src_width) + "*"+QString::number(src_height));
    }
    else
    {
        ui->textBrowser->append("timestamp:"+QString::number(timestamp)+" ---- failure contens: channel name( "+QString::fromStdString(str_channel_name)+" ),"+
                                "image size: "+QString::number(src_width) + "*"+QString::number(src_height));
    }
}

2)接收端

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , mylcm("udpm://239.255.76.67:7667?ttl=1")
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_btn_receive_clicked()
{
    QMessageBox::information(this,"btn_receive","start receive data!");
    if(!mylcm.good())
    {
        return;
    }
    mylcm.subscribe("TEST", &Handler::handleMessage, &myhandler);
    if(mylcm.handle() == 0)
    {
        uchar *datas = new uchar[myhandler.image_data.num_datas*sizeof (uchar)];
        memcpy(datas, &myhandler.image_data.datas[0],myhandler.image_data.num_datas*sizeof(uchar));
        QImage img(datas,myhandler.image_data.position[0],myhandler.image_data.position[1], QImage::Format_RGB888);
        std::string file_name = std::to_string(myhandler.image_data.timestamp)+".jpeg";
        //img.save(file_name.c_str(),"JPEG");

    QRect originRect = ui->label_image->geometry();
    ui->label_image->setGeometry(originRect.x(),originRect.y(),400,300);
    int ratio = 1;
    int src_width = myhandler.image_data.position[0];
    int src_height = myhandler.image_data.position[1];
    int scal_width,scal_height;
    if(src_width/400 >= src_height/300)
    {
        ratio = src_width/400;
    }
    else
    {
       ratio = src_height/300;
    }
    if(ratio > 0)
    {
        scal_width=src_width/ratio;
        scal_height=src_height/ratio;
    }
    else
    {
        scal_width=src_width;
        scal_height=src_height;
    }
    QImage scaledimg;
    scaledimg=img.scaled(scal_width,scal_height,Qt::KeepAspectRatio);

    QString str_width,str_heigth;
    ui->label_text->setText("receive image: "+QString("width: ")+str_width.setNum(src_width)+QString(", height: ")+str_heigth.setNum(src_height));
    ui->label_image->setPixmap(QPixmap::fromImage(scaledimg));

    delete [] datas;
	}
return;
}

3. 问题及解决

1)问题

mainwindow.obj: -1: error: LNK2019: 无法解析的外部符号 __imp__lcm_create,函数 “public: __thiscall lcm::LCM::LCM(class std::basic_string<char,struct std::char_traits,class std::allocator >)” (??0LCM@lcm@@QAE@V?

b

a

s

i

c

s

t

r

i

n

g

@

D

U

?

basic_string@DU?

basicstring@DU?char_traits@D@std@@V?KaTeX parse error: Expected group after ‘_’ at position 78: …019: 无法解析的外部符号 _̲_imp__lcm_destr…basic_string@DU?

c

h

a

r

t

r

a

i

t

s

@

D

@

s

t

d

@

@

V

?

char_traits@D@std@@V?

chartraits@D@std@@V?allocator@D@2@@std@@PBXI@Z) 中引用了该符号

解决:

请添加图片描述

2).pro文件

.pro文件做如下添加:
请添加图片描述

3)发送端

将如下红框中的文件,拷贝到项目目录
请添加图片描述

4)接收端

运行出现如下错误:

GLib-ERROR **: The thread system is not yet initialized.
aborting…
解决:
把其他几个库放到项目目录下,如下图
请添加图片描述

4. 代码中用到的库文件下载

建议自己安装配置好LCM库,尽量不要直接下载我的上传!
库文件下载

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/130114.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!