问题描述
我正在研究一种可以为机器人进行双向规划的图结构。
但不仅是双向的,所以它可以从 A 到 B 和 B 到 A,也考虑到了方向。所以在某些情况下,机器人只能沿着边缘向后移动。
从 4 开始,我可以向着 1 前进。
但是从1开始到4,我需要走路径1>2>3>4,其中3是我可以改变方向的节点。就像汽车单向倒退,利用停车场把车调头一样。
所以我有约束
- 我只能打开特定节点
- 规划节点时需要考虑机器人的方向(节点有方向)
一个想法是在规划之前通过使用机器人的当前方向和目标的方向来过滤图形。但我还不确定这是否可能。
我的另一个想法是不过滤,而是对整个图表进行规划。
但我通常不确定我的计划员(现在是 Dijkstra)是否可以处理它,在计划期间机器人的方向可能会改变,就像在节点 3 中一样。
如果有人能给我一些一般性的提示,如果这是一个好主意,或者你能把我推向正确的方向,我会很高兴。
解决方法
我想说您需要将图形分成两部分,一个包含所有前向链接,另一个包含所有后向链接。然后,这两个图可以在可以转弯的节点处以零成本链接连接起来。
来自您的示例图表:
Forward links
1F - 2F
2F - 4F
4F - 3F
Backwards links
1B - 2B
2B - 3B
Turning links
3F - 3B
从 1F 开始,瞄准 3F 或 3B,Dijsktra 会发现
1F - 2F - 4F - 3F - 3B
最终可以简化为
1 - 2 - 4 - 3
机器人从 1 开始朝前向 4 时的输出示例(机器人可以通过 2 直接到达那里)
C:\Users\James\code\unirobot\bin>unirobot.exe inforward.txt
unirobot
l 1 2 0
l 2 3 2
l 2 4 1
l 4 3 1
t 3
s 1 f
g 4
4 bidirectional links input
Forward links
1f - 2f
2f - 4f
4f - 3f
Back links
1b - 2b
2b - 3b
Turning Links
3f - 3b
Combined graph links
(1f,2f) (2f,1f) (2f,4f) (4f,2f) (4f,3f) (3f,4f) (3f,3b) (1b,2b) (2b,1b) (2b,3b) (3b,2b) (3b,3f)
Path: 1f -> 2f -> 4f ->
从 1 开始向后朝向 4 时的示例输出(机器人需要经过节点 3,这是它唯一可以转身的地方)
C:\Users\James\code\unirobot\bin>unirobot.exe inbackward.txt
unirobot
l 1 2 0
l 2 3 2
l 2 4 1
l 4 3 1
t 3
s 1 b
g 4
4 bidirectional links input
Forward links
1f - 2f
2f - 4f
4f - 3f
Back links
1b - 2b
2b - 3b
Turning Links
3f - 3b
Combined graph links
(1f,3f)
Path: 1b -> 2b -> 3b -> 3f -> 4f ->
生成此输出的代码位于 https://github.com/JamesBremner/unirobot