Codac:机器人约束编程

Codac(Catalog Of Domains And Contractors)是一个C++/Python库,为约束编程在真实、轨迹和场景上。它在以下方面有许多应用状态估计机器人定位

什么是约束编程?
在这个范例中,用户将注意力集中在要找到的解决方案的属性上(例如机器人的姿势、地标的位置)变量约束然后,解算器执行约束传播并提供了一组可靠的可行的解决方案与问题相对应。在这种方法中,用户专注于什么是问题而不是怎样从而让计算机处理怎样
移动机器人怎么样?
在机器人领域,诸如非线性状态估计参数估计延误SLAM公司被绑架机器人问题可以通过使用约束编程在很短的步骤内求解。尽管Codac库并非仅针对机器人问题,但其界面的设计在很大程度上受到了上述应用程序需求的影响。Codac提供了解决这些问题的解决方案,这些问题通常很难用传统方法(如粒子方法或卡尔曼滤波器)解决。

简而言之,Codac是一个约束编程框架提供工具以轻松解决各种问题。

关键词

  • 约束编程

  • 移动机器人

  • 间隔分析

  • 动态系统

  • 本地化

  • 国家估算

  • SLAM公司

  • 解算器

开始:2分钟到Codac

我们只需要定义对于我们的变量和一组承包商实现我们的约束。Codac的核心是承包商网络表示解算器。

只需几个步骤,问题就可以通过以下方式解决

  1. 定义变量(向量、轨迹)的初始域(框、管)

  2. 从图书馆提供的现有运营商目录中选取承包商

  3. 将承包商和域添加到承包商网络

  4. 让承包商网络解决问题

  5. 获得一组可靠的可行变量

例如。
让我们考虑一下机器人的测距定位问题。机器人由状态向量描述\(\mathbf{x}=\{x_1,x_2,\psi,\vartheta\}^\internal)描述其位置、方向和速度。它在三个地标之间发展\(\mathbf{b} _1个\)\(\mathbf{b} _2\)\(\mathbf{b} _3个\)并测量距离\(y_i\)从这些方面来看。

该问题由经典状态方程定义:

\[\begin{split}\left\{\begin}数组}{l}\点{\mathbf{x}}(t)=\mathbf1}\big\\y_i=g\大(\mathbf{x}(ti),\mathbf{b} _ i\大)\右端{数组}。\结束{拆分}\]

哪里\(\mathbf{u}(t)\)是系统的输入,已知有一些不确定性。\(\mathbf{f}\)\(g)是非线性函数。

第一步。
为变量定义域。

我们有三个随时间变化的变量:轨迹\(\mathbf{x}(t)\)\(\mathbf{v}(t)=\dot{\mathbf{x}}(t)\)\(\mathbf{u}(t)\)。我们定义了三个管来封装它们:

日期 = 0.01                                         #管精度的时间步长
T域 = 间隔(0 )                          #时间极限[t0,tf]=[0,3]

x个 = 管向量(TubeVector)(T域 日期 4)                    #状态向量4d管
v(v) = 管向量(TubeVector)(T域 日期 4)                    #态导数4d管
u个 = 管向量(TubeVector)(T域 日期 2)                    #系统输入的2d管

我们假设我们对标题进行了测量\(磅/平方英寸(吨))和速度\(\vartheta(t)\),一些有界不确定性由区间定义\([e_\psi]=[-0.01,0.01]\)\([e_\vartheta]=[-0.01,0.01]\):

x个[2] = 管子(测量的psi 日期)膨胀(0.01)       #measuredpsi是一组测量值
x个[] = 管子(测量的速度 日期)膨胀(0.01)

最后,我们定义了三个单距离观测值的区域\((ti,y_i)\)以及地标的位置。距离\(y_i\)以区间为界\([e_y]=[-0.1,0.1]\)

(_y) = 间隔(-0.10.1)
 = [间隔(1.9+(_y)), 间隔(3.6+(_y)),\#一组距离观测值
     间隔(2.8+(_y))]
b条 = [[8][05][-21]]                          #三个二维地标的位置
 = [0.3 1.5 2]                               #测量次数
第二步。
定义承包商来处理状态方程。

距离函数\(g(\mathbf{x},\mathbf{b})\)机器人和地标之间对应于Ctc医生图书馆提供的承包商。进化函数\(\mathbf{f}(\mathbf{x},\mathbf{u})=\大(x4\cos(x3),x4\sin(x3,u1,u2\big)\)可由定制承包商处理:

ctc_f = Ctc函数(
  功能(“v[4]” “x[4]” “u[2]”
           “(v[0]-x[3]*cos(x[2]);v[1]-x[3]*sin(x[2]);v[2]-u[0];v[3]-u[1])”))
第三步。
将承包商与相关域一起添加到网络中非常简单:
中国 = 承包商网络()   #创建网络

中国添加(ctc_f [v(v) x个 u个])   #添加f约束

对于  在里面 范围 (0伦恩()): #我们添加了观察者。每个距离测量的约束

  第页 = 中国创建期限(间隔向量(4)) #中间。变量(ti状态)

  #距离约束:ti处的状态与第i个信标位置之间的关系
  中国添加(ctc公司距离 [中国子向量(第页01), b条[], []])

  #评估约束:t_i处的状态与[t_0,t_f]上的所有状态之间的关系
  中国添加(ctc公司评估 [[], 第页 x个 v(v)])
第四步。
解决问题。
中国合同()
第五步。
获得一组可靠的可行位置:用蓝色表示的管子。三个黄色机器人展示了观察的三个瞬间。白线是未知的真相。
_images/rangeonly-nox0.png
你只是在不了解初始条件的情况下求解了一个非线性状态估计。
查看Github的完整示例:单位:C++在Python中在MATLAB中

在本教程和该库的examples文件夹中,您将发现更多高级问题,如同步本地化和映射(SLAM)、数据关联问题或延迟系统。

用户手册

想使用Codac吗?首先要做的是安装库,或在线尝试:

然后您有两个选择:阅读Codac功能的详细信息(域、管、承包商、切片等),或者跳到关于如何将Codac用于移动机器人,并举例说明。

移动机器人教程

这个以下教程是独立的,讲述了如何将Codac用于移动机器人应用程序,并举例说明:

许可和支持

此软件处于GNU宽松通用公共许可证

有关最近的改进和活动,请参阅Codac Github储存库您可以在问题页面

贡献者

如何引用该项目?

我们建议使用以下BibTeX模板在科学话语中引用Codac:

@文章{codac_lib,title={{C} odac公司库},网址={https://cyber.bibl.u-szeged.hu/index.php/actcybern/article/view/4388},DOI={10.14232/actacycyb.302772},journal={控制论学报},series={SWIM}2022}特刊,author={Rohou、Simon和Desrochers、Benoit和{Le Bars}、Fabrice},年份={2024},月={3月}}