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 Name | Message Type | Message Type |
---|---|---|
leg_odom | nav_msgs::msg::Odometry | Subscriber |
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 thepose
data.child_frame_id
: Frame of reference for thetwist
(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.