声明:本插件依赖于更新的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