使用通用MCU实现无人机飞行任务的快速二次开发
使用通用MCU实现无人机飞行任务的快速二次开发
---TIDronePilot外部控制offboard模式介绍
无名小哥 2024年1月1日
- 传统飞控二次开发方法和主要存在的问题简介
通过对前面几讲中《零基础竞赛无人机积木式编程指南》系列开发教程的学习可知,在以往TI电赛真题的学习训练方案中飞行任务代码开发主要集中在Substask_Demo.c和Developer_Mode.c两个程序文件,其中在Substask_Demo.c内负责对具体飞行任务中每个阶段的无人机的飞行动作、航点位置、目标追踪、巡航速度、目标姿态、执行机构驱动(如蜂鸣器、激光笔、舵机、电机)等进行流程化的设计,Developer_Mode.c内用于实现自动起飞、降落、不同的飞行任务切换与执行。
尽管飞控代码内的相关的API函数接口已经实现得相当完备,但上述开发过程的对于初次接触整个飞控代码这一系统工程的学习者来讲,想要直接上手去二次开发仍然还有一定的难度,特别是在对飞控系统代码框架(硬件驱动层、传感器驱动、传感器滤波、姿态解算、惯性导航、机器视觉、基本飞行控制实现、API函数、导航控制、SDK自主任务等)没有整体的把握的情况下。
仅有C语言+单片机常用基础芯片资源使用知识的初学者按照提供的真题案例和二次开发教程“依葫芦画瓢”去实现特定任务往往容易会出现一些常识性错误,有些错误会直接导致整个飞控系统的“崩盘”。下面以实现无人机在前进的过程中搜寻到色块后,对色块进行跟踪这一任务为例子,将新手易错的问题整理如下:
- 不理解单片机通过定时器实现控制器需要周期性执行这一基本要求的重要性,如下图中在5ms周期性任务中引入了延时函数的飞行任务中,开发者OS是希望延时函数上方的速度控制执行10S,认为加了延时之后会速度控制函数就会一直执行。实则是程序会运行一次速度控制函数后,程序会在此处空转等待,后续的高度控制、姿态控制、PWM输出等得不到及时的执行,只有在10S等待空窗期后才会继续执行后续的控制,在10S等待时间内,飞控不会对自身的位置、速度、姿态进行即时高频(200Hz相对0.1Hz来讲)的调整与修正,无人机处于间歇性“失控”状态,飞行器的控制周期从5ms变成了10S,用此段代码去控制你的无人机,惨烈的炸机也就变得不可避免。上述问题的根源是延时函数破坏了控制器的周期性执行,连最基本的姿态控制都得不到保障,动摇了飞控系统的“国本”。
- 对飞控代码的执行流程与代码产生实际作用理解错乱,不会对任务按流程进行拆分,将部分重复作用的代码“杂乱堆砌”在一起,造成逻辑混乱,实际作用不明。如在下方代码中色块对准函数内部实现有光流速度控制函数,当视觉模块识别到了色块时,case 1内部的速度控制函数和色块控制内部的速度控制函数会顺序执行,即同一个控制周期5ms内,速度控制函数执行了两遍,第一次运行的控制器输出会被后续第二次运行的结果覆盖掉,似乎第一次可以视为“无用”代码,看似不影响最终的控制效果。但是事实是我们需要考虑到PID控制器的运算过程,同一个控制器一个周期内执行两遍,相当于积分I做了两次运算,微分项不起任何作用。因为两次计算过程中,当反馈和期望不变的情况下,第一次的运算过程的偏差和第二次运算的偏差相等,并且第一次的偏差赋值给了上次的偏差,即微分项会恒等于0,即不管微分项参数D为多少,最终计算出来的微分项结果恒等于0。在PID三个参数都存在的情况下,某个控制器重复执行亦会导致灾难性的BUG。
- 认为控制代码只需要执行一次就能达到期望的控制效果,如果从A飞到B,AB两点的距离为100cm,试想无人机需要在一个控制周期5ms内就能实现A到B,假设无人机做匀加速直线运动,零初始状态下无人机的加速度要到多少才能完成这一目标,无人机的实际推重比是否能达到这个要求?如果按照这个加速度进行加速无人机1S后是否会脱离地球轨道?
-
另外由于飞控自身硬件资源有限,飞控自身外界的外设占用比较多,可供用户它用的串口、PWM、IO资源不再富裕,使用起来使用捉襟见肘,常常需要外部MCU进行扩展,既然都引入了外部MCU到无人机平台中了,很自然的会想到用自己熟悉的MCU飞无人机飞行任务进行开发。
-
综上所述,针对新手初学者来讲,面对略显庞杂的飞控系统代码,在进行二次开发时,若写出某些天坑级的BUG会导致无人机系统的整体崩溃,基本的姿态自稳都得不到保障,就会出现灾难级的炸机事故。因此为了使得二次开发更加简单、开发更加安全,有必要将和用户二次开发相关的API函数、导航控制、SDK自主任务控制部分代码的实现,单独用一个通用控制器去实现,我们只需要在飞控端将已有的API函数接口进行简单整合,在SDK模式中新增加外部控制offboard模式就可以,这部分工作量很少,很多都是现成的我们在后面的教程中进行介绍。
- TIVA飞控的硬件组成与系统框架
-
TIVA飞控硬件系统包括飞控主板与外设两部分组成,其中飞控主板上板载加速度计陀螺仪(带温控电路)、气压计传感器,带独立按键和五向按键,配备OLED显示屏进行人机交互,带蜂鸣器和RGB灯提示,板载的扩展接口包括8路串口、16路PWM、8个预留IO口、2组I2C口等。扩展接口用于外接机载端SLAM定位、offboard外部控制、光流、对地激光测距、GPS、机器视觉(如OPENMV/K210/树莓派OPENCV)、激光雷达点云数据等。
-
TIVA飞控软件系统包括芯片底层与应用相关驱动、传感器数据采集、传感器滤波、姿态解算、惯性导航、基础飞行控制、自主飞行API函数、SDK开发者模式等。
- 运用通用单片机开发板实现对飞控外部控制
-
在传统的开发模式中主要是在飞控代码内部对SDK开发模式中编写飞行任务代码去实现特定任务,这些开发流程在之前按的教程中有详细的阐明。本教程需要解决的问题是如何将飞控软件框架中的自主飞行相关API函数和SDK开发者模式的应用层开发代码放在外部的通用的MCU中去实现,比如盘古TI MCU系统板(已完成)、STM32F103系列核心板(已完成)、STC32G12K128开发板(完成度90%)等。由于外部通用MCU中需要实现的代码量很少,对单片机处理资源和性能要求并不高,因此用户完全可以用任何一款自己熟悉的单片机,高效率得心应手的去开发,参照上述已实现的三款核心板方案,去自己实现飞控的外部控制这部分设计。为了方便后面表述,我们将带有offboard外部控制的飞控称为TIDronePilot(简称TPT/下位机/飞控端),将外部通用MCU开发板称为TIDronePlanner(简称TPR/上位机/应用端)。
- TIDronePilot中offboard外部控制相关函数的实现
-
TPT的实现工作量很小,就是在保留原来TIVA飞控所有功能的前提(仍然可以用传统方案开发)下,主要新增加了一下三点:
TPT发送飞控内部估计出的三维位置、速度、加速度、角速度、姿态四元数、融合标志等信息给外部控制端,TPR端解析到上述反馈数据后用于对无人机实现位置、速度等控制,并将最终的控制量串口打包发送给飞控端。
- TPT解析来自TPR端的姿态和竖直方向速度控制信息,作为offboard外部控制模式下对应项的期望值。
- 在SDK模式中额外新增加了offboard模式,在此模式下飞控端的姿态期望、竖直方向速度期望来源于外部控制器的给定(TPT串口解析来之TPR的控制指令),同时也可以通过遥控器手动介入接管无人机的控制权限,可以实现不切换遥控器开关挡位的情况下对无人机的直接控制。需要注意的是飞控端切入SDK后offboard_start_flag会置1,飞控端会将此标志为发送给外部控制端用于触发外部控制端执行其内部的SDK任务。
至此用于实现offboard外部控制飞控端的主要工作就全部实现了,单从控制部分抽象来看offboard模式下飞控端“退化”成只执行基本的飞行控制部分,主要包括姿态自稳、部分定高(竖直速度、加速度)功能,飞控内部并没有运行对无人机的位置、速度进行直接的控制的代码,相当于飞控在offboard外部控制模式下变成了一个“指哪打哪”、“一切行动听指挥”严格响应外部控制端TPR命令的被控对象。飞控负责保持自身姿态和竖直方向速度的稳定,其它应用层开发全部放在外部控制端TPR端去实现,新的开发模式下用户可以不用在飞控TPT端修改代码,把无人机作为一个整体被控对象去开发,自然也就不会出现第一节中天坑级BUG导致灾难性炸机的情况,在TPR端开发应用层代码不会影响飞控TPT端内部的控制,任何情况下遥控器都可以直接对无人机的控制进行接管。
- TIDronePlanner中应用开发层相关函数的实现
TIDronePlanner作为飞控offboard外部控制模式下的上层控制器,其主要作用是实现原飞控中用于自主飞行相关API函数、SDK开发模式的功能,由于TPR应用端内部需要实现无人机水平方向的位置、速度控制,竖直方向的高度位置控制,自然需要飞控端TPT给应用端TPR发送自身的位置、速度、姿态等无人机飞行状态的反馈信息,TPR接收到反馈信息后用于无人机的位置、速度闭环控制,最终将TPR控制器的输出封装成相关API接口变量,通过串口通讯打包发给TPT飞控端,从而实现了整个飞控位置、速度、加速度、姿态角度、姿态角速度的系统的完整闭环控制。
在通用MCU系统板中实现TIDronePlanner的工作量同样很少,除了对应单片机资源如串口通讯、PWM输出、按键、显示屏、定时器调度驱动实现外,剩下的工作只剩下解析飞控端发送过来的状态反馈信息、移植原飞控端位置控制、速度控制、SDK开发模式、API接口函数、串口打包发送API接口变量。
- 解析来自飞控端的状态反馈数据,按照飞控发送时对应数据协议帧来解析。
- 实现位置控制、速度控制、SDK开发模式、API接口函数,由于这部分在飞控内部均有实现,直接移植过来就可以,此处不作过多介绍,在之前的教程中有对相关函数实现进行讲解。
这里需要注意的是虽然Auto_Flight_Ctrl函数在定时器内周期性执行,但SDK任务执行与否取决于offboard_start_flag变量的值,当用遥控器/ADC按键操作飞控端切入offboard模式后,此标志位会被置1,Auto_Flight_Ctrl中的自主飞行任务才会执行。
- 串口打包发送API接口变量
TIDronePlanner中实现部分还包括外设如舵机/电机、激光笔、蜂鸣器等设备的驱动,辅助传感器如激光雷达点云、机器视觉等数据的接入,具体根据实际飞行任务要求来,由于TIDronePlanner的实现仅需要占用一个串口资源就可以实现其应用层,因此通用MCU核心板的其它预留出来的资源就可以供二次开发使用,此举能有效解决传统开发方案中,资源不够用的情况。
- 基于TIDronePilot和TIDronePlanner分层式开发Q&A
- 上位机和下位机通过串口通讯的方式进行数据交互,数据的实时性如何,如何保证二者通讯时数据的可靠性?
- 这里我们看下用于offboard外部控制的通讯串口波特率为2250000bps,传输带个字节数据包括1个起始位、1个停止位、8个数据位共占用10个二进制位,因此传输单个字节时间开销为1/225000秒,即约为4.4us,可知传输100个字节时,时间开销为约为0.44ms,实际当前传输带宽为68个字节,约为0.3ms。
- 串口通讯时为了确保串口不丢帧,需要考虑优先级高于当前串口中断的任务的最大执行时间+串口中断函数执行时间,务必小于串口接收单个字节所需的时间,才能确保不丢帧。
1、多个串口通讯时,串口通讯波特率可以降低一点。
2、合计设计优先级,当存在不同波特率通讯时,通讯波特率高的串口中断优先级要高于波特率低的。
3、存在优先级高于串口中断的其它中断任务时,其它中断任务的总的最大时间开销也要考虑。
- 在上位机端开发应用层代码的情况下,是不是可以完全不用管飞控端、机载计算端的代码实现?
- 新增offboard外部控制模式的主要目的是简化开发过程,让新手能更容易上手在飞控应用层做二次开发,无需管飞控整个飞控系统代码。因此用户可以完全不应管飞控各系统模块的内部具体的实现过程,新手用户把飞控当作“盲盒”也能实现二次开发,就像之前的教程中把机载端当作一个能提供室内高精度位姿数据的“GPS传感器”一样,只需要知道如何安装、接线、设置、操控就可以。
- 文档中是以室内激光雷达SLAM定位为例的,如果我需要在室外实现相关应用层的二次开发,还能按照上述方式来开发吗?另外外部通用MCU系统板能用树莓派等机载端去实现吗?
- 能,只需要修改飞控端发送的位置、速度数据融合来源就可以,比如在室外GPS定位下,飞控在给外部应用层发反馈状态数据时,将内部GPS融合得到的位置、速度数据替换掉原来SLAM定位融合的数据,原来外部控制器的开发过程不需要做任何调整,同理UWB定位模式下也也是这个处理思路。
- 对于通用MCU的要求比较小,用树莓派ROS端去做开发当然可以,同时如果所使用的单片机波特率到不了2250000bps,可以适当调小通讯波特率,但建议不要低于921600。
TIDronePilot和TIDronePlanner配合使用时的具体操作参见配套的视频教程...
相关文章:
使用通用MCU实现无人机飞行任务的快速二次开发
使用通用MCU实现无人机飞行任务的快速二次开发 ---TIDronePilot外部控制offboard模式介绍 无名小哥 2024年1月1日 传统飞控二次开发方法和主要存在的问题简介 通过对前面几讲中《零基础竞赛无人机积木式编程指南》系列开发教程的学习可知,在以往TI电赛真题的学习…...
什么是Selinux
官网地址:What is SELinux? 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. 概述 安全增强型 Linux (SELinux) 是Linux 系统的安全架构,允许管理员更好地控制谁可以访问系统。它最初是由美…...
计算机网络知识点
1. URI 和 URL 统一资源定位符(Uniform Resource Locator,缩写:URL),是对资源的引用和访问该资源的方法。俗称网址,就是浏览器地址栏里面的内容。 URL 语法为:protocol://userInfohost:port/p…...
Qt 连接 Mysql
Linux下安装mysql及qt连接_liunx下安装mysql及qt链接-CSDN博客...
HarmonyOS4.0系统性深入开发14AbilityStage组件容器
AbilityStage组件容器 AbilityStage是一个Module级别的组件容器,应用的HAP在首次加载时会创建一个AbilityStage实例,可以对该Module进行初始化等操作。 AbilityStage与Module一一对应,即一个Module拥有一个AbilityStage。 DevEco Studio默…...
客服系统接入FastGPT
接入FastGPT 点击【应用】【外部使用】【API访问】【新建】新建一个KEY,同时也可以看到我们的API根地址 这个根地址和Key可以填入任何支持OpenAI接口的应用里,这个接口是兼容OpenAI格式。 在客服系统【知识库AI配置】里填上接口地址和接口密钥。这样我…...
Hi5 2.0 虚拟手与追踪器(Tracker)的位置修正
问题描述 使用环境与工具:Unity 2022.3.4fc1,steam VR(2.7.3),steamvrSDK(1.14.15),HTC vive pro专业版,Hi5 2.0数据手套 首先按照Hi5 2.0的使用说明(可参考:HI5 2.0 交…...
广播及代码实现
广播(Broadcast)是一种网络通信方式,它允许一台设备向网络中的所有其他设备发送消息。广播通常用于在网络上传递一些信息,让所有设备都能接收并处理。在广播中,通信的目标是整个网络而不是特定的单个设备。 向子网中…...
QT应用篇 三、QML自定义显示SpinBox的加减按键图片及显示值效果
QT应用篇 一、QT上位机串口编程 二、QML用Image组件实现Progress Bar 的效果 三、QML自定义显示SpinBox的加减按键图片及显示值效果 文章目录 QT应用篇前言一、qml需求二、使用组件1.SpinBox组件2.SpinBox中QML的使用 总结 前言 记录自己学习QML的一些小技巧方便日后查找 QT的…...
2022年全国职业院校技能大赛网络安全竞赛试题1-10-B模块总结
前言 结尾有对22年国赛题型总结 试题1模块B 网络安全事件响应、数字取证调查和应用安全 B-1任务一:主机发现与信息收集 *任务说明:仅能获取Server1的IP地址 1.通过渗透机Kali2.0对靶机场景进行TCP同步扫描 (使用Nmap工具),并将该操作使用…...
20231228在Firefly的AIO-3399J开发板的Android11的Firefly的AIO-3399J开发板的DTS配置单前置摄像头ov13850
20231228在Firefly的AIO-3399J开发板的Android11的Firefly的AIO-3399J开发板的DTS配置单前置摄像头ov13850 2023/12/28 12:30 开发板:Firefly的AIO-3399J【RK3399】 SDK:rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBr…...
php-fpm运行一段时间,内存不足
目录 一:原因分析 二:解决 三:观察系统情况 php-fpm运行一段时间,内存不足,是什么原因呢。 一:原因分析 1:首先php-fpm的配置 (1)启动的进程数 启动的进程数越多,占用内存越高; 2:其次…...
基于轻量级GhostNet模型开发构建生活场景下生活垃圾图像识别系统
轻量级识别模型在我们前面的博文中已经有过很多实践了,感兴趣的话可以自行移步阅读: 《移动端轻量级模型开发谁更胜一筹,efficientnet、mobilenetv2、mobilenetv3、ghostnet、mnasnet、shufflenetv2驾驶危险行为识别模型对比开发测试》 《基…...
《Linux系列》Linux磁盘MBR分区扩容
文章目录 Linux磁盘MBR分区扩容1.前言2.控制台磁盘扩容3.分区扩容3.1 fdisk3.2 lsblk3.3 扩容分区 4.扩容文件系统4.1 df4.2 扩容文件系统 Linux磁盘MBR分区扩容 1)参考阿里云扩容分区文档,整理MBR分区扩容 2)本文档适用于MBR分区(fdisk -lu查…...
IPv6地址配置
IPv6地址接口配置 IPv6地址结构 一个IPv6地址可以分为两部分: 网络前缀:n比特,相当于IPv4地址中的网络ID 接口标识:128-n比特,相当于IPv4地址中的主机ID 注意: 对于IPv6单播地址来说,如果地址的前三bit不是000,则接口标识必须为64位,如果地址的前三位是000,则没有此…...
Ubuntu20.04 防火墙配置
ubuntu 系统中配置防火墙 ufw(Uncomplicated Firewall)是一个简化的、易于使用的Linux防火墙工具,旨在方便用户管理iptables防火墙规则。 特点 简化的防火墙管理:ufw提供了一个简洁的命令行界面,让您能够轻松地添加、…...
Windows上ModbusTCP模拟Master与Slave工具的使用
场景 Modbus Slave 与 Modbus Poll主从设备模拟软件与Configure Virtual Serial串口模拟软件使用: Modebus Slave 与 Modbus Poll主从设备模拟软件与Configure Virtual Serial串口模拟软件使用_modbus poll激活-CSDN博客 数据对接协议为Modbus TCP,本地开发需要使…...
史上最细,13年老鸟总结-性能测试7大关键点,一篇打通...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、测试环境的鉴定…...
长虹智能电视ZLM60HiS机芯刷机方法及刷机固件,附进维修模式方法
适配机芯:ZLM60HiS 型号:Q1FU、D6000i、U3、D8000ID 软件强制升级方法: 1、下载后解压,找到upgrade_ZLM60HiS_MT5508_V1.00xxx_part.pkg 、chandroid_ota_ZLM60HiS_datapart.zip复制到U盘根目录(不要有任何文件夹&a…...
计算机网络【Google的TCP BBR拥塞控制算法深度解析】
Google的TCP BBR拥塞控制算法深度解析 宏观背景下的BBR 慢启动、拥塞避免、快速重传、快速恢复: 说实话,这些机制完美适应了1980年代的网络特征,低带宽,浅缓存队列,美好持续到了2000年代。 随后互联网大爆发&#x…...
lvs+keepalived+nginx实现四层负载+七层负载
目录 一、lvs配置 二、nginx配置 三、测试 3.1 keepalived负载均衡 3.2 lvskeepalived高可用 3.3 nginx高可用 主机IPlvs01-33 11.0.1.33 lvs02-3411.0.1.34nginx0111.0.1.31nginx0211.0.1.32VIP11.0.1.30 4台主机主机添加host [rootnginx01 sbin]# cat /etc/hosts 127.0.0.…...
独立看门狗与窗口看门狗
一、简介 STM32F10xxx内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产…...
【CTF杂项】常见文件文件头文件尾格式总结 各类文件头
常见文件文件头文件尾格式总结及各类文件头 以下是常见文件的文件头格式总结及各类文件头的描述: 图像文件: JPEG:文件头格式为FF D8 FF,文件尾格式为FF D9。PNG:文件头格式为89 50 4E 47 0D 0A 1A 0A,文件…...
深度学习-模型转换_所需算力相关
模型转换相关 tensflow转onnx python -m tf2onnx.convert \--graphdef /root/autodl-tmp/warren/text-detection-ctpn/data/ctpn.pb \--output ./model.onnx --inputs Placeholder:0 --outputs Reshape_2:0,rpn_bbox_pred/Reshape_1:0 pytorch转onnx #!/usr/…...
Koordinator 助力云原生应用性能提升:小红书混部技术实践
作者:宋泽辉(小红书)、张佐玮(阿里云) 编者按: Koordinator 是一个开源项目,是基于阿里巴巴内部多年容器调度、混部实践经验孵化诞生,是行业首个生产可用、面向大规模场景的开源混…...
java中如何使用elasticsearch—RestClient操作文档(CRUD)
目录 一、案例分析 二、Java代码中操作文档 2.1 初始化JavaRestClient 2.2 添加数据到索引库 2.3 根据id查询数据 2.4 根据id修改数据 2.4 删除操作 三、java代码对文档进行操作的基本步骤 一、案例分析 去数据库查询酒店数据,导入到hotel索引库࿰…...
MySQL自定义函数
MySQL自定义函数 函数与存储过程类似,也是一组预先编译好的SQL语句的集合,但是存储过程可以有0个或多个返回,函数就只能有一个返回 创建函数 #语法 参数列表包含两部分 参数名和参数类型 #函数体必须有return语句 且每个sql语句后要以;结尾 所…...
技术学习|CDA level I 数据库应用(数据操作语言DML)
数据操作语言(DML)是对表中记录进行添加、更新、删除等操作的语言。 一、添加数据 在数据表中填充数据有两种方法,第一种方法是使用insert into语句向数据表中直接录入每行数据信息,但并不常用,因为分析使用的数据很…...
关键字:instanceof关键字
在 Java 中,instanceof关键字用于检查一个对象是否是某个特定类或其子类的实例。它的语法如下: 其中,Object是要检查的对象,Class是要检查的类或接口。 instanceof关键字的返回值是一个布尔值,如果对象Object是类Cla…...
【LeetCode:34. 在排序数组中查找元素的第一个和最后一个位置 | 二分】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
网站分哪几种/青岛seo关键词优化公司
随着电脑的使用,系统里将产生很多垃圾,最典型的就是同一份文件被保存到了不同的位置,这样导致的结果就是磁盘空间被大量占用,系统运行越来越慢。所以如果你的电脑空间告急的话,可以试着去删除这样的文件,释…...
体育器材网站模板/软件外包公司排行
ios程序的入口,还是从main.m开始 int main(int argc, char * argv[]) { autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } NSStringFromClass([AppDelegate class])是指定去AppDelegate这个类中执行该实…...
邯郸邯山区网站建设/链接制作软件
我们可以在windows上建立ASM实例。oracle给我们提供了一个很贴心的工具,来实现在windows上安装asm,这个工具就是asmtool。该工具可以在安装介质的asmtool目录中找到,也可以在安装数据库软件后,在$ORACLE_HOME/bin下找到。下面&…...
上海网站制作电话/软文广告经典案例
PyTorch 自定义序列数据集 flyfish 实现 主要是DataLoader, TensorDataset。 数据集代码与模型训练代码解耦,以获得更好的可读性和模块化。PyTorch提供了两个数据原语:torch.utils.data.DataLoader和torch.utils.data.Dataset, 允许使用预…...
wordpress快速下载地址/软文撰写案例
1. 字符串大小写转换 string没有直接提供to_upper或to_lower这样的方法,不过有更通用的方法: std::string s("hello"); transform(s.begin(), s.end(), s.begin(), toupper); transform(s.begin(), s.end(), s.begin(), tolower);std::vecto…...
塑料机械怎么做网站/企业管理咨询培训
常用的负载均衡技术比较DNS 轮询DNS本身的机制不再赘述,这里主要看一看基于DNS的负载均衡,其大致原理很清楚,DNS系统本身支持同一个域名映射到多个ip (A记录),例如 这样每次向DNS系统询问该域名的ip地址时(Tell Me The…...