apollo cyber中task_manager源码分析

task

using movex::cyber::common::GlobalData;

// 创建任务
template <typename F, typename... Args>
static auto Async(F&& f, Args&&... args)
    -> std::future<typename std::result_of<F(Args...)>::type> {
  return GlobalData::Instance()->IsRealityMode()
             ? TaskManager::Instance()->Enqueue(std::forward<F>(f),
                                                std::forward<Args>(args)...)
             : std::async(
                   std::launch::async,
                   std::bind(std::forward<F>(f), std::forward<Args>(args)...));
}

static inline void Yield() {
  if (croutine::CRoutine::GetCurrentRoutine()) {
    croutine::CRoutine::Yield();
  } else {
    std::this_thread::yield();
  }
}

template <typename Rep, typename Period>
static void SleepFor(const std::chrono::duration<Rep, Period>& sleep_duration) {
  auto routine = croutine::CRoutine::GetCurrentRoutine();
  if (routine == nullptr) {
    std::this_thread::sleep_for(sleep_duration);
  } else {
    routine->Sleep(sleep_duration);
  }
}

static inline void USleep(useconds_t usec) {
  auto routine = croutine::CRoutine::GetCurrentRoutine();
  if (routine == nullptr) {
    std::this_thread::sleep_for(std::chrono::microseconds{usec});
  } else {
    routine->Sleep(croutine::Duration(usec));
  }
}

task_manager

task_manager.h
class TaskManager {
 public:
  ~TaskManager();

  void Shutdown();

  template <typename F, typename... Args>
  auto Enqueue(F&& func, Args&&... args)
      -> std::future<typename std::result_of<F(Args...)>::type> {
    using return_type = typename std::result_of<F(Args...)>::type;
    auto task = std::make_shared<std::packaged_task<return_type()>>(
        std::bind(std::forward<F>(func), std::forward<Args>(args)...));
    if (!stop_.load()) {
      task_queue_->Enqueue([task]() { (*task)(); });
      // 唤醒所有任务
      for (auto& task : tasks_) {
        scheduler::Instance()->NotifyTask(task);
      }
    }
    std::future<return_type> res(task->get_future());
    return res;
  }

 private:
  uint32_t num_threads_ = 0;
  uint32_t task_queue_size_ = 1000;
  std::atomic<bool> stop_ = {false};
  std::vector<uint64_t> tasks_;
  std::shared_ptr<base::BoundedQueue<std::function<void()>>> task_queue_;
  DECLARE_SINGLETON(TaskManager);
};

task_manager.cc
using movex::cyber::common::GlobalData;
static const char* const task_prefix = "/internal/task";

TaskManager::TaskManager()
    : task_queue_size_(1000),
      task_queue_(new base::BoundedQueue<std::function<void()>>()) {
  // 初始化任务队列和任务策略
  if (!task_queue_->Init(task_queue_size_, new base::BlockWaitStrategy())) {
    AERROR << "Task queue init failed";
    throw std::runtime_error("Task queue init failed");
  }

  // 任务回调函数
  auto func = [this]() {
    while (!stop_) {
      std::function<void()> task;
      // 判断队列是否为空,空则等待
      if (!task_queue_->Dequeue(&task)) {
        auto routine = croutine::CRoutine::GetCurrentRoutine();
        routine->HangUp();
        continue;
      }
      task();
    }
  };
  // 创建协程任务
  num_threads_ = scheduler::Instance()->TaskPoolSize();
  auto factory = croutine::CreateRoutineFactory(std::move(func));
  tasks_.reserve(num_threads_);
  for (uint32_t i = 0; i < num_threads_; i++) {
    auto task_name = task_prefix + std::to_string(i);
    tasks_.push_back(common::GlobalData::RegisterTaskName(task_name));
    // 创建新的协程任务
    if (!scheduler::Instance()->CreateTask(factory, task_name)) {
      AERROR << "CreateTask failed:" << task_name;
    }
  }
}

TaskManager::~TaskManager() { Shutdown(); }

// 删除协程任务
void TaskManager::Shutdown() {
  if (stop_.exchange(true)) {
    return;
  }
  for (uint32_t i = 0; i < num_threads_; i++) {
    scheduler::Instance()->RemoveTask(task_prefix + std::to_string(i));
  }
}

功能分析

从上述TaskManager的构造函数可以看出在TaskManager初始化任务的时候会创建scheduler::Instance()->TaskPoolSize()个任务,用户异步协程的运行在用户调用cyber::Async的时候会更具是否处于正式环境调用Enqueue或者std::async函数

问题分析

cyber::Async在一定意义上不具备真正的实时性,在默认情况下协程的优先级为最低,所以task中添加的任务会在系统空闲的时候在调用

### 回答1: trajectory_point是Apollo 7.0软件的一个数据结构,表示车辆在时间上的运动轨迹的一个点。它包含以下字段: - x、y、z:表示车辆在平面坐标系的位置坐标(单位:米)。 - velocity:表示车辆的速度(单位:米/秒)。 - acceleration:表示车辆的加速度(单位:米/秒^2)。 - relative_time:表示车辆位置信息相对于时间轴的偏移量(单位:秒)。 ### 回答2: 百度Apollo 7.0的trajectory_point字段是指车辆轨迹点的含义。在自动驾驶系统,车辆的轨迹是指车辆在一段时间内的位置和速度的变化。而trajectory_point字段用于表示车辆在特定时刻的轨迹信息。 具体来说,trajectory_point字段包含以下几个关键信息:时间戳、车辆位置、车辆速度、车辆加速度等。时间戳用于记录该轨迹点的采集时间,以便后续对车辆轨迹的分析和处理。车辆位置可以通过经纬度或者坐标系的二维坐标来表示,用于确定车辆的具体位置。车辆速度表示车辆在该点的行驶速度,可以用来衡量车辆的运动状态。而车辆加速度则表示车辆在该点的加速度情况,可以用来推测车辆加速或减速的程度。 通过分析和处理trajectory_point字段的数据,自动驾驶系统可以获取车辆的实时轨迹信息,以便进行路径规划、决策制定等操作。同时,也可以通过与目标轨迹进行对比,进行车辆运动状态的判断和控制操作。trajectory_point字段在自动驾驶系统具有重要的作用,为系统提供了必要的车辆轨迹信息,以确保车辆在行驶过程的安全和稳定性。 ### 回答3: 百度Apollo 7.0的trajectory_point字段是指自动驾驶系统的轨迹点数据。轨迹点是指车辆在行驶过程的离散位置点,它记录了车辆在连续时间段内所处的位置、速度、加速度、航向角等信息。 trajectory_point字段包含了多个轨迹点,每个轨迹点由一组参数组成。其,位置信息包括经度、纬度和海拔高度,用于确定车辆的准确位置。速度和加速度信息表示车辆在该位置点的速度和加速度大小,用于描述车辆的运动状态。 另外,航向角是指车辆行驶方向与正北方向的夹角,表示车辆的朝向。在trajectory_point字段,航向角数据可以用于车辆导航和路径规划等算法,以确保车辆按照预定路径行驶。 通过记录和更新trajectory_point字段的数据,自动驾驶系统可以实时获取车辆的位置、速度、加速度和朝向等信息,从而进行路径规划、障碍物检测和决策控制等任务。此外,trajectory_point字段的数据也可以用于生成车辆的轨迹曲线,为系统提供一种准确的车辆运动描述。 总之,百度Apollo 7.0的trajectory_point字段是自动驾驶系统记录车辆位置、速度、加速度和朝向等信息的重要数据字段,它为系统的决策控制和路径规划提供了关键的输入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值