< >
Home » crazyflie开发笔记 » crazyflie开发笔记-PC端 Python API 说明

crazyflie开发笔记-PC端 Python API 说明

说明:

  • 介绍了Crazyflie的PC客户端Crazyflie Python API的使用说明

  • 通过使用API,可以自定义一些飞行模式控制飞行器完成一些个性化的任务

介绍:

  • Crazyflie Python API介绍

    英文参考:http://wiki.bitcraze.se/doc:crazyflie:api:python:index

    Python API对Crazyflie的高级控制功能进行了封装。

    Source insight 对 python 的支持,需要导入配置文件: Python.CLF:
    详见文章:http://blog.163.com/bruce_wen/blog/static/13908242220111011113634768/

  • 函数库结构

    函数库是异步的,主要基于对事件的回调。比如当调用open_link函数后,函数会立刻返回,等到连接建立后,回调函数将会被调用(执行)。整个函数库不包括任何线程和互锁,这样不会阻塞应用的运行。

  • 统一资源标识(URI)
    所有通信链接都由URI标识。标识格式如下:

    • InterfaceType://InterfaceId/InterfaceChannel/InterfaceSpeed
    • 标识接口类型:// 接口ID/ 接口通道/ 接口速度
      当前只有 radio 和 debug用到接口了。以后 udp、serial、usb等等都会如此。以下是radio和debug的例子:
      例子1:
      radio接口:Crazyradio USB接口ID 0,通信通道10,传输速率250kbps;
      表达为: radio://0/10/250K
      例子2:
      Debug接口:接口ID 0, 通道1
      表达为: debug://0/1
  • 回调 Callbacks

    所有的回调都使用Caller类来处理。
    如下:
    add_callback(cb)
    """注册 cb 为一个新的回调,不能重复注册. """
    remove_callback(cb)
    """注册 cb 为一个新的回调,不能重复注册"""
    call(*args)
    """调用注册过的带args参数的回调"""

  • 调试驱动DebugDriver

    函数库包含一个特别的link driver,名为DebugDriver。这个驱动将模拟一个Crazyflie,被用来对UI和函数库进行测试。一般地,这个对用户是隐藏的,除非在配置文件里对其进行“使能”。这个驱动支持:

    • 连接一个下载参数TOC和日志TOC;
    • 设置日志配置和回发伪数据;
    • 设置和读取参数;
    • Bootloading。
    • DebugDriver会返回一系列不同的 URI(统一资源标识),这里包含一系列不同的函数,比如:总是返回一个随机的 TOC CRC校验,总是触发 TOC 下载或者触发连接中断。DebugDriver·同时支持随机延时的回传数据,以触发函数库的随机重发。
  • 初始化link driver
    在函数库能被使用之前,link driver需要先初始化。Link driver的初始化将会搜寻可用的驱动,并且实例化他们。例如:
    init_drivers(enable_debug_driver=False)
    """搜寻并初始化link drivers. 如果 enable_debug_driver 为真,那么DebugDriver将也会启用."""

  • 回调函数的具体实现Connection- and link-callbacks

    对link 和 connection 的操作,将直接返回。一旦有事件发生,将调用下面的回调对事件进行处理。回调如下:

# 无论什么原因,一旦断开连接,下面的事件将触发
disconnected = Caller()
# 在数据丢包(间歇性连接)时被调用
connection_lost = Caller()
# 当一个新的link建立后,收到第一个数据包时被调用
link_established = Caller()
# 当有连接请求时,被调用。
connection_requested = Caller()
# 当连接建立,且所有TOC数据已经被下载是被调用
connected = Caller()
# 连接建立失败时调用
connection_failed = Caller()
# 每接收一个数据包则触发调用
packet_received = Caller()
# 每发送一个数据包则触发调用
packet_sent = Caller()
# 当 link driver 更新连接信号质量时被调用
link_quality_updated = Caller()

针对以上回调声明,注册具体回调的方法,举例如下:

crazyflie = Crazyflie()
crazyflie.connected.add_callback(crazyflie_connected)
  • 搜寻一个Crazyflie并建立连接

    我们要做的第一件事,就是搜寻Crazyflie。首先将会扫描所有可用的接口(当前只有debug和radio两个接口)。

cflib.crtp.init_drivers()
available = cflib.crtp.scan_interfaces()
for i in available:
print "Interface with URI [%s] found and name/comment [%s]" % (i[0], i[1])
通过创建一个Crazyflie对象来打开和关闭一个通信链接(communication link)
crazyflie = Crazyflie()
crazyflie.connected.add_callback(crazyflie_connected)
crazyflie.open_link("radio://0/10/250K")
那么你可以按照以下办法再次关闭连接
crazyflie.close_link()
  • 发送控制命令

    控制命令,不同于参数(parameters),相反他有另外的API
    send_setpoint(roll, pitch, yaw, thrust):
    """发送一个新的控制点给飞行器,包括roll/pitch/yaw/thust。这些都是控制点的目标值。"""
    举例如下:
    roll = 0.0
    pitch = 0.0
    yawrate = 0
    thrust = 0
    crazyflie.commander.send_setpoint(roll, pitch, yawrate, thrust)

    油门是整型数,返回10001到60000。命令发送后,将维持500ms时间。如果500ms后未收到新的命令,飞行器将切断动力。因此,你定时刷新这些值。一般我们每10ms刷新一次。这也帮助我们更精确的控制飞行。

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: crazyflie开发笔记