工具使用-ROS在rviz中的应用实例 (python 版 basic shapes)

发布 : 2019-06-26 浏览 :

Introduction

这个过程中,其实只是在定义publisher的node, 而rviz已经注册好的订阅器,指定了需要订阅的topic主题和消息类型,所以定义的node只需要写好发布器就行。

教程中给了如何使用cpp实现该功能,Markers:Sending Basic Shapes

所以我们这里使用python实现一遍。

Create Package

1
2
3
4
# ~/catkin_ws
catkin_create_pkg using_markers rospy visualization_msgs
catkin_make
. devel/setup.bash

Publisher node

1
2
3
roscd using_markers
mkdir scripts
vim basic_shapes.py

shape.py内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/env python

import rospy
import time # 主要是调用了sleep函数
from visualization_msgs.msg import Marker # 可以通过rosmsg show visualization_msgs/Marker查看marker的内容

def main():
rospy.init_node("basic_shapes", anonymous=True) # 创建node, 命名basic_shapes
rate = rospy.Rate(1) # 消息发布的刷新频率
pub = rospy.Publisher("visualization_marker", Marker, queue_size=1)
# pub定义了一个发布器, 名称visualization_marker, 注意这个topic的名称是固定的,因为rviz中对应marker的订阅器订阅的topic就是visualization_marker,消息类型Marker
shape = Marker.CUBE # 形状参数,python直接通过类的属性默认值访问
while not rospy.is_shutdown(): # 当node没被杀掉时,执行循环
marker = Marker() # 定义Marker类型的变量
marker.header.frame_id = "/my_frame" # 设置header的frame——id和stamp属性值
marker.header.stamp = rospy.Time.now() # 这里应该是一个浮点值,对应cpp版本 ros::Time::now()
# 下面两个量定义了该marker的命名空间和id, 通过这两个量能够确定marker的身份,如果身份相同,那么则刷新rviz中对应目标。后面我们会讲到marker是什么
marker.ns = "basic_shapes"
marker.id = 0

marker.type = shape # marker的类型
marker.action = Marker.ADD # marker action

# 初始化了marker的位置和初始的角度
marker.pose.position.x = 0
marker.pose.position.y = 0
marker.pose.position.z = 0
marker.pose.orientation.x = 0.0
marker.pose.orientation.y = 0.0
marker.pose.orientation.z = 0.0
marker.pose.orientation.w = 1.0
# marker的尺寸大小,这里1.0对应于现实地图的1m
marker.scale.x = 1.0
marker.scale.y = 1.0
marker.scale.z = 1.0
# marker的颜色定义, 注意透明度a的设置,为0就看不到了
marker.color.r = 0.0
marker.color.g = 1.0
marker.color.b = 0.0
marker.color.a = 1.0

marker.lifetime = rospy.Duration()

while pub.get_num_connections() < 1:
# get_num_connections()是python版本查阅当前topic的订阅器数目, cpp版本对应函数:
# marker_pub.getNumScribers()
# 用来判断当前是否有订阅器,也就是说rviz是否打开,如果没有订阅器没必要发布消息。当然没有订阅器情况下发布消息也是没问题的。
if rospy.is_shutdown():
exit(1)
rospy.loginfo("Please create a subscriber to the marker!")
time.sleep(1) # 休眠等待,不断查询有没有订阅器

pub.publish(marker) # 发布消息

# 每次发布的消息不同,从而让rviz绘制不同的marker
if shape == Marker.CUBE:
shape = Marker.SPHERE
elif shape == Marker.SPHERE:
shape = Marker.ARROW
elif shape == Marker.ARROW:
shape = Marker.CYLINDER
elif shape == Marker.CYLINDER:
shape = Marker.CUBE

rate.sleep() # 指定频率刷新

if __name__== "__main__":
try:
main()
except rospy.ROSInterruptException:
pass

build and run

1
2
3
cd ~/catkin_ws
catkin_make
roscore # 打开master

另起两个终端分别执行:

1
rosrun using_markers basic_shapes.py
1
rosrun rviz rivz

则将两个线程都跑起来,接下来还需要设置rviz,才能看到效果。

设置rviz

rviz刚打开的界面

rviz_default

然后将左边栏中的 Fixed Frame的值修改为 /my_frame 即代码中header.frame_id定义的量。

然后点击左下角的Add 选择要添加的type, 显然我们这里传递的消息类型是Marker, 所以选择Marker

rviz_add_type

然后就能看到结果了。

results

本文作者 : zhouzongwei
原文链接 : http://yoursite.com/2019/06/26/rviz-sending-basic-shapes/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

知识 & 情怀 | 赏或者不赏,我都在这,不声不响

微信扫一扫, 以资鼓励

微信扫一扫, 以资鼓励

支付宝扫一扫, 再接再厉

支付宝扫一扫, 再接再厉

留下足迹