RoboMaster SDK解读.2
这个是车子的直接控制模式
也可以通过路由器拥连接
中间因为有了路由器,所以有了更加稳定的数据传输链路
也可以用喜闻乐见的UART来连接,什么?你居然不爱串口???
这里也给出了串口连接的接线图
pip install robomaster
如果网络较差,多次都安装失败,可以尝试:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple robomaster
以上是在Win系统下安装SDK的执行命令
当使用WIFI直接连接以后
from robomaster import robot
if __name__ == '__main__':
# 如果本地IP 自动获取不正确,手动指定本地IP地址
# robomaster.config.LOCAL_IP_STR = "192.168.2.20"
ep_robot = robot.Robot()
# 指定连接方式为AP 直连模式
ep_robot.initialize(conn_type='ap')
version = ep_robot.get_version()
print("Robot version: {0}".format(version))
ep_robot.close()
执行以上code会打印SDK的版本
Robot Version: xx.xx.xx.xx
就像这样
https://en.wikipedia.org/wiki/RNDIS
NDIS是指Remote NDIS,基于USB实现RNDIS实际上就是TCP/IP over USB,就是在USB设备上跑TCP/IP,让USB设备看上去像一块网卡。
UDP 使用具有最小协议机制的简单无连接通信模型。UDP提供数据完整性的校验和,以及用于在数据报的源和目标寻址不同函数的端口号。它没有握手对话,因此将用户的程序暴露在底层网络的任何不可靠的方面;没有交货、订购或重复保护的保证。如果在网络接口级别需要纠错功能,应用程序可以使用为此目的设计的传输控制协议(TCP) 或流控制传输协议 (SCTP)。
UDP 适用于不需要错误检查和更正或在应用程序中执行错误检查和更正的用途;UDP 避免了协议堆栈中此类处理的开销。时间敏感的应用程序通常使用 UDP,因为丢弃数据包比等待由于重新传输而延迟的数据包更可取,在实时系统中,这可能不是一个选项。
TCP是面向连接的 ,在发送数据之前建立客户端和服务器之间的连接。在建立连接之前,服务器必须侦听(被动打开)来自客户端的连接请求。三向握手(主动打开)、重新传输和错误检测增加了可靠性,但延长了延迟。不需要可靠数据流服务的应用程序可以使用用户数据报协议 (UDP),该协议提供无连接数据报服务,将时间置于可靠性的优先级。TCP 采用网络拥塞避免。但是,TCP 存在漏洞,包括拒绝服务、连接劫持、TCP否决和重置攻击。
看这里只支持UDP通信
netstat -an
本机端口打印
懂了。两个参数,发射什么子弹,以及射几个,之前先建立一个对象
import time
from robomaster import robot
from robomaster import blaster
if __name__ == '__main__':
ep_robot = robot.Robot()
ep_robot.initialize(conn_type="sta")
ep_blaster = ep_robot.blaster
# 发射1颗水弹
ep_blaster.fire(times=1)
time.sleep(2)
# 发射3颗水弹
ep_blaster.fire(fire_type=blaster.WATER_FIRE, times=3)
time.sleep(2)
# 发射1颗红外子弹
ep_blaster.fire(fire_type=blaster.INFRARED_FIRE)
time.sleep(2)
# 发射3颗红外子弹
ep_blaster.fire(fire_type=blaster.INFRARED_FIRE, times=3)
time.sleep(2)
ep_robot.close()
代码通俗易懂,一开始库是为了释放资源用
接下来发射系统和时间库相搭配,延时射击各种类型的炮弹
接下来又是一个控制底盘的,先建立对象
然后设置速度,后面三个参数是运动参数
以及超时stop的机制,我写SDK的时候要重点考虑
from robomaster import robot
if __name__ == '__main__':
ep_robot = robot.Robot()
ep_robot.initialize(conn_type="sta")
ep_chassis = ep_robot.chassis
x_val = 0.5
y_val = 0.6
z_val = 90
# 前进 0.5米
ep_chassis.move(x=x_val, y=0, z=0, xy_speed=0.7).wait_for_completed()
# 后退 0.5米
ep_chassis.move(x=-x_val, y=0, z=0, xy_speed=0.7).wait_for_completed()
# 左移 0.6米
ep_chassis.move(x=0, y=-y_val, z=0, xy_speed=0.7).wait_for_completed()
# 右移 0.6米
ep_chassis.move(x=0, y=y_val, z=0, xy_speed=0.7).wait_for_completed()
# 左转 90度
ep_chassis.move(x=0, y=0, z=z_val, z_speed=45).wait_for_completed()
# 右转 90度
ep_chassis.move(x=0, y=0, z=-z_val, z_speed=45).wait_for_completed()
ep_robot.close()
先看这段,导包我就不说了
接下来是__main__方法,因为这段代码当做一个独立的PY文件区运行
接着是初始化,机器的是一种什么样的媒介被控制
接下来新建一个对象,接着是三个常量
这是三个量的作用
我们就看一个语句,调用move方法
只有前进有值,速度0.7
这段里面的干货就比较多。这里可以提炼的知识有,对于未来的SDK设计方面,可以抽象出一种任务类型,就是需要一段时间才能执行完毕~
考虑信息回应,在发出任务后,执行机构回馈收到。执行时回馈开始执行并加入执行时间统计,以及相关时间计数。