【ROS2】【源码展示】ROS2中Rviz2增加一个可以实现收发节点双击修改图表等功能的插件panel

使用说明

源代码在这里,本文基于源代码进行功能增加和修改。主要应用Qt中的一些方法,结合ros2中rviz2对增加panel功能的一些封装。实现双击修改图表中的内容,节点的收发,图表根据收到的msg进行更新等功能。代码未进行编译检测,可能存在一些错误。可参考设计思路。

CPP文件

#include "demo_panel/demo_panel.h"

#include "rviz_common/properties/property_tree_widget.hpp"
#include "rviz_common/interaction/selection_manager.hpp"
#include "rviz_common/visualization_manager.hpp"



namespace demo_panel
{

    MyPanel::MyPanel(QWidget *parent)
            : rviz_common::Panel(parent)
    {
        auto layout = new QVBoxLayout();
        layout->setContentsMargins(0, 0, 0, 0);

        auto text = new QLabel("This is a demo");
        auto lineEdit = new QLineEdit();
        auto radio = new QRadioButton();

        tree_ = new QTreeWidget(this);
        tree_->setColumnCount(2);
        tree_->resize(600, 300);

        top_item_ = new QTreeWidgetItem();
        top_item_->setText(0, "robot");

        tree_->addTopLevelItem(top_item_);

        string_leave_ = new QStringList();
        string_leave_ << "name" << "leave";
        leave_ = new QTreeWidgetItem(top_item_, *string_leave_);


        layout->addWidget(text);
        layout->addWidget(lineEdit);
        layout->addWidget(radio);
        layout->addWidget(button_flash_);
        layout->addWidget(tree_);
        setLayout(layout);

        QTimer* publish_timer = new QTimer(this);
        connect(tree_, SIGNAL(itemDoubleClicked(QTreeWidgetItem* int)), this, SLOT(openEditor(QTreeWidgetItem* int)));
        // connect(tree_, SIGNAL(editingFinished()), this, SLOT(closeEditor()));
        connect(button_flash_, SIGNAL(clicked()), this, SLOT(flash()));
        publish_timer->start(100);
    }

    void MyPanel::onInitialize()
    {
//        tree_widget_->setModel(getDisplayContext()->getSelectionManager()->getPropertyModel());
        node_ = rviz_common::Panel::getDisplayContext()->getRosNodeAbstraction().lock()->get_raw_node();
        object_info_pub_ = node->create_publisher<Object>("topic", 1);
        object_info_sub_ = node->create_subscription<Object>("topic/sub", 1, std::bind(&MyPanel::sub_callback, this, std::placeholders::_1));
    }

    void MyPanel::openEditor(QTreeWidgetItem* item, int col)
    {
        item_tmp_ = nullptr;

        if(col == 0)
        {
            item_tmp_ = item;
            QLineEdit* lineEdit = new QLineEdit(tree_);
            lineEdit->setText(QStringLiteral(" "));
            connect(lineEdit, SIGNAL(editingFinished()), this, SLOT(closeEditor()));
            tree_->setItemWidget(item_tmp_, 0, lineEdit);
        }
    }

    void MyPanel::closeEditor()
    {
        if(item_tmp_ != nullptr)
        {
            QLineEdit* edit = qobject_cast<QLineEdit*>(tree_->itemWidget(item_tmp_, 0));
            if(!edit)
            {
                return;
            }
            QString text = edit->text();
            tree_->removeItemWidget(item_tmp_, 1);
            item_tmp_->setText(0, text);
        }
    }

    void MyPanel::flash()
    {
        leave_->setText(1, QString::number(123, 'd', 2));
    }

}  // namespace demo_panel


#include <pluginlib/class_list_macros.hpp>
PLUGINLIB_EXPORT_CLASS(demo_panel::MyPanel, rviz_common::Panel)

H文件

#pragma once

#include <QMainWindow>
#include "rviz_common/panel.hpp"

#include <QVBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QRadioButton>
#include <qpushbutton.h>
#include <QTreeWidget>
#include <qtimer.h>
#include <rclcpp/node.hpp>


namespace demo_panel
        {

                class MyPanel : public rviz_common::Panel // QMainWindow
        {
            Q_OBJECT

            public:
            explicit MyPanel(QWidget *parent = nullptr);

            void onInitialize() override;

            protected Q_SLOTS:
            void sub_callback(const object msg);
            void publishTopic();

            void flash();

            void openEditor(QTreeWidgetItem* item, int col);
            void closeEditor();

            protected:
            QPushButton* button_flash_;
            QVBoxLayout* layout_;
            QTreeWidget* tree_;
            QTreeWidgetItem* item_tmp_;
            QTreeWidgetItem* top_item_;

            QTreeWidgetItem* leave_;

            QStringList* string_leave_;

            int col_;

            rclcpp::Node::SharedPtr node_;
            std::shared_ptr<rclcpp::Publisher<Object>> object_info_pub_;
            std::shared_ptr<rclcpp::Subscription<Object>> object_info_sub_;
        };

        } // namespace demo_panel

xml文件

增加如下内容

<class  name="demo_panel/MyPanel"
		type="demo_panel::MyPanel"
		base_class_type="rviz_common::Panel">
		<description>
		demo_panel
		</description>
</class>

CMakeLists.txt文件

对原码中进行了修改,删掉冗余的部分。

cmake_minimum_required(VERSION 3.5)

project(demo_panel LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
    set(CMAKE_CXX_STANDARD 14)
endif()

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(rviz_ogre_vendor REQUIRED)
find_package(Qt5 REQUIRED Core Widgets)
set(QT_LIBS Qt5::Widgets)

find_package(pluginlib REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclcpp_action REQUIRED)
find_package(rviz_default_plugins REQUIRED)
find_package(rviz_assimp_vendor REQUIRED)
find_package(rviz_rendering REQUIRED)
find_package(rviz_common REQUIRED)

ament_package_xml()
set(ROS_DISTRO "ROS 2")
set(OGRE_PLUGIN_PATH "rviz_ogre_vendor")

set(${PROJECT_NAME}_headers_to_moc
        include/demo_panel/demo_panel.h
        )

foreach(header "${${PROJECT_NAME}_headers_to_moc}")
    qt5_wrap_cpp(${PROJECT_NAME}_moc_files "${header}")
endforeach()

set(${PROJECT_NAME}_source_files
        src/demo_panel.cpp
        )

add_library(${PROJECT_NAME} SHARED
        ${${PROJECT_NAME}_moc_files}
        ${${PROJECT_NAME}_source_files}
        )

ament_target_dependencies(${PROJECT_NAME}
        PUBLIC
        pluginlib
        rclcpp
        rviz_assimp_vendor
        rviz_rendering
        rviz_common
        rclcpp_action
        rviz_default_plugins
        )

pluginlib_export_plugin_description_file(rviz_common plugin_description.xml)

install(
        TARGETS ${PROJECT_NAME}
        EXPORT ${PROJECT_NAME}
        ARCHIVE DESTINATION lib
        LIBRARY DESTINATION lib
        RUNTIME DESTINATION bin
        INCLUDES DESTINATION include
)

install(
        DIRECTORY include/
        DESTINATION include
)

ament_package()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ROS2编程基础课程文档 ROS 2(机器人操作系统2)是用于机器人应用的开源开发套件。ROS 2之目的是为各行各业的开发人员提供标准的软件平台,从研究和原型设计再到部署和生产。 ROS 2建立在ROS 1的成功基础之上,ROS 1目前已在世界各地的无数机器人应用得到应用。 特色 缩短上市时间 ROS 2提供了开发应用程序所需的机器人工具,库和功能,可以将时间花在对业务非常重要的工作上。因为它 是开源的,所以可以灵活地决定在何处以及如何使用ROS 2,以及根据实际的需求自由定制,使用ROS 2 可以大幅度提升产品和算法研发速度! 专为生产而设计 凭借在建立ROS 1作为机器人研发的事实上的全球标准方面的十年经验,ROS 2从一开始就被建立在工业级 基础上并可用于生产,包括高可靠性和安全关键系统。 ROS 2的设计选择、开发实践和项目管理基于行业利 益相关者的要求。 多平台支持 ROS 2在Linux,Windows和macOS上得到支持和测试,允许无缝开发和部署机器人自动化,后端管理和 用户界面。分层支持模型允许端口到新平台,例如实时和嵌入式操作系统,以便在获得兴趣和投资时引入和推 广。 丰富的应用领域 与之前的ROS 1一样,ROS 2可用于各种机器人应用,从室内到室外、从家庭到汽车、水下到太空、从消费 到工业。 没有供应商锁定 ROS 2建立在一个抽象层上,使机器人库和应用程序与通信技术隔离开来。抽象底层是通信代码的多种实现, 包括开源和专有解决方案。在抽象顶层,核心库和用户应用程序是可移植的。 建立在开放标准之上 ROS 2的默认通信方法使用IDL、DDS和DDS-I RTPS等行业标准,这些标准已广泛应用于从工厂到航空 航天的各种工业应用。 开源许可证 ROS 2代码在Apache 2.0许可下获得许可,在3条款(或“新”)BSD许可下使用移植的ROS 1代码。这两个 许可证允许允许使用软件,而不会影响用户的知识产权。 全球社区 超过10年的ROS项目通过发展一个由数十万开发人员和用户组成的全球社区,为机器人技术创建了一个庞大 的生态系统,他们为这些软件做出贡献并进行了改进。 ROS 2由该社区开发并为该社区开发,他们将成为未 来的管理者。 行业支持 正如ROS 2技术指导委员会成员所证明的那样,对ROS 2的行业支持很强。除了开发顶级产品外,来自世界 各地的大大小小公司都在投入资源为ROS 2做出开源贡献。 与ROS1的互操作性 ROS 2包括到ROS 1的桥接器,处理两个系统之间的双向通信。如果有一个现有的ROS 1应用程序, 可 以通过桥接器开始尝试使用ROS 2,并根据要求和可用资源逐步移植应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铃灵狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值