在ROS中,可以使用sensor_msgs/Range
消息类型来发布和订阅超声波数据。sensor_msgs/Range
消息类型包含以下字段:
header
:消息头,包含时间戳和帧ID。radiation_type
:辐射类型,对于超声波传感器通常是"ultrasound"。field_of_view
:视野角度,以弧度为单位。min_range
:最小测量距离,以米为单位。max_range
:最大测量距离,以米为单位。range
:测量距离,以米为单位。
下面是一个使用sensor_msgs/Range
消息类型发布和订阅超声波数据的C++代码示例:
发布超声波数据:
#include <ros/ros.h>
#include <sensor_msgs/Range.h> int main(int argc, char** argv)
{ ros::init(argc, argv, "ultrasound_publisher"); ros::NodeHandle nh; ros::Publisher pub = nh.advertise<sensor_msgs::Range>("ultrasound", 10); ros::Rate loop_rate(1); // 设置发布频率为1Hz while (ros::ok()) { // 创建超声波数据消息 sensor_msgs::Range msg; msg.header.stamp = ros::Time::now(); msg.radiation_type = "ultrasound"; msg.field_of_view = 0.1; // 视野角度为0.1弧度 msg.min_range = 0.0; // 最小测量距离为0米 msg.max_range = 5.0; // 最大测量距离为5米 msg.range = 3.0; // 测量距离为3米 // 发布超声波数据消息 pub.publish(msg); ros::spinOnce(); loop_rate.sleep(); } return 0;
}
订阅超声波数据:
#include <ros/ros.h>
#include <sensor_msgs/Range.h> void ultrasoundCallback(const sensor_msgs::RangeConstPtr& msg)
{ // 处理超声波数据消息,例如打印测量距离和时间戳 ROS_INFO("Ultrasound distance: %.2f m", msg->range); ROS_INFO("Timestamp: %.2f", msg->header.stamp.toSec());
} int main(int argc, char** argv)
{ ros::init(argc, argv, "ultrasound_subscriber"); ros::NodeHandle nh; ros::Subscriber sub = nh.subscribe("ultrasound", 10, ultrasoundCallback); ros::spin(); // 进入ROS事件循环,等待消息到来和处理回调函数 return 0;
}