ROS QT界面實現

我的環境:Ubuntu16.04,ros kinetic 

安裝含ROS的QT:

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

安裝ROS qt工具:

sudo apt-get install ros-kinetic-qt-create

sudo apt-get install ros-kinetic-qt-build

在工作區,新建一個ROS package:

cd ~/catkin_ws/src

catkin_create_qt_create RosQt (有需要依賴的包就寫在後面)

此時RosQt文件夾下應該有:

打開剛纔安裝,新建項目->其他項目->ros workspace:

需要注意:workspace path 選擇你ROS的工作區,我的是~/catkin_ws/
接下來就可以在RosQt的src文件夾下,新建你需要的cpp文件。

如果需要實現多個ROS節點,需要將每個節點繼承Qthread類實現。

比如:

ImageProcess.h文件
#include <QThread>
#include <ros/ros.h>
using namespace ros;

class ImageProcess : public QThread
{
   Q_OBJECT
public:


    ImageProcess(int argc, char** argv);
    virtual ~ImageProcess();

    bool init();
    void run();
private:
    int init_argc;
    char** init_argv;
    ros::Subscriber poseSub;

}
ImageProcess.cpp文件
#include <ros/ros.h>
#include <ros/network.h>
#include <std_msgs/String.h>

#include "../include/ImageProcess.h"

   ImageProcess::ImageProcess(int argc, char** argv ) :
        init_argc(argc),
        init_argv(argv)
        {}

    ImageProcess::~ImageProcess() {
        if(ros::isStarted()) {
            ros::shutdown(); // explicitly needed since we use ros::start();
            ros::waitForShutdown();
        }
        wait();
    }
   bool ImageProcess::init() {
        ros::init(init_argc,init_argv,"imageProcess");
        if ( ! ros::master::check() ) {
            return false;
        }
        ros::start(); 

        return true;
    }
   void ImageProcess::myCallback(const std_msgs::String str1)
    {
       ...//你需要的操作
    }
   void ImageProcess::run() {
        ros::NodeHandle n_;

        spinner1= new ros::MultiThreadedSpinner(4);//如果你有多個ros節點,就需要用這個
        //具體原因:http://wiki.ros.org/roscpp/Overview/Callbacks%20and%20Spinning
        //https://answers.ros.org/question/205136/starting-multiple-instances-of-same-callback-in-multithreadedspinner/

       
        poseSub = n_.subscribe("/captureflag", 1000, &ImageProcess::myCallback,this);

        spinner1->spin();
        std::cout << "Ros shutdown, proceeding to close the gui." << std::endl;
        Q_EMIT rosShutdown(); // used to signal the gui for a shutdown (useful to roslaunch)

    }

在界面中,調用ImageProcess對象的函數即可。

另外,如果需要在Qt界面中實現,命令行的功能需要用到QProcess,比如運行roscore。

QProcess *p;
 p = new QProcess(this); 
 p->start("roscore");

關於QT,我是新手,有什麼建議或者討論可以加我QQ:1441405602.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章