机器人操作系统ROS—入门
上次我们通过机器人操作系统ROS—初探了解了ROS的基本概念和运行机制,并用内置的小龟模拟器进行了测试。本文我们开始学习如何编写自定义的Service/Client节点进行指定msg格式通信、尝试bag的录制和回放、并简单了解下三维可视化。
一、创建ROS msg消息和srv服务格式
温习一下,上一次我们了解到topic里的Message、ROS Services概念:
消息(msg):
msg文件就是一个描述ROS中所使用消息类型的简单文本。它们会被用来生成不同语言的源代码。
机器人操作系统ROS—初探
一直听到ROS这个名字,很好奇它为什么在机器人领域这么出名,所以从今天起我将从零开始学习一下,看看它到底有哪些神奇之处。本文作为初探篇会先带大家了解ROS的基本概念,通过安装和创建/运行程序包了解Nodes节点、Topics/Msg、Service服务/参数服务器、几个常见的工具。
ROS (Robot Operating System, 机器人操作系统) 提供一系列程序库和工具以帮助软件开发者创建机器人应用软件。它提供了硬件抽象、设备驱动、库函数、可视化、消息传递和软件包管理等诸多功能。ROS遵守BSD开源许可协议。
ROS的官网:https://ros.org/
ROS 图(graph)概念:
-
Nodes:节点,一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信。
华硕ROG安装ubuntu18.4+CUDA10.0+CUDNN7.4
技术面试要点
一、面试基本要求
1.技术面试应关注技术能力和项目经验识别,多听、少说、多问;
2.面试过程中应树立公司技术专业、尊重他人的形象,避免不恰当的情绪和言词对公司造成负面影响;
3.技术面试禁止进行候选人的薪资沟通;
4.面试评价应避免个人主观喜好,客观公正的对候选人回答情况进行评估
5.面试过程必须有具体面试记录(提问问题+候选人回答要点总结),并在面试后同步到下一轮面试官;
二、各轮面试要点
每轮面试结束后,在面试群里简单同步下综合评价(技术水平、优点、不足),供下一轮面试官参考。
一面考核要点
代码能力 (类C语言/Java/脚本类/前端web相关/网络编程/多线程编程/数据库编程等) |
数据结构和算法 (对常用算法、数据结构的掌握程度,包括算法的原理和应用) |
专业知识 (人工智能/数据挖掘/信息检索/数学分析/统计建模) |
系统知识 (Linux系统/网络知识/操作系统/分布式计算/硬件等) |
项目经验 (项目本身的复杂程度,和公司的相关性,面试者在项目里面的职责,软件工程相关意识和能力等等) |
二面观察考核要点
技术基础、知识面综合评定 |
编程能力、算法能力综合评定 |
项目经验 (项目本身的复杂程度,和公司的相关性,面试者在项目里面的职责,软件工程相关意识和能力等等) |
系统设计能力、系统把握能力 |
逻辑思维能力 包括个人对于问题的分析、归纳、推理和判断等 |
沟通,交流以及表达能力 |
聪明程度、理解能力、反应速度、 |
主动性、学习能力、培养潜质 |
三面观察考核要点
项目经验 | 项目本身的复杂程度,和公司的相关性,面试者在项目里面的职责,软件工程相关意识和能力等 |
逻辑思维 | 思路清晰,对事件描述符合逻辑、严密、有条理;工作经验是否系统性全面 |
理解能力 学习能力 |
积极地获取与工作有关的信息和知识,并对其进行加工和理解,以不断更新知识结构、提高能力 |
主动性 | 工作积极主动,善于获得资源来解决问题。 |
责任心 | 回答问题诚实、负责,办事自信,对以往的工作负责 |
压力承受 | 有耐心、韧劲,在遇到批评、指责、压力或受到冲击时,能够克制、容忍、理智地对待 |
自我认知 进取心 |
能够客观、正确地评价自己的优势和不足,并努力改进 |
适应性 | 能够根据变化采取灵活的应对方式,达成目标 |
沟通协作 团队合作 |
能够有效倾听,清晰地表达自己的观点;愿意帮助或协助他人做事、喜欢集体活动,与周围人和谐相处 |
管理经验 | 管理项目或团队的时间、规模、跨度、绩效等 |
离职原因 | 是否入职后也存在相同的问题 |
如何防止客户端的请求被嗅探/钓鱼

本文主要讲解物联网设备、手机APP等client如何避免被嗅探/钓鱼。
一、正常场景
正常的4G请求经过dns域名解析后直接请求真实的服务器,目前4G/5G的直连通路通常都是比较安全的。
How to Learn—组块概论
终身学习中很重要的一点就是把旧的知识和新的知识串联起来,那么如何才能达到一边持续学习,一边又能不断把新旧知识串联起来呢?今天我们一起走进组块概论的学习,了解组块是什么,它是如何形成的,以及如何利用组块来提高学习效果,让学习时间更有价值。
1.组块
1.1 什么是组块
组块能把我们接触到的信息进行打包,让我更好的掌握。我们将学习到如何让自己形成组块,怎样运用它,来帮助我们理解各种学习材料,以及在考试中取得好的成绩。
还有关于学习某一技能或知识点的假象,误区。这是因为我们使用了错误的学习方法,同时骗过了自己,让自己以为自己在学习,其实只不过是在浪费时间。我会告诉你什么样的学习方法是无效,同时也会告诉你什么样的学习方法能帮助你更高效地学习。
当你第一眼看到一个全新的概念时,会感到很迷茫,就像一堆胡乱排放的拼图组件一样,如下左图:
而组块则是一种思考方式,帮助你整合信息。知识。如果你不理解一个概念,你就没有办法让这个概念和其他概念联系起来,而组块原理,像一个桥梁,帮你把新概念整合到旧概念里,形成如左图所示的知识结构。
高可用/高安全的物联网实时消息服务选型
目前全球进入人工智能、物联网、自动驾驶、5G的新一轮技术革命浪潮中,深度学习、强化学习技术使计算机在某些特定领域(例如人脸识别、AlphaZero)下实现了比人类更好的效果,物联网促进所有电子设备的互联互通,自动驾驶使汽车更加智能和安全,5G使万物互联成为可能。
很多新技术在现实中的落地应用都避免不了大量的消息实时通信,例如物联网或自动驾驶,要想实时的获取海量设备或车辆的信息并进行远程控制指令下发,频繁的断开连接是无法确保通信效率和可靠性的,尤其是自动驾驶v2x等场景,云端结合路灯、红绿灯、其他车辆的数据判定某辆车必须进行减速以避免事故时,指令下发的时效性和送达率将是致命的问题,另外还有网络信号不稳定、地库等特殊环境信号差等情况,本文将针对这些问题来研究和探讨如何构建一个支持弱网的高送达率、高时效性、高安全性、高传输效率的实时双向/多向消息传输服务。
如何使服务具备高可用性
上次介绍了《如何搭建高可用Web集群》,有不少同学反馈让我继续发些高可用相关的内容。本文将继续高可用系列内容,介绍一下SRE和架构师角度对『实现高可用性』的理解。
一、概述
可用性案例
在开始之前,先给大家看下可用性的badcase案例:
可用性问题后果
- 用户损失
–用户体验伤害
多源融合SLAM的现状与挑战
全国SLAM技术论坛由中国图象图形学学会CSIG主办,每年举办一届,邀请学术界和企业届的专家围绕SLAM技术的研究、发展以及产业化应用作技术分享。本文整理自浙江大学刘勇教授在第二届全国SLAM技术论坛中的报告。
刘勇,浙江大学智能系统与控制研究所教授,浙江大学求是青年学者,浙江省“新世纪151人才工程”第二层次培养人员,担任浙江省机器换人专家组专家。承担NSFC-浙江两化融合联合基金、国家自然科学基金青年和面上项目、科技部863重点项目子课题、浙江省杰出青年基金、工信部重大专项等国家级省部级项目多项。获得浙江省自然科学奖2017(一等奖),科学进步奖2013(一等奖)。主要研究方向包括:智能机器人系统、机器人感知与视觉、深度学习、大数据分析,多传感器融合等。
多源融合SLAM-现状与挑战
SLAM的定义比较经典,它的核心就是一个状态估计问题,根据传感器观测到的数据以及一些实际的模型,如何对这两者进行结合来准确估计实际情况。这个问题虽然在数学模型上比较简单,但是在实际过程中会面临很多的挑战以及不如意的实际现象。
首先的一个挑战就是landmark在实际应用中的复杂性(由于环境的复杂性引起);其次,由于sensor的不同,也会存在一些其他的问题。具体来讲,在纹理少、四季天气变化、光照剧烈变化、车载条件IMU退化、长走廊、机器人剧烈运动等情况下,原来很好用的SLAM方法在这些情况下往往会无用。这都是很棘手的场景,这些场景会给我们带来实际应用中的困惑,采用单一的传感器会面临这个问题,所以多源融合这个领域很热门,被产业界所认可。
如何搭建高可用Web集群

前段时间有同学问我一个高可用集群到底是怎么建设的,这是一个比较广泛的话题,首先要清楚到底什么叫『高可用集群』;其次,常见的集群又分很多种,例如WEB集群、DB集群、大数据集群等,他们既有相似的地方,又因应用场景不同导致集群架构设计上有所不同。本文先简要介绍下『一个典型的Web集群是如何从普通的单点服务一步一步演变为一个高可用集群的』。
相关名词
在开始之前,先简单明确几个基础名词概念:
- 分布式
–系统的多个模块部署在不同服务器上;或相同的模块部署在不同服务器上
基于VL-SLAM的无GPS自动驾驶系统研究
随着自动驾驶技术的发展,在未知环境中智能汽车的定位技术成为该领域研究的核心。目前定位技术主要的解决方案是基于全球定位系统(GPS),但是在某些特殊的环境中如下车库,没有 GPS 信号如何解决定位问题就是本文研究的关键所在。
近年来,同步定位与地图构建(Simultaneous Localization and Mapping,SLAM)技术的日益成熟,配合多传感器融合解决方案,自动驾驶车辆在未知环境无 GPS 信号的情况下,完成路径规划的自动驾驶任务得以实现。本文先介绍了自动驾驶系统概述、视觉激光融合的 SLAM 理论与算法,又基于 ROS 框架搭建了自动驾驶汽车的建图与路径规划仿真实验,最后完成了在地库中的实车算法验证实验,并做了论文结论总结与自动驾驶技术的未来展望。
1.自动驾驶系统概述
自动驾驶汽车即无人驾驶智能汽车,在没有人为参与的情况下,依靠车内的控制系统与智能算法,通过多重传感器数据融合控制汽车底层协议完成正常的车辆行驶功能。智能驾驶汽车是一个综合的集成系统,包括了自动泊车系统、自动驾驶系统、障碍物停障系统等,又分为了感知层、决策层和控制层三个部分如图 1 所示。
其中感知层包括各路传感器的数据采集、处理与融合等,更加精确和全面的感知周围环境信息。决策层的输入包括感知层的信息、路径的规划以及控制层反馈回来的数据,通过增强学习算法下发决策指令。决策指令包括了循迹、跟车、超车、刹车、转向、调头等等;最终通过控制层下发 CAN 总线下发指令完成智能驾驶汽车的自动驾驶任务,包括油门与刹车的控制、方向盘与挡位的控制等等。
自动驾驶汽车发展与研发中的核心技术是车辆线控技术和车辆精确定位技术。本论文主要分析车辆的精确定位,目前最常用的解决方法就是使用 GPS,可以让汽车实时地得到自身的位置坐标。本文则基于 SLAM 技术研究了一种新的定位方法。
结合 SLAM 技术,自动驾驶汽车的传感器分别由摄像头、激光雷达、车载毫米波雷达、车载超声波雷达、惯导组合、工业控制器等组成,具体的安装位置如图 2 所示。
小猪教你实施CA证书双向认证

CA单向认证常用于https数据传输加密,避免在传输过程中被嗅探和篡改。而CA双向认证则更多的用于高安全场景的身份识别,它为每个client签发的证书内包含了各client的身份(例如银行证书的用户身份证号、车辆证书的车架号等),server在client请求时双向认证对方的证书有效性,同时server从有效client公钥中提取对方身份并与请求参数中的身份进行对比检查,以完成client身份的安全鉴别。下边简单介绍下CA证书双向认证原理和实施方法。
一、CA双向认证原理
1.根证书公/私钥对、服务端证书、客户端证书之间的关系
2.双向认证原理
所谓证书双向认证是指:
- 服务端使用
ca.crt
校验客户端的client.crt
和client.key
- 客户端使用
ca.crt
校验服务端的server.crt
和server.key
mac顽固开机启动程序清理
系统里莫名其妙的自动启动一些东西,怎么才能禁止他们启动呢?本文梳理了下mac能实现开机启动的几个地方,大家要是发现还有别的途径欢迎留言反馈。
一、系统设置-用户与群组-用户-登录项
这个设置与用户有关,会随用户登录时运行,自己添加或删除即可。
二、Library .plist文件
检查以下6个目录中是否有.plist文件,发现有异常的.plist文件删除并重启电脑即可。
1. ~/Library/LaunchAgents/ – (当前用户开机启动进程)
2. ~/Library/LaunchDaemons/ – (当前用户守护进程)
3. /Library/LaunchAgents/ – (root管理员设置的任意用户开机启动进程)
4. /Library/LaunchDaemons/ – (root管理员设置的系统守护进程)
5. /System/Library/LaunchAgents/ – (Mac操作系统授权的用户开机启动进程)
6. /System/Library/LaunchDaemons/ – (Mac操作系统授权的系统守护进程)
7. /Library/Preferences/ – (当前用户设置的进程)
三、launchctl
打开命令行终端(Terminal)执行以下命令:
# 查看服务名
launchctl list | grep xxx
# 停止服务
launchctl stop com.xxx.xxx
# 移除服务
launchctl unload com.xxx.xxx
fis3—前端工程构建工具
FIS3 是面向前端的工程构建工具。解决前端工程中性能优化、资源加载(异步、同步、按需、预加载、依赖管理、合并、内嵌)、模块化开发、自动化工具、开发规范、代码部署等问题。
通俗点说,fis内置了less、sass、js /css/html-compress、mod.js、smarty、vue.js、angularjs等常用前端组件的开发库,使用简单的命令初始化项目,并通过简单的配置即可实现文件指纹、资源压缩、CssSprite图片合并、本地调试(通过配置模拟后端数据)、一键发布。
本文以fis3-smarty为例讲解如何快速实现一个前后端分离、组件化的前端工程。
使用openMVG+PMVS实现视觉三维重建
一、什么是视觉三维重建?
我们知道,照相机的原理是将一个三维场景投影到二维平面。所谓视觉三维重建,顾名思义就是从已有的二维图像中复原原始三维场景。
三维重建的原理大致如下:
- 首先,通过多角度拍摄或者从视频中提取得到一组图像序列,将这些图像序列作为三维重建系统的输入;
- 然后分析多个视角的图像,根据纹理特征提取出稀疏特征点(稀疏点云),通过这些特征点估计相机位置和参数;
- 在得到相机参数并完成特征点匹配后,就可以获得更稠密的点云(这些点可以附带颜色,从远处看就像还原了物体本身一样,但从近处能明显看出它们只是一些点);
- 最后根据这些点重建物体表面,并进行纹理映射,就还原出三维场景和物体了。
基于图像的三维重建基本流程
对比几个三维重建系统
本文简要介绍三维重建的基本流程,列举若干常见系统,给出项目和文档地址,比较它们的工作管线,为深入钻研系统结构作为铺垫。
三维重建概述
我们知道,照相机/摄像机的原理是将一个三维场景或物体投影到二维平面上,过去是胶片,现在是经过感光元件再记录到存储器。降维的过程通常不可避免地会存在信息的损失,而所谓的重建(Reconstruction),顾名思义就是要从获取到的二维图像中复原原始三维场景或物体。
相对照相机的诞生,三维重建的概念本身说年轻也算年轻;但相比从2012年开始比较火的深度学习、神经网络等概念,三维重建也算是古老的研究领域了,因为第一个基于图像的三维重建系统诞生于1992年(CMU的Tomasi等人的工作)。
三维重建的流程大致如下:首先,通过多角度拍摄或者从视频中提取得到一组图像序列,将这些图像序列作为整个系统的输入;随后,在多视角的图像中,根据纹理特征提取出稀疏特征点(称为点云),通过这些特征点估计相机位置和参数;在得到相机参数并完成特征点匹配后,我们就可以获得更稠密的点云(这些点可以附带颜色,从远处看就像还原了物体本身一样,但从近处能明显看出它们只是一些点);最后根据这些点重建物体表面,并进行纹理映射,就还原出三维场景和物体了。
概括起来就是:图像获取->特征匹配->深度估计->稀疏点云->相机参数估计->稠密点云->表面重建->纹理映射
目前已有不少免费系统(部分系统已开源)能够完成三维重建的整个流程,在深入研读某一个系统的代码之前,我决定先根据前人资料横向比较一下这些系统的异同。除了亲自运行了几个系统外,主要参考了这个视频的讲解(需要科学上网),以下内容的部分截图也出自这里。感谢视频原作者和以下每个系统的创造者。
现有系统简要对比
图中从左至右的过程依次是从原始图像到稀疏点云、重建稠密点云、重建表面和纹理映射。对应列的绿色代表该系统具备此功能,红色反之。
H.265(HEVC)—高压缩比的视频/图像压缩算法
数字视频的超高清潮流奔腾向前,帧率从30 fps向60fps、120fps甚至240fps进发,与此同时,物理媒介日薄西山,内容正通过有形无形的网络在世界各个角落的终端设备上传递。高度密集的数据给带宽和存储带来巨大挑战,当前主流的H.264开始不敷应用,而新一代视频编码标准H.265似乎成为了数字4K时代的“救世主”。
H.265又称为HEVC(全称High Efficiency Video Coding,高效率视频编码,本文统称为H.265),是ITU-T H.264/MPEG-4 AVC标准的继任者。2004年由ISO/IEC Moving Picture Experts Group(MPEG)和ITU-T Video Coding Experts Group(VCEG)作为ISO/IEC 23008-2 MPEG-H Part 2或称作ITU-T H.265开始制定。第一版的HEVC/H.265视频压缩标准在2013年4月13日被接受为国际电信联盟(ITU-T)的正式标准。
理论上H.265比H.264效率提高30-50%(尤其是在更高的分辨率情形下),但真的只是这么简单吗?
CA证书的单向认证、双向认证
单向认证
指的是只有一端校验证书合法性,通常都是client来校验服务器的合法性。
单向认证常用于https网站或后端api的数据传输加密,避免在传输过程中被嗅探和篡改。
1、客户端向服务端发送SSL协议版本号、加密算法种类、随机数等信息。
2、服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的证书,即公钥证书
3、客户端使用服务端返回的信息验证服务器的合法性,包括:
证书是否过期
发行服务器证书的CA是否可靠
返回的公钥是否能正确解开返回证书中的数字签名
服务器证书上的域名是否和服务器的实际域名相匹配
验证通过后,将继续进行通信,否则,终止通信
4、客户端向服务端发送自己所能支持的对称加密方案,供服务器端进行选择
5、服务器端在客户端提供的加密方案中选择加密程度最高的加密方式。
6、服务器将选择好的加密方案通过明文方式返回给客户端
7、客户端接收到服务端返回的加密方式后,使用该加密方式生成产生随机码,用作通信过程中对称加密的密钥,使用服务端返回的公钥进行加密,将加密后的随机码发送至服务器
8、服务器收到客户端返回的加密信息后,使用自己的私钥进行解密,获取对称加密密钥。 在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中信息的安全。
双向认证
指的是相互校验,服务器需要校验每个client,client也需要校验服务器。
双向认证常用于高安全场景的身份识别。为每个client签发的证书内包含了各client的身份(例如银行证书的用户身份证号、车辆证书的车架号等),server在client请求时双向认证对方的证书有效性,同时server从有效client公钥中提取对方身份并与请求参数中的身份进行对比检查,以完成client身份的安全鉴别。
1、客户端向服务端发送SSL协议版本号、加密算法种类、随机数等信息。
2、服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的证书,即公钥证书
3、客户端使用服务端返回的信息验证服务器的合法性,包括:
证书是否过期
发行服务器证书的CA是否可靠
返回的公钥是否能正确解开返回证书中的数字签名
服务器证书上的域名是否和服务器的实际域名相匹配
验证通过后,将继续进行通信,否则,终止通信
4、服务端要求客户端发送客户端的证书,客户端会将自己的证书发送至服务端
5、验证客户端的证书,通过验证后,会获得客户端的公钥
6、客户端向服务端发送自己所能支持的对称加密方案,供服务器端进行选择
7、服务器端在客户端提供的加密方案中选择加密程度最高的加密方式
8、将加密方案通过使用之前获取到的公钥进行加密,返回给客户端
9、客户端收到服务端返回的加密方案密文后,使用自己的私钥进行解密,获取具体加密方式,而后,产生该加密方式的随机码,用作加密过程中的密钥,使用之前从服务端证书中获取到的公钥进行加密后,发送给服务端
10、服务端收到客户端发送的消息后,使用自己的私钥进行解密,获取对称加密的密钥,在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中信息的安全。
摘自:https://blog.csdn.net/zl1zl2zl3/article/details/83716909
vue数组修改的渲染性能问题
<template>
<div class="moudle" v-for="v in list" :key="v.id">
<div class="btn" @click="show_more(v.id)"></div>
<div class="more" v-if="more[v.id]">这个更多显示反应有延迟</div>
<div class="content">{{v.name}}</div>
</div>
</template>
<script>
export default {
data() {
return {
list:[{'id':0,'name':'a'},{'id':1,'name':'b'},{'id':2,'name':'c'}],
more: [false,false,false]
}
},
methods: {
show_more(id) {
this.more[id] = true; //此处代码执行完毕约1s后页面才有反应
console.log('set done!');
}
},
}
</script>
可以看到,代码逻辑非常简单,通过console.log日志能看到点击瞬间就执行完毕了,但是延迟将近1s后more区域才显示,把v-if换成v-show没有变化,把more变量改为非数组变量就能正常瞬间显示。
经过反复测试,发现vue的虚拟dom渲染在数组组件更新的地方代码逻辑为:
vue/src/core/observer/index.js data数据会统一转为Observer类,之后的this.数组的修改会触发dependArray()函数遍历数组进行递归的ob转换和监听绑定。
解决方法一(推荐):用$set直接修改单个值,不会触发整个数组组件更新,又能响应式
show_more(id) {
//this.more[id] = true;
this.$set(this.more, id, true); //不会触发组件更新
}
解决方法二:用cost []的方式定义数据,在初次调用时慢,初始化以后就快了
<script>
const more = [false,false,false];
export default {
data() {
return {
list:[{'id':0,'name':'a'},{'id':1,'name':'b'},{'id':2,'name':'c'}],
more: more
}
},
methods: {
show_more(id) {
this.more[id] = true;
console.log('set done!');
}
},
}
</script>
yan 20.1.10
参考:https://juejin.im/post/5c0dec8be51d451dac076f76