讯飞线上赛总结(一)

科大讯飞线上赛赛后总结——Mapper Server

  (已经有好写日子没更新博客了,因为这段日子参加了科大讯飞智能车的线上比赛,3/20才结束,这次通过这次比赛收获颇丰,也充分地认识到自己的不足,接下来的几篇博客主要是自己参加比赛后的开始给自己疯狂补课的总结与大家分享一下,比赛方面的事情抽空会写两篇博客介绍一下。)
  这篇博客主要是介绍ros中mapserver工具的功能以及相关参数。

建图工具选取

  比赛最初使用了gmapping建图,建图效果也比较理想,在获取官方的一些指导后,我们还是采取的cartographer建图工具。由于整个建图过程是手动操控小车,在尽可能的去保证小车的运行速度和距离一致的情况,我们进行两种方法的对比实验。以下是gmapping和cartographer两种建图工具建图的效果。
在这里插入图片描述
  其中,图1是gmapping所建,图2是利用cartographer所建地图,图3是仿真环境实图。通过上图对比可以发现,cartographer建图效果要明显优于gmapping,虽说gmapping可以通过人手动操作来达到同样的建图效果,但是cartographer可以通过回环检测完全避免这种麻烦,cartographer建出来的地图的优越性也体现其他方面,如墙体等的厚度方面,cartographer建出的图更接近于实物,而且由于加入了回环检测环节,cartographer建出地图更加规则。

地图参数分析

   说完,建图工具的选择后,接下来分析建出的地图一些相关参数。
   首先我们需要了解到的是cartographer建图直接出来的地图格式是.pbstream格式的,而这个格式的地图在后续的导航中是无法使用的,所以我们需要更改地图的格式将其转换成.pgm和.yaml格式文件,安装上mapserver后即可将所建地图直接转换成相应的格式。
在这里插入图片描述
  在.pgm文件中主要是一个图片文件(如图)可直接点击打开。.yaml文件在描述了地图元数据的同时命名了图像文件,图像文件对占用数据进行编码(如图5)。
在这里插入图片描述
  图像文件以对应像素的颜色描述环境中每个单元格的占用状态。在标准配置中,更白的像素是空闲的,被占用的空间具有更黑的像素,中间颜色的像素表示未知。以实验中建的地图为例进行说明。
  image:包含占用数据的图像文件路径;可以是绝对路径也可是相对位置。
  resolution:地图的分辨率,单位是米/像素。
  origin:地图中左下角像素的二维姿态,为(x、y、yaw),偏航为逆时针旋转(偏航=0表示无旋转),系统的大部分目前忽略了偏航。
  occupied_thresh:大于此阈值的像素被视为完全占用。
  free_thresh:小于此阈值的像素被认为完全空闲的。
   negate:是否应该反转 白/黑 空闲/占用。
可选参数:
  mode可以有三个值之一:trinary、scale、raw。其中trinary是默认值
  当像素的color值X在[0-255]范围内时,我们需要将整数X转换为一个浮点数p,转换公式具体取决于negate标志的定义。若negate为0,则p=(255-X)/255.0,表示黑色(0)现在具有最高值(1.0)而白色(255)具有最低值(0.0);若negate为1,则p=X/255.0,这是图像的非标准解释。
trinary
  标准解释是三元解释,即解释所有值,使输出最终成为三个值之一。若p>occupied_thresh,则输出值100表示该单元格已被占用;若p<free_thresh,则输出值0表示单元格空闲的;否则输出-1 a.k.a. 255(作为无符号字符)表示单元格未知。
scale
  调整上述解释,以允许更多的输出值。在p>occupied_thresh和p<free_thresh时定义与trinary一致;在occupied_thresh<p<free_thresh时输出99*(p-free_thresh)/(occupied_thresh-free_thresh),这将允许输出范围为[0-100]的完整渐变值。
raw
  此模式将为每个像素点输出X,因此输出值为[0-255]。
  以上都是关于所建地图的参数分析,在实际应用中我们可以通过调整地图的参数值来优化建图的效果,这也将对后面导航时产生一定的影响。主要调整的参数是-occ和-free两个参数值,即occupied_thresh和free_thresh,-occ为无法通行的阈值,-free为可通行的阈值。若-occ过高,则有可能出现墙体边缘灰色未探知地;若-occ过低,则无墙体部分可能会被凭空建墙。若-free过高,则可能出现墙体被认为是自由通行区域;反之,则自由区域可能会出现灰色未探知地块。
在这里插入图片描述
  图6的-occ与-free分别是40和30,图7的-occ与-free分别是70和60,。通过两幅图的对比可以发现图6比图7更接近实际情况。因此,建好图后最好与实物核对一下,调整一下阈值以达到理想的效果减小对后面导航的影响。

线”在电子领域通常指种临时或非标准的电路连接方式,主要用于修复、调试或原型设计阶段。其核心特点是通过直接导线连接电路板上的焊点、元件引脚或接口,绕过原印刷电路板(PCB)的布线。以下是详细说明: ### **线的定义与用途** 1. **临时修复**:当PCB存在断路、设计缺陷或元件损坏时,线可快速恢复电路功能(如手机维修中修复断线)。 2. **原型调试**:在开发阶段,工程师可能用线临时连接未正式布线的信号,测试电路功能。 3. **信号引出**:将芯片内部信号引出到示波器等测试设备,便于调试。 4. **兼容性改造**:修改现有电路以适配不同元件(如更换CPU时线连接未兼容的引脚)。 ### **线的操作要点** - **材料选择**:常用漆包线、杜邦线或凯夫拉线,需根据电流、频率选择线径和绝缘材料。 - **焊接技巧**:需确保焊点牢固,避免虚焊或短路,必要时使用助焊剂。 - **路径规划**:线应尽量短且远离高频信号线,减少干扰。 - **固定与保护**:用热熔胶、UV胶或绝缘胶带固定线,防止振动导致断裂。 ### **线的风险与限制** 1. **可靠性低**:长期使用可能因振动、氧化导致接触不良。 2. **信号干扰**:长线可能引入噪声,影响高频或敏感电路。 3. **维护困难**:密集线会降低电路可读性,增加后续维修难度。 4. **不符合标准**:正式产品中线通常不被接受,需通过PCB改版解决。 ### **代码示例(模拟线逻辑)** ```python # 模拟线连接:将两个未直接连接的焊点通过“线”连通 class CircuitBoard: def __init__(self): self.connections = {} # 存储原始电路连接 self.fly_wires = {} # 存储线连接 def add_connection(self, point1, point2): """添加原始电路连接""" self.connections[(point1, point2)] = True self.connections[(point2, point1)] = True def add_fly_wire(self, point1, point2): """添加线连接""" self.fly_wires[(point1, point2)] = True self.fly_wires[(point2, point1)] = True print(f"线连接: {point1} <-> {point2}") def is_connected(self, point1, point2): """检查两点是否连通(原始连接或线)""" return (point1, point2) in self.connections or (point1, point2) in self.fly_wires # 使用示例 board = CircuitBoard() board.add_connection("U1_PIN1", "R1_PIN1") # 原始连接 board.add_fly_wire("R1_PIN2", "C1_PIN1") # 线连接 print(board.is_connected("U1_PIN1", "R1_PIN1")) # True(原始连接) print(board.is_connected("R1_PIN2", "C1_PIN1")) # True(线连接) print(board.is_connected("U1_PIN1", "C1_PIN1")) # False(无直接连接) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值