LZZ and MYY
嵌入式Linux、工控、虚拟化
展开
-
Far planner 代码系列(35)动态障碍物预处理_激光雷达部分
主要讲解动态障碍物在激光雷达部分的剔除机制原创 2023-04-11 10:44:17 · 570 阅读 · 0 评论 -
FAR Planner带注释代码部分
工具包部分包含一些图表的绘制以及记录一些数据,比如record_odom就是用来记录里程计的,goal_pub_new用来对于特定的地图发布一组连续的导航点,用于评测论文数据。search_path_time用于记录每一次搜索算法运行的时间等等,文件里会有注释用途。目前开源了主函数部分的注释以及一些自己写的工具包。原创 2023-04-05 17:11:39 · 445 阅读 · 3 评论 -
Far planner 部署真实小车 & 树莓派部署lego_loam
今天开一贴Far planner的部署,也算是lego loam的部署吧 因为state_estimation用的是lego loam小车底盘: 轮趣的mini差速底盘外加多一层钢板,中间层用来放velodyne的电池(小的电池还没到,大的电池塞不进去目前)和velodyne信号盒子。前面还可以加一个相机。底层用来放小车的电池和马达等设备了,底层不用动。最上面一层用来安装velodyne16线雷达,需要额外钻孔(如果买轮趣的话可以找老板钻个孔?我也不确定,我自己钻的)。 雷达固定螺丝用的是 1/4-20*3原创 2022-07-12 21:44:43 · 2757 阅读 · 22 评论 -
用far planner跑自己的rosbag
far planner是结合cmu的automantion环境一起跑的,far planner只是一个上层的路径规划算法,所以并不涉及对于机器人的姿态估计和控制。因此我们需要将这一部分用开源代码来替换,比如loam,a-loam和lego-loam。 首先我们需要下载cmu_automantion的matterport版本,对于lego-loam,我们需要修改cmu_automantion 的src中的loam_interface的launch文件,将stateEstimationTopic的原创 2022-07-08 12:32:32 · 1183 阅读 · 12 评论 -
manjaro (archlinux) 安装ros1 noetic
首先,我们先安装docker然后设置docker服务开机自动启动添加组拖入noetic-desktop-full编写Dockerfile接着构建容器启动容器 这时候应该可以进去了,然后把noetic加入到bashrc里目前完成了,可以开个rqt看看输入exit 退出当前docker以后需要打开noetic就这么打开:.....................原创 2022-07-02 19:12:13 · 637 阅读 · 0 评论 -
如何在far_planner 中使用yolov4 之加入dnn检测模块 之ROS Noetic with yolov4 in Opencv DNN module
今天讲的是如何在noetic里用dnn模块来使用yolov4yolov4 ros noetic这篇文章给了很大的启发,不过在处理opencv的问题上,现在主流的做法是不去动noetic里本身的cv_bridge了,而是在pkg里加入一个opencv的bridge包。众所周知,noetic里配的是3.2版本的cv,太老了,没有办法用dnn模块(dnn至少要3.3以上的opencv才会有)。所以,先去opencv的官网下载source。我下载的是OpenCV – 4.5.4解压opencv然后2.创建ro原创 2022-06-19 10:31:30 · 1500 阅读 · 3 评论 -
在deepin20.6上运行ros和far planner
用久了ubuntu,今天出一期deepin的视频,感觉deepin本土化好很多,而且也比较漂亮。那么进入主题吧! 理论上ros1和ros2都是可以装的,这里以ros1为例子:1.添加软件源2.添加软件源密钥3.更新索引4.安装ros5.设置环境6.安装依赖7.更改lsb-release 8.初始化rosdep1.克隆far planner和auto expriment环境包2.修改CMakeList里的QT依赖将所有QT5的依赖里的EXACT去掉3. 正常catkin_make编译即可 把rvi原创 2022-06-18 17:02:35 · 625 阅读 · 0 评论 -
Far planner 无聊系列(2)
看完了路径规划的内容后,我大致归纳了一下,首先就是把goal加入到graph中,然后在把goal与当前graph里所有的node都做一遍association,接着更新他们的可通行性,通过goal的parent逐步传导回odom。然后我在想,这样子虽然没有问题,但是很多时候探索的路径非常多,特别是#字形岔口,所以应该设计一种,初次探索能减少绕路的方式。如上图,比如我从白色的点到绿色的点,那就应该直接往右再往上,但是这个只考虑edist距离的话,它就会先探索上面,发...原创 2022-05-15 00:09:36 · 548 阅读 · 5 评论 -
Far_planner 无聊系列(1)
心血来潮,做了一个自动pub goal的小插件,然后做了一个word_obs_cloud_grid remap到平面grid的映射,看起来是不是很像之前的栅格地图,没错,它就是~首先需要建立一个新的cpp 叫做global_grid.cpp 参考之前的graph_planner.cpp就可以知道,我们需要取出word_obs_cloud_grid下的点云信息,即每个格子为5x5,而我们用到的grid比较细,是0.5x0.5的,如果需要按原始map进行采样,1000m就需要2000x2...原创 2022-05-10 21:09:02 · 828 阅读 · 1 评论 -
Far planner 代码系列 (34)路径规划(一)
当系统正在运行的时候,每次进行ros spinonce 它都会调用PlanningCallBack函数,在这个函数没有接收到goal目标的时候,它会先进行通行区域的更新,也就是计算fgscore和gscore 我们进入UpdateGraphTraverability函数,它主要分为两个部分:第一个是针对odom,拓展到所有的nav_node,我们计算gscore,并更新当前cur_graph的gscore值和nav_node的父节点parent,...原创 2022-05-05 20:50:30 · 1052 阅读 · 1 评论 -
Far planner 代码系列(33) 关于real_world_contour和contour_graph
我们知道far planner前部分的流程是这样子的:对于特定的地图,如下:我们要从surround_obs_cloud里抽取生成realworld_contour_,如下图所示: 在这时候,每个node的z坐标都是以机器人的高度定的。如图所示:先去吃饭啦~待会回来在写...原创 2022-04-26 11:39:31 · 521 阅读 · 0 评论 -
Far planner代码系列(32)
今天聊的内容主要是far_planner的grids,大部分far_planner创建的grid用于可视化效果,最主要的grid有如下四个:pointcloud_grid_、world_obs_cloud_grid_、world_obs_cloud_grid_、terrain_height_grid我们按它建立grid的顺序说起,首先是terrain_grid,它是一个88x88x1的grid,每个sub都对应一个cell,cell里存储的是它的ter...原创 2022-04-24 17:08:29 · 596 阅读 · 0 评论 -
Far planner之 障碍物的图搜索
我们知道,最短路径搜索算法比如A*、Djstra等经常是用在grid地图,也就是栅格地图,当我们把路径搜索算法运用到由node组成的障碍物graph的时候,有很多问题是要进行思考的,当我在完成这个障碍物graph的最短路径搜索的时候,我也想明白了一些far planner里的东西,所以干脆就来说一说好了。如上图所示,这个是一个由Node10出发,到达Node452的一个路径规划。我们知道,对于Far planner而言,它的障碍物contour_g...原创 2022-04-22 10:13:08 · 1506 阅读 · 1 评论 -
Far_planner初次探索全过程(attempt search)
快来跟着我看看far planner探索未知环境并建立Graph的过程吧~首先,我们初始化环境:可以看到小车孤零零的在这个system_indoor的地图上,现在算法还没开始运行,什么都没有。伴随着主程序far_planner的init结束,即初始化成功后,程序进入loop阶段,这时候会调用它的Callback函数 也就是ros::spinonce去调用之前订阅的各个节点的Callback函数,目前主要是这几个:PlanningCallBack、OdomCallBack 、TerrainCall原创 2022-04-19 21:55:03 · 2044 阅读 · 0 评论 -
基于Far planner的可视化图
需要安装networkx,将保存的vgh文件用自己写的代码读取,将node_id和position进行分离,connect、traj、等等 看自己的喜好,其余的当作是该node的特征信息。networkx的可视化(traj部分),其实node_id在这里只对于恢复graph比较重要,对于搞事情而言,我更在意它的position信息,由于networkx只有2d的,所以z轴的值被压缩了仿真环境下的trajcontour部分的graph提取: 仿真环境下的con...原创 2022-04-17 16:50:58 · 640 阅读 · 1 评论 -
Far planner 之 Matterport3d环境的导入
我们知道Far planner里有自带的Autonomous Exploration Development Environment实验室的环境,但是有的时候我们还是想在更真实的世界里进行仿真,那么就需要用到Matterport3d首先我们要把原本的autonomous_exploration_development_environment的分支切换到matterport下,其中的distribution是我们ros的版本 我用的是noetic:...原创 2022-04-16 11:20:34 · 1051 阅读 · 7 评论 -
Far planner代码系列(31)is_covered
今天讲的是UpdateNavGraph函数里的分析每个node的is_covered属性和is_frontier属性。我们看代码,代码里把near_nav_nodes里的点挨个都取出来判断该node是不是is_covered,通过IsNodeFullyCovered函数来判断。IsNodeFullyCoveredIsNodeFullyCovered函数首先判断输入的node是不是odom或者navpoint或者该node的is_cov...原创 2022-04-15 16:02:56 · 551 阅读 · 1 评论 -
Far planner代码系列(30)TopTwoContourConnector
我们知道,nav_node里的potential_contours中可能有许多个nodes,而TopTwoContourConnector函数主要是把nav_node和potential_contours里得分最高的两个nodes进行关联。这个是graph_manager_.UpdateNavGraph里的一个小函数,我们先讲一下,会对大体的流程有一定的了解。 假设我们有两个ctnode 分别叫做ctnodeA和ctnodeB,他们再经过一次更新后变成了navn...原创 2022-04-15 11:27:31 · 452 阅读 · 0 评论 -
Far planner的CTNode、Nav_node的参数表注释
NODE_STRUCT里 ctnode和navnode参数列表的注释原创 2022-04-14 16:20:05 · 656 阅读 · 0 评论 -
Far planner 代码系列(29) EnclosePolygonsCheck()
今天我们再讲一下 EnclosePolygonsCheck()函数,首先说几个预备的知识:1、polys_ctnodes_是存放每一个polygon的首个ctnode,通过front或back可以循环到该polygon的每一个ctnodes 2、ctnode的is_ground_associate属性的标识位(true or false)在AdjustCTNodeHeight函数里进行修改的 有了上面的知识点,我们来看函数:...原创 2022-04-14 14:08:11 · 418 阅读 · 0 评论 -
Far planner 代码系列(28)
今天我们讲的是首次运行时候的情况梳理。篇幅可能有点长,但是看完肯定会有收获的。我们把之前讲过的东西都串起来,形成一个完整的过程。far_planner一开始进入到loop的时候,它是先更新odom的位置信息,如下: 它会把机器人的odom加入到globalGraphNodes_ 里(这个很重要哦!是全局地图),程序接着往下走: 通过BuildTerrainImgAndExtractContour函数,我们可以得到一个由激光映射到平...原创 2022-04-13 21:45:51 · 1084 阅读 · 3 评论 -
Far planner环境系列 动态障碍物的加入
本次主要涉及到动态障碍物加入环境的部分,参考链接如下:BruceChanJianLe/gazebo-actor: This repository demonstrates the usage of actor and related plugins in Gazebo. (github.com)https://github.com/BruceChanJianLe/gazebo-actor 主要用到的插件是libAttachModelPlugin.so ...原创 2022-04-13 11:59:01 · 701 阅读 · 8 评论 -
Far planner 代码系列(27)
今天讲的内容是关于这个reduce v graph的一部分,就是舍弃掉黄色连接的部分,作者在代码中是通过之前讲到的surf_dir来做的。 上代码部分,这个内容主要是在IsInDirectConstraint这部分内容里,最主要的是其中的IsOutReducedDirs函数。 我们来看看这个IsOutReducedDirs的内容: 我们只说一下first half range的范围,因为剩下的那个也一样。第一步是计算node_ptr1指向n...原创 2022-04-12 18:02:00 · 733 阅读 · 0 评论 -
Far planner 代码系列(26)
UpdateNavGraph之re-evaluate trajectory edge using terrain planner 这一部分我们讲的是重新评估轨迹的edge,当环境为动态环境,且cur_internav_ptr不为null的时候,新建一个internav_check_nodes去接收surround_internav_nodes_,若cur_internav_ptr不在该internav_check_nodes,就把它push进去。 ...原创 2022-04-08 14:18:39 · 636 阅读 · 0 评论 -
Far planner 代码系列(25)
UpdateNavGraph之clear false positive node detectionUpdateNavGraph这部分内容太长了。我们要分好几段去讲,刚好作者这里的脉络也蛮清晰的。就按作者 的顺序讲就好了。进入函数,一开始是确定一个clear_node的容器,这个容器的主要作用就是清除掉一些没用的node。具体要看ReEvaluateCounter函数。 函数主要分成了好几个if进行判断,如果是boundary 就不要...原创 2022-04-08 13:12:40 · 396 阅读 · 0 评论 -
Far planner 代码系列(24)
关于decoder_node.cpp和graph_msger.cpp最近又看了会儿关于decoder_node.cpp和graph_msger.cpp的代码,突然看懂了一些些,现在大概讲述一下,希望大家可以不用花太多精力在decode_node.cpp上。graph_msger主要把graph信息做一个打包,发送到/robot_vgraph。decoder_node中订阅/robot_vgraph节点,并用调用decoder_node的GraphCallBack回调...原创 2022-04-07 21:00:53 · 411 阅读 · 0 评论 -
Far planner 代码系列(23)
graph_manager_.ExtractGraphNodes(new_ctnodes_)今天回到far_planner.cpp里继续讲啦~,真是一波n折。今天讲的就是上面这玩意~,当is_stop_update为false,也就是我们一直更新vgraph,并且graph_manager_.ExtractGraphNodes(new_ctnodes_)为true的时候,我们就更新一下new_nodes_。ExtractGraphNodes(new_ctnod...原创 2022-04-07 20:42:11 · 685 阅读 · 0 评论 -
Far planner 代码系列(22)
DynamicGraph::UpdateGlobalNearNodes( ) (二)经过之前的过程,我们得到了extend_match_nodes_、wide_near_nodes_、near_nav_nodes_、internav_near_nodes_、surround_internav_nodes_和margin_near_nodes_我们要接着完善 wide_near_nodes_,这里也很好理解,把odom里连接到的每个node都取出来,如果这个node中的...原创 2022-04-04 15:59:20 · 729 阅读 · 0 评论 -
Far planner 代码系列(21)
DynamicGraph::UpdateGlobalNearNodes( ) (一) 这个函数前半部分从globalGraphNodes_里产生near_nav_nodes_、wide_near_nodes_、extend_match_nodes_、margin_near_nodes_、internav_near_nodes_和surround_internav_nodes_。可以这样理解:我们把全局的nodes给划分成好几块,因为我们不能老调用全局的所有nodes参与运算,我们需要把...原创 2022-04-01 14:03:49 · 667 阅读 · 3 评论 -
Far planner 代码系列(20)
UpdateContourGraph中的AnalysisSurfAngleAndConvexity 这部分对应论文中的Polygon Extraction 里的6-7部分判断polygon的顶点的局部曲率,还有消除掉一部分不满足inner angle条件的edge: 我们先看主体部分,传入contour_graph,然后取出每一个ctnode ,如果它是PILLAR类型的,我们就不看了(这个应该就是说不满足inner angle条件的?),直接把它的surf_di...原创 2022-03-31 15:30:15 · 495 阅读 · 1 评论 -
Far planner 代码系列(19)
UpdateContourGraph中的UpdateOdomFreePosition 今天讲的是紫色框的这一块内容,这里通过次函数会产生一个free_odom_p 函数的主要内容如上图所示,我们来讲一下这个函数。它先读取里程计的信息给free_p,设计了一个标识位is_free_p为true。然后建立了一个采样点集合free_sample_points。首先,我们要把free_p与所有的polygon都对比一次,看看free_p在不在障碍物...原创 2022-03-31 11:32:31 · 626 阅读 · 0 评论 -
Far planner 代码系列(18)
TerrainCallBack详解(2) 上回讲到更新temp_obs_ptr和temp_free_ptr ,我们接着往下讲。接着就用到了ExtractNewObsPointCloud函数去更新抽取NewObsPointCloud函数把temp_obs_ptr_和surround_obs_cloud_输入,把surround_obs_cloud_作为一个参考点列,把其intensity设置为255。temp_obs_ptr_的intensity设为0 然后把这两个都并...原创 2022-03-30 15:48:21 · 689 阅读 · 2 评论 -
Far planner 代码系列(17)
TerrainCallBack详解(1) TerrainCallBack是far_planner里很关键的一个回调函数,它主要包含对环境包autonomous_exploration_development_environment里的点云信息/terrain_map_ext进行处理,一方面是对其进行下采样,减少点云的数量,另一方面为了从里面生成obs_cloud和free_cloud。我们先来看图:这个是/terrain_map_ext发布的点云信息 接着,通过Ter...原创 2022-03-29 11:50:51 · 1137 阅读 · 4 评论 -
Far planner 代码系列(16)
Far planne初始化中的Callback函数(2) scan_sub_ = nh.subscribe("/scan_cloud", 5, &FARMaster::ScanCallBack, this);ScanCallBackvoid FARMaster::ScanCallBack(const sensor_msgs::PointCloud2ConstPtr& scan_pc) { if (master_params_.is_static_en原创 2022-03-28 15:40:25 · 722 阅读 · 0 评论 -
Far planner 代码系列(15)
Far planne初始化中的Callback函数(1) reset_graph_sub_ = nh.subscribe("/reset_visibility_graph", 5, &FARMaster::ResetGraphCallBack, this);ResetGraphCallBack inline void ResetGraphCallBack(const std_msgs::EmptyConstPtr& msg) { is_reset_原创 2022-03-28 10:49:06 · 1169 阅读 · 0 评论 -
Far planner 代码系列(14)
MatchContourWithNavGraph(3) this->EnclosePolygonsCheck(); //可能有些ctnode的is_contour_necessary属性变成了true // 这说明我的contour_graph是一个local层级的 才会从这里面 get new vertices new_convex_vertices.clear(); //! 把contour_graph_里符原创 2022-03-24 10:41:19 · 739 阅读 · 0 评论 -
Far planner 代码系列(13)
上回我们说到MatchContourWithNavGraph 函数中的这个片段,并讲解了其中的NearestNavNodeForCTNode(ctnode_ptr, near_nodes) 函数原创 2022-03-23 21:00:18 · 909 阅读 · 2 评论 -
Far planner 代码系列(12)
今天讲的部分是Contour里的ctnode和near nav nodes进行匹配的部分原创 2022-03-23 12:43:43 · 561 阅读 · 0 评论 -
Far_planner 代码系列(11)
算法2 v-graph的动态更新(2) 上回讲到得到contour_gtaph ,这里面是一组所有障碍物的点,点与点之前通过属性front和back来确定是否是同一个polygonthis->AnalysisSurfAngleAndConvexity(ContourGraph::contour_graph_); 接着我们来看这个 这个是来判断SurfAngle和多边形的凹凸性的 这里好懵我看的。我们来具体看一下函数void ContourGraph::...原创 2022-03-21 11:27:53 · 915 阅读 · 0 评论 -
Far planner代码系列(10)
算法2 v-graph的动态更新(1) 这部分比较吸引我,先讲一下代码中关于ContourGraph的更新。void ContourGraph::UpdateContourGraph(const NavNodePtr& odom_node_ptr, const std::vector<std::vector<Point3D>>& filtered_contours) {...原创 2022-03-18 13:44:29 · 1222 阅读 · 0 评论