ROS 2 Humble Hawksbill 图形工具 rqt

举报
zhangrelay 发表于 2022/05/27 23:17:34 2022/05/27
【摘要】 rqt包全家福: ros-humble-rqt-action ros-humble-rqt-image-overlay-dbgsym ros-humble-rqt-robot-dashboardros-humble-rqt-bag ros-humble-rqt-ima...

rqt包全家福:


  
  1. ros-humble-rqt-action ros-humble-rqt-image-overlay-dbgsym ros-humble-rqt-robot-dashboard
  2. ros-humble-rqt-bag ros-humble-rqt-image-overlay-layer ros-humble-rqt-robot-monitor
  3. ros-humble-rqt-bag-plugins ros-humble-rqt-image-view ros-humble-rqt-robot-steering
  4. ros-humble-rqt-common-plugins ros-humble-rqt-image-view-dbgsym ros-humble-rqt-runtime-monitor
  5. ros-humble-rqt-console ros-humble-rqt-moveit ros-humble-rqt-service-caller
  6. ros-humble-rqt-graph ros-humble-rqt-msg ros-humble-rqt-shell
  7. ros-humble-rqt-gui ros-humble-rqt-plot ros-humble-rqt-srv
  8. ros-humble-rqt-gui-cpp ros-humble-rqt-publisher ros-humble-rqt-top
  9. ros-humble-rqt-gui-cpp-dbgsym ros-humble-rqt-py-common ros-humble-rqt-topic
  10. ros-humble-rqt-gui-py ros-humble-rqt-py-console
  11. ros-humble-rqt-image-overlay ros-humble-rqt-reconfigure

输入rqt即可使用,全部窗口操作。

简介:rqt 是一个 GUI 框架,能够将各种插件工具加载为可停靠窗口。 当前没有选择插件。 要添加插件,请从插件菜单中选择项目。还可以使用 Perspectives 菜单将插件的特定排列保存为透视图。 

插件有如下:


以concole为例,ROS 2 的记录器级别按严重性排序:

  1. Fatal
  2. Error
  3. Warn
  4. Info
  5. Debug

每个级别表示的内容没有确切的标准,但可以安全地假设:

  1. 致命消息Fatal表明系统将终止以试图保护自己免受损害。
  2. 错误消息Error表明重大问题不一定会损坏系统,但会阻止系统正常运行。
  3. 警告消息Warn表示可能代表更深层次问题的意外活动或非理想结果,但不会直接损害功能。
  4. 信息消息Info指示事件和状态更新,作为系统按预期运行的视觉验证。
  5. 调试消息Debug详细说明了系统执行的整个逐步过程。

默认级别为信息。 只会看到默认严重级别和更严重级别的消息。

通常,只有 Debug 消息被隐藏,因为它们是唯一没有 Info 严重的级别。 例如,如果将默认级别设置为 Warn,将只能看到严重性为 Warn、Error 和 Fatal 的消息。

例如将小乌龟节点设置级别:

ros2 run turtlesim turtlesim_node --ros-args --log-level WARN


对比如下两段代码分别用Python和C++实现类似功能:

Python


  
  1. import os
  2. from python_qt_binding.QtCore import qDebug, qWarning
  3. from qt_gui.composite_plugin_provider import CompositePluginProvider
  4. import rclpy
  5. from rqt_gui.ros2_plugin_context import Ros2PluginContext
  6. from rqt_gui.rospkg_plugin_provider import RospkgPluginProvider
  7. from rqt_gui_py.rclpy_spinner import RclpySpinner
  8. class RosPyPluginProvider(CompositePluginProvider):
  9. def __init__(self):
  10. super(RosPyPluginProvider, self).__init__(
  11. [RospkgPluginProvider('rqt_gui', 'rqt_gui_py::Plugin')])
  12. self.setObjectName('RosPyPluginProvider')
  13. self._node_initialized = False
  14. self._node = None
  15. self._spinner = None
  16. self._shutdown_timeout = 2000
  17. def shutdown(self):
  18. qDebug('Shutting down RosPyPluginProvider')
  19. if self._spinner:
  20. self._spinner.quit()
  21. joined = self._spinner.wait(msecs=self._shutdown_timeout)
  22. if not joined:
  23. qWarning('Timed out attempting to join the RclpySpinner thread')
  24. return
  25. if self._node:
  26. self._destroy_node()
  27. super().shutdown()
  28. def load(self, plugin_id, plugin_context):
  29. self._init_node()
  30. ros_plugin_context = Ros2PluginContext(handler=plugin_context._handler, node=self._node)
  31. return super(RosPyPluginProvider, self).load(plugin_id, ros_plugin_context)
  32. def unload(self, plugin_instance):
  33. return super(RosPyPluginProvider, self).unload(plugin_instance)
  34. def _init_node(self):
  35. # initialize node once
  36. if not self._node_initialized:
  37. name = 'rqt_gui_py_node_%d' % os.getpid()
  38. qDebug('RosPyPluginProvider._init_node() initialize ROS node "%s"' % name)
  39. if not rclpy.ok():
  40. rclpy.init()
  41. self._node = rclpy.create_node(name)
  42. self._spinner = RclpySpinner(self._node)
  43. self._spinner.start()
  44. self._node_initialized = True
  45. def _destroy_node(self):
  46. if self._node_initialized:
  47. self._node.destroy_node()
  48. rclpy.shutdown()
  49. self._node_initialized = False

C++ 


  
  1. #include "roscpp_plugin_provider.h"
  2. #include "nodelet_plugin_provider.h"
  3. #include <rqt_gui_cpp/plugin.h>
  4. #include <qt_gui_cpp/plugin_provider.h>
  5. #include <rclcpp/rclcpp.hpp>
  6. #include <pluginlib/class_list_macros.hpp>
  7. #include <stdexcept>
  8. #include <sys/types.h>
  9. namespace rqt_gui_cpp {
  10. RosCppPluginProvider::RosCppPluginProvider()
  11. : qt_gui_cpp::CompositePluginProvider()
  12. , rclcpp_initialized_(false)
  13. {
  14. if (rclcpp::ok())
  15. {
  16. rclcpp_initialized_ = true;
  17. }
  18. init_rclcpp();
  19. QList<PluginProvider*> plugin_providers;
  20. plugin_providers.append(new NodeletPluginProvider("rqt_gui", "rqt_gui_cpp::Plugin"));
  21. set_plugin_providers(plugin_providers);
  22. }
  23. RosCppPluginProvider::~RosCppPluginProvider()
  24. {
  25. if (rclcpp::ok())
  26. {
  27. rclcpp::shutdown();
  28. }
  29. }
  30. void* RosCppPluginProvider::load(const QString& plugin_id, qt_gui_cpp::PluginContext* plugin_context)
  31. {
  32. qDebug("RosCppPluginProvider::load(%s)", plugin_id.toStdString().c_str());
  33. init_rclcpp();
  34. return qt_gui_cpp::CompositePluginProvider::load(plugin_id, plugin_context);
  35. }
  36. qt_gui_cpp::Plugin* RosCppPluginProvider::load_plugin(const QString& plugin_id, qt_gui_cpp::PluginContext* plugin_context)
  37. {
  38. qDebug("RosCppPluginProvider::load_plugin(%s)", plugin_id.toStdString().c_str());
  39. init_rclcpp();
  40. return qt_gui_cpp::CompositePluginProvider::load_plugin(plugin_id, plugin_context);
  41. }
  42. void RosCppPluginProvider::init_rclcpp()
  43. {
  44. // initialize ROS node once
  45. if (!rclcpp_initialized_)
  46. {
  47. int argc = 0;
  48. char** argv = 0;
  49. // Initialize any global resources needed by the middleware and the client library.
  50. // This will also parse command line arguments one day (as of Beta 1 they are not used).
  51. // You must call this before using any other part of the ROS system.
  52. // This should be called once per process.
  53. rclcpp::init(argc, argv);
  54. // Don't do this again in this process
  55. rclcpp_initialized_ = true;
  56. }
  57. }
  58. }
  59. PLUGINLIB_EXPORT_CLASS(rqt_gui_cpp::RosCppPluginProvider, qt_gui_cpp::PluginProvider)

 


文章来源: zhangrelay.blog.csdn.net,作者:zhangrelay,版权归原作者所有,如需转载,请联系作者。

原文链接:zhangrelay.blog.csdn.net/article/details/125004286

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。