1.环境声明
Ubuntu 16.04
ROS kenitic
Levi-Armstrong大佬已经开发了对应的qt插件:ros_qtc_plugin使我们能在qt creator上编译ROS程序。这个插件以前使用ppa的方式进行安装,现在大佬已经把该插件集成到qt creator里面了,安装和使用文档。
2.安装Qt Creator for ROS
附上下载链接
How to Install (Users) — ROS Qt Creator Plug-in documentation
下载对应系统的Qt安装包:分为在线和离线安装两种方式,然后运行.run安装包完成带插件的qt creator的安装。
2.1配置Qt Creator for ROS
教程里面配置了Qt Creator的各种选项,但其实只有第一项:配置Ubuntu允许debugging/ptrace是必要的。过程为:
(1.Open file: sudo gedit /etc/sysctl.d/10-ptrace.conf
(2.Change the value of kernel.yama.ptrace_scope to 0
(3.Reload the kernel configuration with sudo systemctl restart procps.service
其它的都是可选的。
3 ROS程序创建
在Qt Creator中创建catkin工作空间、创建功能包和节点。
3.1首先创建catkin工作空间
打开 “新建文件或项目”,选择ROS Workspace:
下面填写工作空间名称和路径,ps:创建工作空间不会独立创建文件夹,因此最好先新建一个与该工作空间同名的文件夹作为路径。
3.2创建功能包
在工作空间下有一个src目录(默认是隐藏的,先设置显示空目录),右键该目录新建文件打开对话框,选择Package。
填入功能包的名称、和依赖的功能包。
3.3创建节点
右键功能包目录下的src文件夹,新建文件打开对话框。选择对应节点类型。
我这里需要订阅雷达scan话题选择subscriber
然后填入节点名称,比如Laserscan_node.cpp。
3.4配置CMakeLists.txt
跟普通的ROS程序一样,需要配置功能包的CMakeLists.txt文件才能编译。一个典型的CMakeLists.txt文件如下:
cmake_minimum_required(VERSION 2.8.0)
project(Laserscan)
find_package(catkin REQUIRED COMPONENTS
roscpp
sensor_msgs
std_msgs
)
catkin_package(
)
include_directories(
${catkin_INCLUDE_DIRS}
)
add_executable(Laserscan_node src/Laserscan_node.cpp)
target_link_libraries(Laserscan_node ${catkin_LIBRARIES} )
3.5.配置ROS程序
点击项目,首先配置编译选项,使用CatkinMake编译系统。
配置运行选项,设置运行的功能包和节点。
到此, 配置完成后,编译程序,然后ROS就可以运行了。
4 ROS程序使用QT4库
在前面的基础上,添加Qt的GUI界面踩了不少坑。网上多是QT5 for ROS教程,踩坑到底还是对CMake了解不充分。
4.1右键功能包新建文件,打开对话框,选择QT界面类:
然后选择主窗口类:
最后填入类名、头文件名、源文件名、界面文件名等完成创建。
上面创建了一个qt窗口,但是只是增加了几个文件,并没有添加到编译系统。下面修改CMakeLists.txt使得catkin可以编译qt组件。一个典型的配置如下:
cmake_minimum_required(VERSION 2.8.0)
project(Laserscan)
## Compile as C++11, supported in ROS Kinetic and newer
add_compile_options(-std=c++11)
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
roscpp std_msgs qt_build
)
FIND_PACKAGE (Qt4)
catkin_package()
set(CMAKE_AUTOMOC ON) #QT中使用moc元对象编译器分析QT语句,然后才交给标准的C++编译器。
set(CMAKE_AUTOUIC ON) #QT中使用uic分析ui代码
set(CMAKE_INCLUDE_CURRENT_DIR ON)
QT4_WRAP_UI(QT_FORMS_HPP ${QT_FORMS})
QT4_WRAP_CPP(QT_MOC_HPP ${QT_MOC})
include_directories(
# include
include/Laserscan/src
${catkin_INCLUDE_DIRS}
)
rosbuild_prepare_qt4(QtCore QtGui)
file(GLOB QT_FORMS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} FOLLOW_SYMLINKS src/*.ui)
file(GLOB_RECURSE QT_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} FOLLOW_SYMLINKS src/*.cpp)
file(GLOB_RECURSE QT_MOC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} FOLLOW_SYMLINKS src/*.h)
add_executable(${PROJECT_NAME}_node ${QT_SOURCES} ${QT_FORMS_HPP} ${QT_MOC_HPP})
target_link_libraries(
${PROJECT_NAME}_node
${QT_LIBRARIES}
${catkin_LIBRARIES} ${LIBS}
)
然后编译运行即可。
5.踩的坑以及对于个人有效的解决方法
5.1找不到库
检查CmakeLIst中添加库部分
检查文件路径
FIND_PACKAGE (Qt4)
rosbuild_prepare_qt4(QtCore QtGui)
file(GLOB_RECURSE QT_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} FOLLOW_SYMLINKS src/*.cpp)
add_executable(${PROJECT_NAME}_node ${QT_SOURCES} ${QT_FORMS_HPP})
target_link_libraries(
${PROJECT_NAME}_node
${QT_LIBRARIES}
${catkin_LIBRARIES} ${LIBS}
)
5.2 ui头文件未创建
这部分中的u_*.h理应自动创建并使用
原因是在CmakeLIst中没有使用uic工具分析ui代码生成.h头文件
set(CMAKE_AUTOMOC ON) #QT中使用moc元对象编译器分析QT语句,然后才交给标准的C++编译器。
set(CMAKE_AUTOUIC ON) #QT中使用uic分析ui代码
set(CMAKE_INCLUDE_CURRENT_DIR ON) #设置工程包含当前目录