第205章 Relation Class|关系类
建立对象之间的动态关系
第204章已经完成:
Element
↓
Object
↓
Attribute
此时,ICAI 已经能够描述一个对象本身。
例如:
Egg Object
鸡蛋对象
│
├── Position
├── Distance
├── Pressure
├── Force
└── Stability
但是现实世界并不是由一个个孤立对象组成的。
真正的场景中存在大量对象之间的关系:
Hand → near → Egg
Hand → contacts → Egg
Egg → on → Table
Obstacle → near → Egg
而且这些关系会随着现实状态不断变化。
因此,本章建立:
Object
对象
↓
Relation Class
关系类
↓
Relation Instance
关系实例
205.1 Relation|关系
ICAI 中的 Relation(关系)用于描述:
一个对象与另一个对象之间当前存在的认知关系。
最基本的关系结构:
Relation=(Subject,Type,Object,State)Relation=(Subject,Type,Object,State)
即:
Subject
主体
Type
关系类型
Object
目标对象
State
关系状态
例如:
Hand → near → Egg
可以表示为:
Subject = Hand
Type = near
Object = Egg
State = active
因此 Relation 本身也是一个软件对象。
205.2 为什么关系不能只是字符串
传统程序可能直接保存:
$relation = "hand_near_egg";
但是这对于 ICAI 不够。
系统需要知道:
谁?
与谁?
什么关系?
什么时候建立?
当前是否有效?
关系强度是多少?
关系是否正在变化?
因此:
"near"
只是关系类型。
真正的 Relation 应该是:
Hand
+
near
+
Egg
+
Current State
205.3 Relation Class|关系类
建立基础 Class:
class Relation
{
protected $subject;
protected $type;
protected $object;
protected $state;
protected $timestamp;
}
这里:
subject
关系主体
type
关系类型
object
关系目标
state
关系状态
timestamp
关系时间
205.4 Constructor|关系构造
class Relation
{
protected $subject;
protected $type;
protected $object;
protected $state;
protected $timestamp;
public function __construct(
Object $subject,
$type,
Object $object
) {
$this->subject = $subject;
$this->type = $type;
$this->object = $object;
$this->state = 'active';
$this->timestamp = time();
}
}
于是可以创建:
$relation = new Relation(
$hand,
'near',
$egg
);
形成:
Hand
↓
near
↓
Egg
205.5 Relation Instance|关系实例
Class 只是关系结构。
真正运行的是 Relation Instance:
$handEggRelation = new Relation(
$hand,
'near',
$egg
);
此时:
Relation Class
↓
Relation Instance
↓
Hand → near → Egg
同一个 Relation Class 可以创建大量不同关系实例:
Hand → near → Egg
Hand → contacts → Egg
Egg → on → Table
Obstacle → near → Egg
并不需要为每一种关系建立独立 PHP 程序。
205.6 Subject / Object|主体与目标
Relation 必须能够明确两个对象。
例如:
Hand → contacts → Egg
其中:
Subject = Hand
Object = Egg
代码:
public function getSubject()
{
return $this->subject;
}
public function getObject()
{
return $this->object;
}
因此系统可以获得:
$relation->getSubject();
$relation->getObject();
205.7 Relation Type|关系类型
关系类型是 Relation 的核心。
例如:
near
接近
far
远离
contacts
接触
holds
持有
on
位于其上
inside
位于内部
blocks
阻挡
moves_toward
向……移动
supports
支撑
代码:
public function getType()
{
return $this->type;
}
例如:
$relation->getType();
返回:
contacts
205.8 动态关系
ICAI 最重要的不是建立静态关系,而是建立:
Dynamic Relation|动态关系。
例如机械手靠近鸡蛋:
Distance = 20cm
此时:
Hand → far → Egg
继续移动:
Distance = 5cm
关系变成:
Hand → near → Egg
继续移动:
Distance = 0
变成:
Hand → contacts → Egg
所以:
far
↓
near
↓
contacts
关系随着实时状态发生变化。
205.9 Relation State|关系状态
因此 Relation 需要自己的 State:
protected $state;
例如:
active
inactive
unknown
expired
提供:
public function getState()
{
return $this->state;
}
public function updateState($state)
{
$this->state = $state;
$this->timestamp = time();
}
于是:
Relation
↓
State
↓
Dynamic Update
205.10 Relation Value|关系强度
某些关系并不是简单的 True / False。
例如:
Distance
距离
Contact Force
接触力度
Similarity
相似程度
Support
支撑程度
因此 Relation 后面可以拥有动态 Value:
Rt=f(O1,O2,Xt)R_t=f(O_1,O_2,X_t)
例如:
Hand → near → Egg
Distance = 0.05
再变成:
Distance = 0.01
关系仍然是 near,但关系状态已经发生变化。
这一层为后面的动态认知计算留下空间。
205.11 Relation 与 Object
Relation 不是孤立存在的。
它连接两个 Object:
Object A
│
↓
Relation
↓
Object B
例如:
Hand
↓
contacts
↓
Egg
因此一个场景可以拥有:
Hand → near → Egg
Hand → on → Table
Egg → on → Table
Obstacle → near → Egg
最终形成关系网络:
Hand
│
├── near → Egg
│
└── on → Table
Egg
│
└── on → Table
Obstacle
│
└── near → Egg
这已经开始接近 Scene 的结构。
205.12 Relation Collection|关系集合
与 Object 拥有多个 Element 一样,系统也需要管理多个 Relation。
可以建立:
class RelationManager
{
protected $relations = array();
public function addRelation(Relation $relation)
{
$this->relations[] = $relation;
}
public function getRelations()
{
return $this->relations;
}
}
于是:
RelationManager
│
├── Hand → near → Egg
├── Hand → contacts → Egg
├── Egg → on → Table
└── Obstacle → near → Egg
形成动态关系集合。
205.13 Relation 的变化
现实场景中,关系会产生:
Create
创建
Update
更新
Change
变化
Remove
解除
例如:
Hand → near → Egg
继续运动:
Hand → contacts → Egg
抓取成功:
Hand → holds → Egg
松开:
Hand → holds → Egg
↓
Relation Removed
因此 Relation 是一个生命周期对象。
205.14 不为场景编写关系程序
这里必须保持前面确定的工程原则。
不能:
EggSceneRelation.php
GlassSceneRelation.php
FruitSceneRelation.php
而应该:
Relation Class
↓
Relation Instance
例如:
Hand → contacts → Egg
Hand → contacts → Glass
Hand → contacts → Fruit
使用的仍然是:
Relation
区别来自:
Object
+
Attribute
+
State
而不是来自完全不同的程序。
205.15 Relation 与动态认知
到这里:
Object
↓
Attribute
↓
Relation
ICAI 已经不再只是知道:
“这里有一个鸡蛋。”
而开始知道:
“机械手正在接近鸡蛋。”
进一步:
“机械手已经接触鸡蛋。”
再进一步:
“机械手正在持有鸡蛋。”
这意味着机器认知开始从:
Object Recognition
对象识别
进入:
Object Relationship
对象关系
而关系是 Scene 形成的基础。
205.16 Relation Class 基础实现
本章可以先建立干净的基础版本:
<?php
class Relation
{
protected $subject;
protected $type;
protected $object;
protected $state;
protected $timestamp;
public function __construct(
Object $subject,
$type,
Object $object
) {
$this->subject = $subject;
$this->type = $type;
$this->object = $object;
$this->state = 'active';
$this->timestamp = time();
}
public function getSubject()
{
return $this->subject;
}
public function getType()
{
return $this->type;
}
public function getObject()
{
return $this->object;
}
public function getState()
{
return $this->state;
}
public function getTimestamp()
{
return $this->timestamp;
}
public function updateState($state)
{
$this->state = $state;
$this->timestamp = time();
}
}
205.17 一个最简单的运行实例
建立三个 Object:
$hand = new Object(
1001,
'device',
'Robot Hand'
);
$egg = new Object(
1002,
'physical_object',
'Egg'
);
$table = new Object(
1003,
'environment',
'Table'
);
建立关系:
$relation1 = new Relation(
$hand,
'near',
$egg
);
$relation2 = new Relation(
$egg,
'on',
$table
);
运行时得到:
Robot Hand
│
↓ near
│
Egg
│
↓ on
│
Table
这已经不是静态文本描述,而是:
Object Instance
+
Relation Instance
构成的实际软件对象关系。
205.18 本章形成的结构
到第205章结束:
Element
元素
↓
Object
对象
↓
Attribute
属性
↓
Relation
关系
软件层面:
Element Class
↓
Object Class
↓
Attribute Class
↓
Relation Class
运行层面:
Element Instance
↓
Object Instance
↓
Attribute Instance
↓
Relation Instance
最终形成:
Object A
│
↓
Relation
↓
Object B
205.19 本章核心结论
Relation Class 将 ICAI 从“单个对象认知”推进到“对象之间的动态关系认知”。
而且 Relation 本身也是一个可以:
Create
创建
Update
更新
Evaluate
评价
Change
变化
Remove
解除
的软件对象。
因此 ICAI 的软件对象体系进一步形成:
Real-Time Data
实时数据
↓
Element
元素
↓
Object
对象
↓
Attribute
属性
↓
Relation
关系
下一章进入:
第206章 State Class|状态类
核心解决:
Object
+
Attribute
+
Relation
+
Real-Time Change
↓
State
状态
也就是让 ICAI 不只是知道对象和关系是什么,而能够明确表示:
对象、属性和关系在当前这一时刻究竟处于什么状态。