Skip to content

Odom Service Interface


Odometry Data Retrieval Interface

Overview

This interface is used to subscribe to the robot's odometry data, including position, orientation, linear velocity, and angular velocity, via the /leg_odom topic. The topic uses the nav_msgs::msg::Odometry message type, which contains odometry information published by the robot's chassis.

Topic NameMessage TypeMessage Type
leg_odomnav_msgs::msg::OdometrySubscriber
Message Structure
bash
std_msgs/Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist
Key Field Descriptions
  • header: Standard ROS message header, includes:
  • stamp: Timestamp indicating the data acquisition time.
  • frame_id: Frame of reference for the pose data.
  • child_frame_id: Frame of reference for the twist (velocity) data, typically the robot's base frame.
  • pose: Robot's pose information, including:
  • pose.pose.position: 3D position of the robot's geometric center in the world frame (x, y, z in meters).
  • pose.pose.orientation: Orientation represented as a quaternion (x, y, z, w), describing the robot's rotation relative to the odometry frame.
  • twist: Robot's velocity data:
  • twist.twist.linear: Linear velocity along x, y, and z axes.
  • twist.twist.angular: Angular velocity (e.g., yaw rate around the z-axis, in rad/s).
Callback Example
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;
}
Testing Method
  • To view odometry messages in real time, run:
bash
ros2 topic echo /leg_odom

Precautions

  • Before retrieving odometry data, ensure that the ROS 2 node responsible for publishing the /leg_odom topic has been properly launched and is running.