我是靠谱客的博主 暴躁荷花,最近开发中收集的这篇文章主要介绍apollo_dreamview 学习笔记,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

dreamview 的readme.md介绍如下:

一、Introduction

Dreamview或Apollo的HMI模块提供了一个web应用程序,帮助开发人员可视化其他相关自主驾驶模块的输出,例如车辆的规划轨迹、车辆定位、底盘状态等。

二、Input

dreamview监视的消息如下:

1.定位,消息类型“LocalizationEstimate”, 消息定义文件“Localization/proto/Localization.proto",话题名称“/apollo/localizaton/pose";

2.底盘消息,消息类型"Chassis",消息定义文件“canbus/proto/Chassis.proto",话题名称“/apollo/canbus/chassis";

3.规划消息,消息类型“ADCTrajectory",消息定义文件”Planning/proto/Planning",话题名称“/apollo/planning";

4.监控消息,消息类型“MonitorMessage",消息定义文件"common/Monitor/proto/monitor.proto",话题名称”/apollo/monitor";

5.感知障碍结果,消息类型“PerceptionObstacles”,消息定义文件“perception/proto/perception_obstacle.proto",话题名称"/apollo/perception/obstacles";

6.预测结果,消息类型“PredictionObstacles",消息定义文件”prediction/proto/prediction_obstacle.proto",话题名称“/apollo/prediction";

7.路由寻径结果,消息类型“RoutingResponse",消息定义文件”/routing/proto/routing.proto",话题名称“/apollo/routing_response";

三、output

        在模拟世界中显示对监控消息进行基于web的动态3D渲染。

四、后端主文件:

modules/apollo/dreamview/main.cc

4.1.实例化Dreamview

apollo::dreamview::Dreamview dreamview; (构造函数采用默认构造函数)

4.2.执行dreamview Init()和Start();

4.2.1 dreamview.Init()

        VehicleConfigHelper::Init();

        定义options,初始化server_: 

        server_.reset(new CivetServer(options));

        server时CivetWeb的服务器,WebSocketHandler是用来处理和服务器的数据通信(发送和接收),这里这里注册了四个WebSocketHandler,分别为websocket_,map_ws,point_cloud_ws,camera_ws_        ,还有一个ImageHandler可以传输图像。

  websocket_.reset(new WebSocketHandler("SimWorld"));
  map_ws_.reset(new WebSocketHandler("Map"));
  point_cloud_ws_.reset(new WebSocketHandler("PointCloud"));
  camera_ws_.reset(new WebSocketHandler("Camera"));
  image_.reset(new ImageHandler());
   //增加handler
  server_->addWebSocketHandler("/websocket", *websocket_);
  server_->addWebSocketHandler("/map", *map_ws_);
  server_->addWebSocketHandler("/pointcloud", *point_cloud_ws_);
  server_->addWebSocketHandler("/camera", *camera_ws_);
  server_->addHandler("/image", *image_);

这几个handler只是用来发送/接收的一个接口,实际的执行在下面这几个线程中:

  std::unique_ptr<SimulationWorldUpdater> sim_world_updater_;
  std::unique_ptr<PointCloudUpdater> point_cloud_updater_;
  std::unique_ptr<HMI> hmi_;
  std::unique_ptr<PerceptionCameraUpdater> perception_camera_updater_;

对上面几个线程做解释:

//sim_world_updater_实例化
sim_world_updater_.reset(new SimulationWorldUpdater(
      websocket_.get(), map_ws_.get(), camera_ws_.get(), sim_control_.get(),
      map_service_.get(), perception_camera_updater_.get(),
      FLAGS_routing_from_file));
//实例化中用到了
//1. websocket_ 类型:WebSocketHandler
//2. map_ws_    类型:WebSocketHandler
//3. camera_ws_ 类型:WebSocketHandler
//4. sim_control_ 类型:SimControl 是一个单独的类(sim_control_.reset(new     
//   SimControl(map_service_.get()));)
//5. map_service_ 类型:MapService  是一个单独的类 (map_service_.reset(new 
//   MapService());)
//6. perception_camera_updater_: 类型PerceptionCameraUpdater 是一个单独的类 
//   (perception_camera_updater_.reset(
//   new PerceptionCameraUpdater(camera_ws_.get()));)
//7. FLAGS_routing_from_file,一个参数。目前没搞清什么意思
//point_cloud_updater_
//实例化
point_cloud_updater_.reset(
      new PointCloudUpdater(point_cloud_ws_.get(), sim_world_updater_.get()));
//1.point_cloud_ws_      类型:WebSocketHandler
//2. sim_world_updater_  类型:SimulationWorldUpdater

//hmi_
//实例化
//hmi_.reset(new HMI(websocket_.get(), map_service_.get()));
//1.websocket_   类型:WebSocketHandler
//2.map_service_ 类型:MapService (map_service_.reset(new MapService());)
perception_camera_updater_
//实例化
perception_camera_updater_.reset(
      new PerceptionCameraUpdater(camera_ws_.get()));
//1.camera_ws_ 类型:WebSocketHandler

从构造函数可以看出,这四个线程中调用了一些服务,如地图服务等,同时四个线程之间也会存在相互调用。但是数据接口一定要搞清楚。

      根据FLAGS_dreamview_profiling_mode,确定是否启用exit_timer_, 参数默认为false.所以并没有启用exit_timer_。

4.2.1.1dreamview的后台服务器使用的是CivetServer后台服务框架

CivetServer

GitHub - civetweb/civetweb: Embedded C/C++ web server

DreamView数据通信机制 - 灰信网(软件开发博客聚合)

 4.2.2 dreamview.Start()       

Status Dreamview::Start() {
  sim_world_updater_->Start();
  point_cloud_updater_->Start();
  hmi_->Start();
  perception_camera_updater_->Start();
#if WITH_TELEOP == 1
  teleop_->Start();
#endif
  return Status::OK();
}

        然后就是执行start函数,启动四个线程。这就是dreamview后端的一个启动流程。

下一篇记录以下上面四个线程

增加一个内容看到的一个链接,详细讲解dreamview

百度安全验证        

最后

以上就是暴躁荷花为你收集整理的apollo_dreamview 学习笔记的全部内容,希望文章能够帮你解决apollo_dreamview 学习笔记所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部