ROS msg数据结构记录

12 篇文章 5 订阅

0.引言

遇到一个记录一个。

  • rviz中单位为m

1.nav_msgs/Path.msg

  • ref
    请添加图片描述
    注意msg是poses也就是pose构成的数组,因此path的数据是一直递增不清除的。换句话讲就是要注意path的作用域,一般定义为全局变量或定义在main函数里或定义为static变量。
#include <ros/ros.h>
#include <ros/console.h>
#include <nav_msgs/Path.h>
#include <std_msgs/String.h>
#include <geometry_msgs/Quaternion.h>
#include <geometry_msgs/PoseStamped.h>
#include <tf/transform_broadcaster.h>
#include <tf/tf.h>

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

    ros::NodeHandle ph;
    ros::Publisher path_pub = ph.advertise<nav_msgs::Path>("trajectory",1, true);

    ros::Time current_time, last_time;
    current_time = ros::Time::now();
    last_time = ros::Time::now();

    nav_msgs::Path path;
    //nav_msgs::Path path;
    path.header.stamp=current_time;
    path.header.frame_id="odom";


    double x = 0.0;
    double y = 0.0;
    double th = 0.0;
    double vx = 0.1;
    double vy = -0.1;
    double vth = 0.1;

    ros::Rate loop_rate(1);
    while (ros::ok())
    {

        current_time = ros::Time::now();
        //compute odometry in a typical way given the velocities of the robot
        double dt = 0.1;
        double delta_x = (vx * cos(th) - vy * sin(th)) * dt;
        double delta_y = (vx * sin(th) + vy * cos(th)) * dt;
        double delta_th = vth * dt;

        x += delta_x;
        y += delta_y;
        th += delta_th;


        geometry_msgs::PoseStamped this_pose_stamped;
        this_pose_stamped.pose.position.x = x;
        this_pose_stamped.pose.position.y = y;

        geometry_msgs::Quaternion goal_quat = tf::createQuaternionMsgFromYaw(th);
        this_pose_stamped.pose.orientation.x = goal_quat.x;
        this_pose_stamped.pose.orientation.y = goal_quat.y;
        this_pose_stamped.pose.orientation.z = goal_quat.z;
        this_pose_stamped.pose.orientation.w = goal_quat.w;

        this_pose_stamped.header.stamp=current_time;
        this_pose_stamped.header.frame_id="odom";
        path.poses.push_back(this_pose_stamped);

        path_pub.publish(path);
        ros::spinOnce();               // check for incoming messages

        last_time = current_time;
        loop_rate.sleep();
    }

    return 0;
}

2.geometry_msgs/TransformStamped.msg

请添加图片描述

geometry_msgs/Transform定义的就是frame_id与child_frame_id之间的变换。

3.tf2_msgs/TFMessage

请添加图片描述

4.nav_msgs/OccupancyGrid

请添加图片描述

ros::Publisher mapPub = nodeHandler.advertise<nav_msgs::OccupancyGrid>("laser_map", 1, true);

//发布地图.
void PublishMap(ros::Publisher &map_pub)
{
    nav_msgs::OccupancyGrid rosMap;

    rosMap.info.resolution = mapParams.resolution;
    rosMap.info.origin.position.x = 0.0;
    rosMap.info.origin.position.y = 0.0;
    rosMap.info.origin.position.z = 0.0;
    rosMap.info.origin.orientation.x = 0.0;
    rosMap.info.origin.orientation.y = 0.0;
    rosMap.info.origin.orientation.z = 0.0;
    rosMap.info.origin.orientation.w = 1.0;

    rosMap.info.origin.position.x = mapParams.origin_x;
    rosMap.info.origin.position.y = mapParams.origin_y;
    rosMap.info.width = mapParams.width;
    rosMap.info.height = mapParams.height;
    rosMap.data.resize(rosMap.info.width * rosMap.info.height);

    //0~100
    int cnt0, cnt1, cnt2;
    cnt0 = cnt1 = cnt2 = 100;
    for (int i = 0; i < mapParams.width * mapParams.height; i++)
    {
        if (pMap[i] == 50)
        {
            rosMap.data[i] = -1.0;
        }
        else
        {

            rosMap.data[i] = pMap[i];
        }
    }

    rosMap.header.stamp = ros::Time::now();
    rosMap.header.frame_id = "map";

    map_pub.publish(rosMap);
}

5.nav_msgs/Odometry

请添加图片描述
请添加图片描述
请添加图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS(机器人操作系统)中,数据结构用于在不同的节点之间传递和处理数据。Python是一种常用的编程语言,可以用于ROS的开发。下面是一些常见的ROS数据结构和使用Python进行操作的示例: 1. ROS消息(Message):ROS消息是用于在节点之间传递数据的基本单位。你可以使用ROS的消息定义语言(msg)来定义自己的消息类型,然后使用Python编写节点来发布和订阅这些消息。 ```python # 导入所需的消息类型 from std_msgs.msg import String # 创建一个发布者 pub = rospy.Publisher('topic_name', String, queue_size=10) # 创建一个消息实例 msg = String() msg.data = 'Hello, ROS!' # 发布消息 pub.publish(msg) ``` 2. ROS服务(Service):ROS服务允许节点之间进行请求和响应式的通信。你可以使用ROS服务定义语言(srv)来定义自己的服务类型,然后使用Python编写节点来提供和调用这些服务。 ```python # 导入所需的服务类型 from my_package.srv import AddTwoInts, AddTwoIntsRequest # 创建一个服务客户端 rospy.wait_for_service('service_name') add_two_ints = rospy.ServiceProxy('service_name', AddTwoInts) # 创建一个请求实例 req = AddTwoIntsRequest() req.a = 5 req.b = 3 # 调用服务并获取响应 res = add_two_ints(req) print('Sum:', res.sum) ``` 3. ROS参数(Parameter):ROS参数允许在运行时配置节点的参数。你可以使用Python访问和修改参数。 ```python # 导入所需的模块 import rospy # 设置参数 rospy.set_param('param_name', 'param_value') # 获取参数 param_value = rospy.get_param('param_name') # 修改参数 rospy.set_param('param_name', new_value) ``` 这些是ROS中常见的数据结构和Python操作示例。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值