65.9K
CodeProject 正在变化。 阅读更多。
Home

WSNASG: 无线传感器网络动画器和基于 NS2 的移动机器人轨迹场景生成器工具

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2019年11月14日

CPOL

7分钟阅读

viewsIcon

9990

downloadIcon

234

这是一个开源的GUI工具,用于根据不同的静态路径规划机制模拟移动机器人(锚节点)。该工具是以下链接项目的一部分:https://www.researchgate.net/project/WSNASG-WSN-Animator-and-Scenario-Generator-Tool-for-Robot-Trajectory

图 1:WSNASG 的 GUI

引言

该工具用作在 WSN 中用于定位的移动机器人的移动路径的场景生成工具。该工具有许多功能,例如

  1. 动画显示无线传感器网络节点(传感器、锚点)
  2. 部署不同数量的传感器节点
  3. 生成包含移动机器人(锚点)坐标的移动场景文件,根据用于 WSN 中单锚辅助定位的各种静态路径规划机制。生成的场景文件可以轻松用于您自己的 NS2 模拟。该工具可以模拟几种静态路径规划机制,例如
    1. SCAN (扫描)
    2. DOUBLE_SCAN (双扫描)
    3. HILBERT (希尔伯特)
    4. CIRCLES (圆形)
    5. S_CURVES (S形曲线)
    6. SPIRAL (螺旋)
    7. LMAT
    8. Z_CURVE (Z形曲线)
    9. SQUARE_SPIRAL (方形螺旋)
    10. TGS
    11. Hexagon (六边形)
    12. H_Curves (H形曲线)
  4. 更改部署区域大小、轨迹模型分辨率和机器人(锚点)移动速度。
  5. 生成包含 (t, x, y) 的文本文件,用于移动机器人。其中 t 是移动时间,(x, y) 是机器人每秒的坐标。此文件可用作 Arduino 移动机器人的输入移动文件,以根据不同的静态路径规划机制控制 Arduino 机器人的移动。
  6. 生成一个 Excel 文件,用于根据不同的分辨率绘制轨迹模型的形状。
  7. 生成轨迹模型结果,例如:区域大小、水平 R 段数、轨迹长度和模拟时间。这些结果显示在 GUI 屏幕上,并写入外部 Excel 文件。

背景

随着定位提案数量的增加,定位模型的分类也随之扩展。根据移动的性质,定位方案分为四类。第一类(静态节点 - 静态锚点),其中节点和锚点都是静态的。第二类(移动节点 - 静态锚点)包含节点有移动,但锚点没有移动的方案。这种类型通常包括将传感器节点连接到移动物体(如动物)的应用,静态锚点在每次移动时为每个节点提供更新的位置。

第三类(静态节点 - 移动锚点),传感器节点在此时保持静态,而 MA 负责遍历网络并协助这些传感器节点进行定位以估计其位置。这种类型的定位模型进一步细分为两类:随机移动和规划移动,这是所提出的 GUI 工具的主要关注点。最后一类(移动节点 - 移动锚点)包括传感器节点和锚点都移动的场景。

问题及其解决方案

大多数在 WSN 定位领域工作的研究人员,尤其是在单锚辅助定位方面,都是基于 NS-2 模拟器进行模拟。但他们需要生成一个场景文件,该文件负责根据不同的静态路径规划机制来控制移动锚点/机器人的移动。因此,他们可以使用此工具来根据不同的轨迹模型进行自己的模拟,并更改基于 NS-2 的模拟所需的多数参数。此外,该工具还通过动画窗口帮助研究人员验证生成的路径模型,该窗口用于可视化移动机器人根据所选轨迹的移动。它还通过生成 NS-2 所需的最重要结果,如机器人初始位置、模拟时间、分辨率和区域大小,帮助他们深入了解所选路径模型的统计数据。

单锚轨迹模型

静态移动路径与其他移动类型的主要区别在于,运动路径在部署后是预先设定的,无法更改或修改,除了某些支持障碍物的模型。因此,大多数静态路径工作在某种程度上都基于三角测量、三边测量或多边测量技术。然而,提出静态路径需要更关注移动机器人的点和设计的轨迹的细节,以避免其他问题,例如共线性和路径长度。

当未知位置的传感器节点接收到的消息都位于同一条直线上时,就会出现共线性问题。另一个问题是,由于静态路径规划方法高度依赖于三边测量概念,因此设计的静态路径应确保所有传感器节点都能接收到至少三个不同的机器人位置,以便它们能够确定自己的位置。静态路径规划机制示例

图 2:静态路径规划机制

Using the Code

下面的示例代码展示了如何使用递归方法生成六边形轨迹。这里,该方法还将轨迹点生成到用于对此路径进行建模的外部 Excel 文件中。

//Calling method

     hexagon_level(n,ref x,ref y, R, s,ref t,ref ns2,ref op,ref draw, nn);

// Called method

static void hexagon_level(int n,ref double x, ref double y, int R,double s, ref double t,ref string ns2,ref string op,ref string draw, int nn)
        {
            if (n == 0) return;
            hexagon_level(n - 1,ref x, ref y, R, s,ref t,ref ns2,ref op,ref draw, nn);
           
            x -= R / 2; y += Math.Sqrt(3) * R / 2;
            ns2 += "$ns_ at " + t + ".0 \"$node_(" + (nn - 1) + ") setdest " + x + ".0 " + y + ".0 " + s + ".0\"" + "\n";
            op += Math.Round(x) + ", " + Math.Round(y) + "\n";
            draw = Math.Round(t) + " " + Math.Round(x) + " " + Math.Round(y);
            using (FileStream fs = new FileStream(".\\Hexagon\\Hexagon_Draw.txt", FileMode.Append))
            {
                using (StreamWriter w = new StreamWriter(fs, Encoding.UTF8))
                {
                    w.WriteLine(draw);
                }
            }
            t += R / s;
            for (int i = 1; i <= n; i++)
            {
                x += R;
                ns2 += "$ns_ at " + t + ".0 \"$node_(" + (nn - 1) + ") setdest " + x + ".0 " + y + ".0 " + s + ".0\"" + "\n";
                op += Math.Round(x) + ", " + Math.Round(y) + "\n";
                draw = Math.Round(t) + " " + Math.Round(x) + " " + Math.Round(y);
                using (FileStream fs = new FileStream(".\\Hexagon\\Hexagon_Draw.txt", FileMode.Append))
                {
                    using (StreamWriter w = new StreamWriter(fs, Encoding.UTF8))
                    {
                        w.WriteLine(draw);
                    }
                } t += R / s;
            }
            for (int i = 1; i <= n; i++)
            {
                x += R / 2; y -= Math.Sqrt(3) * R / 2;
                ns2 += "$ns_ at " + t + ".0 \"$node_(" + (nn - 1) + ") setdest " + x + ".0 " + y + ".0 " + s + ".0\"" + "\n";
                op += Math.Round(x) + ", " + Math.Round(y) + "\n";
                draw = Math.Round(t) + " " + Math.Round(x) + " " + Math.Round(y);
                using (FileStream fs = new FileStream(".\\Hexagon\\Hexagon_Draw.txt", FileMode.Append))
                {
                    using (StreamWriter w = new StreamWriter(fs, Encoding.UTF8))
                    {
                        w.WriteLine(draw);
                    }
                } t += R / s;
             }
            for (int i = 1; i <= n; i++)
            {
                x -= R / 2; y -= Math.Sqrt(3) * R / 2;
                ns2 += "$ns_ at " + t + ".0 \"$node_(" + (nn - 1) + ") setdest " + x + ".0 " + y + ".0 " + s + ".0\"" + "\n";
                op += Math.Round(x) + ", " + Math.Round(y) + "\n";
                draw = Math.Round(t) + " " + Math.Round(x) + " " + Math.Round(y);
                using (FileStream fs = new FileStream(".\\Hexagon\\Hexagon_Draw.txt", FileMode.Append))
                {
                    using (StreamWriter w = new StreamWriter(fs, Encoding.UTF8))
                    {
                        w.WriteLine(draw);
                    }
                } 
                t += R / s;
            }
            for (int i = 1; i <= n; i++)
            {
                x -= R;
                ns2 += "$ns_ at " + t + ".0 \"$node_(" + (nn - 1) + ") setdest " + x + ".0 " + y + ".0 " + s + ".0\"" + "\n";
                op += Math.Round(x) + ", " + Math.Round(y) + "\n";
                draw = Math.Round(t) + " " + Math.Round(x) + " " + Math.Round(y);
                using (FileStream fs = new FileStream(".\\Hexagon\\Hexagon_Draw.txt", FileMode.Append))
                {
                    using (StreamWriter w = new StreamWriter(fs, Encoding.UTF8))
                    {
                        w.WriteLine(draw);
                    }
                } 
                t += R / s;
            }
            for (int i = 1; i <= n; i++)
            {
                x -= R / 2; y += Math.Sqrt(3) * R / 2;
                ns2 += "$ns_ at " + t + ".0 \"$node_(" + (nn - 1) + ") setdest " + x + ".0 " + y + ".0 " + s + ".0\"" + "\n";
                op += Math.Round(x) + ", " + Math.Round(y) + "\n";
                draw = Math.Round(t) + " " + Math.Round(x) + " " + Math.Round(y);
                using (FileStream fs = new FileStream(".\\Hexagon\\Hexagon_Draw.txt", FileMode.Append))
                {
                    using (StreamWriter w = new StreamWriter(fs, Encoding.UTF8))
                    {
                        w.WriteLine(draw);
                    }
                } 
                t += R / s;
            }
            for (int i = 1; i <= n; i++)
            {
                x += R / 2; y += Math.Sqrt(3) * R / 2;
                ns2 += "$ns_ at " + t + ".0 \"$node_(" + (nn - 1) + ") setdest " + x + ".0 " + y + ".0 " + s + ".0\"" + "\n";
                op += Math.Round(x) + ", " + Math.Round(y) + "\n";
                draw = Math.Round(t) + " " + Math.Round(x) + " " + Math.Round(y);
                using (FileStream fs = new FileStream(".\\Hexagon\\Hexagon_Draw.txt", FileMode.Append))
                {
                    using (StreamWriter w = new StreamWriter(fs, Encoding.UTF8))
                    {
                        w.WriteLine(draw);
                    }
                } 
                t += R / s;
            }

        } 

如何使用 WSNACG

WSNASG 具有以下功能

  1. 生成移动场景
  2. 动画显示生成的场景
  3. 读取已生成的场景

图 3:运行 LMAT 轨迹的步骤

图 3 展示了模拟 LMAT 轨迹模型的步骤。步骤如下

  1. 输入水平段数。
  2. 输入分辨率。
  3. 确定锚点移动速度。
  4. 输入传感器节点总数(传感器 + 1 个锚点)。注意,例如,如果您输入 10 个传感器,则意味着有九个传感器(索引范围从 0 到 8)加上一个锚点节点。因此,在场景文件中(根据 NS-2)锚点节点的索引将是 9。请参阅生成的移动场景文件的前两行。
    $ns_ at 0.0 "$node_(9) setdest 1.0 51.0 10.0"
    
    $ns_ at 5.0 "$node_(9) setdest 51.0 51.0 10.0"

    如图所示,$node_(9) 是具有索引的移动锚点(机器人)节点。

  5. 选择轨迹模型(LMAT)。
  6. 按“部署 WSN”按钮。
  7. 按“开始模拟”按钮。

图 4:模拟 3 分钟后的输出屏幕

如图 4 所示,水平段数为 10 个 R 段,分辨率 = 52 米,锚点移动速度 = 10 米/秒,包括一个锚点在内的节点总数为 10,轨迹模型为“LMAT”。如图所示,在模拟 3 分钟后,锚点节点的位置在点 (203, 101)。轨迹模型结果显示在右下角,其中包含以下统计信息:部署区域 = 520 x 495 平方米,总轨迹长度 = 6824 米,计算出的模拟时间 = 682 秒。注意,锚点节点的默认初始位置在点 (1, 1),这在 NS-2 的 TCL 文件中是必需的,但有些轨迹模型根据锚点节点的初始位置有所不同,这些模型从部署区域的中心开始。因此,这些模型的初始位置将在 GUI 工具的“轨迹模型结果”部分打印在屏幕上。

在按下“部署 WSN”按钮后,会生成输出文本文件。这些文件位于以下路径:.\WSNASG\WSNASG\bin\Debug\LMAT。因此,根据您选择的轨迹模型,输出文本文件将位于一个以该模型命名的文件夹中。相关的文本文件如下:

图 5:移动场景文件

NS-2 模拟器需要此文件才能根据 LMAT 轨迹模型模拟移动机器人(锚点)的移动。此文件的名称为“LMAT.txt”。生成的 Excel 文件名为“LMAT.xls”,用于在 Excel 文件中绘制轨迹,如下所示。

图 6:生成的 .xls 文件

要读取已生成的场景,请选择“读取现有场景”单选按钮,然后按“部署 WSN”并按“开始模拟”按钮。提示,有些轨迹模型需要选择曲线级别而不是水平段数,例如 HILBERT、Z_Curve 和 Hexagon。

结论

所提出的 WSNASG 工具的设计侧重于面向对象架构,这使得研究人员能够适应该工具或将其扩展到不同的轨迹模型。该工具的开发方式使其能够支持或与不同类型的静态路径规划机制一起工作。所提出的工具能够生成写入外部文件的不同场景,以便研究人员在比较不同轨迹时可以使用相同的场景。

历史

  • 2019 年 11 月 13 日:初始版本
© . All rights reserved.