QuadrotorFly-四旋翼无人机动力学仿真环境介绍

2023-05-16

QuadrotorFly四旋翼无人机动力学模型

主要目的是开发一个用于无人机动力学仿真的简单易用、功能相对齐全的仿真环境(也许是水论文环境)。这个仿真是基于python编写的,GPL开源。git的地址在:
https://github.com/linxiaobo110/QuadrotorFly

主要功能(已实现)

模型功能

  • 四旋翼基本动力学模型,即电机推力到角速度、速度的动力学模型。
  • 电机动力学模型,简化成一阶惯性系统,控制输入为百分比(即0-1的小数)。
  • 系统干扰,作用在基本动力学模型上的均值可设定的随机噪声
  • 机型选择,‘x’ 型或 ‘+’ 型。见常见机型
  • 提供了常见控制器以供参考,现有PD控制器
  • 提供了奖励函数以供学习算法使用
  • 状态边界检查,超出最大值后finish标志变成True

仿真功能

  • 支持随机初始位置、固定初始位置两种启动模式
  • 采样时间可设定,状态更新方式采用4阶龙格库塔方法
  • GUI动画,目前基于matplotlib搭建,支持多机

环境与依赖

环境

python3 + 你喜欢的编辑器
新手推荐anconda+spyder简单粗暴,入门建议anaconda+jupyter快捷稳定逼格高,想长期学习的建议anaconda+pycharm门槛高功能强大到难以想象。

需要的库

  • numpy
  • matplotlib

我使用的环境

  • win10 + Anaconda (python 3.6)+ Pycharm

使用教程

这些程序在pycharm、spyder下运行通过。jupyter的测试程序是工程目录下的TestInJupyter.ipynb,模型可以运行不过gui动画不会动,暂时还没有修复。使用过程中有什么建议或者问题可以联系我729527658@qq.com.

测试

下载解压(建议使用git克隆)后运行其中的 QuadrotorFlyTest.py文件。
git克隆指令

git clone https://github.com/linxiaobo110/QuadrotorFly.git

成功运行可以看到以下效果:

在这里插入图片描述

运行结束后在画面单击可以看整个过程的飞行曲线
在这里插入图片描述

最简实现

不画图和记录数据,就是了解整个调用流程。可以在当前目录里新疆一个Test_simple.py(这个代码在Test文件夹里有),然后放入以下代码:

# 包含头文件
import numpy as np
import QuadrotorFlyModel as Qfm
# 定义无人机参数
uavPara = Qfm.QuadParas()
# 定义仿真的参数
simPara = Qfm.QuadSimOpt()
# 使用参数新建一个无人机
quad1 = Qfm.QuadModel(uavPara, simPara)

# 仿真循环开始,总共1000步
print("Simplest simulation begin!")
for i in range(1000):
    # 设定目标,分别是x,y,z的位置,和偏航角的角度
    ref = np.array([0., 0., 1., 0.])
    # 获取无人机的状态,
    #   共12个维度分别是,xyz位置,xyz速度,roll pitch yaw姿态角,roll pitch yaw 角速度
    stateTemp = quad1.observe()
    # 通过无人机状态计算控制量,这也是自行设计控制器应修改的地方
    #    这是一个内置的控制器,返回值是给各个电机的控制量即油门的大小
    action2, oil = quad1.get_controller_pid(stateTemp, ref)
    # 使用控制量更新无人机,控制量是4维向量,范围0-1
    quad1.step(action2)
    
print("Simulation finish!")

遇到“No module name ‘QuadrotorFlyGui’ ”或者 “No module name ‘QuadrotorFlyModel’”,见工程环境设置错误。

自定义仿真参数

在工程下新建Test_full.py(这个代码在Test文件夹里有),然后复制以下代码:

# 包含文件
import numpy as np
import QuadrotorFlyModel as Qfm
import QuadrotorFlyGui as Qfg
import MemoryStore
import matplotlib.pyplot as plt
# 角度到弧度的转换
D2R = Qfm.D2R
# 仿真参数设置
simPara = Qfm.QuadSimOpt(
        # 初值重置方式(随机或者固定);姿态初值参数(随机就是上限,固定就是设定值);位置初值参数(同上)
        init_mode=Qfm.SimInitType.rand, init_att=np.array([5., 5., 5.]), init_pos=np.array([1., 1., 1.]),
        # 仿真运行的最大位置,最大速度,最大姿态角(角度,不是弧度注意),最大角速度(角度每秒)
        max_position=8, max_velocity=8, max_attitude=180, max_angular=200,
        # 系统噪声,分别在位置环和速度环
        sysnoise_bound_pos=0, sysnoise_bound_att=0,
        #执行器模式,简单模式没有电机动力学,
        actuator_mode=Qfm.ActuatorMode.dynamic
        )
# 无人机参数设置,可以为不同的无人机设置不同的参数
uavPara = Qfm.QuadParas(
        # 重力加速度;采样时间;机型plus或者x
        g=9.8, tim_sample=0.01, structure_type=Qfm.StructureType.quad_plus,
        # 无人机臂长(米);质量(千克);飞机绕三个轴的转动惯量(千克·平方米)
        uav_l=0.45, uav_m=1.5, uav_ixx=1.75e-2, uav_iyy=1.75e-2, uav_izz=3.18e-2,
        # 螺旋桨推力系数(牛每平方(弧度每秒)),螺旋桨扭力系数(牛·米每平方(弧度每秒)),旋翼转动惯量,
        rotor_ct=1.11e-5, rotor_cm=1.49e-7, rotor_i=9.9e-5,
        # 电机转速比例参数(度每秒),电机转速偏置参数(度每秒),电机相应时间(秒)
        rotor_cr=646, rotor_wb=166, rotor_t=1.36e-2
        )
# 使用参数新建无人机
quad1 = Qfm.QuadModel(uavPara, simPara)

# 初始化GUI,并添加无人机
gui = Qfg.QuadrotorFlyGui([quad1])

# 初始化记录器,用于记录飞行数据
record = MemoryStore.DataRecord()

# 重置系统
# 当需要跑多次重复实验时注意重置系统,
quad1.reset_states()
record.clear()

# 仿真过程
print("Simplest simulation begin!")
for i in range(1000):
    # 模型更新
    # 设置目标
    ref = np.array([0., 0., 1., 0.])
    # 获取无人机的状态,共12维的向量
    #   分别是,xyz位置,xyz速度,roll pitch yaw姿态角,roll pitch yaw 角速度
    stateTemp = quad1.observe()
    # 通过无人机状态计算控制量,这也是自行设计控制器应修改的地方
    #    这是一个内置的控制器,返回值是给各个电机的控制量即油门的大小
    action2, oil = quad1.get_controller_pid(stateTemp, ref)
    # 使用控制量更新无人机,控制量是4维向量,范围0-1
    quad1.step(action2)
    
    # 记录数据
    record.buffer_append((stateTemp, action2))
    
    # 渲染GUI
    gui.render()
    
# 输出结果
## 获取记录中的状态
bs = np.array([_[0] for _ in record.buffer])
## 获取记录中的控制量
ba = np.array([_[1] for _ in record.buffer])
## 生成时间序列
t = range(0, record.count)
## 画图
fig1 = plt.figure(2)
plt.clf()
## 姿态图
plt.subplot(3, 1, 1)
plt.plot(t, bs[t, 6] / D2R, label='roll')
plt.plot(t, bs[t, 7] / D2R, label='pitch')
plt.plot(t, bs[t, 8] / D2R, label='yaw')
plt.ylabel('Attitude $(\circ)$', fontsize=15)
plt.legend(fontsize=15, bbox_to_anchor=(1, 1.05))
## 位置图(xy)
plt.subplot(3, 1, 2)
plt.plot(t, bs[t, 0], label='x')
plt.plot(t, bs[t, 1], label='y')
plt.ylabel('Position (m)', fontsize=15)
plt.legend(fontsize=15, bbox_to_anchor=(1, 1.05))
## 高度图
plt.subplot(3, 1, 3)
plt.plot(t, bs[t, 2], label='z')
plt.ylabel('Altitude (m)', fontsize=15)
plt.legend(fontsize=15, bbox_to_anchor=(1, 1.05)) 
print("Simulation finish!")

在spyder下的运行效果:

在这里插入图片描述

如果遇到spyder运行时,图片在终端里显示(就是没有弹出新窗口),见Spyder图形渲染设置。

基础知识

常见四旋翼无人机机型

  • + 型四旋翼无人机
    在这里插入图片描述

  • X 型四旋翼无人机

在这里插入图片描述

四旋翼基本动力学模型

p ¨ x = [ cos ⁡ φ sin ⁡ θ cos ⁡ ψ + sin ⁡ φ sin ⁡ ψ ] τ 0 m + d 1 p ¨ y = [ cos ⁡ φ sin ⁡ θ sin ⁡ ψ − sin ⁡ φ cos ⁡ ψ ] τ 0 m + d 2 p ¨ z = cos ⁡ θ c o s φ τ 0 m − g + d 3 φ ¨ = φ ˙ ψ ˙ ( J z z − J x x J y y ) + J R J y y φ ˙ Ω R + L J y y τ 1 + d 4 θ ¨ = θ ˙ ψ ˙ ( J y y − J z z J x x ) − J R J x x θ ˙ Ω R + L J x x τ 2 + d 5 ψ ¨ = θ ˙ φ ˙ ( J x x − J y y J z z ) + 1 J z z τ 3 + d 6 , \begin{aligned} \ddot{p}_x&=[\cos{\varphi}\sin{\theta}\cos{\psi}+\sin{\varphi}\sin{\psi}]\frac{\tau_0}{m} + d_1\\ \ddot{p}_y&=[\cos{\varphi}\sin{\theta}\sin{\psi}-\sin{\varphi}\cos{\psi}]\frac{\tau_0}{m} + d_2\\ \ddot{p}_z&=\cos{\theta}cos{\varphi}\frac{\tau_0}{m}-g + d_3\\ \ddot{\varphi}&=\dot{\varphi}\dot{\psi}(\frac{J_{zz}-J_{xx}}{J_{yy}}) + \frac{J_R}{J_{yy}}\dot{\varphi}\Omega_R + \frac{L}{J_{yy}}\tau_1 + d_4\\ \ddot{\theta}&=\dot{\theta}\dot{\psi} (\frac{J_{yy}-J_{zz}}{J_{xx}}) - \frac{J_R}{J_{xx}}\dot{\theta}\Omega_R +\frac{L}{J_{xx}}\tau_2 + d_5\\ \ddot{\psi}&=\dot{\theta}\dot{\varphi}(\frac{J_{xx}-J_{yy}}{J_{zz}}) + \frac{1}{J_{zz}}\tau_3 + d_6, \end{aligned} p¨xp¨yp¨zφ¨θ¨ψ¨=[cosφsinθcosψ+sinφsinψ]mτ0+d1=[cosφsinθsinψsinφcosψ]mτ0+d2=cosθcosφmτ0g+d3=φ˙ψ˙(JyyJzzJxx)+JyyJRφ˙ΩR+JyyLτ1+d4=θ˙ψ˙(JxxJyyJzz)JxxJRθ˙ΩR+JxxLτ2+d5=θ˙φ˙(JzzJxxJyy)+Jzz1τ3+d6,
其中 p x , p y , p z p_x,p_y,p_z px,py,pz 位置, φ , θ , ψ \varphi,\theta,\psi φ,θ,ψ是姿态, τ 0 , 1 , 2 , 3 \tau_{0,1,2,3} τ01,2,3分别是总体推力,绕x轴、y轴,z轴的扭力。

电机动力学模型

ω ˙ = 1 T ( − ω + C R u + w b ) T = C T ω 2 M = C M ω 2 \begin{aligned} \dot{\omega} &=\frac{1}{T}(-\omega+C_Ru+w_b)\\ T &= C_T\omega^2\\ M &= C_M \omega^2 \end{aligned} ω˙TM=T1(ω+CRu+wb)=CTω2=CMω2
其中 ω \omega ω是电机的转速; u u u是输入给电机的控制信号; T , M T,M T,M分别是电机产生的推力和扭力。

动力学中的力与螺旋桨产生的力关系

以十型举例
τ 0 = T 0 + T 1 + T 2 + T 3 τ 1 = T 1 − T 0 τ 2 = T 3 − T 2 τ 3 = − M 1 − M 2 + M 3 + M 4 \begin{aligned} \tau_0 &= T_0 + T_1 + T_2 + T_3\\ \tau_1 &= T_1 - T_0\\ \tau_2 &= T_3 - T_2\\ \tau_3 &= -M_1 - M_2 + M_3 + M_4 \end{aligned} τ0τ1τ2τ3=T0+T1+T2+T3=T1T0=T3T2=M1M2+M3+M4

FAQ

工程环境设置错误

  • 现象:
    ModuleNotFoundError: No module named ‘QuadrotorFlyGui’
  • 原因:
    这是因为工程运行的目录不是QuadrotorFly目录,比如在Test里,或者是在一个上级的目录。
  • 解决办法

如果上级目录,修改import语句成

# 其他类似
import QuadrotorFly.QuadrotorFlyGui

如果是在Test里,或者不确定在哪里,直接修改程序运行目录

  1. spyder编辑器
    选择为每个文件单独指定配置文件
    在这里插入图片描述
    选择指定文件夹
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019050620353539.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpbnhpYW9ibzExMA==,size_16,color_FFFFFF,t_70

选择QuadrotorFly目录

在这里插入图片描述

Spyder图形渲染设置

选择tool->preferences

在这里插入图片描述

设置合适的渲染工具,不是inline
在这里插入图片描述

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

QuadrotorFly-四旋翼无人机动力学仿真环境介绍 的相关文章

  • [模拟/模拟/有技巧的搜索] csp第一次模拟

    目录 题目一 咕咕东的奇遇题意样例思路总结代码 题目二 咕咕东想吃饭题意样例思路总结代码 题目三 可怕的宇宙射线题意样例思路总结代码 题目一 咕咕东的奇遇 题意 有一个如图所示的圆环 xff0c 初始时指针指在a处 给定一个字符串 xff0
  • [单调栈/差分/尺取/单调队列]Exercise Week5 A最大矩形+B魔法猫+C平衡字符串+D滑动窗口

    目录 A 单调栈 最大矩形题意样例思路总结代码 B 差分 TT 39 s Magic Cat题意样例思路总结代码 C 尺取 平衡字符串题意样例思路总结代码 D 单调队列 滑动窗口题意样例思路总结代码 A 单调栈 最大矩形 题意 给一个直方图
  • [树的直径/并查集/最小生成树/最小瓶颈生成树]Exercise Week6 A+B+C+D

    目录 A 树的直径 氪金带东题意样例思路总结代码 B 并查集 戴好口罩 xff01 题意样例思路总结代码 C 最小生成树 掌握魔法 东东题意样例思路总结代码 D 最小瓶颈生成树 数据中心题意样例思路总结代码 A 树的直径 氪金带东 题意 实
  • [差分约束/拓扑排序/kosaraju缩点]Exercise Week8 A+B+C

    目录 A 差分约束 区间选点 题意样例样例输入 xff1a 样例输出 思路总结代码 B 拓扑排序 猫猫向前冲题意样例样例输入 xff1a 样例输出 xff1a 思路总结代码 C SCC缩点 区间选点 题意样例样例输入 xff1a 样例输出
  • [大模拟]Test Week8 二阶魔方

    目录 大模拟 东东玩二阶魔方题意d样例样例输入 xff1a 样例输出 思路总结代码 B 模拟 ST串题意样例样例输入 xff1a 样例输出 xff1a 思路总结代码 大模拟 东东玩二阶魔方 题意d 东东有一个二阶魔方 xff0c 即2 2
  • [大模拟]Test Week14 猫睡觉问题

    目录 大模拟 猫睡觉问题题意样例样例输入 xff1a 样例输出 思路总结代码 大模拟 猫睡觉问题 题意 众所周知 xff0c TT家里有一只魔法喵 这只喵十分嗜睡 一睡就没有白天黑夜 喵喵一天可以睡多次 xff01 xff01 每次想睡多久
  • [区间DP/状压DP]Exercise Week12 A~E

    目录 A 水 找数题意样例样例输入 xff1a 样例输出 思路总结代码 B BFS 逃离题意样例样例输入 xff1a 样例输出 xff1a 思路总结代码 C DP 扫楼题意样例样例输入 xff1a 样例输出 思路总结代码 D 区间DP 最长
  • 新的开始( [USACO08OCT]打井Watering Hole)

    新的开始 newstart pas c cpp 题目描述 话说小 FF 在经历了上次 寻找古代王族遗产 的探险后 xff0c 成为了世界上最伟大的探险 家并拥有了一大笔财富 当然他不能坐吃山空 xff0c 必须创造财富 xff01 xff0
  • UOS配置本地APT源和外部软件包

    root 64 skill PC mount dev sr0 mnt mount mnt WARNING device write protected mounted read only root 64 skill PC vi etc ap
  • [二分答案] 洛谷P1873 砍树

    目录 题意样例样例输入 xff1a 样例输出 思路总结代码 题意 伐木工人米尔科需要砍倒M米长的木材 这是一个对米尔科来说很容易的工作 xff0c 因为他有一个漂亮的新伐木机 xff0c 可以像野火一样砍倒森林 不过 xff0c 米尔科只被
  • [区间DP]洛谷P1063 能量项链

    目录 题意样例样例输入 xff1a 样例输出 思路总结代码 题意 样例 样例输入 xff1a 4 2 3 5 10 样例输出 710 思路 1 经典区间DP题 算是合并石子的变种 只不过由一个点变成了一个区间 不过我们也可以用结构体存储 当
  • Linux命令行初接触-1 操作文件和目录

    操作文件 amp 目录 1 通配符含义常用通配符常用字符类类型匹配范例 2 mkdir 创建目录3 cp 复制文件和目录工作方式常用选项 4 mv 移动和重命名文件工作方式常用选项 5 rm 删除文件和目录工作方式常用选项注意事项 6 ln
  • 机器学习入入入入门(1)机器学习基本概念、引出深度学习

    机器学习入入入入门 xff08 1 xff09 0 前言1 基本步骤2 基本概念2 1 Hyperparameters2 2 local minima 3 linear model3 1 基础概念 4 piecewise linear cu
  • 深度学习蒟蒻入门——从0安装pytorch(CPU版)

    从0安装pytorch 1 检查自己的电脑有没有GPU2 安装CPU版的pytorch3 测试pytorch 1 检查自己的电脑有没有GPU 首先打开任务管理器 xff0c 选择性能栏 然后滑到最下 xff0c 看是否有GPU一项 xff0
  • 系统学习iOS动画 —— Stroke和路径动画

    这是要完成的动画 xff1a 先添加需要的代码 xff0c 这里需要将storyboard的ViewController换成TableViewController xff0c 将Under Top Bars 和 Under Bottom B
  • 不知道这些网站还做什么程序员呀!

    今天我就来总结一些程序员必备的网站 xff0c 囊括开源项目 解决bug 技术分享 一线资源和自我提升的网站 xff0c 希望能对广大程序猿有所帮助 xff0c 赶紧给我收藏起来 xff0c 下次刷不到了可别说我没提醒你 我们首先来看一下国
  • (音视频开发)WebRTC进阶流媒体服务器开发-多人互动架构

    一 xff1a 多人互动架构方案 xff08 一 xff09 WebRTC回顾 xff0c 两层含义 xff1a 1 WebRTC是google开源的流媒体客户端 xff0c 可以进行实时通讯 xff0c 主要应用于浏览器之间进行实时通讯
  • 10种linux下磁盘快照方式恢复系统

    导读大家都知道windows系统有一个磁盘快照的功能 xff0c 在windows2003中系统恢复开始依赖于一个叫做硬盘快照服务 Volume Snapshot Service 的服务 xff0c 他能够自动创建系统快照 包括正在使用的文
  • ubuntu安装go开发环境

    一 为ubuntu20 04更新源 给root用户设置密码 xff1a 命令 xff1a sudo passwd root 备份原来的源 xff0c 命令 xff1a sudo cp etc apt sources list etc apt
  • 如何修复Ubuntu中包缓存文件被毁问题

    导读今天 xff0c 我尝试更新我的 Ubuntu 18 04 LTS 的仓库列表 xff0c 但收到了一条错误消息 xff1a E The package cache file is corrupted it has the wrong

随机推荐

  • 1002 A+B for Polynomials (25分) 详解+易错点

    注意点 xff1a 系数为0 xff0c 则不输出 xff0c 例 xff1a 其中 1和1相加为0 xff0c 则在输出时避免这一项 xff0c 而且要注意结果的K值 xff0c 不要包括这一项 xff0c 思路 xff0c 利用结构体存
  • Linux远程桌面的选择

    Linux的远程桌面主要分两个部分 xff1a Linux客户机连Linux服务器和Windows客户机连Linux服务器 xff0c 还有现在用平板电脑连远程桌面 Linux客户机连Windows服务器比较简单没啥可说的 xff0c rd
  • Kali Linux mdk3WiFi洪水攻击 攻击路由器 生成虚假WiFi WiFi身份验证攻击可使连接WiFi的手机掉线重连抓包

    将无线网卡转换为监听模式 airmon ng start wlan0 查找附近无线网络 airodump ng wlan0mon Authentication DoS xff1a xff08 洪水攻击 xff0c 又叫做身份验证攻击 xff
  • 大一java程序设计的某次作业题解

    题目描述 xff1a 设计程序实现输入日期及机票张数 xff0c 计算出应付金额 假设北京至上海的机票全价为 1200 元 张 xff0c 以 2017 年为例进行程序编写 xff0c 所有的法定假日 xff0c 机票无折扣 xff1b 除
  • D. Make It Round(1759D)

    要求n k后缀0数量最多 xff08 k lt 61 m xff09 xff0c 且n k尽可能大 比赛时思路 xff08 错误 xff09 xff1a 10是由2和5组成 xff0c 故先统计n的因子包含2的个数num2 包含5的个数nu
  • Codeforces Round #841 (Div. 2)

    B Kill Demodogs 分析 显然要选择和两斜线的元素相加 所以答案可以表示为 xff1a 即 xff1a 根据公式 得答案为 但答案不能直接得这个 因为n的范围为1e9 xff0c 而ull的范围为1e20 xff0c 答案的第一
  • Educational Codeforces Round 141 Editorial C~D

    1783C Yet Another Tournament 分析 正解思路是贪心 开始自己也想的贪心 xff1a 首先显然打败的人数越多越好 xff0c 然后选择权值最小的人打败 这个思路前半部分没问题 xff0c 后半部分过不了样例的第二个
  • Codeforces Round #844 (Div. 1 + Div. 2, based on VK Cup 2022 - Elimination Round) D

    1781D Many Perfect Squares 分析 对于每组 xff0c 若和均为完全平方数 xff0c 则存在 xff1a 所以枚举所有 xff0c 对于每个 xff0c 枚举其所有 双因子对 xff0c 若两个因子之差为偶数 x
  • 匹配已有字符串

    生活小妙招 通过set和substr函数 xff0c 方便快捷地写出匹配已有字符串的代码 前置芝士 xff1a set使用详解 题目 xff1a G Perfect Word 代码实现 通过set 43 string的substr的使用快速
  • 在vue中使用rules的定义和校验规则

    表单内容里面定义属性 lt Form ref 61 34 rulesForm 34 model 61 34 rulesForm 34 label width 61 34 100 34 rules 61 34 rules 34 gt lt F
  • Codeforces Raif Round 1 (Div. 1 + Div. 2) D

    D Bouncing Boomerangs 分析 一个stack用于存只有一个的物品的行的物品位置 xff0c 一个queue用于存有两个物品的行的左边物品位置 xff08 其实这两个容器用stack还是queue无所谓 xff0c 只是这
  • 使用django服务的前置操作

    注意 xff1a 这是一个用于小组作业说明的内部文章 xff0c 如果你在寻找部署django服务的完整流程 xff0c 请退出此文章 python版本 xff1a 3 7 输入命令 xff0c 安装django工具 xff1a pip i
  • Codeforces Round #853 (Div. 2) C题

    CF1789C Serval and Toxel 39 s Arrays 学弟的思路 思路清晰 xff0c 代码简洁明了 xff0c 吊打目前80 以上题解 分析 记录每个数字在多少个数组中出现过 xff0c 即记录每个数字出现的次数 然后
  • E. Carrots for Rabbits(一种神奇的数列维护技巧)

    题目 E Carrots for Rabbits 分析 将每个物品都放到大根堆里 xff0c 但每个物品有两个信息 xff1a 长度len 当前被切了几段part 根据这个物品当前状态的贡献 作为在堆里位置的依据 贡献由cal函数算出 注意
  • Codeforces Round 857 (Div. 1 + Div. 2) 2A - 2D

    A Likes 分析 首先数据保证了一定合法 xff0c 那只需要统计有几个负数 最大的策略是先把所有正数用完 xff0c 然后把所有负数用完 xff0c 可知答案一定是1 2 3 4 5 4 3这种形式 xff1b 最小策略是加一个就直接
  • Struts2校验框架<validators>配置报错

    问题 xff1a 新建了Actionname validation xml文件写校验 xff0c 发现 lt validators gt 及其子标签爆红 解决 1 找到部署Struts2时在官网下载的一堆 jar包 如图 xff1a 解压圈
  • 树莓派操作系统

    树莓派操作系统 树莓派操作系统 介绍更新和升级树莓派操作系统 使用 APT使用 rpi 更新播放音频和视频 OMXPlayer 应用程序如何播放音频如何播放视频播放期间的选项在后台播放使用 USB 网络摄像头 基本用法自动化图像捕获延时拍摄
  • KVM虚拟机的多种启动方式

    KVM 全称是基于内核的虚拟机 xff08 Kernel based Virtual Machine xff09 xff0c 它是一个 Linux的一个内核模块 xff0c 该内核模块使得 Linux变成了一个Hypervisor xff1
  • ARM平台FS6818/s5p6818开发板实验6 —— 按键中断实验

    按键中断实验 xff1a 实验内容 xff1a 通过简单事例说明s5p6818处理器的GIC中断处理的应用 xff0c 设置key2按键连接的引脚为中断模式 xff0c 当识别按键被按下时进入相应的中断处理函数 实验目的 xff1a 熟悉开
  • QuadrotorFly-四旋翼无人机动力学仿真环境介绍

    QuadrotorFly四旋翼无人机动力学模型 主要目的是开发一个用于无人机动力学仿真的简单易用 功能相对齐全的仿真环境 xff08 也许是水论文环境 xff09 这个仿真是基于python编写的 xff0c GPL开源 git的地址在 x