996.ICU
一位保守党政客讲得再清楚不过,穷人全都“必须要不断地吃,不断地喝,不断地工作,不断地死去”。
有的项目要求一个 commit 必须包含完整的功能,但在开发时通常会提交很多细粒度的 commit,比如 add test
clean code
等。这种情况下可以使用 git squash
将多个 commit 压缩,得到干净的主分支。
1 | git merge --squash tmp |
squash 的优点是可以得到简洁的 commit 记录,但缺失详细的 commit 记录会对后面 debug 造成一些影响。
比如,使用FastDDS后,我一直在调试一个无法重连的bug,通过 log 可以定位到这个 bug 是在一次 2000 行的 commit 引入的。如果现在开始读这两千行代码肯定会浪费很多时间。
现在要借助 github,在 pull request 页面可以找到详细的 23 个 commit 记录,并定位到引入 bug 的 commit:
为了防止这个 commit 不完整,我们需要手动下载引入 bug 的代码,和引入 bug 之前的代码,分别做一次回归测试。(手动下载代码的原因是,这些 commit ID 不在 git repo 里,无法 checkout)
在 master 里改完 bug 以后,为了防止引入新 bug,别忘了跑回归测试。
刚开始用 FastDDS 的时候就发现这个问题,原以为是共享内存 deadlock 了,于是就有了前面关于 boost 鲁棒锁的那篇帖子。但问题并没有这么简单 >_<
对 FastDDS 程序进行 debug 时,将 subscriber 暂停,等一会再重启,subscriber将无法再次接收数据。Publisher / Subscriber 的日志如下
1 | Publisher |
1 | Subscriber |
详细复现过程记录在 eProsima/Fast-DDS#2811
查看 log 对应的代码,最后定位到可能出现问题的 commit 在 eProsima/Fast-DDS@e58dcb1。
这个 commit 是 Pull Request 时将几十个 commit squash 在一起的[链接]。squash 前的 commit 在 github 可以查看,但用 git 命令是无法 checkout 的,所以手动下载了一堆源码编译,二分查找了一下,最后定位在下面这个 commit:
Refs #8250. Do not reuse zombie ports structures.
@adolfomarver authored and @MiguelCompany committed on May 12, 2020
问题看起来像是 Subscriber 拒绝复用 zombie ports,但又没申请新的 port.
注释了几行代码,可以暂时避免这个问题,参考 duchengyao@Fast-DDS/commit/63ad668
Boost
是一个开源 C++ 算法库,是官方认证的对标准 C++ 的扩充(有点类似 python 的 anaconda)。C++ 15 / 17 等新版本有很多特性也会参考 boost 库;boost:Interprocess
实现了进程间通信功能,包括共享内存、内存映射文件、信号量、文件锁、消息队列等;共享内存
指可被多个进程存取的内存,被用作进程间的通信。boost::interprocess 在 1.78 版本之前如果进程崩溃可能导致死锁。从18年就有人提出这个issue,21年才修复。
最简单的复现方法是执行三遍下面的代码:
1 | #include "boost/interprocess/managed_shared_memory.hpp" |
terminate called after throwing an instance of 'boost::interprocess::interprocess_exception'
what(): boost::interprocess_exception::library_error
terminate called after throwing an instance of 'boost::interprocess::lock_exception'
what(): boost::interprocess::lock_exception
原因在这几行,如果不想更新boost,改那几行也可以。
如果编译器支持 _POSIX_C_SOURCE >= 200809L
,在构造锁的时候判断 pthread_mutexattr_setrobust(&m_attr, PTHREAD_MUTEX_ROBUST) != 0
。
pthread_mutexattr_setrobust 的说明在这里
FastDDS 新推出的零拷贝 (Zero Copy) 模式有很多难以理解的地方,在这里会持续做些整理。
目录
subscriber
和 publisher
会使用同一个内存地址,为什么打印出来的地址不同?qos.history().depth
与 qos.resource_limits().max_samples/extra_samples
什么关系?目前使用 apt-mirror 会缺少文件,比如:
1 | Err:18 http://mymirror.blah:80/ubuntu bionic/main DEP-11 64x64@2 Icons 404 Not Found [IP: *.*.*.* 80] |
需要使用下面的脚本修复。
上一篇文章吐槽了
创想三维 Sermoon V1
的缺点,其中包括不开源的主板。我花了几天时间逆向,得到了主板的配置文件。
使用此配置文件可以自行编译固件:开启 Lineradvance、加入 BLTouch 自动调平、降低待机时风扇的噪声。
新的配置文件在 Klipper3d/klipper#5621
官方已经开源了 CrealityOfficial/Sermoon-V1另外,文章最后提供一个散热套件的模型。
阿尔法罗密欧的四叶草(Quadrifoglio)版本具有 Race 模式,在此模式下打开双模式排气,停用 ESC 稳定控制系统,同时提高油门、变速箱、制动和转向响应。
在普通版本的阿尔法罗密欧中,可以通过修改 Body Control Module(BCM) 的配置文件来启动隐藏的 Race 模式。
通常,改装 Race 模式的方法是去闲鱼购买一个四叶草版本的 DNA 开关(¥1100),远程开启隐藏功能(¥500)。这篇文章教你零成本开启此功能。
ROS 和前期的 Apollo 定义了一个 API,它向用户公开如
发布
/订阅
等通信概念。
这些通信概念的实现基于自定义协议,并使用共享内存去降低基于Socket通信的开销。
这些传统方法存在一些问题,如每个节点以单独进程的形式存在,由底层操作系统调度,而Linux是个通用系统,每个节点的运行顺序并无任何逻辑。ROS是专用系统,任务应按照一定的业务逻辑执行。
ROS 2
和 Apollo 3
的计算框架 Cyber RT
构建在现有中间件解决方案 DDS
之上 [1] [2]
Cyber RT
在此基础上构建了自己的调度器 [3],由一个多队列的任务编排策略
调度协程(Coroutine)在 Native Thread 上有序运行。其中,Cyber RT 会动态的根据不同调度顺序的执行时间来动态的选择一个时间最短的调度策略。
调整吉他之前请换一套新琴弦,并在每一步调整完毕后给吉他重新调音。
之前使用的 valine 评论工具有一些漏洞会导致隐私泄漏和XSS攻击,比如
这个
,目前更换为 utteranc ,一个基于 github 的评论工具,之前的评论内容正在努力迁移中...
阅读了几篇关于 Chatbot 的综述、文档,Rasa 的介绍。另外,调研了一些大厂的 Chatbot 框架,包括Google 的 Dialogflow, Microsoft Bot, AWS LEX, 阿里小蜜;和开源超过 1k stars 的框架,包括 Rasa, OpenNLU, ParlAI, ChatterBot, ai-chatbot-framework。
去年把全景拼接算法部署到了郑州机场,实现 4×4K 视频采集、拼接、发布,在单个 1080ti 上可以达到 300FPS。
因为机场光照特别强烈,使用的廉价摄像头曝光不均匀。表现为每张图片都是中间曝光强,四周曝光弱,拼接以后在接缝处会出现条纹(下图)。因为摄像头上半部分是天空,我们假设天空的亮度、颜色是统一的,可以设计一个很简单的算法解决亮度不均匀的问题。
机脚(发动机支架)负责在车架上固定和稳定发动机。为了减少发动机产生的振动,包含一个弹性的缓冲胶(机脚胶),给驾驶员创造一个更平稳,更愉快的旅程。另外,底座在发动机和车身之间起到弹簧的作用,减少了发动机的磨损。此外,发动机的噪音也会降低。随着发动机支座的磨损,通过车辆感觉到的振动量将开始增加。
原厂机脚和底盘摆臂链接件通常是橡胶材料,某些厂家为赛车提供了聚氨酯材料的缓冲胶。橡胶和聚氨酯由于其优异的可逆弹性变形性能和良好的阻尼和能量吸收特性,在许多汽车应用中得到应用。这两种类型的支架各有优缺点,我们将在下面讨论。
Initialize:
1 | import tensorflow as tf |
Work:
1 | model = tf.saved_model.load(dir) |
1 | model = tf.saved_model.load(dir) |
Failed:
1 | model = tf.saved_model.load(dir).signatures['serving_default'] |
1 | tensorflow.python.framework.errors_impl.FailedPreconditionError: Error while reading resource variable conv5_block17_0_bn/gamma_96932 from Container: localhost. This could mean that the variable was uninitialized. Not found: Resource localhost/conv5_block17_0_bn/gamma_96932/N10tensorflow3VarE does not exist. |
User | interview | agreeableness | conscientiousness | extraversion | neuroticism | openness |
---|---|---|---|---|---|---|
heysky | 0.920916 | 0.913731 | 0.919769 | 0.921289 | 0.914613 | 0.917014 |
hershd23 | 0.9180 | 0.9111 | 0.9153 | 0.9150 | 0.9100 | 0.9102 |
baseline | 0.916202 | 0.91123 | 0.915228 | 0.91122 | 0.910378 | 0.911123 |
bekhouche | 0.915746 | 0.910312 | 0.913775 | 0.91551 | 0.908297 | 0.910078 |
*MS1997 | 0.9047 | 0.9075 | 0.9066 | 0.9030 | 0.9018 | 0.9046 |
go2chayan | 0.901859 | 0.903216 | 0.894914 | 0.90266 | 0.901147 | 0.904709 |
azzasama | 0.872129 | 0.891004 | 0.865975 | 0.878842 | 0.863237 | 0.874761 |
Nano 的4G内存太小了(最近还出来一个2G版nano >_<),模型跑不动的患者可以通过以下几个步骤减少内存消耗。
1. 关闭用户图形界面
sudo systemctl set-default multi-user.target
sudo reboot
开启用户图形界面
sudo systemctl set-default graphical.target
sudo reboot
2. 切换图形界面
默认图形界面为Unity,Ubuntu 18 系统自带Gnome3,可切换到 lxde 以节约内存。
3. 关闭 dockerd 节约 49M
Give an image, the task is to generate natural Question based on the image.
keras hdf5 –> .pb
1 | # V2 behaviour is disabled by default in Jetpack 4.4.DP. |
自然交互
:更接近与人之间的交互方式。 PC:键盘鼠标;移动:触控;现在:语音、手势、图像。云端一体
:场景智能
:主动感知、用户理解、个性化推荐、智能决策。5G加速智联网时代的到来,多模态数据成为主流
电阻屏=>电容屏:流量从PC时代走向移动时代
多模态自然交互:移动时代走向智联网时代
1976
发现麦格克效应2015
200 citation–>3000+ citation. 有代表的论文 VQA: Visual Question Answering (ICCV 2015)2016
多个大型多模态数据集发表 (Youtube8m, audioset)2017
VoxCeleb 发布(多模态自然人识别数据集)2018
视觉语音降噪,虚拟人合成技术![]() |
![]() |
![]() |
![]() |
---|---|---|---|
input image | piece-wise planar segmentation | reconstructed depthmap | texture-mapped 3D model |
Velodyne 通过网线发送的原始数据包为球坐标(spherical coordinates, r, ω, α)。它的 ros driver 提供了两种更方便的格式:/velodyne_points
和/velodyne_scan
其中,/velodyne_points
是转换为XYZ后的坐标,转换的方式如下图;/velodyne_scan
为第8根线的scan值(可直接用来模拟单线雷达)。
目前我成功的有两种方法:
autoware_camera_lidar_calibrator
: 不需要自制标定板,需要手动人工点击9个点velo2cam_calibration
: 全自动,需要定制一个标定板