重点参考:

b站up:机器人工匠阿杰

csdn链接:https://blog.csdn.net/zzhh1111/article/details/148761199?fromshare=blogdetail&sharetype=blogdetail&sharerId=148761199&sharerefer=PC&sharesource=yuchenhuaizhe&sharefrom=from_link

正文:

IMU 惯性测量单元消息包

  1. 用途:加速度计、陀螺仪和磁力计数据。
  2. 关键字段:
    # 标准头信息(时间戳 + 坐标系)
    std_msgs/Header header
      uint32 seq        # 序列号
      time stamp        # 数据采集时间戳
      string frame_id   # 坐标系(如 "imu_link")
    
    # 姿态四元数(相对于参考坐标系)
    geometry_msgs/Quaternion orientation
      float64 x
      float64 y
      float64 z
      float64 w         # 通常 w > 0
    
    # 姿态协方差矩阵(行优先,3x3)
    float64[9] orientation_covariance
      # 索引:0 4 8 → 对角线元素(xx, yy, zz方差)
      # 值 -1 表示数据不可用
    
    # 角速度(单位:rad/s)
    geometry_msgs/Vector3 angular_velocity
      float64 x         # 绕X轴旋转(滚转)
      float64 y         # 绕Y轴旋转(俯仰)
      float64 z         # 绕Z轴旋转(偏航)
    
    # 角速度协方差矩阵(行优先,3x3)
    float64[9] angular_velocity_covariance
    
    # 线加速度(单位:m/s²)
    geometry_msgs/Vector3 linear_acceleration
      float64 x         # X轴加速度(前进方向)
      float64 y         # Y轴加速度(左侧方向)
      float64 z         # Z轴加速度(向上方向)
    
    # 线加速度协方差矩阵(行优先,3x3)
    float64[9] linear_acceleration_covariance
    

    IMU数据的话题发布:通过 /imu/data_raw/imu/data/imu/mag话题发布

ROS的标准消息包std_msgsROS 中的几何包 geometry_msgs 和 传感器包 sensor_msgs

ROS中的栅格地图格式

构建软件包map_pkg,依赖里加上nav_msgs,在再map_pkg里创建一个节点map_pub_node

cd catkin_ws/src/
catkin_create_pkg map_pkg rospy roscpp nav_msgs
cd map_pkg/src/
touch map_pub_node.cpp

节点中发布话题/map,消息类型为nav_msga::OccupancyGrid;构建一个nav_msga::OccupancyGrid地图消息包,并对其赋值;将地图消息包发送到话题/map

# include <iostream>
# include <ros/ros.h>
# include <nav_msgs/OccupancyGrid.h>

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

    ros::NodeHandle n;
    ros::Publisher pub = n.advertise<nav_msgs::OccupancyGrid>("/map", 10); //节点中发布话题/map,消息类型为nav_msga::OccupancyGrid

    ros::Rate r(1); //消息包发送频率为1HZ
    while (ros::ok()) //使用while循环不停发送消息包
    {
        nav_msgs::OccupancyGrid msg; //构建消息包
        // header
        msg.header.frame_id = "map";
        msg.header.stamp = ros::Time::now(); //时间戳设置为当前时间
        // 地图描述信息
        msg.info.origin.position.x = 0;
        msg.info.origin.position.y = 0;
        msg.info.resolution = 1.0;  //栅格分辨率
        msg.info.width = 4;
        msg.info.height = 2;
        // 地图数据
        msg.data.resize(4*2);//调整数组大小
        msg.data[0] = 100;
        msg.data[1] = 100;
        msg.data[2] = 0;
        msg.data[3] = -1;
        // 发送
        pub.publish(msg);
        r.sleep();//发送频率的控制
    }
    
    return 0;
}

更多推荐