Qt-ROS 学习总结

1、安装 QT-create
https://download.qt.io/archive/qt/
进入网站后找到 qt-opensource-linux-x64-5.12.2.run,开始下载

chmod +x  qt-opensource-linux-x64-5.12.2.run
./qt-opensource-linux-x64-5.12.2.run

2、安装QT-ros
https://ros-qtc-plugin.readthedocs.io/en/latest/_source/How-to-Install-Users.html
请添加图片描述 选择离线安装
3、创建新的工程
请添加图片描述

请添加图片描述
注意:选择CatkinMake

4、编译
请添加图片描述

5、运行请添加图片描述

6、开始创作
参考蒋大佬的文章
https://blog.csdn.net/qq_38441692?type=blog
Qt5 安装ros插件ros_qtc_plugin

sudo add-apt-repository ppa:levi-armstrong/qt-libraries-xenial
sudo add-apt-repository ppa:levi-armstrong/ppa
sudo apt-get update && sudo apt-get install qt57creator-plugin-ros

shanchu的软件源请运行

sudo add-apt-repository --remove ppa:beineri/opt-qt57-xenial
sudo add-apt-repository --remove ppa:beineri/opt-qt571-xenial

anzhuangshibai

在这里插入代码片
sudo add-apt-repository ppa:levi-armstrong/qt-libraries-xenial 
sudo add-apt-repository ppa:levi-armstrong/ppa 
sudo apt update && sudo apt install qt57creator 
sudo apt install qt57creator-plugin-ros

7、按钮启动终端
在UI 上定义一个按钮
跳转到信号槽

请添加图片描述.c 写代码


void robomap::MainWindow::on_pushButton_6_clicked()
{
    system("gnome-terminal -x bash -c 'source ~/turtlebot_hokuyo/devel/setup.bash; roslaunch turtlebot_bringup minimal.launch'&");
}

.h 定义
请添加图片描述
8、如何在QT里显示相机界面
首先相机发布话题
这里使用的是intel d435i
通过 realsense-ros 发布相机话题

roslaunch realsense2_camera rs_camera.launch

首先在功能包的CMakeLists.txt中添加依赖

find_package(catkin REQUIRED COMPONENTS rviz roscpp sensor_msgs
    cv_bridge
    std_msgs
    image_transport
    )

订阅话题

 ros::NodeHandle n;
 image_transport::ImageTransport it_(n);
 image_sub=it_.subscribe(topic.toStdString(),100,&QNode::imageCallback0,this);

回调函数处理图片数据


 //图像话题的回调函数
 void QNode::imageCallback0(const sensor_msgs::ImageConstPtr& msg)
 {
     cv_bridge::CvImagePtr cv_ptr;

     try
       {
         //深拷贝转换为opencv类型
         cv_ptr = cv_bridge::toCvCopy(msg, msg->encoding);
         QImage im=Mat2QImage(cv_ptr->image);
         emit Show_image(0,im);
       }
       catch (cv_bridge::Exception& e)
       {

         log(Error,("video frame0 exception: "+QString(e.what())).toStdString());
         return;
       }
 }

接着将opencv类型转换为QImage类型(因为Label只能显示QImage类型的图像),通过Mat2QImage函数:

 QImage QNode::Mat2QImage(cv::Mat const& src)
 {
   QImage dest(src.cols, src.rows, QImage::Format_ARGB32);

   const float scale = 255.0;

   if (src.depth() == CV_8U) {
     if (src.channels() == 1) {
       for (int i = 0; i < src.rows; ++i) {
         for (int j = 0; j < src.cols; ++j) {
           int level = src.at<quint8>(i, j);
           dest.setPixel(j, i, qRgb(level, level, level));
         }
       }
     } else if (src.channels() == 3) {
       for (int i = 0; i < src.rows; ++i) {
         for (int j = 0; j < src.cols; ++j) {
           cv::Vec3b bgr = src.at<cv::Vec3b>(i, j);
           dest.setPixel(j, i, qRgb(bgr[2], bgr[1], bgr[0]));
         }
       }
     }
   } else if (src.depth() == CV_32F) {
     if (src.channels() == 1) {
       for (int i = 0; i < src.rows; ++i) {
         for (int j = 0; j < src.cols; ++j) {
           int level = scale * src.at<float>(i, j);
           dest.setPixel(j, i, qRgb(level, level, level));
         }
       }
     } else if (src.channels() == 3) {
       for (int i = 0; i < src.rows; ++i) {
         for (int j = 0; j < src.cols; ++j) {
           cv::Vec3f bgr = scale * src.at<cv::Vec3f>(i, j);
           dest.setPixel(j, i, qRgb(bgr[2], bgr[1], bgr[0]));
         }
       }
     }
   }

   return dest;
 }

接着发送自定义信号到mainwindow:

emit Show_image(0,im);

在mainwindows.cpp链接刚才回调函数中发出的信号:

//链接槽函数
connect(&qnode,SIGNAL(Show_image(int,QImage)),this,SLOT(slot_show_image(int,QImage)));

槽函数中处理信号在槽函数中更新ui界面显示,在lable上显示图像:

void MainWindow::slot_show_image(int frame_id, QImage image)
{
 
        ui.label_video0->setPixmap(QPixmap::fromImage(image).scaled(ui.label_video0->width(),ui.label_video0->height()));
}

定义按钮启动相机

void robomap::MainWindow::on_pushButton_11_clicked()
{
  initVideos();
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值