在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;
}