ns3gym rltcp代码梳理(一) sim.cc

sim.cc

构建网络拓扑

  • 分配ip一定要在构建拓扑之后,不然会报错

  • 时间是10s

  • 哑铃状拓扑 Dumbbell d

    • .GetLeft() 和 .GetRight() 取哑铃状中间的两个路由器
    • .GetLeft( int i ) 和 .GetRight( int i ) 取哑铃状左右叶子的节点
    • 先安装中间的节点,再安装两边的
  • 哑铃状IP分配

    • 左边的所有叶子节点的地址为10.1.1.x,子网掩码为255.255.255.0
    • 右边的所有叶子节点的地址为10.2.1.x,子网掩码为255.255.255.0
    • 路由器的接口地址为10.3.1.x,子网掩码为255.255.255.0
    • 注意路由器有两个device,所以这里的10.3.1.x指的是中间的网段

定义openGym相关

  • comment里面注明必须再其他所有的拓扑开始之前设置OpenGym Env相关
  • 创建一个openGymInterface的类(的智能指针)并且绑定相应的端口
  • openGymPort
  • tcpEnvTimeStep定义为0.1s,得是约为一个RTT ,一个时间步进行一次reward和动作(???)的更新
  • transport_prot 拥塞控制算法种类
    分为TimeBased和EventBased

回调函数

  • CountRxPkts绑定PacketSink类的Rx属性跟踪中










tcp-rl-env

  • 实际上它就是RL中的环境的定义,只不过ns3-gym中的环境还包括拓扑的搭建(sim.cc
  • 他这个类的作用就辅助python中的代码可以像调用gym环境一样去调用环境的接口(get_action、step之类的)

OpenGymEnv

  • tcp-rl-env里面所有类的基类,抽象类,主要是定义了官方要的七个接口,都是纯虚函数,毕竟opengym_interface也等着调用呢!
    OpenGymEnv
  • 还有一些别的函数和属性
* SetOpenGymInterface( )
* Notify ( )
* NotifySimulationEnd( )
* Ptr<OpenGymInterface> m_openGymInterface;
  • 接口接口,那么都接去哪儿了呢?从哪儿接啊——OpenGymInterface
NotifySimulationEnd()和Notify()
  • 调用的OpenGymInterface的里面对应的函数
SetOpenGymInterface
  • 调用的OpenGymInterface里面的函数,把OpenGymInterface的回调函数设置成自己类里面的一系列
void
OpenGymEnv::SetOpenGymInterface(Ptr<OpenGymInterface> openGymInterface)
{
  NS_LOG_FUNCTION (this);
  m_openGymInterface = openGymInterface;
  openGymInterface->SetGetActionSpaceCb( MakeCallback (&OpenGymEnv::GetActionSpace, this) );
  openGymInterface->SetGetObservationSpaceCb( MakeCallback (&OpenGymEnv::GetObservationSpace, this) );
  openGymInterface->SetGetGameOverCb( MakeCallback (&OpenGymEnv::GetGameOver, this) );
  openGymInterface->SetGetObservationCb( MakeCallback (&OpenGymEnv::GetObservation, this) );
  openGymInterface->SetGetRewardCb( MakeCallback (&OpenGymEnv::GetReward, this) );
  openGymInterface->SetGetExtraInfoCb( MakeCallback (&OpenGymEnv::GetExtraInfo, this) );
  openGymInterface->SetExecuteActionsCb( MakeCallback (&OpenGymEnv::ExecuteActions, this) );
}

opengym_interface

class OpenGymSpace;		//Space类
class OpenGymDataContainer;	//数据存储(比如说Observation的值得存储)
class OpenGymEnv;

init()
  • 创建一个ns3opengym(which使用了zmq等通信框架),把信息(obsSpace和actionSpace的初始化信息)通过ns3opengym传递给python并设置m_initSimMsgSent为真
  • 然后收python那边传来的ACK

NotifyCurrentState()
  • 把ns3这边的数据收集起来( Obersavation、reward、Done(IsGameOver)、ExtraInfo )传递给python

IsGameOver
  • 返回gameOver或者m_simEnd

NotifySimulationEnd
  • 应该是再模拟结束的时候调用?
  • 设置m_simEnd为真
    • 结束有两种方式,一种就是仿真时间到了,一种就是IsGameOver返回True
  • 如果m_initSimMsgSent为真

OpenGymInterface(uint32_t port)
  • 初始化一些属性
m_port(port), m_zmq_context(1), m_zmq_socket(m_zmq_context, ZMQ_REQ),
  m_simEnd(false), m_stopEnvRequested(false), m_initSimMsgSent(false)

DoGet(uint32_t port)和 Get( uint32_t port )
  • 使用单例模式返回一个interface的ptr

WaitForStop()
  • 调用NotifyCurrentState()

NotifySimulationEnd()
  • 设置m_simEnd为真
  • 如果已经初始化发过信息(m_simEnd为真),调用m_simEnd

Notify()
  • 设置回调函数(设置成OpenGymEnv 的一系列动作)
  SetGetGameOverCb( MakeCallback (&OpenGymEnv::GetGameOver, entity) );
  SetGetObservationCb( MakeCallback (&OpenGymEnv::GetObservation, entity) );
  SetGetRewardCb( MakeCallback (&OpenGymEnv::GetReward, entity) );
  SetGetExtraInfoCb( MakeCallback (&OpenGymEnv::GetExtraInfo, entity) );
  SetExecuteActionsCb( MakeCallback (&OpenGymEnv::ExecuteActions, entity) );



TcpGymEnv [ 还是个抽象类 ]

  • 继承OpenGymEnv ,所以一定要实现那OpenGymInterface对应的七个接口

  • 还要求了另一些多的接口

    • track packet
    * TxPktTrace()
    * RxPktTrace
    
    • TCP拥塞控制算法
    GetSsThresh()
    IncreaseWindow()
    PktsAcked()
    CongestionStateSet()
    CwndEvent()
    
  • 还有一些属性用于记录AGENT

m_nodeId  哪个节点是AGENT 
m_socketUuid 这个节点上的哪个socket

TcpEventGymEnv

  • 继承TcpGymEnv

TcpTimeStepGymEnv

  • 继承TcpGymEnv

存疑

  • 动作的更新也在每一个Step里面?
  • openGym的接口是什么时候被自动调用的?
  • NotifySimulationEnd什么时候调用呢
  • 还有一些属性用于记录AGENT 这个是不是用来设置相应的变化的
### Isaac Sim 使用教程 #### 安装与配置 为了使用 Isaac Sim 及其集成的 Omniverse Isaac Gym 插件,需先完成基本环境配置。这通常涉及安装 NVIDIA Omniverse 平台以及特定版本的 Isaac Sim 软件包[^2]。 对于 Windows 用户来说,推荐通过 WSL2 (Windows Subsystem for Linux 2) 来设置开发环境,并确保已正确安装 ROS2 系统以便于后续与其他机器人系统的交互[^3]。 #### 启动 Isaac Sim 启动 Isaac Sim 应用程序后,默认界面提供了多种预设场景供开发者快速上手测试。用户可以通过图形化编辑器创建自定义模拟环境或将现有模型导入至工作区中进行调整优化。 ```bash # 进入到 isaac_sim 所在目录并执行启动命令 ./isaac-sim.sh ``` #### 配置 Omniverse Isaac Gym Omniverse Isaac Gym 是专为大规模物理仿真设计的强大工具集,在最新版 Isaac Sim 中作为内置组件提供给用户。该模块允许研究人员高效地构建复杂多样的强化学习任务环境,支持批量处理多个相同类型的实体实例以加速训练过程[^1]。 要激活此特性,可在项目文件夹内找到对应 Python API 文档说明来指导具体参数设定;另外官方 GitHub 仓库也包含了丰富的案例可供参考学习: ```python from omni.isaac.gym.vec_env import VecEnvBase env = VecEnvBase(headless=True) task_name = "CartPole" env.load_task(task_name) obs = env.reset() print(f"Observation space shape: {env.observation_space.shape}") print(f"Action space shape: {env.action_space.shape}") for i in range(100): actions = ... obs, rew, done, info = env.step(actions) env.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值