새소식

ROS & Robotics/GUI

ROS with Qt : 1. 설치하고 간단한 프로젝트 템플릿 만들기

  • -

로봇 개발에서의 편의성을 위해 이런 저런 GUI 개발을 시도해 보고 있는데, FoxGlove, Flutter를 이용한 웹앱 등 여러 가지 툴을 써 봤지만 가장 대중적인 Qt는 안 써봐서 이참에 시도해 보는 글

# 필요한 qt 패키지 sudo apt-get update sudo apt-get install qt5-default qtcreator # UI를 시각적으로 디자인할 수 있는 도구 sudo apt-get install qttools5-dev-tool
qtcreator

 

# ROS 워크스페이스의 src 폴더에서 catkin_create_pkg qt_ros_app roscpp std_msgs cd qt_ros_app
# filetree qt_ros_app/ ├── include/qt_ros_app/ │ └── mainwindow.h ├── src/ │ ├── main.cpp │ └── mainwindow.cpp └── CMakeLists.txt

 

그리고 내부의 CMakeLists.txt를 다음과 같이 수정해준다. 

cmake_minimum_required(VERSION 3.0.2) project(qt_ros_app) # C++ 14 사용 set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Qt 설정 set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) find_package(catkin REQUIRED COMPONENTS roscpp std_msgs ) find_package(Qt5 REQUIRED COMPONENTS Core Widgets ) catkin_package( INCLUDE_DIRS include LIBRARIES ${PROJECT_NAME} CATKIN_DEPENDS roscpp std_msgs ) include_directories( include ${catkin_INCLUDE_DIRS} ${Qt5Core_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS} ) # 소스 파일 설정 set(qt_ros_app_node_SRCS src/main.cpp src/mainwindow.cpp ) # 헤더 파일 설정 set(qt_ros_app_node_HDRS include/${PROJECT_NAME}/mainwindow.h ) # 실행 파일 생성 add_executable(${PROJECT_NAME}_node ${qt_ros_app_node_SRCS} ${qt_ros_app_node_HDRS} ) target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES} Qt5::Core Qt5::Widgets )

include/qt_ros_app/mainwindow.h

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <ros/ros.h> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: ros::NodeHandle nh_; // ROS 구독자와 발행자를 여기에 선언할 예정 }; #endif

 

src/mainwindow.cpp

#include "qt_ros_app/mainwindow.h" #include <QVBoxLayout> #include <QLabel> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // 중앙 위젯 생성 QWidget *centralWidget = new QWidget(this); setCentralWidget(centralWidget); // 레이아웃 설정 QVBoxLayout *layout = new QVBoxLayout(centralWidget); // 레이블 추가 QLabel *label = new QLabel("ROS Qt Application", this); layout->addWidget(label); // 윈도우 크기 설정 resize(800, 600); } MainWindow::~MainWindow() { }

src/main.cpp

#include <QApplication> #include "qt_ros_app/mainwindow.h" #include <ros/ros.h> int main(int argc, char *argv[]) { // ROS 초기화 ros::init(argc, argv, "qt_ros_app"); // Qt 애플리케이션 생성 QApplication app(argc, argv); // 메인 윈도우 생성 및 표시 MainWindow w; w.show(); // Qt 이벤트 루프와 ROS 스핀을 함께 실행 while (ros::ok()) { ros::spinOnce(); app.processEvents(); } return app.exec(); }

 

catkin_make --pkg qt_ros_app source devel/setup.bash rosrun qt_ros_app qt_ros_app_node

그러면 이와 같은 GUI가 실행된다. 

 

https://youtu.be/EpEoFR8ihcc?si=iREl1CtDpjLDhI_J

 

+ 덧 

하루이틀 써보니까 느낀건데, 엄청 쉽고 편하긴 한데 Client 단에서 ROS 디펜던시를 없앨 수 없다는 점이 조금 아쉽다. 
Qt 자체는 ROS 디펜던시는 없는데, 어쨌든 (ROS 없는 Qt) + ROS 제어를 하려면 ROS 메시지, 서비스 등을 앱에다 전달해주는 애가 하나 더 붙어야 한다는 점.
만약에 ROS가 안 깔려있는 아무 컴퓨터에서나 해 볼 수 있으려면 역시 웹소켓 Rosbridge를 이용한 웹앱이 좋은 것 같다. 공수만 좀 덜 들이고 할 수 있으면 둘 다 개발해봐야지


(ROS 디펜던시 없음 + 웹브라우저에서 접속 가능함 + 데이터 트래픽 조절 가능)이라는 점에서 Flutter 웹앱이 사용성 면에서는 Qt 압승...
but (그냥 ROS 깔려 있는 리눅스 컴터에서 돌릴 거임 + 항상 모니터가 있는 환경임 + 빨리 C++로 개발하고 싶음)일 경우에는 Qt가 더 적합한 선택  

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.