要点初见:安装教程与二度拓展——基于SUMO的Flow Project(附代码链接)

2023-05-16

前文链接:要点初见:用Python进行微观交通模型仿真——基于SUMO的伯克利开源项目Flow Project初探与拓展

 

前文链接中是博主先前写TRB论文时根据个人研究所写的Flow Project介绍、代码解释以及初步的功能拓展方法介绍,简单说就是一个能用python设计运行微观交通流仿真、方便在微观交通流中进行强化学习(Reinforcement Learning)的好东西(官方链接:https://github.com/flow-project/flow)。最近写毕业论文又捡起了Flow Project用来做微观交通流仿真,安装运行了Flow官方Github上的master分支代码(最新flow版本:flow0.5.0)后发现这新版本仍然没有实现众多仿真时必要的功能,譬如每个车辆的长宽等参数定制、每条道路的行驶速度等参数定制等等。其实这些功能都是SUMO中已有的,只需要一点衔接就能在Flow中实现这些功能,Flow作为SUMO的二次开发框架可能更集中于强化学习部分的功能开发,故在基础功能开发方面未有深入。

本文不会具体介绍这些功能衔接的具体实现(想了解可以将highway_newfunc分支的代码覆盖至master分支,并用VSCode之类的IDE查看Source Control-CHANGES),本文主要是给出链接、介绍优化后的Flow超简单安装方法、介绍此次拓展出的功能,并分析示例代码(test0205.py)。本文的运行环境是 Ubuntu16.04, anaconda 4.6.11

**************************************************************

注意:修改flow/flow中的源码后需要重新运行python setup.py develop对项目进行rebuild,Flow核心中部分的代码需要rebuild才会生效,例如flow/flow/core/kernel/simulation/、flow/flow/core/experiment.py,部分核心代码不需要rebuild也能生效,例如flow/flow/core/kernel/network/,但每次修改源码后运行python setup.py develop能避免改动未生效。

**************************************************************

不多废话,此处是在Flow(2021.2.8 master分支)上实现了这些功能衔接的代码链接(注意是highway_newfunc分支而非master分支):

Github 链接:https://github.com/BingLiHanShuang/flow/tree/highway_newfunc

百度网盘链接:https://pan.baidu.com/s/1GD3gb5sHthAzTBpvM0JTSw  提取码:59pe

1  下载并切换分支

此处展示通过git下载并切换至本分支所需的命令:

1、git clone https://github.com/BingLiHanShuang/flow.git

2、cd flow

3、git checkout highway_newfunc

2  安装Flow

切换至highway_newfunc分支后,Flow安装起来相比master分支更简单!具体方法如下(此时在flow目录下,需提前安装好anaconda)(参考Flow官方文档:https://flow.readthedocs.io/en/latest/flow_setup.html):

1、pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple(更适合中国宝宝体质)

2、conda env create -f environment.yml

3、pip install -r requirements.txt

4、安装sumo:根据自己的系统运行如下对应的脚本

Ubuntu 14.04:

运行flow/scripts/setup_sumo_ubuntu1404.sh

Ubuntu 16.04:

运行flow/scripts/setup_sumo_ubuntu1604.sh

Ubuntu 18.04:

运行flow/scripts/setup_sumo_ubuntu1804.sh

Mac:

运行flow/scripts/setup_sumo_osx.sh

5、运行如下命令测试sumo是否安装成功:

which sumo

sumo --version

sumo-gui

6、conda activate flow_new2

7、python setup.py develop(此步骤若运行timeout超时可多次运行)

3  Flow拓展的原理以及修改的文件

Flow的本质实际上是通过代码自动化撰写SUMO相关的xml等文件、设定Flow参数,并调用SUMO中的Python接口TraCI从而实现SUMO仿真:前者主要由example/exp_configs里的python脚本实现,后者估摸着是由simulate.py实现。先前在stackoverflow上博主曾询问了Flow是否能实现定制每条道路单独速度的问题(https://stackoverflow.com/questions/56901221/can-we-choose-max-and-min-speeds-for-each-traffic-lane-in-flow-project),得到的回答说是可以直接单独调用TraCI实现该功能,实际上博主尝试后发现暂时还无法介入Flow调用TraCI的层面进行功能实现,但可以从撰写xml文件(即前文所述的衔接)的角度入手进行源码修改从而将SUMO中已有的功能移植到flow中。

本highway_newfunc分支修改的文件如下:

1、flow/environment.yml

2、flow/README.md

3、flow/requirements.txt

4、flow/examples/exp_configs/non_rl/test0205.py

5、flow/core/params.py

6、flow/core/kernel/network/traci.py

7、flow/networks/highway.py

4  highway_newfunc分支的拓展功能

本highway_newfunc分支主要实现的功能如下:

1、改进了Flow安装方法,解决了一个依赖库的版本bug:在conda env create时pip应先被安装再安装其他库。而redis需>=3.3.2才能符合environment.yml中某个库的依赖。(具体哪个忘了……)

2、为VehicleParams类增加了length、width、height和vClass参数,即可在Flow代码中添加车辆时设定该种车辆的长、宽、高、车辆类型,这些设定能在SUMO仿真中直观生效。车辆类型默认为passenger,具体内容选择可在该链接中查询: https://sumo.dlr.de/docs/Definition_of_Vehicles,_Vehicle_Types,_and_Routes.html#abstract_vehicle_class。未来还能为VehicleParams类添加的参数可以参考这个链接:https://sumo.dlr.de/docs/Definition_of_Vehicles,_Vehicle_Types,_and_Routes.html#available_vtype_attributes

3、在highway路网中增加了lane_list参数(其他路网中未添加,若想添加请参考flow/flow/networks/highway.py),即可为每个edge上的每条lane单独设定专门的行驶速度上限、禁行的车辆种类名单。SUMO中的道路(lane)是建立在edge(出发边缘)上的。禁行的车辆种类名单的书写格式为“A”或“A B C 等等”,A的内容需从上文车辆类型的具体内容链接中选取,不同种类由空格隔开。未来还能为每条道路添加的参数可以参考这个链接:https://sumo.dlr.de/docs/Networks/PlainXML.html#lane-specific_definitions

4、为TraCIKernelNetwork类增加了width参数,即可设定整个仿真中的道路宽度,同样能在SUMO仿真中直观生效。未来如果想定制每个edge中每条lane的宽度,方法可以参考3中lane_list的修改方法对源码进行修改。

5、增加了对如上4项功能的示例代码flow/examples/exp_configs/non_rl/test0205.py,也是博主毕业论文的仿真基础……目前未写测试,待问问Flow官方看不看的上这个拓展版本。

6、以上所有拓展内容都是可选的,仿真不设置上述内容一样可跑。

5  运行示例代码

示例代码flow/examples/exp_configs/non_rl/test0205.py的运行方法:

1、新开一个Terminal窗口,切换到flow项目目录下

2、conda deactivate

3、source activate flow_new2

4、export PYTHONPATH="/home/hongyong/.conda/envs/flow_new2/lib/python3.7/site-packages:$PYTHONPATH"

5、python examples/simulate.py test0205 --gen_emission

输出结果:

/home/hongyong/.conda/envs/flow_new2/lib/python3.7/site-packages/numpy/core/fromnumeric.py:3335: RuntimeWarning: Mean of empty slice.

out=out, **kwargs)

/home/hongyong/.conda/envs/flow_new2/lib/python3.7/site-packages/numpy/core/_methods.py:161: RuntimeWarning: invalid value encountered in double_scalars

ret = ret.dtype.type(ret / rcount)

Round 0, return: -0.1

./data/test0205_20210208-1735491612776949.4998093-0_emission.csv ./data

Average, std returns: -0.1, 0.0

Average, std velocities: nan, nan

Average, std outflows: 2030.4, 0.0

Total time: 220.84119844436646

steps/second: 48.04350433419724

运行生成的文件:

flow/data/test0205.json

flow/data/test0205_20210208-1735491612776949.4998093-0_emission.csv (237.8 MB, 研究Flow仿真的核心所在,但太大了所以git pull前和json文件一起删了)

6  示例代码flow/examples/exp_configs/non_rl/test0205.py分析

先给出全貌:

"""Example of an open multi-lane network with human-driven vehicles."""

import traci
from flow.core.kernel.vehicle import KernelVehicle
from flow.core.kernel.vehicle import TraCIVehicle
from flow.core.kernel import Kernel
from flow.core.params import SimParams

from flow.controllers import IDMController, SimLaneChangeController, RLController
from flow.core.params import SumoParams, EnvParams, NetParams, InitialConfig, SumoLaneChangeParams, SumoCarFollowingParams
from flow.core.params import VehicleParams, InFlows
from flow.envs.ring.lane_change_accel import ADDITIONAL_ENV_PARAMS
from flow.networks.highway import HighwayNetwork, ADDITIONAL_NET_PARAMS
from flow.envs import LaneChangeAccelEnv

vehicles = VehicleParams()

vehicles.add(
    veh_id="rlcar",# Lincoln MKC 4552*1864*1654 THIS IS TYPE NAME
    length = 4.552,
    width = 1.864,
    height = 1.654,
    vClass = "passenger",
    #color = "1,0,0",
    acceleration_controller=(RLController, {}),
    car_following_params=SumoCarFollowingParams(
        speed_mode="obey_safe_speed",
        max_speed=33.333,
        accel=2.6, #Wait changed
        decel=4.5, 
        sigma=0.5, 
        tau=1.0, 
        min_gap=2.5,
        speed_factor=1.0, 
        speed_dev=0.1, 
        impatience=0.5, 
        car_follow_model="IDM"
    ),
    lane_change_params=SumoLaneChangeParams(
        lane_change_mode="only_speed_gain_safe",# no_lc_safe, Disable all SUMO lane changing but still handle safety checks (collision avoidance and safety-gap enforcement) in the simulation.
        model="SL2015",
        lc_sublane=2.0,
    ),
    num_vehicles=0)

vehicles.add(
    veh_id="humancar",# Volkswagen LAVIDA 4670*1806*1474 max:120km/h
    length = 4.67,
    width = 1.806,
    height = 1.474,
    vClass = "passenger",
    #v0 : desirable velocity, in m/s (default: 30) in flow/flow/controllers/car_following_models.py 352
    acceleration_controller=(IDMController,{'v0':32}),# desirable velocity 115km/h
    car_following_params=SumoCarFollowingParams(
        speed_mode="obey_safe_speed", # default
        max_speed=33.333,
        accel=2.6, #Wait changed
        decel=4.5, 
        sigma=0.5, 
        tau=1.0, 
        min_gap=2.5,
        speed_factor=1.0, 
        speed_dev=0.1, 
        impatience=0.5, 
        car_follow_model="IDM"
    ),
    lane_change_params=SumoLaneChangeParams(
        lane_change_mode="only_speed_gain_safe",# sumo_default, only_speed_gain_safe, only_strategic_safe, only_cooperative_safe
        model="SL2015", # Lane-changing model for sublane-simulation [https://sumo.dlr.de/docs/Definition_of_Vehicles,_Vehicle_Types,_and_Routes.html] [https://sumo.dlr.de/docs/Simulation/SublaneModel.html]
        lc_sublane=2.0, # The eagerness for using the configured lateral alignment within the lane. Higher values result in increased willingness to sacrifice speed for alignment. default: 1.0, range [0-inf]
    ),
    num_vehicles=0)

vehicles.add(
    veh_id="humanbus",# YUTONG ZK6826BEV 8245*2500*3240 max:100km/h
    length = 8.245,
    width = 2.500,
    height = 3.240,
    vClass = "bus",
    color = "1,1,0",
    acceleration_controller=(IDMController, {'v0':26.4}),# 95km/h
    car_following_params=SumoCarFollowingParams(
        speed_mode="obey_safe_speed", # default
        max_speed=27.778,
        accel=2.6, #Wait changed
        decel=4.5, 
        sigma=0.5, 
        tau=1.0, 
        min_gap=2.5,
        speed_factor=1.0, 
        speed_dev=0.1, 
        impatience=0.5, 
        car_follow_model="IDM"
    ),
    lane_change_params=SumoLaneChangeParams(
        lane_change_mode="only_speed_gain_safe",
        model="SL2015",
        lc_sublane=2.0,
    ),
    num_vehicles=0)

vehicles.add(
    veh_id="humantruck",# FOTON BJ5319XXY-AB 12000*2550*3950 max:100km/h
    length = 12,
    width = 2.550,
    height = 3.950,
    vClass = "truck",
    color = "0,1,0",
    acceleration_controller=(IDMController, {'v0':25}),# 90km/h
    car_following_params=SumoCarFollowingParams(
        speed_mode="obey_safe_speed", # default
        max_speed=27.778,
        accel=2.6, #Wait changed
        decel=4.5, 
        sigma=0.5, 
        tau=1.0, 
        min_gap=2.5,
        speed_factor=1.0, 
        speed_dev=0.1, 
        impatience=0.5, 
        car_follow_model="IDM"
    ),
    lane_change_params=SumoLaneChangeParams(
        lane_change_mode="only_speed_gain_safe",
        model="SL2015",
        lc_sublane=2.0,
    ),
    num_vehicles=0)

env_params = EnvParams(additional_params=ADDITIONAL_ENV_PARAMS)

inflow = InFlows()
inflow.add(
    veh_type="rlcar",
    edge="highway_0",
    #probability=0.025,# 0.25 probability for emitting a vehicle each second (not together with vehsPerHour or period)
    vehs_per_hour=120,#250
    depart_lane=3,# the index of the lane, starting with rightmost=0
    depart_speed=30)
    
inflow.add(
    veh_type="humancar",
    edge="highway_0",
    #probability=0.85,# 0.25 probability for emitting a vehicle each second (not together with vehsPerHour or period)
    vehs_per_hour=2500,#15000
    depart_lane="random",#free random allowed best first
    depart_speed=30)
    
inflow.add(
    veh_type="humanbus",
    edge="highway_0",
    #probability=0.1,
    vehs_per_hour=486,#486
    depart_lane="random",
    depart_speed=26.4)
    
inflow.add(
    veh_type="humantruck",
    edge="highway_0",
    #probability=0.05,
    vehs_per_hour=486,#486
    depart_lane="random",
    depart_speed=25)

flow_params = dict(
    # name of the experiment
    exp_tag='test0205',

    # name of the flow environment the experiment is running on
    env_name=LaneChangeAccelEnv,

    # name of the network class the experiment is running on
    network=HighwayNetwork,

    # simulator that is used by the experiment
    simulator='traci',

    # sumo-related parameters (see flow.core.params.SumoParams)
    #sim=SumoParams(
        #render=True,
        #lateral_resolution=1.0,
    #),
    sim=SumoParams(
        restart_instance=True, 
        sim_step=0.1, # seconds per simulation step, default
        emission_path="./data/",
        render=True, # delegate rendering to sumo-gui for back-compatibility(Color)
        lateral_resolution=3.75,
        sight_radius=120, # sets the radius of observation for RL vehicles (meter)
        pxpm=3, # specifies rendering resolution (pixel / meter)
        show_radius=True # specifies whether to render the radius of RL observation
        #save_render=True # specifies whether to save rendering data to disk
    ),

    # environment related parameters (see flow.core.params.EnvParams)
    env=EnvParams(
        horizon=5000, # number of steps per rollouts
        additional_params=ADDITIONAL_ENV_PARAMS.copy(),
    ),

    # network-related parameters (see flow.core.params.NetParams and the
    # network's documentation or ADDITIONAL_NET_PARAMS component)
    net=NetParams(
        inflows=inflow,
        #additional_params=ADDITIONAL_NET_PARAMS.copy(),
        additional_params={
            'length': 6000,
            'width': 3.75,
            'lanes': 4,# highway_0_0(right) highway_0_3(left)
            'speed_limit': 33.333,
            'num_edges': 1,
            # 'lane_list': {}, # must available
            'lane_list': {'0': # edge index
                [
                    {
                        'index': '0', # 0(right)  n-1(left)
                        'speed': '27.778'
                    },
                    {
                        'index': '1', 
                        'speed': '27.778'
                    },
                    {
                        'index': '3', 
                        'speed': '33.333', 
                        'disallow': "bus truck"
                    }
                ]
            }, #In the order of edges index
            "use_ghost_edge": False,
            "ghost_speed_limit": 25,
            "boundary_cell_length": 500
        },
    ),

    # vehicles to be placed in the network at the start of a rollout (see
    # flow.core.params.VehicleParams)
    veh=vehicles,

    # parameters specifying the positioning of vehicles upon initialization/
    # reset (see flow.core.params.InitialConfig)
    initial=InitialConfig(
        spacing="uniform",
        shuffle=True,
    ),
)

单步分解可以参考文首的前文链接,里面有非常详细的介绍啦。此处主要介绍与本文拓展有关的部分:

a. 通过VehicleParams类定制每辆车

vehicles.add(
    veh_id="humanbus",# YUTONG ZK6826BEV 8245*2500*3240 max:100km/h
    length = 8.245,
    width = 2.500,
    height = 3.240,
    vClass = "bus",
    color = "1,1,0",
    acceleration_controller=(IDMController, {'v0':26.4}),# 95km/h
    car_following_params=SumoCarFollowingParams(
        speed_mode="obey_safe_speed", # default
        max_speed=27.778,
        accel=2.6, #Wait changed
        decel=4.5, 
        sigma=0.5, 
        tau=1.0, 
        min_gap=2.5,
        speed_factor=1.0, 
        speed_dev=0.1, 
        impatience=0.5, 
        car_follow_model="IDM"
    ),
    lane_change_params=SumoLaneChangeParams(
        lane_change_mode="only_speed_gain_safe",
        model="SL2015",
        lc_sublane=2.0,
    ),
    num_vehicles=0)

以大客车的添加为例,你可以自由设定它的长、宽、高、车辆种类啦。在SUMO仿真中的效果图如下(即图中的黄色车辆,右侧是其SUMO参数界面):

b.为highway路网增加增加道路宽度参数,并定制每条道路的最高限速、禁行车辆种类名单

net=NetParams(
        inflows=inflow,
        #additional_params=ADDITIONAL_NET_PARAMS.copy(),
        additional_params={
            'length': 6000,
            'width': 3.75,
            'lanes': 4,# highway_0_0(right) highway_0_3(left)
            'speed_limit': 33.333,
            'num_edges': 1,
            # 'lane_list': {}, # must available
            'lane_list': {'0': # edge index
                [
                    {
                        'index': '0', # 0(right)  n-1(left)
                        'speed': '27.778'
                    },
                    {
                        'index': '1', 
                        'speed': '27.778'
                    },
                    {
                        'index': '3', 
                        'speed': '33.333', 
                        'disallow': "bus truck"
                    }
                ]
            }, #In the order of edges index
            "use_ghost_edge": False,
            "ghost_speed_limit": 25,
            "boundary_cell_length": 500
        },
    ),

可以看到,上述代码中将道路宽度设定为3.75m,通过lane_list为index为0(edge的index可能需要参考源码中读取edge的顺序)的edge上的0、1、3号道路(Flow中0号道路是edge最右侧那条)分别定制了最高限速,并为3号道路定制了禁行bus和truck的规则。在SUMO仿真中的0到3号道路的参数图如下:

建议大家在该示例代码的基础上进行修改开发,如果需要在其他路网(例如下图Flow官方示例中魔幻的minicity)中实现这些功能,如文首所说可以将highway_newfunc分支的代码覆盖至master分支,并用VSCode之类的IDE查看Source Control-CHANGES,从而对其他路网进行类似的修改(主要还是修改flow/flow/networks中的文件)。

欢迎交流讨论!对Flow Project有更深入的疑惑可以在stackoverflow的专题链接中提问(带上flow-project的标签,回的挺快):https://stackoverflow.com/questions/tagged/flow-project

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

要点初见:安装教程与二度拓展——基于SUMO的Flow Project(附代码链接) 的相关文章

  • pugixml使用笔记

    https pugixml org docs manual html dom tree pugixml官方使用手册 1 创建xml文件信息 例如 xff1a pugi xml document xmldoc pugi xml node de
  • QQ情话糖果情话内容获取并保存

    1 下载夜神模拟器 xff0c 打开应用商店下载xposed和qq xff0c xposed里面安装trustmealready 2 打开模拟器里面的wifi设置代理 xff0c 电脑fiddler抓包 设置代理方法 1 电脑打开fiddl
  • Qscrollarea去除边框的办法

    1 代码去除 QScrollArea是派生于QFrame xff0c 如果设置QFrame的FrameShape值为NoFrame那么就可以实现边框去除 ui gt scrollArea gt setFrameShape QFrame No
  • 简单VS问题 VS2017 文件高级保存选项显示设置

    在用VS2015的时候可以在文件 文件高级保存选项中 但是在VS2017中 xff0c 这个功能不见了 xff0c 按下面方法就可以给弄出来了 1 工具 自定义 xff1b 2 点击 命令 标签 xff1b 3 在上方单选区选中 菜单栏 x
  • Qt程序启动画面播放(gif与swf两种动画格式)

    学习Qt有一段时间了 xff0c 发现一个小问题 xff0c 网上关于Qt的资料或者总结性的学习及应用文章有点少 比如 xff0c Qt完整的API xff0c 程序运行之前的启动画面如何按理想效果播放等 xff0c 每次想在项目中添加一些
  • 自己总结的QT相关资料和网址汇总

    QT官网 xff1a http www qt io download QT项目源码 xff1a http download qt io QT编程指南 xff1a https lug ustc edu cn sites qtguide QTD
  • QT程序异常结束 处理方式

    运行几个网上的程序都出现如下程序异常结束 xff0c 感觉没有任何错误 xff0c 所以就去网上搜索解决方案 xff1a 很多人都说是 xff1a 1 环境问题 2 要不就是编译器选择不符 3 还有就是有的人是在动态编译的时候提示缺少一些d
  • 【Windows版】CMake安装教程

    一 参考资料 windows 43 cmake 43 mingw 搭建c c 43 43 开发环境 二 步骤 1 官网下载CMake安装包 CMake官网 2 解压安装包 D 360Downloads Software CMake cmak
  • GNSS入门2-RTD, RTK,精度

    2 1 RTD vs RTK RTD xff08 Real Time Differential xff09 xff1a 实时码 xff08 C A码 P码 xff09 相位差分技术 xff0c 流动站与基站距离需小于100km xff0c
  • 关于嵌入式开发的C语言基础总结

    一 位操作 C语言支持的6种位操作符如下 xff1a 1 不改变其他位的值的状况下 xff0c 对某几个位进行设值 方法 xff1a 先对需要设置的位用 amp 操作符 xff08 对应位 amp 0 xff09 进行清零操作 xff0c
  • STM32 ASSERT断言机制

    调试代码经常会有跑崩的时候 xff0c 当整机调试是出问题特别让人崩溃 xff0c 断言机制能很好的定位由于参数错误导致的系统异常的情况 在代码重要的代码区 xff0c 添加断言 xff0c 相当于对出入参数做了预判操作 xff0c 当参数
  • 舵机抖动的原因分析

    舵机抖动 舵机在很多场合都会用到 xff0c 比如航模 云台等 但有时候舵机会莫名的出现抖动 xff0c 最近我也遇到了这个问题 xff0c 花了两天的时间终于解决了 舵机抖动的原因主要有以下几点 xff1a 1 电源电压不足 xff1a
  • ubuntu系统python实现串口通信

    我使用的是USB TTL串口 xff0c 下面是测试之前的一些准备工作 span class token function ls span dev span class token comment 查看设备 xff0c 插拔串口设备注意有没
  • __FILE__,__func__,__LINE__用法举例

    C语言中 xff0c FILE func LINE 常用于logout xff0c 打trace xff0c debug调试 注意 xff1a 其使用不需要定义 xff0c FILE 指示当前文件名 func 指示当前函数名 LINE 指示
  • STM32 串口超时中断+DMA接收不定长数据 比 空闲中断(IDLE)更加灵活、稳定(一)

    前言 xff1a 最近项目有使用串口接收大段不定长GPS数据的需求 xff0c 调试了很久 xff0c 终于找到一个比较好的解决办法 我觉得这个项目需求 xff08 高波特率 大段数据 不定长 xff09 十分典型 xff0c 所以在这里记
  • STM32串口通信(基于缓冲区)

    一 串口的初始化和中断设置 1 初始化GPIO xff1a 根据手册的8 1 11节 xff0c 我们可以找到下表 xff1a 在全双工的模式下 xff0c 发送引脚需要设置为推挽复用输出 xff0c 接收引脚则设置为浮空输入或带上拉的输入
  • STM32与C#上位机串口通信示例

    1 概述 串口通信是一种非常常用的通信方式 xff0c 本文首先介绍了串口硬件和协议的相关内容 xff0c 然后给出一个STM32与C 上位机通过串口通信的示例 2 串口介绍 参考这份文档 3 通信协议 为了方便数据传输 xff0c 定义了
  • 【转】23个常用的VSCode快捷键(动图演示)

    尽管我们经常使用 VS Code中的许多快捷方式 xff0c 但是我们有可能会忘记它们 这里用可视化制作了一些GIF xff0c 以便更好地记住它们 xff0c 希望对你有所帮助 VSCode中的每个命令也可以通过使用CTRL 43 SHI
  • HI3531编码h.264文件播放偏慢分析随笔

    现象 xff1a 编码h 264文件播放时 xff0c 无论帧率是30fps还是60fps xff0c 播放器显示帧率为25 fps 探索过程 xff1a cat proc umap venc 显示得知 xff0c 编码的的确是30fps和
  • C++ const用法详解

    const 是C 43 43 中常用的类型修饰符 常类型是指使用类型修饰符const说明的类型 xff0c 常类型的变量或对象的值是不能被更新的 目录 一 const的作用 二 const修饰普通类型的变量 三 const修饰指针变量 四

随机推荐

  • Source Insight 4.0打开一会就闪退 解决方法

    遇到Source Insight 4 0打开直接闪退 xff0c 请不要着急卸载 xff0c 在Source Insight 4 0快捷键上 xff0c 点击属性 xff0c 选择兼容性如下 xff1a
  • secureCRT连接ubuntu18.04

    1 安装ssh服务器 sudo apt get install openssh server 2 ssh服务器安装失败 错误提示 xff1a 下列软件包有未满足的依赖关系 xff1a openssh server 原因 xff1a 系统预置
  • STM32——USART串口通信与串口重定向

    简介 UART 通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff0c 通常称 作 UART 它将要传输的资料在串行通信与并行通信之间加以转换 作为把并行输入信 号
  • 海思文件系统缺少文件himm 、i2c_read 、i2c_write 、ssp_read 、ssp_write

    原因 xff1a 海思根文件默认没有把himm i2c read i2c write ssp read ssp write工具集成在bin里 xff0c 但是在sdk中 解决办法 xff1a cd osdrv tools board reg
  • Ubuntu 18.04 Samba服务器的安装和配置(详解)

    具体步骤 xff1a 1 设置为静态IP xff1a 点击静态IP设置链接 2 更新当前软件 sudo apt get upgrade sudo apt get update sudo apt get dist upgrade 3 安装sa
  • C52单片机(AT89C52)—流水灯

    本文重点 xff1a C52流水灯代码编写 xff0c keil如何生存hex文件和proteus如何导入hex文件 1 打开keil xff0c 建立工程 xff0c 编写如下代码 include lt reg52 h gt includ
  • Hi3516EV200图像调优

    一 平台搭建 1 将Hi3516EV200 PQ V1 0 0 3 tgz放到nfs挂载目录下解压 xff0c 进入Hi3516EV200 PQ V1 0 0 3 执行StartControl sh 2 执行HiPQTools exe xf
  • Qt低延时/可集成嵌入的网络播放器 –soundTouch的使用

    背景 在观看直播的过程中 xff0c 保不齐网络出现卡的现象 xff0c 可能导致音频数据包累积了好几秒的数据 xff0c 这时候要么丢直接播放新的 xff0c 要么直接播放基音 xff0c soundTouch可以加速播放并不要变调 主要
  • 超低延时直播rtmp推流

    项目起源 xff1a 改项目主要是基于类qt av的模式 xff0c 快速集成 xff0c 将ffmpeg融入到插件当中 xff0c 并提供本地的音频设备和视频设备的查找输出 xff0c 并可以采集各类虚拟摄像头 xff0c 酷狗直播助手
  • minio 使用aws c++ 多线程下载

    C 43 43 下载 Minio 文件 下载 aws sdk cpp git clone recurse submodules GitHub aws aws sdk cpp AWS SDK for C 43 43 麒麟上编译AWS cmak
  • 拉流推流服务器设计

    背景 该服务器也是基于一个客户的需求产生的 客户那边使用的是腾讯的直播sdk xff0c 将不同终端的流推到腾讯云平台 xff0c 但是又想推到其他平台 xff0c 基于此需求 xff0c 该产品产生了 该产品通讯协议使用的是WebSock
  • 开发实现C++ RTMP直播推流sdk

    前言 rtmp即Real Time Messaging Protocol xff08 实时消息传输协议 xff09 的首字母缩写 xff0c 它是由Adobe公司提出的一种应用层的协议 xff0c 用来解决多媒体数据传输流的多路复用 xff
  • 开发实现C++ RTMP直播拉流播放器

    背景 该直播播放器的背景是来源于 拉流推流服务器设计 的一个分支 xff0c 它的重点是把拉下来的流进行解码显示播放 设计点 要实现跨平台 xff0c 目前支持的平台linux和windows要模块化和结构化可以拉各个平台的直播流要音视频同
  • 校验和计算原理

    校验和思路 首先 xff0c IP ICMP UDP和TCP报文头都有检验和字段 xff0c 大小都是16bit xff0c 算法基本上也是一样的 在发送数据时 xff0c 为了计算数据包的检验和 应该按如下步骤 xff1a 1 把校验和字
  • gb 28181的20位编码简介

    图解Python数据结构与算法 实战篇 举例 xff1a 36030000042000000003 设备的20位编码组成 国标编码由中心编码 xff08 8位 xff09 行业编码 xff08 2位 xff09 类型编码 xff08 3位
  • 继承的构造析构函数&&父类子类同名函数,变量的调用

    include lt iostream gt include 34 string 34 using namespace std class Base public int m A int m B 61 20 Base m A 61 100
  • CMake 之静态库依赖动态库,如何使用该静态库

    参考 xff1a xff08 参考文章用的Makefile 我自己用的CMake xff09 静态库链接动态库时 xff0c 如何使用该静态库 newchenxf的专栏 CSDN博客 链接静态库 1 先建立如下工程目录文件 下载 xff08
  • 单片机堆栈小知识

    目录 一 关于单片机堆栈的基础知识 1 STM32程序数据分类 2 STM32内存 RAM 分配 3 经典例子分析 xff1a 4 STM32堆栈位置 5 STM32栈增长方式 三 如何设置STM32的堆栈大小 1 MDK编译环境下 2 I
  • 要点初见:用Python进行微观交通模型仿真——基于SUMO的伯克利开源项目Flow Project初探与拓展

    后续拓展 xff1a 要点初见 xff1a 安装教程与二度拓展 基于SUMO的Flow Project xff08 附代码链接 xff09 通俗来讲 xff0c 微观交通模型仿真就是从车辆个体的视角 xff08 看动画 xff09 进行交通
  • 要点初见:安装教程与二度拓展——基于SUMO的Flow Project(附代码链接)

    前文链接 xff1a 要点初见 xff1a 用Python进行微观交通模型仿真 基于SUMO的伯克利开源项目Flow Project初探与拓展 前文链接中是博主先前写TRB论文时根据个人研究所写的Flow Project介绍 代码解释以及初