C++和ROS的callback多线程运行

#include <ros/ros.h>
#include <std_msgs/Bool.h>
#include <geometry_msgs/Point.h>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex mtx;
std::condition_variable cv;
bool follow_flag = false;
geometry_msgs::Point target_point;

void targetPointCallback(const geometry_msgs::Point::ConstPtr& msg) {
    std::lock_guard<std::mutex> lock(mtx);
    target_point = *msg;
    ROS_INFO("Received target point: x=%.2f, y=%.2f, z=%.2f", target_point.x, target_point.y, target_point.z);
    follow_flag = true;
    cv.notify_all();  // Notify follow thread
}

void followThread() {
    while (true) {
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, []{ return follow_flag; });
        if (!follow_flag) {
            break;
        }
        ROS_INFO("Following target point: x=%.2f, y=%.2f, z=%.2f", target_point.x, target_point.y, target_point.z);
        // Implement your follow logic here
        // std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }
    ROS_INFO("Follow task ended.");
}

void followFlagCallback(const std_msgs::Bool::ConstPtr& msg) {
    std::lock_guard<std::mutex> lock(mtx);
    follow_flag = msg->data;
    if (follow_flag) {
        ROS_INFO("Start following.");
        cv.notify_all();  // Notify follow thread
    } else {
        ROS_INFO("Stop following.");
    }
}

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

    ros::Subscriber target_point_sub = nh.subscribe<geometry_msgs::Point>("target_point_topic", 1, targetPointCallback);
    ros::Subscriber follow_flag_sub = nh.subscribe<std_msgs::Bool>("follow_flag_topic", 1, followFlagCallback);

    std::thread follow_thread(followThread);

    ROS_INFO("Robot follow node initialized.");

    ros::spin();  // Spin ROS callbacks

    follow_thread.join();  // Wait for follow thread to finish

    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ICECREAM-7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值