视频笔记
位形空间 configuration Space(之前我博客都是配置空间)。就是无障碍时机器人工作空间,以及有障碍时候,对障碍进行膨胀后的空间(这里我个人理解好像有点问题)。如图:
右边障碍物位姿空间,是由障碍物形状,和机器人形状共同造成的。然后再右边的空间进行寻找路径。
视频2.2是一个二自由度的机械臂的例子,也是障碍物位形空间。
视频2.3是在二自由度基础上,加入了小车的旋转。也就是三个自由度了。而且把旋转角度当做了z轴,数学上可以理解,但是画成图就看不太懂了。
然后就是在位形空间规划路径的三种方法,出发点都是,在连续的位形空间中进行规划,然后用不同的方法在图形中重构,再用Dijkstra或者A*算法。
这段话没太明白,感觉就是,把位形空间转为图,然后去用那些算法进行搜索
包括:2.4可视图;2.5 分割成梯形 (维诺图?) 2.6 碰撞检测
可视图:连接任意的两个顶点,判断是否会与障碍物相交。然后再用Dijkstra或者A*
![](https://i-blog.csdnimg.cn/blog_migrate/03cdfaa464d96d6f8c7f2c0d4c9ddc62.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fbf84a76330b21e254700f5d08096f28.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a4725e5a471f58a793fd30808340ea14.png)
还有一个假设,假设两个点都是未碰撞的,则连线也不会碰撞。但是这个是在分辨率较高的时候可以。
Code of Week2
碰撞检测这块,Kin_Zhang的程序,在他博客中。主要就是,如果一个点在三角形内部,则由四个点构成的面积和等于三角形面积,在之外就是大于。如图。
然后就是检测三个点是否都在外部。如果都在,表示无重叠。这里需要检测两次,否则会出现三个点都在内部
flag = PointIn(P1,P2);
if(flag==false)
flag = PointIn(P2,P1); %这里就是说检测两次的那部分
end
function Point = PointIn(P_1,P_2)
base = [P_1 ones(3,1)];
base_area = 0.5*det(base);
Point = false;
for i=1:3
Area = abs(Cal_area(P_2(i,:),P_1(1:2,:)));
Area = Area + abs(Cal_area(P_2(i,:),P_1(2:3,:)));
Area = Area + abs(Cal_area(P_2(i,:),[P_1(1,:);P_1(3,:)]));
if Area == base_area
Point = true;
break;
end
end
end
function Area = Cal_area(point1, point2)
Area = 0.5*det([[point1;point2] ones(3,1)]);
end
另外在Kin_Zhang博客中提到的那个bug,是因为现在可以穿过边界的。这是由于变量是角度,0°和360°是一样的。这里应该是因为这是机械臂的原因,如果是移动小车,还是不能够穿过边界的。至于把其中一个设置为0,因为有两个,所以障碍还是不会减少。
input_map(:, 181) = [];
input_map(181, :) = [];% 是181的原因,是因为之前的地图应该是分辨率为2°,0:2:360.
%为了让其能穿过四个边,所以周围应该是设置为不是障碍。所以为0,同时0°和360°应该是一样的。所以设置为0不会影响。
其他博主方面写的很好了。非常感谢!