本文做者:Apollo開發者社區算法
簡介ide
咱們經過本文將向開發者闡述如何向Apollo中添加新的車輛。this
注意: Apollo控制算法將林肯MKZ配置爲默認車輛
spa
添加新的車輛時,若是您的車輛須要不一樣於Apollo控制算法提供的屬性,請參考:code
使用適合您的車輛的其它控制算法。繼承
修改現有算法的參數以得到更好的結果。開發
添加新車輛的步驟get
按照如下步驟以實現新車輛的添加:it
實現新的車輛控制器io
實現新的消息管理器
實現新的車輛工廠
註冊新的車輛
更新配置文件
1、實現新的車輛控制器
新的車輛控制器是從 VehicleController
類繼承的。 下面提供了一個頭文件示例:
/** * @class NewVehicleController * * @brief this class implements the vehicle controller for a new vehicle. */ class NewVehicleController final : public VehicleController { public: /** * @brief initialize the new vehicle controller. * @return init error_code */ ::apollo::common::ErrorCode Init( const VehicleParameter& params, CanSender* const can_sender, MessageManager* const message_manager) override; /** * @brief start the new vehicle controller. * @return true if successfully started. */ bool Start() override; /** * @brief stop the new vehicle controller. */ void Stop() override; /** * @brief calculate and return the chassis. * @returns a copy of chassis. Use copy here to avoid multi-thread issues. */ Chassis chassis() override; // more functions implemented here ... };
2、實現新的消息管理器
新的消息管理器是從 MessageManager
類繼承的。 下面提供了一個頭文件示例。
/** * @class NewVehicleMessageManager * * @brief implementation of MessageManager for the new vehicle */ class NewVehicleMessageManager : public MessageManager { public: /** * @brief construct a lincoln message manager. protocol data for send and * receive are added in the construction. */ NewVehicleMessageManager(); virtual ~NewVehicleMessageManager(); // define more functions here. ... };
3、實施新的車輛工廠
新的車輛工廠是從 AbstractVehicleFactory
類繼承的。下面提供了一個頭文件示例。
/** * @class NewVehicleFactory * * @brief this class is inherited from AbstractVehicleFactory. It can be used to * create controller and message manager for lincoln vehicle. */ class NewVehicleFactory : public AbstractVehicleFactory { public: /** * @brief destructor */ virtual ~NewVehicleFactory() = default; /** * @brief create lincoln vehicle controller * @returns a unique_ptr that points to the created controller */ std::unique_ptr<VehicleController> CreateVehicleController() override; /** * @brief create lincoln message manager * @returns a unique_ptr that points to the created message manager */ std::unique_ptr<MessageManager> CreateMessageManager() override; };
一個.cc
示例文件以下:
std::unique_ptr<VehicleController> NewVehicleFactory::CreateVehicleController() { return std::unique_ptr<VehicleController>(new lincoln::LincolnController()); } std::unique_ptr<MessageManager> NewVehicleFactory::CreateMessageManager() { return std::unique_ptr<MessageManager>(new lincoln::LincolnMessageManager()); }
Apollo提供能夠用於實現新車輛協議的基類 ProtocolData
。
4、註冊新的車輛
在modules/canbus/vehicle/vehicle_factory.cc
裏註冊新的車輛。 下面提供了一個頭文件示例。
void VehicleFactory::RegisterVehicleFactory() { Register(VehicleParameter::LINCOLN_MKZ, []() -> AbstractVehicleFactory* { return new LincolnVehicleFactory(); }); // register the new vehicle here. Register(VehicleParameter::NEW_VEHICLE_BRAND, []() -> AbstractVehicleFactory* { return new NewVehicleFactory(); }); }
5、更新配置文件
在 modules/canbus/conf/canbus_conf.pb.txt
中更新配置,在Apollo系統中激活車輛。
vehicle_parameter { brand: NEW_VEHICLE_BRAND // put other parameters below ... }