对于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;
}