对不起,我忽略了ROS循环中的ros::ok()函数。在ROS节点的循环中,通常需要使用ros::ok()函数来检查ROS节点是否仍然运行。以下是更新后的示例代码:
#include <ros/ros.h>
#include <sensor_msgs/Image.h>
#include <opencv2/opencv.hpp>
int main(int argc, char** argv)
{
// 初始化ROS节点
ros::init(argc, argv, "image_publisher");
ros::NodeHandle nh;
// 创建一个图像发布者
ros::Publisher image_pub = nh.advertise<sensor_msgs::Image>("/image_topic", 10);
ros::Rate rate(10); // 设置发布频率为10Hz
int count = 0;
while (ros::ok() && count < 100)
{
cv::Mat image;
// 加载图像数据到image变量中
sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();
image_pub.publish(msg); // 发布图像消息
ros::spinOnce(); // 处理回调函数
rate.sleep(); // 控制发布频率
count++;
}
return 0;
}
在上述更新后的代码中,通过添加ros::ok()和ros:spinOnce()来确保ROS节点正常运行,并处理任何挂起的回调函数。这样可以使得程序能够优雅地退出,并且在运行期间能够正常响应其他ROS节点的消息。
内容由零声教学AI助手提供,问题来源于学员提问




