ROS话题节点项目小结(小白心得)

对于EGO--Planner开源算法,想要查阅无人机当前位置,但无从下手,后面与同门不断探讨和实验,终于找到,以此篇文章记录一下心得。

首先运行ego_planner算法相关启动代码:

1、sh shfiles/rspx4.sh

2、roslaunch px4ctrl run_ctrl.launch

3、roslaunch ego-planner single_run_in_exp.launch

4、roslaunch ego_planner rviz.launch

之后查看rqt_graph框图,发现处理后的数据由节点/vins_fusion发布,话题名为vins_fusion/imu_propagate。

至此找到发布无人机当前位置的话题,但是由于纯小白,竟然不知道如何通过话题名查看它的消息类型,最后查阅ROS相关资料,对ROS节点、话题进行如下总结:

1、rosnode list : 查看所有运行的节点

2、rosnode info  节点名: 查看某个节点详细信息,如节点名、该节点发布哪些话题、订阅的话题、话题的类型、服务等。

3、rostopic type 话题名 :查看该话题消息类型

4、rostopic info 话题名 :查看该话题消息类型、 发布者、订阅者

5、rosmsg list : 查看所有消息类型 

 6、查看某个消息类型内部的数据结构

小结:

1、话题、服务都属于节点发布

2、消息类型可通过话题查阅

3、数据结构可通过消息类型查阅

ros::spin() 与 ros::spinonce()区别

ros::spinOnce():每次调用处理一次回调,适合配合自己控制的循环(如自定义的定时器、计算步骤等)。
ros::spin():进入一个无限循环,持续响应回调,直到程序退出,适合自动运行的应用场景

代码示例:
1、ros::spinOnce()


#include <ros/ros.h>
#include <std_msgs/String.h>
#include <geometry_msgs/Twist.h>
#include <ros/console.h>

// 发布器和订阅器
ros::Publisher pub;
ros::Subscriber sub;

// 回调函数
void cmdCallback(const geometry_msgs::Twist::ConstPtr& msg) {
    ROS_INFO("Received velocity command: [%f, %f, %f]", msg->linear.x, msg->angular.z);
}

int main(int argc, char** argv) {
    ros::init(argc, argv, "spin_once_example");
    ros::NodeHandle nh;

    // 初始化发布器和订阅器
    pub = nh.advertise<std_msgs::String>("chatter", 1000);
    sub = nh.subscribe("cmd_vel", 1000, cmdCallback);

    ros::Rate loop_rate(10);  // 10Hz

    while (ros::ok()) {
        // 自定义处理逻辑,例如发布消息
        std_msgs::String msg;
        msg.data = "Hello ROS!";
        pub.publish(msg);

        // 处理回调函数,使用 spinOnce 来手动控制回调的调用
        ros::spinOnce();

        loop_rate.sleep();  // 保持10Hz的循环频率
    }

    return 0;
}


2、ros::spin()

#include <ros/ros.h>
#include <std_msgs/String.h>
#include <geometry_msgs/Twist.h>
#include <ros/console.h>

// 订阅器
ros::Subscriber sub;

// 回调函数
void cmdCallback(const geometry_msgs::Twist::ConstPtr& msg) {
    ROS_INFO("Received velocity command: [%f, %f, %f]", msg->linear.x, msg->angular.z);
}

int main(int argc, char** argv) {
    ros::init(argc, argv, "spin_example");
    ros::NodeHandle nh;

    // 初始化订阅器
    sub = nh.subscribe("cmd_vel", 1000, cmdCallback);

    // 进入 spin 循环,直到程序退出
    ros::spin();

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值