实习日志
考研完到杭州迈睿机器人公司实习了一个月,感觉收获不少,学到了很多工程相关的经验,之前对大型工程没有什么概念,有无从下手的感觉,现在经过一个月的实习,大致对实际的开发流程有了了解。
这一个月的实习中,我基本上了解了MRTA的全部内容,并重写了一个利用最小费用最大流原理的算法取代了原本的匈牙利算法,测试小车数大于30辆时可以缩短时间10倍。然后基本了解了MRPP中的路径规划,学会了A*算法,交通管理没怎么看懂。给公司解决了实际应用下小车倒车以及出入库的近远端终点选择。
经过了一个月的实习,我了解了前端和底层数据可以通过JSON交互数据,这样可以实现JS做web的UI,C++实现底层的调度,再利用JAVA实现后端和有关数据库的整个软件系统的实现。并且认识到了设计模式和重构的重要性。
11:38 2018/12/28 到公司,安装环境
13:21 2018/12/28 看MRTA代码
8:38 2018/12/29 看MRTA代码
9:55 2018/12/29 利用#define和#ifdef进行注释开关
8:59 2019/1/2 学习了静态库和动态库的使用
13:38 2019/1/2 用匈牙利算法解决指派问题的理论搞懂
20:27 2019/1/2 最小费用最大流代码(spfa)写完
15:59 2019/1/3 最小费用最大流调试完成,但是发现比原本的匈牙利算法慢1.5倍
20:36 2019/1/3 发现主要问题应该是内存分配慢,原本的都是一开始分一个整体内存,我自己写的是每次用malloc
8:36 2019/1/4 内存问题解决,发现快了1/5,但是还是比匈牙利慢一倍
10:07 2019/1/4 已知最小费用最大流采用原始对偶法+dijkstra可以快一些,网上给的测试是spfa的1/3.3,尝试重写
16:31 2019/1/4 写出来发现比用spfa还慢,可能是因为本身负权比较少,这种算法不适用二分图最佳匹配
17:35 2019/1/4 还剩一个km算法可以选择,时间复杂度是O(n^3),需要递归,排除
9:40 2019/1/5 将工作的车辆数提高到100以上时,发现最小费用最大流的性能大约是匈牙利的20倍,原本测试7台车辆时两者差距不大,也就1倍;也就是当工作量小时两者差距不大,但工作量大时最小费用最大流优势很大
10:15 2019/1/5 开始考虑如何将已经到的那些车辆考虑进去
9:37 2019/1/7 vs调试学习
10:12 2019/1/7 看整个工程中的调度代码
11:09 2019/1/7 C++11中,用emplace_back()取代push_back(),有效率上的提升
13:34 2019/1/7 工程使用最小费用最大流静态库小车会停止,查找原因
16:57 2019/1/7 找到原因:最小费用最大流未考虑空闲车为0的情况
17:37 2019/1/7 |=是位或,用于实现能力集
8:29 2019/1/8 当小车个数比较小的时候最小费用最大流出现内存占用错误,查找到原因是head中总边数分配过少导致初始化有问题
9:34 2019/1/8 测试3辆小车时调度没有问题
9:49 2019/1/8 会出现小车不跑到最近的工作台而是跑到较远处的原因是排队时延,原本的20过大,改为5就会好很多
1:29 2019/1/8 看RCS中整合的调度代码
19:51 2019/1/8 6辆小车分别测试匈牙利和最小费用最大流,结果差不多,都会出现一些调度问题
19:56 2019/1/8 详细测试匈牙利和最小费用最大流,当车辆*工作台数量>300时,最小费用最大流就占优,整体来说用最小费用最大流比较合适
9:10 2019/1/9 想法:在死锁的情况下重新分配,下位机改变不了,只能更改上位机->实现不了
10:23 2019/1/9 virtual:C++中的虚函数,特点是动态链编,可以根据指针类型判断调用的是基类还是继承类中的函数
override:表示当前函数重写了基类的虚函数
explicit:防止类构造函数函数的隐式转换,比如A=14,防止自动把14看成一个类
typename:模板中说明T::bar是一个类型而不是变量
13:49 2019/1/9 上位机MRPP也是利用线程,不会线程,学一下
14:51 2019/1/9 基本的线程学习完成
16:31 2019/1/9 MRPP和MRTA都是利用分配线程,循环调用函数得到,MRTA已经没办法更改,MRPP是下位机静态库代码看不到,所以只能想办法更改上位机中使用MRPP的函数
19:55 2019/1/9 学习C++中的单例模式和工厂模式,单例模式可以使类所存储的数据都存放在一个单例中,这样就不用每次使用都new一个对象
10:49 2019/1/10 工厂模式可以使用户只需知道工厂子类,传递所需类型就能得到具体的产品,每次使用不同的子类时不需要知道具体用哪一个子类而是只需要知道类型号即可
13:52 2019/1/10 新需求:当储位和工作区之间存在障碍物时,因为简单使用曼哈顿距离,导致绕开障碍物后的优先去中间位置而不是边上位置的工作区。
14:12 2019/1/10 想法1:障碍可以作为不可行的申请输入,先将所有申请的坐标建立矩阵,筛去那些上下左右旁边都有申请的中心点,策略是优先取外围,矩阵不行,
19:12 2019/1/10 初步修改完,写测试函数
20:23 2019/1/10 测试函数完成,基本测试完成,明天使用模拟器跑
8:51 2019/1/11 画图测试,车辆停止
11:05 2019/1/11 更改代码,更加完善
13:43 2019/1/11 模拟测试,小车乱跑
9:30 2019/1/14 模拟测试,任务接收成功但是没有分配
10:28 2019/1/14 查找出原因是配置文件没有设对,现已经可以正确执行任务
11:08 2019/1/14 出库入库的逻辑搞懂
15:05 2019/1/14 自画图验证,将筛选逻辑改为一行一列中所有中间的都筛去
15:38 2019/1/14 检验出一个bug,修改
15:46 2019/1/14 需求基本达成,但会有一个问题:出发点离上方道路不能过远,否则会选择最下方的点
17:34 2019/1/14 为了克服该问题,必须在任务分配中加入地图。
19:25 2019/1/14 dynamic_cast<D*>(pb)可以在执行期决定真正的类型
20:31 2019/1/14 加入地图节点接口
10:46 2019/1/15 学习了如何不使用静态库而使用代码
11:49 2019/1/15 复习了C++中Lambda表达式的使用,[&a](b){},a是获取的外部变量,b是比较的内部变量
13:57 2019/1/15 资源与地图上的点id匹配
15:42 2019/1/15 代码基本写完
17:28 2019/1/15 TopoNode中存的是单向边,双向边是后面建立的存在MR_TOPO_MAP中
20:22 2019/1/15 直接将路径规划中的私有成员使用要改动的地方太多,选择重新计算一遍图
8:34 2019/1/16 需要在MRTA中分配地图的内存
9:18 2019/1/16 代码修改完成,出现问题:机器人读不出来->误删了initMrtaInput
10:00 2019/1/16 运行有些问题,找到原因是拓扑点的坐标和资源点的坐标表示方式不同
10:20 2019/1/16 测试同一列4个点基本成功
11:38 2019/1/16 两列8个点测试成功
13:42 2019/1/16 出库没有问题,但是入库出现问题,因为入库找的是最远的策略,从起点出发会导致选取的点混乱
13:59 2019/1/16 想法:先找出所有可以进入的点,再找出对应的旋转点,算出离旋转区的距离,根据它进行最大最小策略
15:56 2019/1/16 程序写完,测试原料出库、入库,空托盘出入库均成功
16:18 2019/1/16 匈牙利和最小费用最大流做一个选择接口
16:48 2019/1/16 MRTA重构完成,分配策略设置在能力集中
16:51 2019/1/16 测试两辆车的情况,两辆车时,其中一辆车会卡住,应该是MRPP的问题
8:57 2019/1/17 MRTA尝试加入蚁群算法,MRPP学习A*算法
9:49 2019/1/17 蚁群算法用于最佳平衡负载,跟期望不匹配,加入不了
9:58 2019/1/17 MRTA告一段落,转向MRPP
10:58 2019/1/17 看MRPP代码,学习C++处理UDP
14:31 2019/1/17 学会C++建立UDP
19:19 2019/1/17 学会A*算法,代码有内存泄漏的问题,尝试手动分配内存->内存分配解决
9:23 2019/1/18 A*算法可以用二叉堆优化,学习一下,priority_queue不好用,得手造二叉堆
17:06 2019/1/18 看了一天MRPP的代码,过于复杂,估计得看上好几天才能看懂
10:54 2019/1/22 最小费用最大流代码交付合并,上传至服务器
13:34 2019/1/22 看MRPP代码
13:46 2019/1/22 学习使用assert中断错误
15:53 2019/1/22 弄懂时间窗用于处理冲突,每次记录转弯前的时间窗,目前是只要有其他机器人出现在时间窗内就不申请
20:22 2019/1/22 MRPP主要是这么几个部分:A*算法用于路径规划,用最小堆优化;交通管制,也就是处理小车之间路径冲突。交通管制这块存在难点
13:33 2019/1/23 通过路径规划中对每辆小车建立各自的私有地图,私有地图中通过其他小车的预约格设定地图节点的权重来进行路径规划
14:02 2019/1/23 看MRPP中拓扑图的处理
15:40 2019/1/23 拿到新需求:德企机器人,特定拓扑图中旋转点固定,因此会出现绕一圈回来的情况,需加入倒车
19:16 2019/1/23 机器人的方向由位姿中的角度决定
8:57 2019/1/24 德企的因为分配点不是旋转点,所以MRTA的分配逻辑有问题
10:30 2019/1/24 尝试将原本的最近旋转点改为最近的邻近非货架点,原本的查找最近旋转点函数只是根据xy坐标简单判断,没有进行是否连接,地图一大会出现问题
13:57 2019/1/24 想法:对起点进行bfs搜索,因为只往起点的四个方向进行搜索,所以可以大量剪枝,不会花费很多时间
15:32 2019/1/24 普通的和叉车的不同,但是叉车还是得加上连接
16:31 2019/1/24 普通的拓扑图是以单向边可翻转来表示,真正建立拓扑图是在MRPP中,因此寻找旋转点等存在问题,想法:在拓扑图建图的同时建立真正的双向图
19:21 2019/1/24 发现bug:处理拓扑图的邻接点会出现重复->找到原因:建双向边会导致后面的节点新加入的反向边也加入建双向边的过程
9:14 2019/1/25 解决了昨天的bug:每次建立新边将可逆行标志改为0解决
10:00 2019/1/25 重构了拓扑图地图的有关代码,原本建立真实的拓扑图是在MRPP中,现在加载地图后即建立真实的双向拓扑图便于有关地图节点连接的判断
11:17 2019/1/25 学习JSON,可以用它来进行不同语言之间数据的交换,感觉还是很好用的
14:21 2019/1/25 修改了寻找最近旋转点的函数,加入了判断连接的逻辑
14:34 2019/1/25 拓扑图节点的id和下标是对应的,优化了建拓扑图函数,时间复杂度大概减小了n/2倍
15:22 2019/1/25 任务分配没有问题,但是小车不经过旋转点会直接开过去
9:32 2019/1/26 小车具体怎么走,是倒车还是前进是在交通管制中,存在小车的Cmd.CmdType中
13:25 2019/1/26 小车方向是向前,路径是向后的情况,还是会原地掉头
14:30 2019/1/26 可以做出倒车动作,但是会出现原地旋转360度的问题,需要把TCM彻底看懂
16:08 2019/1/26 map中的高速路都是可以转向的,造成问题
16:45 2019/1/26 发现不是高速路的问题,是一开始路径因为判断转向,turnflag=1,所以加入小车角度180的处理逻辑,完成基本倒车
16:51 2019/1/26 倒车经过十字路口的时候逻辑有很大的问题。
9:11 2019/1/28 倒车经过十字路口即旋转点时还是会选择倒车
10:28 2019/1/28 逻辑其实已经写好了,主要是起始点加入非转弯的逻辑
13:47 2019/1/28 倒车功能完成
9:28 2019/1/29 理解对象组合和继承,也就是has-a和is-a的差别
16:43 2019/1/29 经过倒车修改后的MRPP交付
18:44 2019/1/29 新需求:新小车现在可以取多个货架,所以每次把所有能取的货架取完,要求是用MRTA分配得到每辆车要取的点,然后对这些点的顺序进行路径规划,路径规划是重点
10:02 2019/1/30 昨天需求废除,优先需求:现在需要小车走直线、
15:56 2019/1/30 需求做不出来,开完年会就爬