えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

RVizで𝕏する(Rviz2・WebEngineWidgets)

みなさんは、毎日ロボットのデバッグにRvizを使っていると思います。

しかし、(おそらく)ツイ廃のあなたはデバッグ中もインターネットがこわれていないか気になって仕方ないですよね?

そこで、今回はブラウザをRvizに組込みたいと思います!🙃


動作環境

  • Ubuntu 22.04
  • ROS Humble (Qt5.15)
  • qtwebengine5-dev (apt intallで取得)

今回も例のごとく説明は省きまくっているので、Rviz用のQtプラグインの作成方法やDesignerの使いかたは公式サイトやサンプルプログラムなどを参考にしてください。

↓一応、私もチュートリアルを作っています。

github.com


UI

Qt Designerで適当に WebEngineWidgets を貼り付けます。

URLは https://x.com/ にします。

正しく設定できれば、プレビュー画面が見えます。

コード

UIからロードするだけなので非常にシンプル!

Rviz特有の設定はほぼありません。

// ======= x_com.cpp =======
// 作成した.uiファイル名によって変わる
// xxx.ui -> ui_xxx.h
#include "ui_x_com.h"

#ifndef Q_MOC_RUN
#include <rviz_common/panel.hpp>

#include <rviz_common/config.hpp>
#include <rviz_common/display_context.hpp>
#endif

namespace x_com
{
class XWidget : public rviz_common::Panel
{
public:
  explicit XWidget(QWidget * parent = nullptr)
  : rviz_common::Panel(parent)
  {
    ui.setupUi(this);
  }

private:
  Ui::XWidget ui; // UIファイルの設定に依るので注意
};

} // namespace x_com

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

ビルド設定

plugins_description.xml

<library path="x_com">
  <class name="x_com/X.com" type="x_com::XWidget" base_class_type="rviz_common::Panel">
    <description>button panel</description>
  </class>
</library>
# ======= CMakeLists.txt =======
cmake_minimum_required(VERSION 3.25)
project(x_com)

set(CMAKE_AUTOUIC ON)

find_package(ament_cmake_auto REQUIRED)
find_package(Qt5 REQUIRED COMPONENTS Core Gui Widgets WebEngineWidgets)

ament_auto_find_build_dependencies()

set(QT5_LIBS Qt5::Core Qt5::Gui Qt5::Widgets Qt5::WebEngineWidgets)

ament_auto_add_library(x_com SHARED
    src/x_com.ui 
    src/x_com.cpp)
target_link_libraries(x_com ${QT5_LIBS})

pluginlib_export_plugin_description_file(rviz_common plugins_description.xml)

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  set(ament_cmake_copyright_FOUND TRUE)
  set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

ament_auto_package()

Rvizしながらツイッタ-!

ちゃんと動きます。

ただ、Rviz自体のリソースと競合するので、めっちゃ重い。

場合によってはフリーズしてしまいます🥲


みなさんもタイムラインのデバッグ、しちゃいましょう😉