Apollo map模块地图、地图格式以及地图元素介绍

这篇具有很好参考价值的文章主要介绍了Apollo map模块地图、地图格式以及地图元素介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、map 生成流程

百度高精地图数据格式采用(XML)文件格式的数据组织方式,根据(XML)文件生成base_map.bin文件,进而生成routing_map和sin_map。工具的代码在modules/map/tools中,调用bazel-bin目录下的可执行文件。
• base_map是最完整的地图,包含所有道路和车道几何形状和标识。其他版本的地图均基于base_map生成。
• routing_map包含base_map中车道的拓扑结构,可以有以下命令生成:
dir_name=modules/map/data/demo # example map directory./scripts/generate_routing_topo_graph.sh --map_dir(src dir) ${dir_name}(des dir)
//该脚本是map模块中的tool工具的使用。在babel-bin下找到他的可执行文件

--------------------------------------应用举例

bash scripts/generate_routing_topo_graph.sh --map_dir=/apollo/modules/map/data/apollo_map /apollo/modules/map/data/apollo_map 

• sim_map是一个适用于Dreamview视觉可视化,基于base_map的轻量版本。减少了数据密度,以获得更好的运行时性能。可以由以下命令生成:

dir_name=modules/map/data/demo # example map directory
bazel-bin/modules/map/tools/sim_map_generator --map_dir=${dir_name} --output_dir=${dir_name}

--------------------------------------应用举例

bazel-bin/modules/map/tools/sim_map_generator 
--map_dir=/apollo/modules/map/data/apollo_map 
--output_dir=/apollo/modules/map/data/apollo_map

map tool工具使用
modules/map/tools/proto_map_generator.cc由XML文件生成.bin和.txt文件。

bazel-bin/modules/map/tools/proto_map_generator 
--map_dir=/apollo/modules/map/data/apollo_map_test  
--output_dir=/apollo/modules/map/data/apollo_map_test

modules/map/tools/map_tool.cc由生成的bin或者txt文件进行地图偏移,生成新的bin和txt文件。

 bazel-bin/modules/map/tools/map_tool --map_dir=/apollo/modules/map/data/apollo_map_test  --output_dir=/apollo/modules/map/data/apollo_map_test/offset

modules/map/tools/sim_map_generator.cc用于生成由dreamview前端显示的下采样地图的地图工具,也就是生成sim_map
modules/map/tools/quaternion_euler.cc四元数转欧拉角
modules/map/tools/map_xysl.cc车道点之间的相互转换,xy->sl 、sl->xy 或者xy->lane 等
modules/map/tools/refresh_default_end_way_point.cc假设在我们的终点的绝对值(x,y,z)仍然正确的情况下改变了通道信息。 然后我们可以在新地图上找到最近的点作为新的终点。
modules/map/tools/map_datachecker该文件还不知道能干啥,编译的时候缺少一个grpc的文件,grpc是一个谷歌开源库,是一种(Remote Procedure Call Protocol),需要把这个库安装一下才能使用.
安装方法:grpc c++ helloworld 例子 实例解析
------构建服务器

bazel build //modules/map/tools/map_datachecker/server:map_datachecker_server

------构建客户端

bazel build //modules/map/tools/map_datachecker/client:map_datachecker_client

二、map 介绍

Apollo地图格式对 OpenDRIVE 都有哪些改动,改动的原因或初衷是什么,改动有什么优势?
OpenDRIVE本身设计面向的应用是仿真器,自动驾驶需要更多的信息OpenDRIVE并没有完全提供,所以我们对OpenDRIVE的标准做了部分改动和扩展。
主要改动和扩展了以下几个方面:一是地图元素形状的表述方式。以车道边界为例,标准OpenDRIVE采用基于Reference Line的曲线方程和偏移的方式来表达边界形状,而Apollo OpenDrive采用绝对坐标序列的方式描述边界形状;**二是元素类型的扩展。**例如新增了对于禁停区、人行横道、减速带等元素的独立描述;**三是扩展了对于元素之间相互关系的描述。**比如新增了junction与junction内元素的关联关系等;除此之外还有一些配合无人驾驶算法的扩展,比如增加了车道中心线到真实道路边界的距离、停止线与红绿灯的关联关系等。改动和扩展后的规格在实现上更加的简单,同时也兼顾了无人驾驶的应用需求
Apollo地图规范
格式
百度高精地图数据格式采用(XML)文件格式的数据组织方式,是基于国际通用的OpenDrive规范,并根据百度自动驾驶业务需求拓展修改而成。
Apollo高精地图文件的整体结构如下所示:

坐标

百度高精地图坐标采用WGS84经纬度坐标表示。WGS84为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。

Status CoordinateConvertTool::CoordiateConvert(const double longitude,
                                               const double latitude,
                                               const double height_ellipsoid,
                                               double* utm_x, double* utm_y,
                                               double* utm_z) {
  CHECK_NOTNULL(utm_x);
  CHECK_NOTNULL(utm_y);
  CHECK_NOTNULL(utm_z);
  if (!pj_from_ || !pj_to_) {
    std::string err_msg = "no transform param";
    return Status(apollo::common::ErrorCode::HDMAP_DATA_ERROR, err_msg);
  }

  double gps_longitude = longitude;
  double gps_latitude = latitude;
  double gps_alt = height_ellipsoid;

  if (pj_is_latlong(pj_from_)) {
    gps_longitude *= DEG_TO_RAD;
    gps_latitude *= DEG_TO_RAD;
    gps_alt = height_ellipsoid;
  }

  if (0 != pj_transform(pj_from_, pj_to_, 1, 1, &gps_longitude, &gps_latitude,
                        &gps_alt)) {
    std::string err_msg = "fail to transform coordinate";
    return Status(apollo::common::ErrorCode::HDMAP_DATA_ERROR, err_msg);
  }

  if (pj_is_latlong(pj_to_)) {
    gps_longitude *= RAD_TO_DEG;
    gps_latitude *= RAD_TO_DEG;
  }

  *utm_x = gps_longitude;
  *utm_y = gps_latitude;
  *utm_z = gps_alt;

  return Status::OK();
}

车道

道路的reference line 存储在ID为0的车道中,其他车道只存储当前车道的一个边界。例如,reference line右侧的车道只存储车道的右侧边界。

车道 ID 的命名规则:
• lane section 内唯一
• 数值连续的
• reference line 所在 lane 的 ID 为 0
• reference line 左侧 lane 的 ID 向左侧依次递增 (正t轴方向)
• reference line 右侧 lane 的 ID 向右侧依次递减(负 t 轴方向)
• reference line 必须定义在 center 节点内
车道总数目没有限制。Reference line 自身必须为 Lane 0。
路口区域
基本的原理比较简单,路口区域用Junction结构表达。在Junction内,incoming Road通过Connecting Roads与out-going道路相连。下图展示了一个比较复杂的路口:

高精度地图在Apollo的存在形式
在Apollo发布的Docker镜像中,也包含了地图的部分。Apollo在启动时,你可以按照如下方式为启动的镜像挂载地图:
bash docker/scripts/dev_start.sh --map sunnyvale_big_loop
如果不指定挂载的地图,默认挂载以下地图:
• map_volume-sunnyvale_big_loop-latest
• map_volume-sunnyvale_loop-latest
[外链图片转存失败(img-ne26syyW-1568785146609)(。/images/map_sunnyvalue.jpg)]
一段道路的相关自动驾驶地图可以放置在如下结构的目录中:

sunnyvale_big_loop
├── background.jpg
├── background.png
├── base_map.bin
├── base_map.lb1
├── base_map.txt
├── base_map.xml               # Defined by FLAGS_base_map_filename
├── default_end_way_point.txt  # Defined by FLAGS_end_way_point_filename
├── grid_map
├── local_map
├── map.json
├── routing_map.bin            # Defined by FLAGS_routing_map_filename
├── routing_map.txt
├── sim_map.bin                # Defined by FLAGS_sim_map_filename
├── sim_map.txt
└── speed_control.pb.txt

可以将可用地图文件名指定为备选列表:
–base_map_filename=“base.xml|base.bin|base.txt”
然后Apollo会找到第一个可用的文件加载。一般来说,按照以下扩展顺序加载:
x.xml # An OpenDrive formatted map.
x.bin # A binary pb map.
x.txt # A text pb map.
base_map, routing_map和sim_map之间的差异
• base_map是最完整的地图,包含所有道路和车道几何形状和标识。其他版本的地图均基于base_map生成。
• routing_map包含base_map中车道的拓扑结构,可以有以下命令生成:
• dir_name=modules/map/data/demo # example map directory./scripts/generate_routing_topo_graph.sh --map_dir ${dir_name}
• //该脚本是map模块中的tool工具的使用。在babel-bin下找到他的可执行文件

• --------------------------------------应用举例

bash scripts/generate_routing_topo_graph.sh --map_dir=/apollo/modules/map/data/apollo_map /apollo/modules/map/data/apollo_map 


• sim_map是一个适用于Dreamview视觉可视化,基于base_map的轻量版本。减少了数据密度,以获得更好的运行时性能。可以由以下命令生成:

dir_name=modules/map/data/demo # example map directorybazel-bin/modules/map/tools/sim_map_generator --map_dir=${dir_name} --output_dir=${dir_name}


• --------------------------------------应用举例
• bazel-bin/modules/map/tools/sim_map_generator
• --map_dir=/apollo/modules/map/data/apollo_map
• --output_dir=/apollo/modules/map/data/apollo_map
高精地图在Apollo中的流转形式
xml格式的地图见modules/map/data/sunnyvale_big_loop/base_map.xml文件。那接下来我们就看下从XML解析到proto的过程。
XML解析为Proto
主要是由方法opendrive_adapter.cc中的以下方法解析并读取:

modules/map/hd_map/opendrive_adapter.cc
`OpendriveAdapter::LoadData(const std::string& filename,apollo::hdmap::Map* pb_map)`

解析的过程主要分为以下四个过程:
1、根目录
2、header
3、道路
4、路口
等节点的获取,具体的方法可以参考。
系统内格式
不管原始数据格式为什么,在Apollo内部的数据地图的格式为proto。以下为Apollo高精地图的对象定义:
modules/map/proto/map.proto
// This message defines how we project the ellipsoidal Earth surface to a plane.message Projection { // PROJ.4 setting: // "+proj=tmerc +lat_0={origin.lat} +lon_0={origin.lon} +k={scale_factor} +ellps=WGS84 +no_defs" optional string proj = 1;}message Header { optional bytes version = 1; optional bytes date = 2; optional Projection projection = 3;//坐标系转换 optional bytes district = 4; optional bytes generation = 5; optional bytes rev_major = 6; optional bytes rev_minor = 7; optional double left = 8; optional double top = 9; optional double right = 10; optional double bottom = 11; optional bytes vendor = 12;}message Map { optional Header header = 1; repeated Crosswalk crosswalk = 2;// 人行道 repeated Junction junction = 3;//路口区域 repeated Lane lane = 4;//车道 repeated StopSign stop_sign = 5;//停止线 repeated Signal signal = 6;//信号灯 repeated YieldSign yield = 7;//让路标志 repeated Overlap overlap = 8;//重叠区域 repeated ClearArea clear_area = 9;//禁停区域 repeated SpeedBump speed_bump = 10;//减速带 repeated Road road = 11;//道路}

其中重点介绍车道与路口部分。

如前文所述,Apollo高精度地图OpenDrive采用绝对坐标序列的方式描述边界形状,依次为基础生成直线或类似直线的对象:
modules/map/proto/map_geometry.proto
// Polygon, not necessary convex.message Polygon { repeated apollo.common.PointENU point = 1;}// Straight line segment.message LineSegment { repeated apollo.common.PointENU point = 1;}// Generalization of a line.message CurveSegment { oneof curve_type { LineSegment line_segment = 1; } optional double s = 6; // start position (s-coordinate) optional apollo.common.PointENU start_position = 7; optional double heading = 8; // start orientation optional double length = 9;}// An object similar to a line but that need not be straight.message Curve { repeated CurveSegment segment = 1;}

道路Road

modules/map/proto/mao_road.proto
message BoundaryEdge { optional Curve curve = 1; enum Type { UNKNOWN = 0; NORMAL = 1; LEFT_BOUNDARY = 2; RIGHT_BOUNDARY = 3; }; optional Type type = 2;}message BoundaryPolygon { repeated BoundaryEdge edge = 1;}// boundary with holesmessage RoadBoundary { optional BoundaryPolygon outer_polygon = 1; // if boundary without hole, hole is null repeated BoundaryPolygon hole = 2;}message RoadROIBoundary { optional Id id = 1; repeated RoadBoundary road_boundaries = 2;}// road section defines a road cross-section, At least one section must be defined in order to// use a road, If multiple road sections are defined, they must be listed in order along the roadmessage RoadSection { optional Id id = 1; // lanes contained in this section repeated Id lane_id = 2; // boundary of section optional RoadBoundary boundary = 3;}// The road is a collection of traffic elements, such as lanes, road boundary etc.// It provides general information about the road.message Road { optional Id id = 1; repeated RoadSection section = 2; // if lane road not in the junction, junction id is null. optional Id junction_id = 3;}

车道Lane

modules/map/proto/mao_lane.proto
message LaneBoundaryType { enum Type { UNKNOWN = 0; DOTTED_YELLOW = 1; DOTTED_WHITE = 2; SOLID_YELLOW = 3; SOLID_WHITE = 4; DOUBLE_YELLOW = 5; CURB = 6; }; // Offset relative to the starting point of boundary optional double s = 1; // support multiple types repeated Type types = 2;}message LaneBoundary { optional Curve curve = 1; optional double length = 2; // indicate whether the lane boundary exists in real world optional bool virtual = 3; // in ascending order of s repeated LaneBoundaryType boundary_type = 4;}// Association between central point to closest boundary.message LaneSampleAssociation { optional double s = 1; optional double width = 2;}// A lane is part of a roadway, that is designated for use by a single line of vehicles.// Most public roads (include highways) have more than two lanes.message Lane { optional Id id = 1; // Central lane as reference trajectory, not necessary to be the geometry central. optional Curve central_curve = 2; // Lane boundary curve. optional LaneBoundary left_boundary = 3; optional LaneBoundary right_boundary = 4; // in meters. optional double length = 5; // Speed limit of the lane, in meters per second. optional double speed_limit = 6; repeated Id overlap_id = 7; // All lanes can be driving into (or from). repeated Id predecessor_id = 8; repeated Id successor_id = 9; // Neighbor lanes on the same direction. repeated Id left_neighbor_forward_lane_id = 10; repeated Id right_neighbor_forward_lane_id = 11; enum LaneType { NONE = 1; CITY_DRIVING = 2; BIKING = 3; SIDEWALK = 4; PARKING = 5; }; optional LaneType type = 12; enum LaneTurn { NO_TURN = 1; LEFT_TURN = 2; RIGHT_TURN = 3; U_TURN = 4; }; optional LaneTurn turn = 13; repeated Id left_neighbor_reverse_lane_id = 14; repeated Id right_neighbor_reverse_lane_id = 15; optional Id junction_id = 16; // Association between central point to closest boundary. repeated LaneSampleAssociation left_sample = 17; repeated LaneSampleAssociation right_sample = 18; enum LaneDirection { FORWARD = 1; BACKWARD = 2; BIDIRECTION = 3; } optional LaneDirection direction = 19; // Association between central point to closest road boundary. repeated LaneSampleAssociation left_road_sample = 20; repeated LaneSampleAssociation right_road_sample = 21;}

路口Junction

对于路口区域的描述
modules/map/proto/map_junction.proto
// An junction is the junction at-grade of two or more roads crossing.message Junction { optional Id id = 1; optional Polygon polygon = 2; repeated Id overlap_id = 3;}
Proto格式地图的使用
这个时候的的地图格式,可以为Apollo中的多个模块,或者统一的方法所使用。

获取高精度地图元素

对地图的操作方法
有了原始从xml格式到protobuf的数据之后,就可以访问这些高精地图的元素,Apollo高精地图提供如下的方法获取元素:
提供高精地图元素获取的方法实现类:
apollo::hdmap::HDMapImpl,详见apollo::hdmap::HDMapImpl Class Reference
LoadMapFromFile (const std::string &map_filename) 从本地文件加载地图

GetLaneById (const Id &id) const
GetJunctionById (const Id &id) const
GetSignalById (const Id &id) const
GetCrosswalkById (const Id &id) const
GetStopSignById (const Id &id) const
GetYieldSignById (const Id &id) const
GetClearAreaById (const Id &id) const
GetSpeedBumpById (const Id &id) const
GetOverlapById (const Id &id) const
GetRoadById (const Id &id) const

// 在确定范围获取所有车道
GetLanes (const apollo::common::PointENU &point, double distance, std::vector< LaneInfoConstPtr > *lanes) const
// 在确定范围获取所有路口区域
GetJunctions (const apollo::common::PointENU &point, double distance, std::vector< JunctionInfoConstPtr > *junctions) const
// 在确定范围内获取所有人行道
GetCrosswalks (const apollo::common::PointENU &point, double distance, std::vector< CrosswalkInfoConstPtr > *crosswalks) const
// 获取确定范围的所有信号灯
GetSignals (const apollo::common::PointENU &point, double distance, std::vector< SignalInfoConstPtr > *signals) const
// 获取确定范围内的所有停止标识
GetStopSigns (const apollo::common::PointENU &point, double distance, std::vector< StopSignInfoConstPtr > *stop_signs) const
// 获取确定范围内的所有避让标识
GetYieldSigns (const apollo::common::PointENU &point, double distance, std::vector< YieldSignInfoConstPtr > *yield_signs) const
// 获取确定范围内的所有禁止停车标识
GetClearAreas (const apollo::common::PointENU &point, double distance, std::vector< ClearAreaInfoConstPtr > *clear_areas) const
// 获取确定范围内的所有减速带
GetSpeedBumps (const apollo::common::PointENU &point, double distance, std::vector< SpeedBumpInfoConstPtr > *speed_bumps) const
// 获取确定范围内的所有道路
GetRoads (const apollo::common::PointENU &point, double distance, std::vector< RoadInfoConstPtr > *roads) const
// 获取从目标点的最近车道
GetNearestLane (const apollo::common::PointENU &point, LaneInfoConstPtr *nearest_lane, double *nearest_s, double *nearest_l) const
// 判断车辆姿态,获取在一定范围内最近的车道
GetNearestLaneWithHeading (const apollo::common::PointENU &point, const double distance, const double central_heading, const double max_heading_difference, LaneInfoConstPtr *nearest_lane, double *nearest_s, double *nearest_l) const
// 判断车辆姿态,获取所有车道
GetLanesWithHeading (const apollo::common::PointENU &point, const double distance, const double central_heading, const double max_heading_difference, std::vector< LaneInfoConstPtr > *lanes) const

// 获取确定范围内的所有道路和路口边界
GetRoadBoundaries (const apollo::common::PointENU &point, double radius, std::vector< RoadROIBoundaryPtr > *road_boundaries, std::vector< JunctionBoundaryPtr > *junctions) const
// 如果有两个与一条停止线相关的信号,则在车道上的某个范围内前进最近的信号,返回两个信号。
GetForwardNearestSignalsOnLane (const apollo::common::PointENU &point, const double distance, std::vector< SignalInfoConstPtr > *signals) const
获取元素实例
modules/planning/reference_line/reference_line_provider.cc
bool ReferenceLineProvider::GetReferenceLinesFromRelativeMap(
const relative_map::MapMsg &relative_map,
std::list *reference_line,
std::listhdmap::RouteSegments *segments) {
if (relative_map.navigation_path_size() <= 0) {
return false;
}
auto *hdmap = HDMapUtil::BaseMapPtr();
for (const auto path_pair : relative_map.navigation_path()) {
const auto &lane_id = path_pair.first;
const auto &path_points = path_pair.second.path().path_point();
// 从高精地图中获取对应车道
auto lane_ptr = hdmap->GetLaneById(hdmap::MakeMapId(lane_id));
RouteSegments segment;
segment.emplace_back(lane_ptr, 0.0, lane_ptr->total_length());
segment.SetCanExit(true);
segment.SetId(lane_id);
segment.SetNextAction(routing::FORWARD);
segment.SetIsOnSegment(true);
segment.SetStopForDestination(false);
segment.SetPreviousAction(routing::FORWARD);
segments->emplace_back(segment);
std::vector ref_points;
for (const auto &path_point : path_points) {
ref_points.emplace_back(
MapPathPoint{Vec2d{path_point.x(), path_point.y()},
path_point.theta(),
LaneWaypoint(lane_ptr, path_point.s())},
path_point.kappa(), path_point.dkappa(), 0.0, 0.0);
}
reference_line->emplace_back(ref_points.begin(), ref_points.end());
}
return true;
}
使用其他地图

  1. 更改全局 flagfile: modules/common/data/global_flagfile.txt 这是所有模块的基本flag文件,保持了整体系统的统一。
  2. 作为flag标记传递,这样只影响单个进程:
    –map_dir=/path/to/your/map
  3. 覆盖模块所属的flag文件,生成位置:modules/**/conf/ * .conf明显地,这个文件也只影响单个模块:
    –flagfile=modules/common/data/global_flagfile.txt

–map_dir=/path/to/your/map
DreamView调用map流程
前端
Apollo map模块地图、地图格式以及地图元素介绍

后端
Apollo map模块地图、地图格式以及地图元素介绍

Apollo map模块地图、地图格式以及地图元素介绍
Apollo map模块地图、地图格式以及地图元素介绍文章来源地址https://www.toymoban.com/news/detail-479439.html

到了这里,关于Apollo map模块地图、地图格式以及地图元素介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uni-app开发小程序中遇到的map地图的点聚合以及polygon划分区域问题

    写一篇文章来记录以下我在开发小程序地图过程中遇到的两个小坑吧,一个是点聚合,用的是joinCluster这个指令,另一个是polygon在地图上划分多边形的问题: 1.首先说一下点聚合问题,由于之前没有做过小程序地图问题,所以浏览了很多资料,最终发现看的多了反而杂乱,而

    2024年02月11日
    浏览(55)
  • Visual Studio(2022)生成链接过程的.map映射文件以及.map映射文件的内容说明

    /MAP(生成映射文件) | Microsoft Learn         1. 右键项目属性, 连接器 - 常规 - 启用增量链接,设置为否。如下图:         2. 连接器 - 调试                 生成调试信息  设置为  生成调试信息 (/DEBUG)                 生成程序数据库文件  设置为 指定路径文件名,

    2024年02月10日
    浏览(55)
  • Ansible命令格式和常用模块介绍

    ansible [群组名] -m [模块名] -a [参数] command模块为默认模块,用于远程执行命令(命令模块) 使用command模块在远程主机中执行命令时,不会经过远程主机的shell处理,在使用command模块时,如果需要执行命令中的含\\\"\\\",\\\"\\\",\\\"|\\\",\\\"\\\"等特殊符号时,这些符号功能会失效 常用参数: command模块

    2024年01月19日
    浏览(40)
  • echarts geo3D结合map3D 生成可以点击获取省份信息跳转到相应省份 且地图显示省份名称

    先讲下需求: 1.地图上显示各个省份的名称 2.对不同省份进行区分(项目涉及到省份排名之类的); 3. 点击进入不同省份 展示各个省份的市区信息; 4. 在省份地图上添加marker ; 1.中国地图使用geo3d 和scatter3D做文字图层,用map3d实现点击可以获取省份信息,如果单独使用geo

    2024年02月16日
    浏览(62)
  • int[]数组转Integer[]、List、Map「结合leetcode:第414题 第三大的数、第169题 多数元素 介绍」

    输出: 众所周知,将普通数组转为List集合,可以通过JDK提供的诸多方法来减轻我们的编码负担,所以接下来小名借用两个leetcode题中的场景来分享下数组转集合的使用方法: 看到开头的 「int[ ]转Integer[ ]」 可能有的小伙伴并不知道什么情况会用。当然平日开发我们断然不会

    2024年02月14日
    浏览(50)
  • 宝塔Nginx环境安装pagespeed模块加速网站以及配置WebP格式图片加速(笔记)

    起因: 由于站点内很多本地图片每次打开要等很久于是就开始搜索相关内容 卡到了一个pagespeed这么一个模块而且折腾起来也比较简单所以就开始干活正式折腾。 正文: 首先我的环境是centos8+宝塔 【web环境lnmp(linux-ngingx-mysql-php)】 环境不一样的不要直接复制!!! 以下教

    2024年03月21日
    浏览(49)
  • 万兆以太网MAC设计(6)IP协议报文格式详解以及IP层模块设计

    参考:https://sunyunqiang.com/blog/ipv4_protocol_rfc791/这篇文章内容很丰富,建议看看 Version : 长度为 4 比特, 表征 IP 协议的版本号, 对 IPv4 来说该字段的值为 4 IHL : 长度为 4 比特, IHL 是 Internet Header Length 的缩写, 以 4 字节为单位指示 IP Header 的长度, 对于 IPv4 来说, Header 的最小长度为

    2024年04月28日
    浏览(43)
  • JSON格式介绍以及STM32串口通信JSON格式远程控制LED灯

    JSON(JavaScript Object Notation),即 JS对象简谱,是一种轻量级的数据格式。 它采用完全独立于编程语言的文本格式来存储和表示数据,语法简洁、层次结构清晰,易于人阅读和编写,同时也易于机器解析和生成,有效的提升了网络传输效率。 JSON 可以将 JavaScript 对象中表示的一

    2024年02月02日
    浏览(43)
  • 【Apollo学习笔记】—— Routing模块

    Apollo的routing模块读取高精地图原始信息,用于根据输入 RoutingRequest 信息在 base_map 中选取匹配最近的点作为导航轨迹的起点和终点,读取依据 base_map 生成的 routing_map 作为 topo_graph ,然后通过Astar算法在拓扑图中搜索连接起始点的最优路径 RoutingResponse ,作为输出发送出去。

    2024年02月15日
    浏览(41)
  • 毕设常用模块之舵机介绍以及使用方法

    舵机是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由接收机或者单片机发出信号给舵机,其内部有一个基准电路,产生周期为 20ms,宽度为 1.5ms 的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差

    2024年02月06日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包