1. esmini 在Server.cpp中提供了外部控制ego车的方式,以UDP的方式接收外部数据然后驱动ego运动。为了开启UDP数据接收线程,只需要命令行增加--server参数即可。
2. ScenarioGateway 类中保存了所有车辆的当前数据,UDP线程接收到数据后需要调用reportObject函数来上报数据。
3. ScenarioEngine 类中的step函数中,每一帧开始会调用ScenarioGateway的getObjectStateById函数来获取车辆数据,然后在每一帧结束会通过reportObject来上报数据。如果开启外部控制的话,UDP线程的reportObject和step的reportObject会冲突。
可以按以下方法修改:
1. ScenarioEngine类增加一个bool变量egoExternalCtl_作为控制开关,并增加设置函数。并且需要在构造函数中初始化为false
void SetEgoExternal(bool isCtrl) { egoExternalCtl_ = isCtrl; }
bool egoExternalCtl_;
2. 修改ScenarioEngine的step函数,给reportObject调用的地方加上这个开关,并判断是否是ego车。
// Report state to the gateway
if(!egoExternalCtl_ || obj->name_ != "Ego")scenarioGateway.reportObject(obj->id_, obj->name_, static_cast<int>(obj->type_), obj->category_, obj->model_id_,obj->GetActivatedControllerType(), obj->boundingbox_, simulationTime_, obj->speed_, obj->wheel_angle_, obj->wheel_rot_, &obj->pos_);
3. 在ScenarioPlayer的初始化函数中,当读取到--server参数时,会设置launch_server,在开启UDP的线程的地方,调用ScenarioEngine的SetEgoExternal即可。
if (launch_server)
{// Launch UDP server to receive external Ego stateStartServer(scenarioEngine);scenarioEngine->SetEgoExternal(true);
}