运行环境:
ubuntu16.04、Qtcreator5.9.9、ros kinetic
1、配置环境变量
在home目录下的 .bashrc文件下加入以下代码
export XDG_RUNTIME_DIR=/tmp/runtime-root
export QTDIR=/home/xuan/Qt5.9.9 #qt安装目录
export PATH=$QTDIR/5.9.9/gcc_64/bin:$PATH #注意qt的版本号
export PATH=$QTDIR/Tools/QtCreator/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/gcc_64/lib:$LD_LIBRARY_PATH
加入该代码段是为了可以在终端下用qtcreator命令运行qt。
加入该代码后
在终端下运行
source .bashrc #使配置生效
2、新建project
用qt新建project,一个ros节点相当于一个project。
选择qmake,也可以选择cmake,cmake的话语法就和用catkin_make写Cmakelists.txt文件差不多。
选5.9.9 GCC这个,选第一个会在此目录下生成debug文件夹等等
工程生成完成后,配置该工程的build属性,去掉shadow build的勾勾。
配置run属性,去掉勾勾,使其不打开终端运行。
3、qmake语法
qmake语法参考学习
可以将以下代码复制到project的.pro文件下
TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt
DESTDIR += ./bin #放置可执行程序目标的目录
OBJECTS_DIR += ./tmp #放置obj中间文件的目录
INCLUDEPATH += \
/opt/ros/kinetic/include \
#应用程序所需的额外的包含路径列表
LIBS += -L/opt/ros/kinetic/lib \
-L/usr/lib \
-L/usr/lib/x86_64-linux-gnu \
-lroscpp -lrospack -lrosconsole -lroscpp_serialization \
-lrostime -lroslib -lrosconsole_log4cxx -ltf -ltf2 -ltf2_ros -lactionlib \
-ldynamic_reconfigure_config_init_mutex -limage_transport -lcv_bridge -lclass_loader \
# -lcsm -lmessage_filters \
-lboost_system -lboost_filesystem -lboost_thread -lboost_timer -lboost_date_time \
-lpthread \
#依赖库的路径和名称 -L{xxdirxx} -l{xxnamexx}
#所包含的cpp源文件
SOURCES += \
main.cpp
4、测试ros相关工程
去ros wiki上顺便复制了一段代码,点击运行,不报错就对了。
以下是订阅者代码。记得打开roscore!!!
#include "ros/ros.h"
#include "std_msgs/String.h"
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
ros::spin();
return 0;
}
以下是发布者截图,运行成功的截图。
#include <iostream>
#include "ros/ros.h"
#include "std_msgs/String.h"
using namespace std;
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker");
ros::NodeHandle n;
ros::Publisher pub = n.advertise<std_msgs::String>("chatter", 1000);
ros::Rate loop_rate(10);
int count = 0 ;
while(ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss<<"hello world"<<count;
msg.data = ss.str();
ROS_INFO("%s",msg.data.c_str());
pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
5、一点小技巧
就是可能会用到很多自定义的msg,写好msg后可以用catkin_make语法编译,生成头文件 .h 后直接将头文件引入到该工程下。用qt写代码还是舒服特别特别多,有自动补全了~