ROS_Qt_UI_Coding - 8BitsCoding/RobotMentor GitHub Wiki

ROS_Qt_UI_Coding ๋ฐฉ๋ฒ•

UI Coding ํ•˜๊ธฐ 1

// main_window.cpp, 
// MainWindow()
ui.request_a_lineEdit->setText("Insert Number");
ui.request_b_lineEdit->setText("Insert Number");
ui.response_result_lineEdit->setEnabled(false);
ui.operator_comboBox->addItem(QString("Select Operator"));
ui.operator_comboBox->addItem(QString("PLUS"));
ui.operator_comboBox->addItem(QString("MINUS"));
ui.operator_comboBox->addItem(QString("MULTIPLICATION"));
ui.operator_comboBox->addItem(QString("DIVISION"));

ui ์ฝ”๋”ฉ์€ SIGNAL AND SLOT์˜ ๊ธฐ๋Šฅ์„ ์•Œ์•„์•ผ์ง€ ๊ฐ€๋Šฅํ•˜๊ธฐ์— SIGNAL AND SLOT์„ ์„ค๋ช… ํ›„ ๋‹ค์‹œ ์ฝ”๋”ฉ์„ค๋ช…ํ•จ.


Qt ์˜ ํ•ต์‹ฌ SIGNAL AND SLOT ์‚ฌ์šฉํ•˜๊ธฐ

QObject::connect(ui.operator_comboBox,SIGNAL(crrentIndexChanged(int)), this, SLOT(changeOperator()));
// ํ•ด์„์„ ํ•˜์ž๋ฉด, ui.operator_comboBox ์˜ค๋ธŒ์ ํŠธ์˜ currentIndexChange ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ์‹œ ํ˜„ ์˜ค๋ธŒ์ ํŠธ(this)์˜ changeOperator๋ฅผ ํ˜ธ์ถœํ•˜๋ผ.
// ๋ง์ด ์ข€ ์–ด๋ ค์šด๊ฑฐ ๊ฐ™์Œ.
// QObject::connect(<Object1 ์ฃผ์†Œ>, SIGNAL(<Object1๋‚ด์˜ ํ•จ์ˆ˜>, <Object2 ์ฃผ์†Œ>, SLOT(<Object2 ๋‚ด์˜ ํ•จ์ˆ˜>)));
// ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด๋œ๋‹ค.

๋‹จ, Object1, 2๋ชจ๋‘ ํ•จ์ˆ˜์˜ ์„ ์–ธ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธ์„ ํ•ด์ค˜์•ผํ•จ.

public Q_SLOTS :
     void changeOperator();
public Q_SIGNALS :
     void crrentIndexChanged(int);

UI Coding 2

combobox ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„.

// main_window.cpp, 

// MainWindow() ํ•จ์ˆ˜
QObject::connect(ui.operator_comboBox,SIGNAL(crrentIndexChanged(int)), this, SLOT(changeOperator()));
// ํ•ด์„์„ ํ•˜์ž๋ฉด, ui.operator_comboBox ์˜ค๋ธŒ์ ํŠธ์˜ currentIndexChange ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ์‹œ ํ˜„ ์˜ค๋ธŒ์ ํŠธ(this)์˜ changeOperator๋ฅผ ํ˜ธ์ถœํ•˜๋ผ.


// changeOperator() ํ•จ์ˆ˜
qnode.sendSetOperator(ui.operator_comboBox->currentText().toStdString());
// main_window.hpp
public Q_SLOTS :
	void changeOperator();
// ๋‹ค์Œ์ฒ˜๋Ÿผ connect์˜ ๋ฐ›๋Š” ์ชฝ์€ Q_SLOT ๋ฐ‘์— ๋„ฃ์–ด์ค˜์•ผํ•จ.
// ๋ฐ˜๋Œ€๋กœ connect์˜ ๋ณด๋‚ด๋Š” ์ชฝ์€ Q_SIGNALS : ๋ฐ‘์— ๋„ฃ์–ด์•ผํ•˜๊ณ  ๋ณด๋‚ผ ๋•Œ๋Š” Q_EMIT (ํ•จ์ˆ˜๋ช…) ์œผ๋กœ ํ•ด์ค˜์•ผํ•˜๋ฉฐ, ๋ฐ‘์—์„œ ๋‹ค์‹œ ์„ค๋ช…ํ•จ.
// qnode.cpp, 
// sendSetOperator(std::string index) ํ•จ์ˆ˜ -> SLOT์œผ๋กœ ๋ฐ›๋Š” ๋ถ€๋ถ„.

ros::NodeHandle n;
    if(!strncmp(index.c_str(), "PLUS", 4))
        n.setParam("calculation_method", 1);
    if(!strncmp(index.c_str(), "MINUS", 4))
        n.setParam("calculation_method", 2);
    if(!strncmp(index.c_str(), "MULTIPLICATION", 4))
        n.setParam("calculation_method", 3);
    if(!strncmp(index.c_str(), "DIVISION", 4))
        n.setParam("calculation_method", 4);

๋ฒ„ํŠผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„.

// main_window.ui

// SEND push_button์„ "Go to slot โ€ฆ" ์ฒ˜๋ฆฌํ•œ๋‹ค.
// clicked(bool)
// main_window.cpp, 
// on_send_pushButton_clicked(bool check) ํ•จ์ˆ˜

qnode.sendSetNumber(ui.request_a_lineEdit->text().toInt(), ui.request_b_lineEdit->text().toInt());

ROS MSG Subscribe ํ•˜๊ธฐ

// qnode.hpp

# include <oroca_ros_tutorials_msgs/msgsTutorial.h>
// ์ฐธ๊ณ ๋กœ ์œ„์— ์ฒ˜๋Ÿผ ์ธํด๋ฃจ๋“œํ•˜๋ฉด ์•ˆ๋จ. qnode.hppํŒŒ์ผ์„ ๊ธฐ์ค€์œผ๋กœ ../../ ํ•ด์„œ include์ฒ˜๋ฆฌํ•ด์•ผํ•จ.
void msgCallback(const oroca_ros_tutorials_msgs::msgTutorial::ConstPtr &msg);
ros::Subscriber ros_tutorial_sub;
// qnode.cpp

// QNode::init() ํ•จ์ˆ˜ ๋‚ด๋ถ€
ros_tutorial_sub = n.subscribe("ros_tutorial_msg", 100, &QNode::msgCallback, this);

// ...

// QNode::msgCallback(~) ํ•จ์ˆ˜ ๋‚ด๋ถ€
std::string receiveMsg;
std::stringstream ss;
ss << "receive msg: "<< msg->data;
receiveMsg = ss.str();
log(Info, receiveMsg);

Service ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„

// qnode.hpp

ros::ServiceClient ros_tutorial_service_client;
//qnode.cpp, 
// init() ํ•จ์ˆ˜

ros_tutorial_service_client = n.serviceClient<oroca_ros_tutorials_msgs::srvTutorial>("ros_tutorial_srv", 10);



// sendSetNumber(int res_a, int res_b) ํ•จ์ˆ˜

oroca_ros_tutorials_msgs::srvTutorial srv;
srv.request.a = res_a;
srv.request.b = res_b;

if (ros_tutorial_service_client.call(srv))
	Q_EMIT updateServiceResult(srv.response.result);
// main_window.cpp

// MainWindow() ํ•จ์ˆ˜

QObject::connect(&qnode, SIGNAL(updateServiceResult(int)), this, SLOT(updateResultLineEdit(int)));
// qnode ์˜ค๋ธŒ์ ํŠธ์˜ updateServiceResult ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ์‹œ ๋ณธ ์˜ค๋ธŒ์ ํŠธ์˜ updateResultLineEidt๋ฅผ ํ˜ธ์ถœํ•˜๋ผ
// main_window.hpp

void updateResultLineEdit(int srv_response);
// main_window.cpp

// updateResultLineEdit(int) ํ•จ์ˆ˜

ui.response_result_lineEdit->setText(QString::number(srv_response);
โš ๏ธ **GitHub.com Fallback** โš ๏ธ