Skip to content

Odom 服务接口


获取里程计数据


简介

里程计服务接口用于订阅机器人的位置、方向、线速度、角速度等信息的leg_odom topic。该 topic 使用nav_msgs::msg::Odometry消息类型,包含机器人底盘所发布的里程计相关信息。

Topic 名称Topic类型角色
leg_odomnav_msgs::msg::Odometry订阅方
消息结构
bash
std_msgs/Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist
主要字段说明

header:包含时间戳和坐标系的标准 ROS 消息头。

  • stamp:时间戳,指示数据采集的时间。
  • frame_id:坐标系ID,指示里程计pose数据所参考的坐标系。
  • child_frame_id:表示里程计twist数据所参考的机器人坐标系。

pose:机器人的位姿信息,通常包括位置(position)和方向(orientation)。

  • pose.pose.position:通过三维数组存储的位置信息,数组三个元素分别表示机身几何中心在世界坐标系下的x、y、z坐标值(m)
  • pose.pose.orientation:通过四维数组存储的方向四元数信息,用于描述机器人坐标系相对于odom坐标系的旋转状态。

twist:机器人的线速度和角速度信息,用于表示机器人的运动状态。

  • twist.twist.linear:机器人线速度,包括 x、y 和 z 分量。
  • twist.twist.angular:机器人角速度,表示机身绕机器人坐标系z轴的旋转角速度( rad/s )
回调函数实例
cpp
void odometryCallback(nav_msgs::msg::Odometry::SharedPtr odom_data) {
  const auto& position = odom_data->pose.pose.position;
  if (isOdomInvalid(Eigen::Vector3d{position.x, position.y, position.z})) {
    SPDLOG_WARN("odometry data is invalid !!!");
    return;
  }
  geometry_msgs::msg::TransformStamped transform;
  // get current_pose_
  transform.transform.rotation = odom_data->pose.pose.orientation;
  transform.transform.translation.x = position.x;
  transform.transform.translation.y = position.y;
  transform.transform.translation.z = position.z;
  transform.header = odom_data->header;
  transform.child_frame_id = odom_data->child_frame_id;
  tf_broadcaster_->sendTransform(transform);
  // get current_vel_
  current_vel_[0] = odom_data->twist.twist.linear.x;
  current_vel_[1] = odom_data->twist.twist.linear.y;
  current_vel_[2] = odom_data->twist.twist.linear.z;
  current_vel_[3] = odom_data->twist.twist.angular.x;
  current_vel_[4] = odom_data->twist.twist.angular.y;
  current_vel_[5] = odom_data->twist.twist.angular.z;
}
测试方法
  • 订阅里程计消息:
bash
ros2 topic echo /leg_odom
注意事项
  • 获取里程计数据时,应先确保里程计 ROS2 节点已启动并正在发布leg_odom topic。