一:话题/odom
属于nav_msgs/Odometry消息包
调用方法:
#include "ros/ros.h"
#include "nav_msgs/Odometry.h"
#include "tf/transform_listener.h"
void OdomCallback(const nav_msgs::Odometry::ConstPtr &msg)
{
double x, y, z;
double roll, pitch, yaw;
x = msg->pose.pose.position.x;
y = msg->pose.pose.position.y;
z = msg->pose.pose.position.z;
tf::Quaternion quat;//定义一个四元数
tf::quaternionMsgToTF(msg->pose.pose.orientation, quat);
//取出方向存储于四元数
tf::Matrix3x3(quat).getRPY(roll, pitch, yaw);
ROS_INFO("Odom: %f, %f, %f, %f, %f, %f", x, y, z, roll, pitch, yaw);
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle node;
ros::Subscriber sub = node.subscribe("odom", 1000, OdomCallback);
ros::spin();
return 0;
}
格式:
Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist
二:话题cmd_vel:
属于:geometry_msgs/Twist
消息包
调用方法:
#include "ros/ros.h"
#include "geometry_msgs/Twist.h"
int main(int argc, char** argv)
{
// 初始化 ROS 节点
ros::init(argc, argv, "velocity_controller");
ros::NodeHandle nh;
// 创建一个发布者,发布到 cmd_vel 话题
ros::Publisher vel_pub = nh.advertise<geometry_msgs::Twist>("cmd_vel", 10);
// 设置循环频率
ros::Rate loop_rate(10); // 10Hz
while (ros::ok())
{
// 创建一个 Twist 消息
geometry_msgs::Twist vel_msg;
vel_msg.linear.x = 0.5;
vel_msg.angular.z = 0.5;
// 发布速度指令
vel_pub.publish(vel_msg);
// 按照循环频率等待
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
格式:
geometry_msgs/Twist:
linear:
x: 0.5 # 沿 X 轴的线速度,单位通常是米/秒
y: 0.0 # 沿 Y 轴的线速度
z: 0.0 # 沿 Z 轴的线速度
angular:
x: 0.0 # 绕 X 轴的角速度
y: 0.0 # 绕 Y 轴的角速度
z: 0.5 # 绕 Z 轴的角速度,单位通常是弧度/秒