功能包类型选ament_cmake,核心代码是这两句,把spin单独出来,不然接收不到话题数据
std::thread spin_thread([listener]() -> void { rclcpp::spin(listener); });
spin_thread.detach();
主要代码 sys_status_display.cpp
#include <QApplication>
#include <QLabel>
#include <QString>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
class Listener : public rclcpp::Node {
public:
Listener() : Node("sys_status_display") {
subscription_ = this->create_subscription<std_msgs::msg::String>(
"chatter", 10,
std::bind(&Listener::topic_callback, this, std::placeholders::_1));
label_ = new QLabel("等待话题数据哈哈哈哈哈哈哈哈哈哈哈哈");
label_->show();
}
private:
void topic_callback(const std_msgs::msg::String::SharedPtr msg) const {
QString message = QString::fromStdString(msg->data);
label_->setText(message);
}
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
QLabel* label_;
};
int main(int argc, char* argv[]) {
rclcpp::init(argc, argv);
QApplication app(argc, argv);
auto listener = std::make_shared<Listener>();
std::thread spin_thread([listener]() -> void { rclcpp::spin(listener); });
spin_thread.detach();
app.exec();
rclcpp::shutdown();
return 0;
}
CMakeLists.txt配置
cmake_minimum_required(VERSION 3.8)
project(status_display)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
find_package(Qt5 REQUIRED COMPONENTS Widgets)
include_directories(include ${Qt5Widgets_INCLUDE_DIRS})
add_executable(sys_status_display src/sys_status_display.cpp)
target_link_libraries(sys_status_display Qt5::Widgets)
ament_target_dependencies(sys_status_display rclcpp std_msgs)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# comment the line when a copyright and license is added to all source files
set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# comment the line when this package is in a git repo and when
# a copyright and license is added to all source files
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
install(TARGETS sys_status_display
DESTINATION lib/${PROJECT_NAME})
ament_package()