Qt-ros插件:创建工程,编译实现操控小乌龟(二)

声明:本插件依赖于更新的qt5.9,不需安装qt,安装插件自行安装qt。详情见点击打开链接

1、创建工程

最后点击完成即可。

2,建好后右键点击src,打开Terminal,执行指令建包catkin_create_qt_pkg btn

(预先安装建包工具,指令:sudo apt-get install ros-indigo-qt-ros


这就建立


这就建好一个包了,点击左下角小锤子编译一下,通过。


3、然后点击project->run,添加节点如图:


4,在UI界面拖放几个按钮,并改名字,右击按钮转到槽,在主窗口cpp文件中写入qnode.up();(因为qnode里面定义的是up和left),另一按钮同理。

5主要的是qnode.cpp文件,首先在头文件中定义

然后写qnode.cpp文件

/**
 * @file /src/qnode.cpp
 *
 * @brief Ros communication central!
 *
 * @date February 2011
 **/

/*****************************************************************************
** Includes
*****************************************************************************/

#include <ros/ros.h>
#include <ros/network.h>
#include <string>

#include <std_msgs/String.h>
#include <geometry_msgs/Twist.h>

#include <sstream>
#include "../include/btn/qnode.hpp"

/*****************************************************************************
** Namespaces
*****************************************************************************/

namespace btn {

/*****************************************************************************
** Implementation
*****************************************************************************/

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

QNode::~QNode() {
    if(ros::isStarted()) {
      ros::shutdown(); // explicitly needed since we use ros::start();
      ros::waitForShutdown();
    }
	wait();
}

bool QNode::init() {
	ros::init(init_argc,init_argv,"btn");
	if ( ! ros::master::check() ) {
		return false;
	}
	ros::start(); // explicitly needed since our nodehandle is going out of scope.
	ros::NodeHandle n;
	// Add your ros communications here.
  chatter_publisher = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 1000);
	start();
	return true;
}

bool QNode::init(const std::string &master_url, const std::string &host_url) {
	std::map<std::string,std::string> remappings;
	remappings["__master"] = master_url;
	remappings["__hostname"] = host_url;
	ros::init(remappings,"btn");
	if ( ! ros::master::check() ) {
		return false;
	}
	ros::start(); // explicitly needed since our nodehandle is going out of scope.
	ros::NodeHandle n;
	// Add your ros communications here.
  chatter_publisher = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 1000);
	start();
	return true;
}

/*void QNode::run() {
	ros::Rate loop_rate(1);
   int count = 0;
  while ( ros::ok() )
  {

    geometry_msgs::Twist msg;
            msg.linear.x = 1.0;
            msg.angular.z = 0.0;

            chatter_publisher.publish(msg);
    //        log(Info, msg.linear.x);
    //        log(Info, msg.angular.z);
            logging_model.insertRows(logging_model.rowCount(),1);
            std::stringstream logging_model_msg;
            logging_model_msg << "[DEBUG] [" << ros::Time::now() << "]: " <<"linear = "<< msg.linear.x<<" angular = "<<msg.angular.z;
            QVariant new_row(QString(logging_model_msg.str().c_str()));
            logging_model.setData(logging_model.index(logging_model.rowCount()-1),new_row);
            Q_EMIT loggingUpdated(); // used to readjust the scrollbar

    ros::spinOnce();
		loop_rate.sleep();
		++count;
  }*/
  void QNode::up() {
    ros::Rate loop_rate(1);

   if( ros::ok() )
    {

      geometry_msgs::Twist msg;
              msg.linear.x = 1.0;
              msg.angular.z = 0.0;

              chatter_publisher.publish(msg);


      ros::spinOnce();
      loop_rate.sleep();

    }
}
  void QNode::left() {
      ros::Rate loop_rate(1);

      if ( ros::ok() )
      {

        geometry_msgs::Twist msg;
                msg.linear.x = 0.0;
                msg.angular.z = 1.0;

                chatter_publisher.publish(msg);



        ros::spinOnce();
        loop_rate.sleep();

      }

  //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)
}


void QNode::log( const LogLevel &level, const std::string &msg) {
	logging_model.insertRows(logging_model.rowCount(),1);
	std::stringstream logging_model_msg;
	switch ( level ) {
		case(Debug) : {
				ROS_DEBUG_STREAM(msg);
				logging_model_msg << "[DEBUG] [" << ros::Time::now() << "]: " << msg;
				break;
		}
		case(Info) : {
				ROS_INFO_STREAM(msg);
				logging_model_msg << "[INFO] [" << ros::Time::now() << "]: " << msg;
				break;
		}
		case(Warn) : {
				ROS_WARN_STREAM(msg);
				logging_model_msg << "[INFO] [" << ros::Time::now() << "]: " << msg;
				break;
		}
		case(Error) : {
				ROS_ERROR_STREAM(msg);
				logging_model_msg << "[ERROR] [" << ros::Time::now() << "]: " << msg;
				break;
		}
		case(Fatal) : {
				ROS_FATAL_STREAM(msg);
				logging_model_msg << "[FATAL] [" << ros::Time::now() << "]: " << msg;
				break;
		}
	}
	QVariant new_row(QString(logging_model_msg.str().c_str()));
	logging_model.setData(logging_model.index(logging_model.rowCount()-1),new_row);
	Q_EMIT loggingUpdated(); // used to readjust the scrollbar
}

}  // namespace btn
最后,编译运行就可以了,(首先加入turtlesim小乌龟的节点,然后启动roscore欧)。点击connect连接,就可以按键控制了。



PS:1、头文件包含问题:

用插件创建或导入ROS package之后还需要修改.workspace文件,

<IncludePaths>标签下加入下面这行

<Directory>/opt/ros/indigo/include</Directory>
  • 1

这样就可以使得Qt找到ros头文件,比如<ros/ros.h> 

2,connect前一定要、一定要在use environment variable前打钩或者输入ROS IP。

在此非常感谢我的小伙伴的帮助。

借鉴自:

1、http://blog.csdn.net/yaked/article/details/45342137

2、http://blog.csdn.net/u013453604/article/details/52186375

3、http://blog.csdn.net/qq_30460905/article/details/79034633




猜你喜欢

转载自blog.csdn.net/qq_39989653/article/details/79189605
今日推荐