Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
140 changes: 140 additions & 0 deletions modules/dreamview/backend/simulator/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")

package(default_visibility = ["//visibility:public"])

cc_library(
name = "simulator_base",
hdrs = [
"base/entity.h",
],
copts = ["-DMODULE_NAME=\\"dreamview\\""],
deps = [
"//cyber",
],
)

cc_library(
name = "simulator_scenario",
srcs = [
"scenario/parser.cc",
"scenario/manager.cc",
],
hdrs = [
"scenario/scenario.h",
"scenario/parser.h",
"scenario/manager.h",
],
copts = ["-DMODULE_NAME=\\"dreamview\\""],
deps = [
":simulator_base",
":simulator_entity_ego",
":simulator_entity_env",
"//modules/dreamview/backend/map:map_service",
"@com_github_nlohmann_json//:json",
],
)

cc_library(
name = "simulator_entity_ego",
srcs = [
"entity/ego/ego_model.cc",
],
hdrs = [
"entity/ego/ego_model_base.h",
"entity/ego/ego_model.h",
],
copts = ["-DMODULE_NAME=\\"dreamview\\""],
deps = [
":simulator_base",
"//cyber",
"//modules/common_msgs/planning_msgs:planning_cc_pb",
"//modules/common_msgs/chassis_msgs:chassis_cc_pb",
"//modules/common_msgs/localization_msgs:localization_cc_pb",
"//modules/dreamview/backend/map:map_service",
],
)

cc_library(
name = "simulator_entity_env",
srcs = [
"entity/env/obstacle_manager.cc",
"entity/env/traffic_light_manager.cc",
],
hdrs = [
"entity/env/obstacle_manager.h",
"entity/env/traffic_light_manager.h",
],
copts = ["-DMODULE_NAME=\\"dreamview\\""],
deps = [
":simulator_base",
"//cyber",
"//modules/common_msgs/perception_msgs:perception_obstacle_cc_pb",
"//modules/common_msgs/perception_msgs:traffic_light_detection_cc_pb",
"//modules/dreamview/backend/map:map_service",
"@com_github_nlohmann_json//:json",
],
)

cc_library(
name = "simulator_core",
srcs = [
"core/engine.cc",
],
hdrs = [
"core/engine.h",
],
copts = ["-DMODULE_NAME=\\"dreamview\\""],
deps = [
":simulator_base",
":simulator_scenario",
":simulator_entity_ego",
":simulator_entity_env",
"//cyber",
"//modules/dreamview/backend/map:map_service",
],
)

cc_library(
name = "simulator_evaluation",
srcs = [
"evaluation/evaluator.cc",
"evaluation/metrics/max_sim_time_metric.cc",
],
hdrs = [
"evaluation/evaluation_manager.h",
"evaluation/evaluator.h",
"evaluation/evaluator_base.h",
"evaluation/metrics/metric_base.h",
"evaluation/metrics/max_sim_time_metric.h",
],
copts = ["-DMODULE_NAME=\\"dreamview\\""],
deps = [
":simulator_base",
],
)

cc_library(
name = "simulation_manager",
srcs = ["simulation_manager.cc"],
hdrs = ["simulation_manager.h"],
copts = ["-DMODULE_NAME=\\"dreamview\\""],
deps = [
":simulator_core",
":simulator_evaluation",
":simulator_scenario",
"//modules/dreamview/backend/map:map_service",
"@com_github_nlohmann_json//:json",
],
)

cc_binary(
name = "simulator_main",
srcs = ["simulator_main.cc"],
copts = ["-DMODULE_NAME=\"dreamview\""],
deps = [
":simulation_manager",
"//cyber",
"//modules/dreamview/backend/map:map_service",
"@com_github_gflags_gflags//:gflags",
],
)
23 changes: 23 additions & 0 deletions modules/dreamview/backend/simulator/base/entity.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#pragma once

namespace apollo {
namespace dreamview {

class SimEntity {
public:
virtual ~SimEntity() = default;

virtual bool Init() = 0;

// dt: delta time in seconds
virtual void Step(double dt) = 0;

// Reset the entity to its initial configuration
virtual void Reset() = 0;

// Publish resulting data/messages to Cyber RT channels
virtual void Publish() = 0;
};

} // namespace dreamview
} // namespace apollo
53 changes: 53 additions & 0 deletions modules/dreamview/backend/simulator/base/frame_context.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#pragma once

#include <memory>
#include <vector>

#include "modules/common/proto/pnc_point.pb.h"

namespace apollo {
namespace dreamview {

// 障碍物状态快照
struct ObstacleStatus {
int id;
double x;
double y;
double theta;
double v;
double length;
double width;
bool is_static;
};

// Ego 车辆状态快照
struct EgoState {
double x = 0.0;
double y = 0.0;
double z = 0.0;
double heading = 0.0;
double v = 0.0;
double a = 0.0;
double kappa = 0.0; // 曲率
double throttle = 0.0;
double brake = 0.0;
double steering_percentage = 0.0;
};

// 仿真帧上下文:作为 Evaluator 的输入
struct FrameContext {
// 时间信息
double dt = 0.0;
double sim_time_sec = 0.0;
size_t frame_index = 0;

// 状态数据(使用指针避免大对象拷贝,由 Engine 保证生命周期)
const EgoState* ego_state = nullptr;
const std::vector<ObstacleStatus>* obstacles = nullptr;

// 扩展:地图信息(可选,用于检测是否压线、超速等)
// MapService* map_service = nullptr;
};

} // namespace dreamview
} // namespace apollo
134 changes: 134 additions & 0 deletions modules/dreamview/backend/simulator/core/engine.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
#include "modules/dreamview/backend/simulator/core/engine.h"

#include <cmath>

namespace apollo {
namespace dreamview {

SimulationEngine::SimulationEngine(MapService* map_service)
: node_(cyber::CreateNode("simulation_engine")),
map_service_(map_service) {}

SimulationEngine::~SimulationEngine() { Stop(); }

bool SimulationEngine::Init() {
tick_timer_.reset(new cyber::Timer(10, [this]() { this->Tick(); }, false));
return true;
}

void SimulationEngine::AddEntity(std::shared_ptr<SimEntity> entity) {
std::lock_guard<std::mutex> lock(mutex_);
entities_.push_back(std::move(entity));
}

void SimulationEngine::ClearEntities() {
std::lock_guard<std::mutex> lock(mutex_);
entities_.clear();
}

void SimulationEngine::Play() {
std::lock_guard<std::mutex> lock(mutex_);
last_tick_time_ = cyber::Time::Now().ToSecond();
sim_time_sec_ = 0.0;
tick_count_ = 0;
is_running_ = true;
if (tick_timer_) {
tick_timer_->Start();
}
}

void SimulationEngine::Stop() {
std::lock_guard<std::mutex> lock(mutex_);
is_running_ = false;
if (tick_timer_) {
tick_timer_->Stop();
}
}

void SimulationEngine::Reset() {
Stop();
std::lock_guard<std::mutex> lock(mutex_);
sim_time_sec_ = 0.0;
tick_count_ = 0;
for (auto& entity : entities_) {
entity->Reset();
}
}

bool SimulationEngine::IsRunning() const {
std::lock_guard<std::mutex> lock(mutex_);
return is_running_;
}

uint64_t SimulationEngine::GetTickCount() const {
std::lock_guard<std::mutex> lock(mutex_);
return tick_count_;
}

double SimulationEngine::GetSimTimeSec() const {
std::lock_guard<std::mutex> lock(mutex_);
return sim_time_sec_;
}

void SimulationEngine::Tick() {
std::lock_guard<std::mutex> lock(mutex_);
if (!is_running_) return;

double current_time = cyber::Time::Now().ToSecond();
double dt = current_time - last_tick_time_;
last_tick_time_ = current_time;
if (dt < 0.0) {
dt = 0.0;
}
sim_time_sec_ += dt;
++tick_count_;

// 1. Update calculation (Step)
for (auto& entity : entities_) {
entity->Step(dt);
}

// 2. Evaluation: build FrameContext from entity snapshots and run evaluators
frame_context_cache_.dt = dt;
frame_context_cache_.sim_time_sec = sim_time_sec_;
frame_context_cache_.frame_index = tick_count_;

// Reset caches
ego_state_cache_ = EgoState();
obstacles_cache_.clear();
frame_context_cache_.ego_state = nullptr;
frame_context_cache_.obstacles = nullptr;

for (const auto& entity : entities_) {
// Try ego
if (!frame_context_cache_.ego_state) {
auto ego = std::dynamic_pointer_cast<EgoModel>(entity);
if (ego) {
ego_state_cache_ = ego->GetState();
frame_context_cache_.ego_state = &ego_state_cache_;
}
}
// Try obstacle manager
auto obs = std::dynamic_pointer_cast<ObstacleManager>(entity);
if (obs) {
obstacles_cache_ = obs->GetObstacleStatuses();
frame_context_cache_.obstacles = &obstacles_cache_;
}
}

// Invoke Evaluate on evaluator entities
for (const auto& entity : entities_) {
auto evaluator = std::dynamic_pointer_cast<Evaluator>(entity);
if (evaluator) {
evaluator->Evaluate(frame_context_cache_);
}
}

// 3. Data output (Publish)
for (auto& entity : entities_) {
entity->Publish();
}
}

} // namespace dreamview
} // namespace apollo
Loading