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

2023-05-16

使用说明

源代码在这里,本文基于源代码进行功能增加和修改。主要应用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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 正点原子MiniFly遥控器V1.1—通信链路

    如果遥控器连接了上位机 xff0c 遥控器会将接收到的应答数据包先解析 xff0c 解析完成后转发给上位机 同样 xff0c 上位机发下来的数据遥控器也会先解析再转发 给四轴 Radiolink 链路中 遥控器定周期发送控制命令 xff0c
  • 正点原子Minifly遥控器V1.1—代码分析一:radiolink.c

    无线连接任务 span class token keyword void span span class token function radiolinkTask span span class token punctuation span
  • 正点原子wukong开源飞控时钟配置之stm32CubeMX

    数字来源下面 xff0c go to define就能找到 再对照一下 xff0c 这个说明还没改过来 重点来了 xff1a 进过上面那些参数配置 xff0c 各外设时钟配置成多少了 xff1f 使用stm32CubeMX直观了解一下 xf
  • 我的共轴双旋翼无人机

    已申请专利 xff0c 终于可以拿出来与大家一起看看 xff0c 相关资料等毕业论文弄好后再公开 xff01 造型酷不酷 xff1f 有没有心动 xff1f 想不想看看它怎么上天的 xff1f B站视频链接 xff1a 试飞 xff1a 试
  • 使用Betaflight Configurator飞控刷写固件时各步骤的含义

    关于ISP IAP DFU和bootloader 参考上面文章 xff0c 总结一下 xff1a 最开始 xff0c 每次升级程序 xff0c 将芯片从工作板到升级代码板 xff0c 反复移植 xff0c 不方便 于是ISP来了 ISP x
  • linux温湿度传感器SHTC3驱动开发

    开发环境为Ubuntu16 04LTS 43 vscode xff0c 使用了正点原子IMX6ULL开发板 xff0c 板子上运行的是正点原子的出厂系统 参考了这篇文章 温湿度传感器SHTC3驱动开发 xff08 一 xff09 小白也能轻
  • SVN st 命令信息说明

    未指定参数时 xff0c 只显示本地修改的条目 没有网络访问 使用 q 时 xff0c 只显示本地修改条目的摘要信息 使用 u 时 xff0c 增加工作版本和服务器上版本过期信息 使用 v 时 xff0c 显示每个条目的完整版本信息 输出的
  • 深度学习中常用的优化算法

    机器学习几乎所有的算法都要利用损失函数 lossfunction 来检验算法模型的优劣 xff0c 同时利用损失函数来提升算法模型 而这个提升的过程就叫做优化 Optimizer 下面的内容就是记录一下在深度学习中常用到的几种优化算法 xf
  • ERROR: unable to process source [https://raw.githubusercontent.com/ros/rosdistro

    xxx 64 xxx span class token punctuation span span class token operator span span class token operator span autoware span
  • Realsense D435i录制rosbag后提取jpeg图像

    Realsense D435i录制rosbag后提取jpeg图像 启动相机录制rosbag提取图像 启动相机 roslaunch realsense2 camera rs camera span class token punctuatio
  • 网络现代化势在必行,VMware 发布软件定义网络 SD-WAN 全新方案

    出品 CSDN云计算 作为计算存储网络基础设施三大件之一 xff0c 网络一直是 IT 核心技术 xff0c 并不断向前发展 数字化转型浪潮下 xff0c 各行业都在探索创新应用 xff0c 而数字化创新 xff0c 也是对 5G 和云边端
  • MySQL数据库(一)服务器数据库的搭建和远程访问

    服务器数据库的搭建和远程访问 本文主要针对本人在NB IoT项目中有关数据库的开发和使用 xff0c 进行一些粗浅的学习指导 欢迎大家在评论区批评指正 xff0c 感谢 xff01 文章目录 服务器数据库的搭建和远程访问 前言一 远程连接服
  • Linux学习(一)Ubuntu20.04 LTS (Focal Fossa)以及 Anaconda CUDA CuDNN PyTorch VisualStudioCode 的安装

    提示 xff1a 本文基于 Ubuntu 20 04 LTS xff08 Focal Fossa xff09 文章目录 前言一 Ubuntu系统下载 烧录与安装1 下载镜像文件2 下载启动盘制作软件3 Ubuntu系统安装4 Ubuntu2
  • Windows安装docker踩坑、远程连接Docker

    安装过程中出现一下问题 xff0c 步骤如下 菜鸟教程安装windows docker https www runoob com docker windows docker install html 启动后报错wsl2错误 xff0c 因为
  • Centos7.8下Nmap的安装与使用

    基于centos的nmap的安装与使用 1 Nmap是什么 xff1f 2 NMAP下载3 Nmap安装4 常用命令5 建议 1 Nmap是什么 xff1f Nmap Network Mapper xff0c 最早是Linux下的网络扫描和
  • 出现“应用程序发生异常,未知的软件异常(0XC06D007E)”解决方法

    win 43 R 输入cmd 回车 然后把下面这行字符复制到黑色cmd框即在命令提示符后击鼠标右键 粘贴 回车 xff0c 耐心等待 xff0c 直到屏幕滚动停止 xff08 下面是要运行的代码 xff09 xff1a for 1 in w
  • json 笔记

    JSON简介 之前一直以为JSON只是一种文件格式 xff0c 了解了才发现并不是 JSON JavaScript Object Notation JavaScript 对象表示法 JSON 是存储和交换文本信息的语法 类似 XML JSO
  • Zookeeper启动成功后拒绝连接的解决方案

    zookeeper启动成功后zkServer sh status出错 一 问题出现情形 运行zookeeperd后显示启动成功 xff1a JMX enabled by default span class token keyword Us
  • STM32实战-高级定时器带死区的互补PWM输出

    前言 xff1a 平时我们设计点击驱动电路时 xff0c 一般会采用npn和pnp三极管 xff0c 来控制电机的导通和关闭 xff0c 但是三级管内部自带电容 xff0c 断电后不会立马断掉 xff0c 会经过很小的一段时间才会放电完毕
  • ldmia和stmia的用法

    ldmia r0 r3 r10 将基址寄存器r0开始的连续8个地址单元的值分别赋给r3 r4 r5 r6 r7 r8 r9 r10 注意的是r0指定的地址每次赋一次r0会加1 ld代表load 指向下一个地址单元 stmia r1 r3 r

随机推荐