使用ROS的rqt_plot对任意语言的程序进行可视化

来源:互联网 发布:js indexof 多个 编辑:程序博客网 时间:2024/06/05 09:54

简介

经常做数据处理的同学可能比较熟悉MATLAB或者Python,而做图像或者机器人用到最多的其实是C和C++。经常需要在调试时实时看到某些数据的变化趋势,而C++却没有一套好的可视化库(或者需要很麻烦的配置。)于是写了这个工具。调用者只要在程序里打印需要实时显示的数据,然后将控制台信息通过管道传给Python程序即可自动在rqt_plot里显示,并自动发布ROS话题。

效果

这里写图片描述

使用方法及源码

#! /usr/bin/python# coding:utf-8"""    本脚本将任意程序输出转为ROS话题发布出来,便于通过可视化程序直接查看数据。    用法:    cmd | python debug_in_ros.py [TOPIC_NAME] [PLOT_NUMS]    调用者需要在自己的程序中将需要调试的数据按如下格式打印:    [TOPIC_NAME] [DATA] [NUMBER]    数据间用空格隔开。    如,我的程序a输出为:    odom 1 2 3    调用 a | python debug_in_ros.py odom 3    则本程序将发布ros话题odom,并实时用rqt_plot绘制出波形,类型为Float64MultiArray。"""import sysimport osimport numpy as npimport rospyimport std_msgs.msg as ros_msgdef debug_in_ros():    array = ros_msg.Float64MultiArray()    rospy.init_node('debug_in_ros')    pub = rospy.Publisher(sys.argv[1], ros_msg.Float64MultiArray, queue_size=10)    rate = rospy.Rate(100)    while not rospy.is_shutdown():        try:            line = raw_input("")        except:            break        if line == '':            return        line = line.strip()        tokens = line.split(' ')        if len(tokens) <= 2:            continue        if tokens[0] == sys.argv[1]:            array.data = [float(token) for token in tokens[1:]]            pub.publish(array)        rate.sleep()if __name__ == '__main__':    if len(sys.argv) < 3:        print __doc__        sys.exit()    data = ['%s/data[%d]' % (sys.argv[1],i) for i in range(int(sys.argv[2]))]    data = ' '.join(data)    os.system('rosrun rqt_plot rqt_plot topics %s&' % data)    debug_in_ros()
0 0
原创粉丝点击