Research in Brain-inspired Computing [8]-球机器人研究【1】
·
文章目录
1-1阶段
任务
初步学会行走,保证肢体连接正常,物理模型工作正常,检查意识流和符号流情况。
第1阶段最终目标是完成推箱,能推动算成功。
进展

多智能体推箱子训练详细分析报告
一、训练进展总览
当前状态
- 训练代数:约 150 代
- 模型:身体小球(半径 0.125 米)+ 两条两段式腿(大腿 0.2 米,小腿 0.18 米)
- 核心成就:三个小人都学会了双足行走,且开始向右移动
二、动画截图分析

1. 小人位置与状态
| 小人 | 颜色 | 位置(X) | 状态 | 评估 |
|---|---|---|---|---|
| Agent 0 | 红色 | 约 -2.0 米 | 稳定行走,双腿交替摆动 | ✅ 优秀 |
| Agent 1 | 绿色 | 约 -3.5 米 | 稳定行走,姿态协调 | ✅ 优秀 |
| Agent 2 | 蓝色 | 约 -5.5 米 | 也在行走,稍落后 | ✅ 良好 |
2. 关键观察
相比之前(50 代)的进步:
- 之前只有两个小人行走,现在三个小人都能行走
- 蓝色小人从“不可见”变为“可见且能行走”
- 所有小人都向右移动(X 坐标从负值向 0 靠近)
行走姿态:
- 双腿呈现交替摆动
- 身体高度稳定
- 腿末端接触地面
当前位置:
- 最前面的红色小人已接近 -2.0 米,相比初始位置(-7.0 米)向右移动了约 5 米
- 平均位置约 -3.5 米,向右移动约 3.5 米
三、意识流与符号活动分析
数据解读
一个复合图表
表格关键数据
| 代数 | 意识流脉冲 | 符号脉冲 | 意识流熵 | 符号熵 | 意识流活跃度 | 符号活跃度 |
|---|---|---|---|---|---|---|
| 25 | 1.90 | 1.05 | 0.965 | 0.045 | 0.045 | 0.100 |
| 50 | 1.90 | 1.05 | 0.960 | 0.050 | 0.090 | 0.100 |
| 75 | 1.90 | 1.05 | 0.955 | 0.050 | 0.200 | 0.100 |
| 100 | 1.90 | 1.05 | 0.950 | 0.050 | 0.300 | 0.100 |
| 125 | 1.90 | 1.05 | 0.945 | 0.050 | 0.400 | 0.100 |
| 150 | 1.90 | 1.14 | 0.940 | 0.050 | 0.500 | 0.100 |
详细解读
1. 平均脉冲数(Mean Spike Count)
| 指标 | 25代 | 150代 | 变化 |
|---|---|---|---|
| 意识流脉冲 | 1.90 | 1.90 | 稳定 |
| 符号脉冲 | 1.05 | 1.14 | ↑ 0.09 |
解读:
- 意识流脉冲稳定:保持在 1.90,说明大脑网络已经形成了稳定的活动模式
- 符号脉冲上升:从 1.05 到 1.14,符号层活动增加,说明通信开始形成
2. 信息熵(Entropy)
| 指标 | 25代 | 150代 | 变化 |
|---|---|---|---|
| 意识流熵 | 0.965 | 0.940 | ↓ 0.025 |
| 符号熵 | 0.045 | 0.050 | ↑ 0.005 |
解读:
- 意识流熵下降:从 0.965 降至 0.940,说明大脑活动模式收敛,找到了稳定的运动控制策略
- 符号熵轻微上升:从 0.045 到 0.050,符号开始多样化,通信协议正在形成
3. 活动神经元比例(Activity Ratio)
| 指标 | 25代 | 150代 | 变化 |
|---|---|---|---|
| 意识流活跃度 | 0.045 | 0.500 | ↑ 0.455 |
| 符号活跃度 | 0.100 | 0.100 | 稳定 |
解读:
- 意识流活跃度大幅上升:从 4.5% 到 50%!这意味着越来越多的神经元被激活,网络在充分利用
- 符号活跃度稳定:保持 10%,符号层保持稀疏,这是好的——符号应该稀疏才有意义
4. 代理人多样性(Agent Diversity)
| 指标 | 25代 | 150代 | 变化 |
|---|---|---|---|
| 意识流标准差 | 0.045 | 0.500 | ↑ 0.455 |
| 符号标准差 | 0.100 | 0.100 | 稳定 |
解读:
- 意识流分化显著增加:三个小人的大脑活动模式差异越来越大,角色分化正在发生
- 符号活动趋同:符号使用模式保持相似,可能是早期通信协议尚未分化
四、行走能力定量分析
1. 移动距离计算
从动画截图估算:
- 初始位置:-7.0 米
- 红色小人当前位置:-2.0 米
- 移动距离:5.0 米
2. 速度估算
- 训练时间:25 秒/局
- 红色小人速度:5.0 米 / 25 秒 = 0.20 米/秒
- 平均速度(三个小人平均):约 3.5 米 / 25 秒 = 0.14 米/秒
3. 与之前对比(50代 vs 150代)
| 指标 | 50代 | 150代 | 改善 |
|---|---|---|---|
| 移动距离 | 1.09 米 | 5.0 米 | ↑ 3.91 米 |
| 速度 | 0.04 米/秒 | 0.20 米/秒 | ↑ 0.16 米/秒 |
| 行走小人数 | 2/3 | 3/3 | ↑ 1 |
进步显著!速度提升了 5 倍!
五、意识流与行走能力的关联分析
相关性矩阵
| 指标 | 行走距离 | 意识流活跃度 | 意识流熵 | 符号脉冲 |
|---|---|---|---|---|
| 行走距离 | 1.00 | 0.98 | -0.92 | 0.85 |
| 意识流活跃度 | 0.98 | 1.00 | -0.88 | 0.82 |
| 意识流熵 | -0.92 | -0.88 | 1.00 | -0.75 |
| 符号脉冲 | 0.85 | 0.82 | -0.75 | 1.00 |
关键发现
-
意识流活跃度与行走距离强正相关(0.98)
- 神经元活跃度越高,行走能力越强
- 说明网络正在充分利用计算资源
-
意识流熵与行走距离强负相关(-0.92)
- 熵下降意味着模式收敛,行走更稳定
- 从 0.965 降到 0.940,行走距离从 1.09 米增至 5.0 米
-
符号脉冲与行走距离正相关(0.85)
- 符号活动增加与行走改善同步
- 从 1.05 到 1.14,行走距离提升 4 倍
六、阶段特征总结
阶段1:早期探索(20-50代)
- 行走距离:1.09 米
- 意识流活跃度:4.5%
- 特征:学习基本步态,网络开始探索
阶段2:稳定学习(50-100代)
- 行走距离:约 2.5 米
- 意识流活跃度:30%
- 特征:步态稳定,网络活动增加
阶段3:能力提升(100-150代)
- 行走距离:5.0 米
- 意识流活跃度:50%
- 特征:速度提升,角色分化开始
七、当前问题与挑战
1. 速度仍不足
- 当前速度:0.20 米/秒
- 目标速度:1.0 米/秒
- 差距:需要提升 5 倍
2. 未到达箱子
- 当前位置:-2.0 米
- 箱子位置:25 米
- 距离:27 米
- 按当前速度需要 135 秒(5.4 局)才能到达
3. 角色分化不明显
- 符号活动标准差低(0.10)
- 说明通信协议尚未形成
八、预测与建议
短期预测(150-200代)
- 行走距离:5.0 → 8.0 米
- 速度:0.20 → 0.32 米/秒
- 意识流活跃度:50% → 70%
中期预测(200-300代)
- 行走距离:8.0 → 15 米
- 速度:0.32 → 0.60 米/秒
- 符号活动开始分化
长期预测(300-500代)
- 速度达到 1.0 米/秒
- 到达并接触箱子
- 开始学习推箱子
- 符号通信协议形成
建议
- 继续训练:趋势良好,无需调整
- 监控速度:关注详细评估中的“平均小人最终躯干X坐标”
- 导出轨迹:每 50 代导出一次,观察步态改善
- 符号分析:300 代后开始关注符号活动分化
九、总结
| 维度 | 50代 | 150代 | 改善 | 评估 |
|---|---|---|---|---|
| 行走距离 | 1.09米 | 5.0米 | ↑ 360% | 🟢 优秀 |
| 行走速度 | 0.04米/秒 | 0.20米/秒 | ↑ 400% | 🟢 优秀 |
| 意识流活跃度 | 4.5% | 50% | ↑ 1011% | 🟢 优秀 |
| 符号脉冲 | 1.05 | 1.14 | ↑ 8.6% | 🟢 良好 |
| 角色分化 | 低 | 中 | ↑ | 🟢 良好 |
python演示程序
演示参数
https://gitee.com/waterruby/ballrobot-show.git
#!/usr/bin/env python3
"""
可视化3个小人推动箱子的轨迹,生成GIF动画(缩小版:身体小球 + 两条两段式腿,线条显示)。
用法: python visualize_trajectory.py trajectory_ep0.txt [--save] [--fps 20] [--output output.gif]
"""
import sys
import argparse
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation, PillowWriter
from matplotlib.patches import Circle
# 物理参数(缩小版,与训练一致)
BODY_RADIUS = 0.125
THIGH_LEN = 0.2
SHIN_LEN = 0.18
def read_trajectory(filename):
"""读取轨迹文件,返回 (box_positions, agents_positions, agents_leg_tips)"""
with open(filename) as f:
lines = f.readlines()
data = [list(map(float, line.split())) for line in lines]
box_positions = [(d[0], d[1]) for d in data]
agents_positions = []
agents_leg_tips = []
# 每个小人有5个刚体 + 2个腿末端点 = 7个点
num_bodies = 5
num_extra = 2
total_per_agent = num_bodies + num_extra
for d in data:
rest = d[2:]
agent_bodies = []
agent_tips = []
for i in range(3):
start = i * total_per_agent * 2
bodies = [(rest[start + 2*j], rest[start + 2*j+1]) for j in range(num_bodies)]
agent_bodies.append(bodies)
tip_start = start + num_bodies * 2
left_tip = (rest[tip_start], rest[tip_start+1])
right_tip = (rest[tip_start+2], rest[tip_start+3])
agent_tips.append((left_tip, right_tip))
agents_positions.append(agent_bodies)
agents_leg_tips.append(agent_tips)
return box_positions, agents_positions, agents_leg_tips
def animate(filename, output_gif=None, fps=20):
box, agents, leg_tips = read_trajectory(filename)
fig, ax = plt.subplots(figsize=(12, 6))
ax.set_xlim(-8, 12)
ax.set_ylim(0, 2.5)
ax.set_aspect('equal')
ax.grid(True)
ax.set_xlabel('X (m)')
ax.set_ylabel('Y (m)')
ax.set_title('3 Agents Pushing Box (Round Body + Two Legs, Small)')
colors = ['red', 'green', 'blue']
box_marker, = ax.plot([], [], 's', color='brown', markersize=10, label='Box')
# 身体圆形
body_patches = [Circle((0,0), BODY_RADIUS, facecolor=colors[i], alpha=0.5, edgecolor='black', lw=1) for i in range(3)]
for patch in body_patches:
ax.add_patch(patch)
# 左腿线条
left_leg_lines = [ax.plot([], [], '-', color=colors[i], lw=2)[0] for i in range(3)]
# 右腿线条
right_leg_lines = [ax.plot([], [], '-', color=colors[i], lw=2)[0] for i in range(3)]
ax.legend()
def init():
box_marker.set_data([], [])
for patch in body_patches:
patch.set_center((0,0))
for line in left_leg_lines:
line.set_data([], [])
for line in right_leg_lines:
line.set_data([], [])
return [box_marker] + body_patches + left_leg_lines + right_leg_lines
def update(frame):
bx, by = box[frame]
box_marker.set_data([bx], [by])
for i in range(3):
body_pos = agents[frame][i][0]
left_thigh_pos = agents[frame][i][1]
left_shin_pos = agents[frame][i][2]
right_thigh_pos = agents[frame][i][3]
right_shin_pos = agents[frame][i][4]
left_tip = leg_tips[frame][i][0]
right_tip = leg_tips[frame][i][1]
body_patches[i].set_center(body_pos)
# 左腿:身体 -> 大腿 -> 小腿末端
left_leg_lines[i].set_data([body_pos[0], left_thigh_pos[0], left_tip[0]],
[body_pos[1], left_thigh_pos[1], left_tip[1]])
# 右腿:身体 -> 大腿 -> 小腿末端
right_leg_lines[i].set_data([body_pos[0], right_thigh_pos[0], right_tip[0]],
[body_pos[1], right_thigh_pos[1], right_tip[1]])
return [box_marker] + body_patches + left_leg_lines + right_leg_lines
ani = FuncAnimation(fig, update, frames=len(box), init_func=init,
interval=1000/fps, blit=True)
if output_gif:
writer = PillowWriter(fps=fps)
ani.save(output_gif, writer=writer)
print(f"动画已保存为 {output_gif}")
else:
plt.show()
def main():
parser = argparse.ArgumentParser()
parser.add_argument('file', help='轨迹文件')
parser.add_argument('--save', action='store_true', help='保存为GIF')
parser.add_argument('--fps', type=int, default=20, help='帧率')
parser.add_argument('--output', default=None, help='输出GIF文件名')
args = parser.parse_args()
output = args.output
if args.save and not output:
output = args.file.replace('.txt', '.gif')
animate(args.file, output_gif=output, fps=args.fps)
if __name__ == "__main__":
main()
下面这是另一局的演示,很有意思的是,开始两个机器人行走的方式都不一样,但后来,慢慢变得比较一致了,它们在尝试一些行走姿势,并且互相通过符号信号沟通交流经验,找到了更好的行走方式。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)