常用ROS话题与消息包(odom,cmd_vel)

一:话题/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 轴的角速度,单位通常是弧度/秒

 

ROS中,要订阅/odom话题,首先需要在C++或Python程序中导入相关的ROS包和消息类型。然后,通过创建一个ROS节点来订阅/odom话题。 在C++中,首先需要包括头文件,如下所示: ```cpp #include <ros/ros.h> #include <nav_msgs/Odometry.h> ``` 接下来,在main函数中初始化ROS节点,并创建一个订阅者对象来订阅/odom话题。示例代码如下: ```cpp int main(int argc, char** argv) { // 初始化ROS节点 ros::init(argc, argv, "odom_subscriber"); // 创建节点句柄 ros::NodeHandle nh; // 创建订阅者对象 ros::Subscriber sub = nh.subscribe("/odom", 10, odomCallback); // 循环处理回调函数 ros::spin(); return 0; } ``` 在上述代码中,`odomCallback`是一个回调函数,用于接收并处理消息。在该函数中,需要定义消息类型和进行相应的处理。 接下来,在回调函数中定义`odomCallback`,如下所示: ```cpp void odomCallback(const nav_msgs::Odometry::ConstPtr& msg) { // 处理接收到的消息 // 例如,打印消息的内容 ROS_INFO("Received odometry message: [%f, %f]", msg->pose.pose.position.x, msg->pose.pose.position.y); } ``` 在上述代码中,我们通过`msg`指针来访问接收到的消息的字段,如位置信息`pose`、线速度信息`twist`等。 对于Python,操作类似。首先导入需要的包和消息类型,并创建一个订阅者对象。示例代码如下: ```python import rospy from nav_msgs.msg import Odometry # 回调函数 def odom_callback(msg): # 处理接收到的消息 # 例如,打印消息的内容 rospy.loginfo("Received odometry message: [%f, %f]", msg.pose.pose.position.x, msg.pose.pose.position.y) # 初始化ROS节点 rospy.init_node('odom_subscriber') # 创建订阅者对象 rospy.Subscriber("/odom", Odometry, odom_callback) # 循环处理回调函数 rospy.spin() ``` 在上述代码中,`odom_callback`是一个回调函数,用于接收并处理消息。通过`msg`对象来访问接收到的消息的字段,如位置信息`pose`、线速度信息`twist`等。 总之,在ROS中订阅/odom话题,我们需要导入相关的ROS包和消息类型,并创建一个订阅者对象来接收并处理消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值