ros rviz 显示文本 数据 实例

这两段代码展示了如何使用ROS的visualization_msgs/Marker消息在特定位置显示文字。第一个示例创建一个Marker,随着时间推移在/odom坐标系中沿着x轴移动,显示递增的数字。第二个示例则创建一个MarkerArray,同时显示多个Marker,每个Marker在不同的x坐标上显示0到99的数字。这些方法可用于机器人视觉和定位系统的调试与信息反馈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在特定地方显示一行文字

#include <ros/ros.h>
#include <visualization_msgs/Marker.h>
#include<iostream>
using namespace std;
int main( int argc, char** argv )
{
    ros::init(argc, argv, "showline");
    ros::NodeHandle n;
    ros::Publisher markerPub = n.advertise<visualization_msgs::Marker>("TEXT_VIEW_FACING", 10);
    visualization_msgs::Marker marker;
    marker.header.frame_id="/odom";
    marker.header.stamp = ros::Time::now();
    marker.ns = "basic_shapes";
    marker.action = visualization_msgs::Marker::ADD;
    marker.pose.orientation.w = 1.0;
    marker.id =0;
    marker.type = visualization_msgs::Marker::TEXT_VIEW_FACING;

    marker.scale.z = 0.2;
    marker.color.b = 0;
    marker.color.g = 0;
    marker.color.r = 255;
    marker.color.a = 1;

    ros::Rate r(1);
    int k=0;
    while(1)
    {
        geometry_msgs::Pose pose;
        pose.position.x =  (float)(k++)/10;
        pose.position.y =  0;
        pose.position.z =0;
        ostringstream str;
        str<<k;
        marker.text=str.str();
        marker.pose=pose;
        markerPub.publish(marker);
        cout<<"k="<<k<<endl;
        r.sleep();
    }
    return 0;
}

在不同地方显示不同文字

#include <ros/ros.h>
#include <visualization_msgs/Marker.h>
#include<visualization_msgs/MarkerArray.h>
#include<iostream>
using namespace std;
int main( int argc, char** argv )
{
    ros::init(argc, argv, "showline");
    ros::NodeHandle n;
    ros::Publisher markerArrayPub = n.advertise<visualization_msgs::MarkerArray>("MarkerArray", 10);

    visualization_msgs::MarkerArray markerArray;
    ros::Rate r(1);
    int k=0;
    while(k<100)
    {
        visualization_msgs::Marker marker;
        marker.header.frame_id="/odom";
        marker.header.stamp = ros::Time::now();
        marker.ns = "basic_shapes";
        marker.action = visualization_msgs::Marker::ADD;
        marker.pose.orientation.w = 1.0;
        marker.id =k;
        marker.type = visualization_msgs::Marker::TEXT_VIEW_FACING;

        marker.scale.z = 0.1;
        marker.color.b = 255;
        marker.color.g = 255;
        marker.color.r = 255;
        marker.color.a = 1;

        geometry_msgs::Pose pose;
        pose.position.x =  (float)(k)/10;
        pose.position.y =  0;
        pose.position.z =0;
        ostringstream str;
        str<<k;
        marker.text=str.str();
        marker.pose=pose;

        cout<<"k="<<k<<endl;
        markerArray.markers.push_back(marker);
        cout<<"markerArray.markers.size()"<<markerArray.markers.size()<<endl;
        markerArrayPub.publish(markerArray);
        r.sleep();
        k++;
    }
    return 0;
}
### rosbag 的基本功能与数据处理 `rosbag` 是 ROS 中用于记录和回放消息的强大工具。它能够捕获并存储来自不同话题的消息流,以便后续分析或重播。 #### 记录数据 可以通过命令行使用 `rosbag record` 来记录指定的话题数据。例如: ```bash rosbag record -O dataset /turtle1/pose /turtle1/cmd_vel [^1] ``` 上述命令会创建一个名为 `dataset.bag` 的文件,并保存 `/turtle1/pose` 和 `/turtle1/cmd_vel` 这两个话题的数据。 如果只想记录部分信息,可以使用 `-o` 参数来设置输出文件的基础名称。例如: ```bash rosbag record -o subset /turtle1/cmd_vel /turtle1/pose [^3] ``` 这将生成一个名为 `subset-YYYY-MM-DD-HH-mm-SS.bag` 的文件。 #### 查看 bag 文件的内容 要查看已录制的 `.bag` 文件中的内容,可运行以下命令: ```bash rosbag info <filename>.bag ``` 此命令会显示该文件中包含的所有话题及其类型、消息数量以及其他元信息[^2]。 #### 转换数据格式 有时可能需要将 `rosbag` 数据转换为其他格式(如 CSV)。ROS 提供了一些脚本支持这种操作。例如,对于简单的数值型数据,可以直接提取到文本文件中: ```bash rostopic echo -b <filename>.bag -p /topic_name > output.csv ``` 这里 `-b` 表示从特定的 `.bag` 文件读取数据,而 `-p` 则表示以制表符分隔的形式打印结果。 #### 可视化数据分析 为了更直观地理解所收集的数据,可以利用 RViz 工具加载这些数据进行可视化展示。具体步骤如下: 1. 启动 RViz; 2. 配置好相应的显示插件; 3. 使用 `rosbag play` 命令播放目标 `.bag` 文件: ```bash rosbag play <filename>.bag ``` 这样就可以动态观察机器人状态变化或其他传感器反馈的信息了。 #### 数据解析实例 假设我们有一个包含激光扫描仪数据的 `.bag` 文件,则可通过 Python 编写自定义程序进一步挖掘其中隐藏的价值。下面是一个简单例子演示如何遍历所有消息: ```python import rospy import rosbag def process_bag_file(bag_path): with rosbag.Bag(bag_path, 'r') as bag: for topic, msg, t in bag.read_messages(topics=['/scan']): # 对每条消息执行某些计算逻辑... print(f"Timestamp: {t}, Range size: {len(msg.ranges)}") if __name__ == "__main__": process_bag_file('example_data.bag') ``` 以上代码片段展示了如何打开一个现有的 `.bag` 文件并对某一特定主题下的所有消息逐一访问。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值