前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ROS专题----数据可视化rviz简明笔记

ROS专题----数据可视化rviz简明笔记

作者头像
zhangrelay
发布2019-01-23 11:48:00
4.6K0
发布2019-01-23 11:48:00
举报

ROS数据可视化rviz简明笔记

----

  1. 标记:发送基本形状(C ++)显示如何使用visualization_msgs / Marker消息将基本形状(立方体,球体,圆柱体,箭头)发送到rviz。
  2. 标记:点和线(C ++)教导如何使用visualization_msgs / Marker消息将点和线发送到rviz。
  3. 交互式标记:入门本教程解释什么是交互式标记,并教你一些基本的概念。
  4. 交互式标记:编写简单的交互式标记服务器本教程介绍如何设置管理单个交互式标记的极简主义服务器。
  5. 交互式标记:基本控件本教程解释basic_controls教程代码如何工作。
  6. 插件:新显示类型如何编写一个插件,为RViz添加一个新的显示功能。
  7. 插件:新的可停靠面板如何编写一个插件,添加一个新类型的可停靠Panel小部件到RViz。
  8. 插件:新工具类型如何编写一个插件,为RViz添加一个新工具。
  9. Librviz:将RViz纳入自定义GUI如何使用RViz可视化窗口小部件编写应用程序。
  10. Rviz in Stereo教你如何设置Rviz在3D立体声渲染。

----

代码语言:javascript
复制
$ tree -L 3
.
├── interactive_marker_tutorials
│   ├── CHANGELOG.rst
│   ├── CMakeLists.txt
│   ├── package.xml
│   ├── scripts
│   │   ├── basic_controls.py
│   │   ├── cube.py
│   │   ├── menu.py
│   │   └── simple_marker.py
│   └── src
│       ├── basic_controls.cpp
│       ├── cube.cpp
│       ├── menu.cpp
│       ├── point_cloud.cpp
│       ├── pong.cpp
│       ├── selection.cpp
│       └── simple_marker.cpp
├── librviz_tutorial
│   ├── CHANGELOG.rst
│   ├── CMakeLists.txt
│   ├── package.xml
│   ├── rosdoc.yaml
│   └── src
│       ├── doc
│       ├── main.cpp
│       ├── myviz.cpp
│       └── myviz.h
├── rviz_plugin_tutorials
│   ├── CHANGELOG.rst
│   ├── CMakeLists.txt
│   ├── icons
│   │   └── classes
│   ├── media
│   │   └── flag.dae
│   ├── package.xml
│   ├── plugin_description.xml
│   ├── rosdoc.yaml
│   ├── scripts
│   │   └── send_test_msgs.py
│   └── src
│       ├── doc
│       ├── drive_widget.cpp
│       ├── drive_widget.h
│       ├── flag.h
│       ├── imu_display.cpp
│       ├── imu_display.h
│       ├── imu_visual.cpp
│       ├── imu_visual.h
│       ├── plant_flag_tool.cpp
│       ├── plant_flag_tool.h
│       ├── teleop_panel.cpp
│       └── teleop_panel.h
├── rviz_python_tutorial
│   ├── CHANGELOG.rst
│   ├── CMakeLists.txt
│   ├── config.myviz
│   ├── doc-src
│   │   ├── conf.py
│   │   ├── index.rst
│   │   ├── myviz.png
│   │   └── tutorialformatter.py
│   ├── myviz.py
│   ├── package.xml
│   └── rosdoc.yaml
├── visualization_marker_tutorials
│   ├── CHANGELOG.rst
│   ├── CMakeLists.txt
│   ├── package.xml
│   └── src
│       ├── basic_shapes.cpp
│       └── points_and_lines.cpp
└── visualization_tutorials
    ├── CHANGELOG.rst
    ├── CMakeLists.txt
    └── package.xml

18 directories, 57 files

----

1 标记:基本形状,点,线等

补充阅读:

1 DisplayTypes/Marker:http://wiki.ros.org/rviz/DisplayTypes/Marker

2 rviz/UserGuide:http://wiki.ros.org/rviz/UserGuide

3 tf/tf2:http://wiki.ros.org/tf http://wiki.ros.org/tf2

代码解析等参考如下:

1 标记:发送基本形状(C ++)

2 标记:点和线(C ++)

使用命令和效果,如下:

$ rosrun visualization_marker_tutorials basic_shapes

在rviz中,添加Marker,修改Fixed Frame为my_frame,可见如下不断变化的基本图形:

$ rosrun visualization_marker_tutorials points_and_lines

----

2 交互式标记

这部分都分为C++和Python两种语言介绍。

这里需要注意,Fixed Frame为base_link等。

这里以simple_marker为例:

python:

代码语言:javascript
复制
import rospy

from interactive_markers.interactive_marker_server import *
from visualization_msgs.msg import *

def processFeedback(feedback):
    p = feedback.pose.position
    print feedback.marker_name + " is now at " + str(p.x) + ", " + str(p.y) + ", " + str(p.z)

if __name__=="__main__":
    rospy.init_node("simple_marker")
    
    # create an interactive marker server on the topic namespace simple_marker
    server = InteractiveMarkerServer("simple_marker")
    
    # create an interactive marker for our server
    int_marker = InteractiveMarker()
    int_marker.header.frame_id = "base_link"
    int_marker.name = "my_marker"
    int_marker.description = "Simple 1-DOF Control"

    # create a grey box marker
    box_marker = Marker()
    box_marker.type = Marker.CUBE
    box_marker.scale.x = 0.45
    box_marker.scale.y = 0.45
    box_marker.scale.z = 0.45
    box_marker.color.r = 0.0
    box_marker.color.g = 0.5
    box_marker.color.b = 0.5
    box_marker.color.a = 1.0

    # create a non-interactive control which contains the box
    box_control = InteractiveMarkerControl()
    box_control.always_visible = True
    box_control.markers.append( box_marker )

    # add the control to the interactive marker
    int_marker.controls.append( box_control )

    # create a control which will move the box
    # this control does not contain any markers,
    # which will cause RViz to insert two arrows
    rotate_control = InteractiveMarkerControl()
    rotate_control.name = "move_x"
    rotate_control.interaction_mode = InteractiveMarkerControl.MOVE_AXIS

    # add the control to the interactive marker
    int_marker.controls.append(rotate_control);

    # add the interactive marker to our collection &
    # tell the server to call processFeedback() when feedback arrives for it
    server.insert(int_marker, processFeedback)

    # 'commit' changes and send to all clients
    server.applyChanges()

    rospy.spin()

C++:

代码语言:javascript
复制
#include <ros/ros.h>

#include <interactive_markers/interactive_marker_server.h>

void processFeedback(
    const visualization_msgs::InteractiveMarkerFeedbackConstPtr &feedback )
{
  ROS_INFO_STREAM( feedback->marker_name << " is now at "
      << feedback->pose.position.x << ", " << feedback->pose.position.y
      << ", " << feedback->pose.position.z );
}

int main(int argc, char** argv)
{
  ros::init(argc, argv, "simple_marker");

  // create an interactive marker server on the topic namespace simple_marker
  interactive_markers::InteractiveMarkerServer server("simple_marker");

  // create an interactive marker for our server
  visualization_msgs::InteractiveMarker int_marker;
  int_marker.header.frame_id = "base_link";
  int_marker.header.stamp=ros::Time::now();
  int_marker.name = "my_marker";
  int_marker.description = "Simple 1-DOF Control";

  // create a grey box marker
  visualization_msgs::Marker box_marker;
  box_marker.type = visualization_msgs::Marker::CUBE;
  box_marker.scale.x = 0.45;
  box_marker.scale.y = 0.45;
  box_marker.scale.z = 0.45;
  box_marker.color.r = 0.5;
  box_marker.color.g = 0.5;
  box_marker.color.b = 0.5;
  box_marker.color.a = 1.0;

  // create a non-interactive control which contains the box
  visualization_msgs::InteractiveMarkerControl box_control;
  box_control.always_visible = true;
  box_control.markers.push_back( box_marker );

  // add the control to the interactive marker
  int_marker.controls.push_back( box_control );

  // create a control which will move the box
  // this control does not contain any markers,
  // which will cause RViz to insert two arrows
  visualization_msgs::InteractiveMarkerControl rotate_control;
  rotate_control.name = "move_x";
  rotate_control.interaction_mode =
      visualization_msgs::InteractiveMarkerControl::MOVE_AXIS;

  // add the control to the interactive marker
  int_marker.controls.push_back(rotate_control);

  // add the interactive marker to our collection &
  // tell the server to call processFeedback() when feedback arrives for it
  server.insert(int_marker, &processFeedback);

  // 'commit' changes and send to all clients
  server.applyChanges();

  // start the ROS main loop
  ros::spin();
}

--

可以比较一下,然后输入下面命令:

$ rosrun interactive_marker_tutorials simple_marker

  • 定义一个函数processFeedback,通过打印出位置来处理来自RViz的反馈消息。
  • 初始化roscpp。
  • 创建交互式标记服务器对象。
  • 设置交互式标记并将其添加到服务器的集合。
  • 输入ROS消息循环。

注意,当调用insert时,服务器对象将在内部只将新标记推入等待列表。一旦你调用applyChanges,它将它包含在它的公开可见的交互式标记集,并发送到所有连接的客户端。

$ rosrun interactive_marker_tutorials basic_controls

$ rosrun interactive_marker_tutorials menu

点击box会出现目录选项。

$ rosrun interactive_marker_tutorials pong

$ rosrun interactive_marker_tutorials cube

$ rosrun interactive_marker_tutorials selection

$ rosrun interactive_marker_tutorials point_cloud

欲了解具体实现,请参考源码~

----

3 插件

$ rosrun rviz_plugin_tutorials send_test_msgs.py

----

4 librviz

$ rosrun librviz_tutorial myviz

----

补充:

1 http://wiki.ros.org/rviz/Tutorials

----

数学补充:

四元数说明:http://blog.csdn.net/candycat1992/article/details/41254799

欧拉角到四元数

给定一个欧拉旋转(X, Y, Z)(即分别绕x轴、y轴和z轴旋转X、Y、Z度),则对应的四元数为:

x = sin(Y/2)sin(Z/2)cos(X/2)+cos(Y/2)cos(Z/2)sin(X/2)

y = sin(Y/2)cos(Z/2)cos(X/2)+cos(Y/2)sin(Z/2)sin(X/2)

z = cos(Y/2)sin(Z/2)cos(X/2)-sin(Y/2)cos(Z/2)sin(X/2)

w = cos(Y/2)cos(Z/2)cos(X/2)-sin(Y/2)sin(Z/2)sin(X/2)

q = ((x, y, z), w)

它的证明过程可以依靠轴角到四元数的公式进行推导。

结合程序说明:

        locations['Goal'] = Pose(Point(1.4, 0.2, 0.000), Quaternion(0.000, 0.000, 0.7, 0.7))

        locations['Home'] = Pose(Point(0.0, 0.0, 0.000), Quaternion(0.000, 0.000, 0.0, 1.0))

如果Home为起点,那么Goal为Home前1.4m 左0.2米 并左转90度

----

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年03月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ROS数据可视化rviz简明笔记
    • 1 标记:基本形状,点,线等
      • 2 交互式标记
        • 3 插件
          • 4 librviz
          相关产品与服务
          对象存储
          对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档