编译robot_hmi并完成修改

1.踩坑:已解决

qt5 添加multimedia包 cmake编译错误_lx37213721的博客-CSDN博客

2.qnode类和mainWindow类中的信息如何传递?

qnode类中接收订阅话题,如果mainWindow类中需要访问qnode话题所携带的信号,则需要在qnode.hpp中定义一个信号,

Q_SIGNALS:
    void loggingUpdated();
    void rosShutdown();
    void speed_vel(float,float);

在qnode里的回调函数里发送信号:

void QNode::odom_callback(const nav_msgs::Odometry &msg)
{
    emit speed_vel(msg.twist.twist.linear.x,msg.twist.twist.linear.y);
}

mainWindow类中连接:

connect(&qnode,SIGNAL(speed_vel(float,float)),this,SLOT(slot_update_dashboard(float,float)));

接受者this是当前对象。

mainWindow中对槽函数进行定义:

void MainWindow::slot_update_dashboard(float x,float y)
{
    ui.label_dir_x->setText(x>0?"正向":"反向");
    ui.label_dir_y->setText(y>0?"正向":"反向");
    speed_x_dashBoard->setValue(abs(x)*100);
    speed_y_dashBoard->setValue(abs(y)*100);
}

3.电池电量的显示与实现

概览:

订阅电量话题、回调函数中发布自定义信号、连接信号、槽函数更新ui显示

rostopic echo power

电池电压的数据类型:

#include <std_msgs/Float32.h>

步骤:

qnode.hpp中:
ros::Subscriber power_sub;
void power_callback(const std_msgs::Float32 &msg);
Q_SIGNALS:
void power_vel(float);
 
qnode.cpp中:
power_sub=n.subscribe("power",1000,&QNode::power_callback,this);
void QNode::power_callback(const std_msgs::Float32 &msg)
{
    emit power_vel(msg.data);
}
MainWindow.cpp链接这个信号:
connect(&qnode,SIGNAL(power_vel(float)),this,SLOT(slot_update_power(float)));
槽函数:
void MainWindow::slot_update_power(float value)
{
      ui.label_power_val->setText(QString::number(value).mid(0,5)+"V");
      double n=(value-10.5)/(12.5-10.5);
      int val=n*100;
      ui.progressBar->setValue(val);
}


4.运行终端命令实现快捷指令:

#include <QProcess>

connect(ui.laser_btn,SIGNAL(clicked()),this,SLOT(slot_quick_cmd_clicked()));
void MainWindow::slot_quick_cmd_clicked()
{
    laser_cmd=new QProcess;
//运行系统的一些命令
    laser_cmd->start("bash");
//反斜杠符代表执行命令的结束
    laser_cmd->write(ui.textEdit_laser_cmd->toPlainText().toLocal8Bit()+'\n');
//接收到错误的输入信息的话,会发送此信号,响应输出
    connect(laser_cmd,SIGNAL(readyReadStandardError()),this,SLOT(slot_quick_output()));
//正常的输出回显
    connect(laser_cmd,SIGNAL(readyReadStandardOutput()),this,SLOT(slot_quick_output()));

}

//槽函数:slot_quick_output()
void MainWindow::slot_quick_output()
{
    ui.textEdit_quick_output->append("<font color=\"#FF0000\">"+laser_cmd->readAllStandardError()+"</font>");
    ui.textEdit_quick_output->append("<font color=\"#FFFFFF\">"+laser_cmd->readAllStandardOutput()+"</font>");
}

 之后在文本框内输入命令即可:

参考阅读:

 

5.订阅图像话题并在界面显示:

 因为在qnode类中订阅,所以将头文件包含在qnode.hpp中。

checkbox在订阅前指定话题,点击按钮订阅,改变样式表(QSS)加边框。

因为在qnode中点击订阅按钮才进行订阅显示,所以在qnode中创建一个接口函数,

(1)qnode.hpp中:
void sub_image(QString topic_name);
Q_SIGNALS:
void image_val(QImage);
(2)qnode.cpp中:
void QNode::sub_image(QString topic_name)
{
    ros::NodeHandle n;
//新建一个图像话题的句柄
    image_transport::ImageTransport it_(n);
//Qstring类型转成stdString类型
    image_sub=it_.subscribe(topic_name.toStdString(),1000,&QNode::image_callback,this);

}
void QNode::image_callback(const sensor_msgs::ImageConstPtr &msg)
{
    cv_bridge::CvImagePtr cv_ptr;
    cv_ptr=cv_bridge::toCvCopy(msg,msg->encoding);
    QImage im=Mat2QImage(cv_ptr->image);
    emit image_val(im);
}
(3)MainWindow.cpp中:
connect(ui.pushButton_sub_image,SIGNAL(clicked()),this,SLOT(slot_sub_image()));
connect(&qnode,SIGNAL(image_val(QImage)),this,SLOT(slot_update_image(QImage)));
void MainWindow::slot_sub_image()
{
    qnode.sub_image(ui.lineEdit_image_topic->text());
}
void MainWindow::slot_update_image(QImage im)
{
    ui.label_image->setPixmap(QPixmap::fromImage(im));
}

 执行流程:

点击按钮后,进入槽函数slot_sub_image(),在其中订阅图像话题(传入图像话题参数),进去qnode类中,并且进入回调函数,图像的回调函数中,进行图像类型的转换,并发送图像信号,mainWindow类中接收到图像信号后,进入槽函数slot_update_image();并更新显示图像(用Qpixmap);

执行结果:

 

 

 


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