ns3仿真3D可视化

2023-11-08 20:20
文章标签 可视化 仿真 3d ns3

本文主要是介绍ns3仿真3D可视化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

因为种种原因需要实现ns3仿真的三维可视化功能,ns3已经提供了实时的仿真可视化程序pyviz。 首先对该部分进行分析。
pyviz部分的程序有与ns3实现有关的c++部分。有专注于可视化python程序。

pyviz 可视化python程序文件框架

在这里插入图片描述
需要解决的核心问题。

  1. 找到所有画图的位置。 || 如何更新,所有的调用,能否增加数据。
  2. 找到所有数据的来源。 || 打印出所有数据。

下面对重要文件进行分析。

init.py
ns.cppyy.cppdef("""using namespace ns3; bool hasMobilityModel(Ptr<Node> node){ return !(node->GetObject<MobilityModel>() == 0); };""")
ns.cppyy.cppdef("""using namespace ns3; Vector3D getNodePosition(Ptr<Node> node){ return node->GetObject<MobilityModel>()->GetPosition(); };""")
ns.cppyy.cppdef("""using namespace ns3; Ptr<Ipv4> getNodeIpv4(Ptr<Node> node){ return node->GetObject<Ipv4>(); };""")
ns.cppyy.cppdef("""using namespace ns3; Ptr<Ipv6> getNodeIpv6(Ptr<Node> node){ return node->GetObject<Ipv6>(); };""")
ns.cppyy.cppdef("""using namespace ns3; std::string getMobilityModelName(Ptr<Node> node){ return node->GetObject<MobilityModel>()->GetInstanceTypeId().GetName(); };""")
ns.cppyy.cppdef("""using namespace ns3; bool hasOlsr(Ptr<Node> node){ return !(node->GetObject<olsr::RoutingProtocol>() == 0); };""")
ns.cppyy.cppdef("""using namespace ns3; Ptr<olsr::RoutingProtocol> getNodeOlsr(Ptr<Node> node){ return node->GetObject<olsr::RoutingProtocol>(); };""")

后续将追踪此处的调用函数,该函数对获取的数据以及去向进行解析

core.py

其中核心类: class Visualizer(GObject.GObject):

load_plugins()
viz = Visualizer()
for hook, args in initialization_hooks:GLib.idle_add(hook, viz, *args)
ns.Packet.EnablePrinting()
viz.start()
core.py 中的 Visualizer() 类
初始化
# 重要回调语句
for plugin in plugins:plugin(self)

这句话跟load_plugins()共同完成对plugins内部所有模块类型的载入。

viz.start()

def start(self):self.scan_topology()self.window.connect("delete-event", self._quit)#self._start_update_timer()
## 不知道为啥这个函数没有检测到被调用GLib.timeout_add(200, self.autoscale_view)self.simulation.start()try:__IPYTHON__except NameError:passelse:self._monkey_patch_ipython()Gtk.main()

mob = ns.cppyy.gbl.hasMobilityModel(ns3_node)

研究一下谁调用了 _update_node_positions()

追踪画图

画布的创建 self.canvas = GooCanvas.Canvas()

base.py
功能类

为每种元素都有一个类, 但类里没有功能函数。
在这里插入图片描述

设备种类变量

重要变量, 肯定是区分每个节点所携带的不同的device类型的变量
在这里插入图片描述
device_traits 变量也在 scan_topology函数中被调用, 我觉得只要把这个删掉,大概率就不会有ns3的aqua报错了。

比例尺函数

画图辅助函数,比例尺
在这里插入图片描述

load_plugins()

载入模块
在这里插入图片描述
此部分的核心在于plugins文件夹中文件的register函数
例如 interface_statics.py 接口数据统计部分。
在这里插入图片描述
wifi 链路部分。
在这里插入图片描述
有一个需要解决的问题: 需要在这里添加一个对aqua 设备的注册模块。

知识

python-c++绑定 : cppyy: Automatic Python-C++ bindings

在pyviz中,体现为,可以在python中通过ns.xxx函数调用ns3的相关模块获取数据。例如通过一下diamagnetic块获得了节点的位置信息。
在这里插入图片描述

ipython

一个非常流行的python解释器,相比于原生的python解释器有许多优点和长处

功能简介

(1) python shell不能在退出保存历史;ipython历史记录自动保存:保存在history.sqlite文件下:可用“”、“”、“”调用最近三次记录;

(2) python shell不支持tab自动补全;ipython支持tab补全;

(3) python shell不能快速获取类、函数信息;ipython通过“?”显示对象签名、文档字符串、代码位置,通过“??”显示源代码;(4) python shell不能直接执行shell命令,需要借助sys;ipython通过“!”调用系统命令,如“!uptime”;

(5) 其他ipython有很多magic函数,可通过使用%lsmagic枚举;

 %run:运行python文件%edit:使用编辑器打开当前函数编辑%save:把某些历史记录保存到文件%debug:激活debug程序等等,后面会讲到

(6)ipython有很多快捷键

(7)ipython的扩展宏系统、storemagic持久化宏、变量、别名;以及autoreload自动重载等功能;

magic command 重要功能

所谓的模式命令,是指那些给我们提供方便,轻松控制ipython交互系统的命令,可以这样去理解,魔术命令可以看成是ipython交互环境下面的命令行程序,其中很多还有一些命令行参数选项。

%quickref :可以显示ipython的快速参考

%magic :可以查看到底有哪些模式命令(这个方法会显示每一个命令的详细信息,因此会很多)

%lsmagic :这里只会显示模式命令的名字,会比较简洁,查看起来更方便

%命令? 或者是%命令??:当我们想要查看某一命令的详细信息,我们可以使用同前面类似的方法,在魔术命令后面添加一个或者是两个问号??来查看详细信息。

Platform 库

platform模块提供了一个API来获取关于运行代码的底层系统/平台的信息。操作系统名称、Python版本、架构、硬件信息等信息通过平台模块功能公开。这个模块不需要安装,因为它是Python安装附带的默认库的一部分。
可以使用该库获取python的一些信息
首先,让我们获取有关python的一些信息,例如版本,构建信息等。
python_version() – 返回python版本。
python_version_tuple() – 返回元组中的python版本。
python_build() – 以元组的形式返回内部版本号和日期。
python_compiler() – 用于编译python的编译器。
python_implementation() – 返回python实现,例如“ PyPy”,“ CPython”等。

这篇关于ns3仿真3D可视化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/372274

相关文章

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

Python 交互式可视化的利器Bokeh的使用

《Python交互式可视化的利器Bokeh的使用》Bokeh是一个专注于Web端交互式数据可视化的Python库,本文主要介绍了Python交互式可视化的利器Bokeh的使用,具有一定的参考价值,感... 目录1. Bokeh 简介1.1 为什么选择 Bokeh1.2 安装与环境配置2. Bokeh 基础2