gl-opendrive插件(车俩3D仿真模拟自动驾驶)

该插件采用opendrive开源项目,结合Threejs和Webgl技术,实现了Vue前端框架的可视化展示。目前处于demo阶段,包括Vue版本的PC端展示和非Vue的安卓内嵌版本。主要功能有地图解析、道路追踪、全局路径规划、车辆三视图渲染、GPU颜色拾取等。开发中涉及了JavaScript、Vue、Echarts和多种坐标系的知识。
摘要由CSDN通过智能技术生成

简介

本插件基于免费opendrive开源插件、Threejs和Webgl三维技术、vue前端框架,blender开源建模工具等进行二次开发。该插件由本人独立开发以及负责,目前处于demo阶段,功能还需待完善,由于开发仓促代码还需优化。

两个版本:
1.vue版本pc端可视化展示
2.非vue版本支持内嵌到安卓,QT

因此,使用和阅读者需要具备 :

  • xodr文件格式
  • threejs三维渲染引擎
  • webgl三维协议以及相关着色器知识
  • 会使用blender,具备一定的建模基础
  • javaScript技术
  • vue框架
  • echarts数据可视化图表库
  • 熟悉各种坐标系,如 世界坐标系,st坐标系,uv坐标系,xyz惯性坐标系,物体坐标系,
  • 数学知识基础(极坐标,微分,向量)等
  • 离屏渲染思想、webgl着色器(vertexShader、fragmentShader)
  • glsl语法

OpenDriver源码版

该版本只展示高精地图,无任何功能

opendriver-源代码

https://www.alipan.com/s/AaB1nULGC6a

点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。

步骤:

1.使用idea或者eclipse打开java项目jsView并启动资源服务端
2.使用Hbuilder或者vscode打开目录opendrive


3.运行html

4.预览效果

核心功能

  • xodr文件解析
  • 地图渲染
  • 车辆三视图(算法优化)
  • 道路追踪
  • 全局路径规划展示
  • 自定义打点
  • 车辆运行
  • 车轮旋转
  • 鼠标定位(三维)
  • GPU颜色拾取
  • 支持远程或者本地数据文件加载
  • 其他

xodr文件解析

该功能由opendrive插件实现,具体的文件格式可查阅opendrive官方

或者推荐网址

自动驾驶场景仿真标准(一)- OpenDRIVE - 知乎

《OpenDRIVE1.6规格文档》1_opendrive官方文档-CSDN博客

《OpenDRIVE1.6规格文档》3_opendrive 1.6_YMWM_的博客-CSDN博客

道路追踪

利用离屏渲染技术以及定位功能实现

gpu拾取颜色获取车道ID

 //跟踪屏幕中间位置(近似跟踪车的位置)
        camera.setViewOffset(
          renderer.domElement.width, //画布的宽度
          renderer.domElement.height, //画布的高度
          renderer.domElement.width/2 | 0, //画布坐标系中,相机的x坐标位置
          renderer.domElement.height/2 | 0, //画布坐标系中,相机的y坐标位置
          1, //副相机的宽度
          1 //副相机的高度
        );
        //离屏渲染
        renderer.setRenderTarget(lane_picking_texture);
        renderer.render(lane_picking_scene, camera);

        renderer.setRenderTarget(roadmark_picking_texture);
        renderer.render(roadmark_picking_scene, camera);

        renderer.setRenderTarget(xyz_texture);
        renderer.render(xyz_scene, camera);

        renderer.setRenderTarget(st_texture);
        renderer.render(st_scene, camera);

        const lane_id_pixel_buffer = new Float32Array(4);
        //拾取颜色
        //console.log(mouse.x, window.innerHeight - mouse.y)
        renderer.readRenderTargetPixels(
          lane_picking_texture,
          0, //相机截图左上角为坐标原点,相对于截图左上角而言的渲染起始点x坐标
          0, //相机截图左上角为坐标原点,相对于截图左上角而言的渲染起始点y坐标
          1, //渲染宽度范围
          1, //渲染高度范围
          lane_id_pixel_buffer
        );

获取车道进行颜色渲染


        if (isValid(lane_id_pixel_buffer)) {
          //根据颜色值解码成车道ID
          const decoded_lane_id = decodeUInt32(lane_id_pixel_buffer);
          //自定义数据中获取所有车段中的所有车道数据
          const odr_lanes_mesh =
            road_network_mesh.userData.odr_road_network_mesh.lanes_mesh;
          //本次选中的区域车道ID是否和上次一样
          if (INTERSECTED_LANE_ID != decoded_lane_id) {
            //当前是否是初始化状态,如果不是则进行初始化,防止重复初始化
            if (INTERSECTED_LANE_ID != 0xffffffff) {
              //根据车道ID索引获取车道信息
              road_network_mesh.geometry.attributes.color.array.fill(
                COLORS.road
              );
            }

            //保存选中车道ID
            INTERSECTED_LANE_ID = decoded_lane_id;
            //根据车道ID获取车道信息
            const lane_vert_idx_interval =
              odr_lanes_mesh.get_idx_interval_lane(INTERSECTED_LANE_ID);
            //获取该车道长度
            const vert_count =
              lane_vert_idx_interval[1] - lane_vert_idx_interval[0];
            //修改离屏渲染场景中该车道的背景颜色
            applyVertexColors(
              road_network_mesh.geometry.attributes.color,
              new THREE.Color(COLORS.lane_highlight),
              lane_vert_idx_interval[0],
              vert_count
            );
            //手动更新颜色值
            road_network_mesh.geometry.attributes.color.needsUpdate = true;
            //显示左上角信息展示
            spotlight_info.style.display = "block";
          }
          //使用过后删除数据冗余,避免造成内存泄漏
          odr_lanes_mesh.delete();
        } else {
          //鼠标拾取无效色素

          //恢复初始化数据
          //当前是否已经是初始化状态如果不是则进行初始化
          if (INTERSECTED_LANE_ID != 0xffffffff) {
            const odr_lanes_mesh =
              road_network_mesh.userData.odr_road_network_mesh.lanes_mesh;
            const lane_vert_idx_interval =
              odr_lanes_mesh.get_idx_interval_lane(INTERSECTED_LANE_ID);
            road_network_mesh.geometry.attributes.color.array.fill(COLORS.road);
            road_network_mesh.geometry.attributes.color.needsUpdate = true;
            odr_lanes_mesh.delete();
            INTERSECTED_LANE_ID = 0xffffffff;
            spotlight_info.style.display = "none";
          }
        }

车辆三视图(算法优化)

优点:避免了点过于分散和间距过大造成的视图摇晃和颠簸问题

s:上一个点的位置

e:下一个点的位置

b:当前点的位置

a:摄像机的位置

正视图 

算法

 效果图

侧视图

算法

效果图:

 俯视图

效果图

 全局路径规划展示

 车轮旋转

非车辆原地不动,车轮旋转,地图动的方式(录制软件掉帧问题,效果不太明显)

三维定位

左上角webgl坐标

自定义打点 

点击开始打点,可在地图上进行自定义路径,点击启动,将展示路径和启动模型运行

中间红色线则为路线 

其他

转弯

 直行

变道

 

 全局鸟瞰图

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不穿铠甲的穿山甲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值