mavsdk(dronekit-python)
主要关注无人机的应用 切勿关注飞控等
PX4
airsim(gazebo)
qgroundcontrol 验证 == 自己写的控制程序
cd PX4/Autopilot
make px4_sitl gazebo
done
qgroundcontrol
依赖 done
下载 运行 done
Build Airsim on ubuntu
git clone -b 4.25 [email protected]:EpicGames/UnrealEngine.git
done
cd UnrealEngine
./Setup.sh
done
./GenerateProjectFiles.sh
done
make
error :No space left on device
done
make
done
git clone https://github.com/Microsoft/AirSim.git
done
cd AirSim
done
./setup.sh
失败:拒绝连接 断网了 明日再战
解决:
解决
AirSim setup completed successfully!
./build.sh
done
使用Airsim:
转到UnrealEngine安装文件夹并通过运行启动 Unreal ./Engine/Binaries/Linux/UE4Editor。
当虚幻引擎提示打开或创建项目时,选择浏览并选择AirSim/Unreal/Environments/Blocks(或您的自定义虚幻项目)。
或者,项目文件可以作为命令行参数传递。对于块:./Engine/Binaries/Linux/UE4Editor
如果您收到转换项目的提示,请查找“更多选项”或“就地转换”选项。如果系统提示您构建,请选择 Yes。如果系统提示您禁用 AirSim 插件,请选择否。
虚幻编辑器加载后,按播放按钮。
黑屏 没东西
ubuntu+ROS
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt update
error:没有足够空间
done
sudo apt upgrade
sudo apt install ros-noetic-desktop-full
source /opt/ros/noetic/setup.bash
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
done
验证ROS
安装rosinstall rosinstall命令是一个使用的非常频繁的命令,使用这个命令可以轻松的下载许多ROS软件包。
sudo apt-get install python-rosinstall
在Terminal中运行以下命令:
roscore
新开一个terminal,运行以下命令,打开小乌龟窗口:
rosrun turtlesim turtlesim_node
新开一个terminal,运行以下命令,打开乌龟控制窗口,可使用方向键控制乌龟运动:
rosrun turtlesim turtle_teleop_key
选中控制窗口,按方向键,可看到小乌龟窗口中乌龟在运动。
新开一个terminal,运行以下命令,可以看到ROS的图形化界面,展示结点的关系:
rosrun rqt_graph rqt_graph
至此,测试完成,说明ROS安装没有问题
扩展磁盘
sudo apt-get install gparted
没网了(右上角也没有图标)
sudo service NetworkManager stop
sudo rm /var/lib/NetworkManager/NetworkManager.state
sudo service NetworkManager start
done
sudo gparted
done
###(Raspberry Pi)树莓派
MAVSDK-Python
配置MAVSDK
pip install mavsdk
done
pip3 install aioconsole
done
make px4_sitl gazebo
done
commander takeoff
done
链接控制
apython
from mavsdk import System
drone = System()
await drone.connect()
done
await drone.action.arm()
await drone.action.takeoff()
await drone.action.land()
done
脚本控制
python3 XXX.py
失败:未安装asyncio
pip3 install asyncio
python3 XXX.py
done
asyncio
asyncio-CSDN
asyncio使用“协程” 它本质上是可以在以后暂停和恢复的函数(python中的子例程)。这样可以并行运行协程: CPU运行协程的一部分一段时间,然后暂停它并移动到另一个协程。类似于线程 但只在一个线程上运行。
异步并发:
其他并发模型大多采用线性方式编写,依赖于编程语言和操作系统的底层线程或进程;asyncio应用的应用代码显示的处理上下文切换,asyncio提供的框架以事件循环(event loop)为中心,程序开启一个无限循环,程序把一些函数注册到事件循环上,满足事件发生时调用相应协程函数。
事件循环:
一种处理多并发量的有效方式,一种等待程序 分配事件或消息的编程架构。
future:
一个数据结构 表示还未完成的工作结果。事件循环监听future对象是否完成。
task:
future的一个子类,包装和管理一个协程的执行。
async用来定义一个异步方法,await用来等待一个异步方法的执行完成。
异步方法:
async def 方法名():
return 结果
事件循环可以通过多种不同的方法启动协程
run_until_complete()
**方法。run_until_complete
来运行 loop ,等到 future 完成,run_until_complete
也就返回了run_until_complete()
的参数是一个future对象,当传入一个协程其会自动封装成task示例:
import asyncio
async def foo():
print("这是一个协程")
return "返回值"
if __name__ == '__main__':
loop = asyncio.get_event_loop()
# 事件循环
try:
print("开始运行协程")
coro = foo()
# 函数(协程)foo()的对象coro
print("进入事件循环")
loop.run_until_complete(coro)
# 协程对象传入方法run_until_complete()
print(f"run_until_complete可以获得协程的{result},若无则默认输出None")
finally:
print("关闭事件循环")
loop.close()
if name == ‘main’:工作原理
py文件一般有两种执行方式①作为脚本直接被执行。②被import到其他脚本中被执行。 而此行就是控制该py文件只在第一种情况下被执行。
每个模块都有一个__name__
属性 当其值为__main__
时表示该模块(程序)自身在运行,否则是被引入。
这里的__main__
可以理解为入口函数。若模块(程序、py文件)直接运行(比如 python3 XX.py)则__name__
值为__main__
;若模块是被调用(在XXX.py 中import了 XX.py)则__name__
值为文件名xx。
关键字: call_soon 、 call_later 、 call_at
call_soon
loop.call_soon(callback, *args, context=None)
在loop中即刻执行(根据context)
callback:待调用的同步函数
*args:
context:上下文参数(不知道干嘛)
call_at
loop.call_at(when, callback, *args, context=None)
在loop的when时间执行callback同步函数
when:不是系统时间戳,通过loop.time()获得
call_later
loop.call_later(delay, callback, *args, context=None)
在loop运行了delay长时间之后执行callback同步函数
call_later就是通过call_at实现的
详见asyncio-CSDN链接
mavsdk-system
github mavsdk-python
示例学习:
#!/usr/bin/env python3
import asyncio
from mavsdk import System
async def run():
drone = System()
#创建drone对象
await drone.connect(system_address="udp://:14540")
print("Waiting for drone...")
async for state in drone.core.connection_state():
if state.is_connected:
print(f"Drone discovered with UUID: {state.uuid}")
break
print("-- Arming")
await drone.action.arm()
print("-- Taking off")
await drone.action.takeoff()
await asyncio.sleep(5)
print("-- Landing")
await drone.action.land()
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(run())
基本操作
传任务(比如传入一个地标 然后返航)
飞行中任务可能变(动态传任务)
师兄做调用 我做被调用的实现
摄像头监视传回来
规划算法
教学视频
功能:
Git在本地有
Git远程有
是一系列加密算法,不同算法之间加密强度不同但有很多共同点:
快照怎么进行:
git会读取当前工作空间的所有数据,进行数据预存,再重新调整。它会和上一次的快照版本的内容进行比较,对于没有改变的文件数据,git会把当前预存中冗余文件的数据去除掉,改为保留指向上一个版本中该文件数据的指针,对于有差异的文件数据就会保留下来,最终再把数据完整保存下来,这才算是执行了一次快照。
git和CVS,、Subversion等的区别:
两者的差异在于对待保存数据的方式。前者是记录和组装一系列快照流的微型系统,关心文件数据的整体是否发生变化。每次commit的时候保存一次快照,而每个快照都包含了完整的数据;后者则关心文件内容的具体差异,第一次保存了完整的数据,往后每次保存的都不是完整的数据,只会记录基于之前的版本和现在两者的变化信息,对于此外没有变化的都不会去记录。(翻译:快照对于未变化文件直接指针指向原文件,变化文件则更新。;SVN是每次只保存变化的一部分信息。)
###Git本地库链接远程库步骤
#9.26-9.28✓
#flask框架 -轻量级py web框架
CSDN-flask
学习内容见pycharm
#9.26
#werkzeug库
Werkzeug是一个WSGI工具包
WSGI(Python Web Server Gateway Interface),
它为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。
这是一个规范,描述了web server如何与web application交互、web application如何处理请求),
Werkzeug可以作为一个Web框架的底层库。werkzeug是一个工具包,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等。
其内容包含
HTTP头的解析
易用使用的request和response对象
基于交互风格的JavaScript脚本语言的浏览器调试器
与 WSGI 1.0 规范100%兼容
支持Python 2.6, 2.7和3.3
Unicode支持
HTTP Session和签名Cookie支持
URI和IRI处理函数,包含对Unicode的支持
内置兼容一些非标准的WSGI服务器和浏览器
集成了URLs路由功能
#session与cookie
CSDN
HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性。
##session
客户端请求服务端,服务端会为这次请求开辟一块内存空间,这个对象便是 Session 对象,存储结构为 ConcurrentHashMap。Session 弥补了 HTTP 无状态特性,服务器可以利用 Session 存储客户端在同一个会话期间的一些操作记录。
##session如何判断是否是同一会话
服务器第一次接收到请求时,开辟了一块 Session 空间(创建了Session对象),同时生成一个 sessionId ,并通过响应头的 **Set-Cookie:JSESSIONID=XXXXXXX **命令,向客户端发送要求设置 Cookie 的响应;
客户端收到响应后,在本机客户端设置了一个 **JSESSIONID=XXXXXXX **的 Cookie 信息,该 Cookie 的过期时间为浏览器会话结束;
接下来客户端每次向同一个网站发送请求时,请求头都会带上该 Cookie信息(包含 sessionId ), 然后,服务器通过读取请求头中的 Cookie 信息,获取名称为 JSESSIONID 的值,得到此次请求的 sessionId。
##session的缺点
Session 机制有个缺点,比如 A 服务器存储了 Session,就是做了负载均衡后,假如一段时间内 A 的访问量激增,会转发到 B 进行访问,但是 B 服务器并没有存储 A 的 Session,会导致 Session 的失效。
##cookie
HTTP 协议中的 Cookie 包括 Web Cookie 和浏览器 Cookie,它是服务器发送到 Web 浏览器的一小块数据。服务器发送到浏览器的 Cookie,浏览器会进行存储,并与下一个请求一起发送到服务器。通常,它用于判断两个请求是否来自于同一个浏览器,例如用户保持登录状态。
在WWW上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位器),它是WWW的统一资源定位标志,就是指网络地址。
URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。
也可认为由4部分组成:协议、主机、端口、路径
URL的一般语法格式为:
(带方括号[]的为可选项):
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
CSDN
restful是架构的一种约束,给出的一种约束标准
REST:Representational State Transfer(表象层状态转变):
1.每一个URI代表一种资源;
2.客户端和服务器之间,传递这种资源的某种表现层;
3.客户端通过四个HTTP动词(get、post、put、delete),对服务器端资源进行操作,实现”表现层状态转化”。
REST架构的6大原则
1. C-S架构
数据的存储在Server端,Client端只需使用就行。两端彻底分离的好处使client端代码的可移植性变强,
Server端的拓展性变强。两端单独开发,互不干扰。
2. 无状态
http请求本身就是无状态的,基于C-S架构,客户端的每一次请求带有充分的信息能够让服务端识别。
请求所需的一些信息都包含在URL的查询参数、header、body,服务端能够根据请求的各种参数,无需保存客户端的状态,
将响应正确返回给客户端。无状态的特征大大提高的服务端的健壮性和可拓展性。
当然这总无状态性的约束也是有缺点的,客户端的每一次请求都必须带上相同重复的信息确定自己的身份和状态(这也是必须的),
造成传输数据的冗余性,但这种缺点对于性能和使用来说,几乎是忽略不计的。
3.统一的接口
这个才是REST架构的核心,统一的接口对于RESTful服务非常重要。客户端只需要关注实现接口就可以,接口的可读性加强,使用人员方便调用。
4.一致的数据格式
服务端返回的数据格式要么是XML,要么是Json(获取数据),或者直接返回状态码
自我描述的信息,每项数据应该是可以自我描述的,方便代码去处理和解析其中的内容。
比如通过HTTP返回的数据里面有 [MIME type ]信息,我们从MIME type里面可以知道数据的具体格式,是图片,视频还是JSON,
客户端通过body内容、查询串参数、请求头和URI(资源名称)来传送状态。服务端通过body内容,响应码和响应头传送状态给客户端。
这项技术被称为超媒体(或超文本链接)。
除了上述内容外,HATEOS也意味着,必要的时候链接也可被包含在返回的body(或头部)中,以提供URI来检索对象本身或关联对象。
如请求一条微博信息,服务端响应信息应该包含这条微博相关的其他URL,客户端可以进一步利用这些URL发起请求获取感兴趣的信息,再如分页可以从第一页的返回数据中获取下一页的URT也是基于这个原理。
JSON为例:
code——包含一个整数类型的HTTP响应状态码。
status——包含文本:”success”,”fail”或”error”。HTTP状态响应码在500-599之间为”fail”,在400-499之间为”error”,
其它均为”success”(例如:响应状态码为1XX、2XX和3XX)。这个根据实际情况其实是可要可不要的。
message——当状态值为”fail”和”error”时有效,用于显示错误信息。参照国际化(il8n)标准,
它可以包含信息号或者编码,可以只包含其中一个,或者同时包含并用分隔符隔开。
data——包含响应的body。当状态值为”fail”或”error”时,data仅包含错误原因或异常名称、或者null也是可以的
返回成功的响应JSON:
{
"code": 200,
"message": "success",
"data": {
"userName": "123456",
"age": 16,
"address": "beijing"
}
}
返回失败的响应json格式:
{
"code": 401,
"message": "error message",
"data": null
}
4.系统分层
客户端通常无法表明自己是直接还是间接与端服务器进行连接,分层时同样要考虑安全策略
5.可缓存
在万维网上,客户端可以缓存页面的响应内容。因此响应都应隐式或显式的定义为可缓存的,
若不可缓存则要避免客户端在多次请求后用旧数据或脏数据来响应。
管理得当的缓存会部分地或完全地除去客户端和服务端之间的交互,进一步改善性能和延展性。
6.按需编码、可定制代码(可选)
服务端可选择临时给客户端下发一些功能代码让客户端来执行,从而定制和扩展客户端的某些功能。
比如服务端可以返回一些 Javascript 代码让客户端执行,去实现某些特定的功能。
提示:REST架构中的设计准则中,只有按需编码为可选项。如果某个服务违反了其他任意一项准则,严格意思上不能称之为RESTful风格。
##简介✓
API是用于构建软件应用程序的一组 子程序定义
、协议
和工具
。一般来说,是一套明确定义的软件各组件之间的通信方法。
协议(protocol):API接口中各组件之间交互的规范
格式(format):交互时的格式。通用的格式包含 XML 和 JSON
API端点:指同一个接口中提供某一子功能子的服务提供者。不同端点可以有不同协议和格式。
API特点:
API可以确认所有操作是否合法
发生错误时,API会根据错误报告机制发出指示
分页(pagination)有多信息需要显示时可以分部分显示。有助于节省带宽和资源
过滤(filtering)可以应要求显示特定信息,有助于节省带宽和资源
API中内置授权和访问控制
可以设置速率限制来控制服务器资源的使用
使用API核心需求:利用现有接口可以降低开发成本。比如想要使用地图可以使用高德地图API
##读懂API
CSDN-读懂API
##写API-RocketAPI
CSDN
HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol),是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。
超文本Hypertest
普通文本就是简单的字符,人们想要传输图片、视频、音频甚至图片或者文字超链接,此时语意被扩大了的文本即 超文本。
传输transfer
把二进制数据包由计算机终端传输到另一个终端
传输数据包的一方称为请求方,把接到二进制数据包的一方称为应答方
HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NmvcfGQJ-1641299488850)(https://tse1-mm.cn.bing.net/th/id/R-C.c57e01c28808a8d2652102b3502a0631?rik=5htBPnE5BPB8WA&riu=http%3a%2f%2fcache.yisu.com%2fupload%2fadmin%2fcustomer_case_img%2f2019-11-07%2f1573122633.png&ehk=3daIzO7aXx9WA3ZNW7YdQPiKjd5uHkBNzenXUihJwkk%3d&risl=&pid=ImgRaw&r=0)]
以分层(layer)的方式组织协议,每一层都为上一层提供服务,每个分层中所有协议称为协议栈
####应用层
应用程序通信的协议(HTTP、SMTP、FTP、DNS等等)
应用层是 网络应用程序 和 网络协议 存放的分层,因特网的应用层包括许多协议,
例如我们学 web 离不开的 HTTP,电子邮件传送协议 SMTP、端系统文件上传协议 FTP、还有为我们进行域名解析的 DNS 协议。
应用层协议分布在多个端系统上,一个端系统应用程序与另外一个端系统应用程序交换信息分组,我们把位于应用层的信息分组称为 报文(message)
####运输层
应用程序运输的协议(TCP UDP)
因特网的运输层在应用程序断点之间传送应用程序报文,在这一层主要有两种传输协议 TCP和 UDP,利用这两者中的任何一个都能够传输 报文
我们把运输层的分组称为 报文段(segment)
####网络层
目标位置的IP协议
网络层负责将称为 数据报(datagram) 的网络分层从一台主机移动到另一台主机。网络层一个非常重要的协议是 IP 协议,
所有具有网络层的因特网组件都必须运行 IP 协议,IP 协议是一种网际协议,除了 IP 协议外,
网络层还包括一些其他网际协议和路由选择协议,一般把网络层就称为 IP 层,由此可知 IP 协议的重要性。
####链路层
链路层的数据分组叫做“帧”
将分组从一个节点(主机或路由器)运输到另一个节点
例子:以太网、WiFi 和电缆接入的 DOCSIS 协议
####物理层
物理层的作用是将帧中的一个个 比特 从一个节点运输到另一个节点,物理层的协议仍然使用链路层协议,
这些协议与实际的物理传输介质有关,例如,以太网有很多物理层协议:关于双绞铜线、关于同轴电缆、关于光纤等等。
1.OPTIONS
返回服务器针对特定资源,也可以利用向web服务器发送的请求来测试服务器的功能性
2.HEAD
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
3.GET
向特定的资源发出请求。
注意:GET方法不应当被用于产生“副作用”的操作中,
例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。
Loadrunner中对应get请求函数:web_link和web_url
4.POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。
POST请求可能会导致新的资源的建立和/或已有资源的修改。
Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
5.PUT
向指定资源位置上传其最新内容
6.DELETE
请求服务器删除Request-URL所标识的资源
7.TRACE
回显服务器收到的请求,主要用于测试或诊断
8.CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
注意:
1)方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,
服务器应当返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(Not Implemented)。
2)HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法都是可选的,此外除上述方法,特定的HTTP服务器支持扩展自定义的方法。
MIME官网
媒体类型,是一种标准,用来表示文档、文件或字节流的性质和格式。
浏览器通常使用MIME类型(而不是文件扩展名)来确定如何处理URL,因此Web服务器在响应头中添加正确的MIME类型非常重要。
用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具。今天给大家介绍的这款网页调试工具不仅可以调试简单的css、html、脚本等简单的网页基本信息,它还可以发送几乎所有类型的HTTP请求!Postman在发送网络HTTP请求方面可以说是Chrome插件类产品中的代表产品之一。
Postman API 中文白皮书文档-Postman 使用教程
#9.30-10.2 pause
#swagger-更好的书写API文档
现在变成了前段渲染,前后端分离,前后端唯一的联系变成了API接口;API文档变成了前后端开发人员联系的纽带,
swagger
1、是一款让你更好的书写API文档规范且完整的框架。
2、提供描述、生产、消费和可视化RESTful Web Service。
3、是由庞大工具集合支撑的形式化规范。这个集合涵盖了从终端用户接口、底层代码库到商业API管理的方方面面。
作用:
1. 接口的文档在线自动生成。
2. 功能测试。
Swagger是一组开源项目,其中主要要项目如下:
1. Swagger-tools:提供各种与Swagger进行集成和交互的工具。例如模式检验、Swagger 1.2文档转换成Swagger 2.0文档等功能。
2. Swagger-core: 用于Java/Scala的的Swagger实现。与JAX-RS(Jersey、Resteasy、CXF...)、Servlets和Play框架进行集成。
3. Swagger-js: 用于JavaScript的Swagger实现。
4. Swagger-node-express: Swagger模块,用于node.js的Express web应用框架。
5. Swagger-ui:一个无依赖的HTML、JS和CSS集合,可以为Swagger兼容API动态生成优雅文档。
6. Swagger-codegen:一个模板驱动引擎,通过分析用户Swagger资源声明以各种语言生成客户端代码。
7. swagger-editor:就是一个在线编辑文档说明文件(swagger.json或swagger.yaml文件)的工具,
以方便生态中的其他小工具(swagger-ui)等使用。
#10.1
#spring框架
Spring是一个轻量级 Java 开发框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。
它是一个分层的JavaSE/JavaEE full-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。
Spring负责基础架构,因此Java开发者可以专注于应用程序的开发。
Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。
Spring可以做很多事情,它为企业级开发提供给了丰富的功能,但是这些功能的底层都依赖于它的两个核心特性,
也就是依赖注入(dependency injection,DI)和面向切面编程(aspect-oriented programming,AOP)。
为了降低Java开发的复杂性,Spring采取了以下4种关键策略
基于POJO的轻量级和最小侵入性编程;
通过依赖注入和面向接口实现松耦合;
基于切面和惯例进行声明式编程;
通过切面和模板减少样板式代码。
#10.1-10.2pause
#Rocket API-快速写一个API
常用配置文件格式
#10.1-10.2 ✓
#FastAPI - 优于flask的py web框架
CSDN
FastAPI 可以用 url/docs 查看自动生成的API模型
###FastAPI与flask不同处:
装饰器
@app.route(’’, methods=[‘POST’])
@app.get(’’) @app.post(") @app.put(") @app.delete(")
路径参数
@app.route(’/page/int:num’)
@app.get("/items/{item_id}")
async def read_item(item_id: int):
FastAPI还会自动为我们做数据校验的功能,数据验证都是由 Pydantic实现的
Path:http://pandora128.cn/{param}
Query: http://pandora128.cn?q={param}
Header/Body:
{
‘param’:‘value’
}
4
5
RequestBody-CSDN
前端
django框架 flask框架 搭个后台
通过一个API调用
BS结构
restful get post
postman
swagger
把mavsdk写进flask
前端HTML CSS JAVAScript等语言
网站架构
系统管理
服务部署
持续集成
数据库管理
并发处理
py的web开发技术栈 :
mavsdk导进去flask
然后对无人机的数据进行分析
Tensorflow/Pytorch
golang
yolo视觉分析