当前位置: 首页 > news >正文

开源 Agent 小屋

知乎:何枝
地址:https://zhuanlan.zhihu.com/p/9096314010

Live Demo(网站在进入前可能会加载一段时间,需要等一等)

  • 人物观测:Agent Life Live Demo[1]

  • 行为统计:Agent Life Action Logging Board[2]

Code:GitHub - HarderThenHarder/AgentLife: A small open source 3D agent simulator based on LLM.
Video:https://www.bilibili.com/video/BV1f

去年第一次看到 斯坦福小镇[3] 时,大概是骨子里喜欢模拟类游戏的原因,当时激动了好久好久,

后来 AI Town[4]出现,允许注册玩家进入到虚拟小镇里和里面的 NPC 对话,又把这类玩法拔了一个高度。

图片

斯坦福小镇(图左)& AI Town(图右)

但受限于当时自己薄弱的技术功底,因为不会做游戏,让我不得不放弃亲手圆梦的计划,

直到不久前,我无意中刷到 6个AI合租[5]视频时,内心的燥热再也按耐不住,

不会做,那就学!

所以在将近一个月里所有零零散散的时间拼拼凑凑后,终于堆完了第一个版本的 demo[6](也可以看 视频[7]):

图片

Agent Life Demo(因为需要用到 Qwen-2.5 进行决策,所以 demo 网站将持续至账户 quota 用光为止)

和原版相比,主要做了以下一些改动:

  1. 2D -> 3D:虽然 2D 像素也能做出艺术品(我很喜欢《星露谷》),但为了观测起来更 “真” 一点,我们还是决定一步到位切 3D 引擎。

  2. Multi -> Single:「斯坦福小镇」和「AI Town」亮点在于 Multi-Agent,我们可以在里面看到非常有趣的 Agent 之间的对话内容。但 —— 我总感觉有些看不太过来,一个地图上同时存在非常多对人在对话,即便作为 “上帝” 的我也只有一双眼睛。为此,我们想暂时砍掉 Multi,先只 Focus 到一个 Agent 上。

  3. 建立与 Agent 与真实世界之间的联系: 我一直在想,如果能让 Agent 和现实世界里的真实信息产生联系,说不定会有趣起来。所以我给了 Agent 一个微博,它能够通过发布、回复微博,来和物理世界里的我交互;同时我们允许他查看当前最新的热点新闻,由他自己选择将感兴趣的内容存放到“记忆”里。

  4. 可视化 Agent 一天的日程:对 Agent 每一次的行为选择进行可视化,通过赋予 Agent 不同的人设,统计 Agent 在行为选择上是否会有所不同。

  5. 动态编辑游戏世界,制造新的事件:比如移除床后无法睡觉,破坏灶台后无法做饭,查看 AI 在突发情况下做出什么决策。(目前还不完善)

图片

日程可视化:八卦人设(左)更喜欢看娱乐新闻 & 极客人设(右)更喜欢看稀土掘金

秉承着「一起学习,共同进步」的基本原则,我将我实现这个项目中用到的所有技术在这里梳理出来,

文章的最后会给出源码,希望能对那些想 try 一把虚拟世界的朋友们有一点帮助。

PS:相信我,其实没有那么难。

1. 项目框架

整个项目分为两部分:客户端(渲染引擎)+ 服务端(行为决策):

图片

Agent Life 系统框架图

1.1 客户端(Client)

因为是一个 3D 的渲染引擎,所以首先从 three.js[8] 开始学习,

Three.js Journey[9] 是我看过最好的教程,它会从很多基础的概念开始讲解和剖析。

不过想要扎实基本功,时间短了是肯定搞不定的,所以整套教程很长(一共 67 个视频,每个 0.5~2 小时)。

图片

Three.js Journey 教程视频

three.js 算是稍微底层的代码,最后在实现项目时用开源框架,之前几十行的代码其实一行就搞定了。

就好比:一大段 Transformer Model 用一句 from transformers import xxx 就能解决一样。

所以,如果不想从头看起也可以直接跳转学习 React Three Fiber(R3F)[10]。

React & React Three Fiber

React[11] 是 Javascript 的一个三方库(类似于 Python 里 pip install 的那些三方库一样),

从写法上来讲,最大的特点事允许我们同时在一个文件里面同时写 html tag 和 js 的代码。

PS:「状态管理」是 React 更核心的特点,但是这不是一篇科普 React 的文章(我自己也只是个小白),所以主要讲一讲写法上的特点,便于之后阅读源码。

如果 js 比较陌生,我们可以想象成 python,如果我们要用 python 来构建一个能进行逻辑计算的前端页面,

因为 html 本身不支持计算逻辑,所以我们需要 2 个文件:

  • 1 个 index.html 来负责定义网页长什么样(几个按钮,几个输入框)。

  • 1 个 calculate.py 来负责逻辑计算,然后再传递给 index.html。

PS:所以现在比较受欢迎的 python 做 web 的框架:streamlit[12] & gradio[13]都变成纯 python 写网页,不用我们亲自写 html & css,但带来的问题就是局限性比较大,无法实现一些自己想实现的样式。

但这样很麻烦,我们能不能直接把「计算逻辑」和「页面布局」同时写在一个文件里呢?

当然可以,使用 React 这种实现就方便了很多,以下是一个例子:

图片

React 示例(将计算逻辑 & html 逻辑写在同一个文件下)

上面的例子是 React(.jsx) 中常用的写法,所有计算逻辑都在前面写好(a = 3 + 2),

然后在 return 里写上需要的 html 组件(<button>),结束!

React Three Fiber[14] 是在将 Three.js 融合在 React 框架里面的一个三方库,

它能够极大的简化 three.js 代码,并转换成 <tag> 的形式,在 React 的 return 部分导入 3D 模型。

举一个创建立方体的例子:

// three.js 写法(js 形式)
const geometry = new THREE.BoxGeometry(1, 1, 1);                   // 创建立方体几何体
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); // 创建绿色材质
const mesh = new THREE.Mesh(geometry, material);                   // 使用几何体和材质创建网格    // R3F 写法(tag 形式)
<mesh><boxGeometry args={[1, 1, 1]} /><meshBasicMaterial color='green' />
</mesh>

完整的示例代码如下:

图片

R3F 示例,将 Three.js 融入到 React 中使用

可以在 R3F官网[15] 里查看详细的说明,也可以在 sandbox[16] 里面在线尝试运行/调试代码。

Tailwind CSS

tailwind css[17] 是一个非常非常非常方便快速美化 web 页面的库,

可以简单理解为:这个库已经提前实现了很多常用的 css 效果,我们只需要填对应的 className 就能快速应用:

图片

tailwind css 使用示例

更直观的来看,我们的项目中底层使用 R3F 进行 3D 世界的渲染,而所有上层的信息框都是通过 tailwind css 来实现(比如人物的状态信息栏、内心想法、搜索网页效果等):

图片

tailwind css 的实现效果

例如,右上角的状态栏对应实现代码如下:

const InfoBox = ({characters,selectedAvatar
}) => {return (// 通过设置 className 来使用 tailwind css 的样式(注:在 React 中使用 className 而不是 class)<div className="fixed right-5 top-5 w-80 h-2/5 flex flex-col items-start space-y-2 p-0 bg-opacity-30 shadow-lg rounded-lg text-xs overflow-y-auto backdrop-blur-sm duration-500"...>{characters?.find(character => character.id === selectedAvatar) ? (<table className="table-auto"><tbody>{Object.entries(characters.find(character => character.id === selectedAvatar)).map(([key, value], index) => (<tr key={key} className={index % 2 === 0 ? 'bg-gray-600 bg-opacity-30' : 'bg-gray-0 bg-opacity-50'}><td className="px-4 py-2 text-sky-100">{key}</td><td className="px-4 py-2 text-sky-100">{JSON.stringify(value)}</td></tr>))}</tbody></table>) : (<div className="p-2 text-red-400">角色信息不可用</div>)}</div>)
}

人物模型 & 动画资源

项目中用到的人物模型是在 Ready Player Me[18] 上捏的,这是一个免费的捏人网站,

你可以在上面选择肤色、发型、衣服等,然后把捏好的人物下载到本地使用(可能是因为国外网站的原因,用起来很卡):

图片

Ready Player Me,捏完之后点击「Next」再保存到本地

动画则是在 mixamo[19] 上找到的,这个网站可以支持上传自己的人物模型,

然后挑选对应的动画(animations),在线预览后下载到本地即可:

图片

点击左侧预设动画,调节好参数后 download 到本地

参考原型

这个客户端的原型是 Youtube 博主 Wawa sensei[20] 的 SIMS ONLINE[21],

我们是基于这个非常棒的开源项目进行的修改,配套的视频教程中有博主亲自一步一步敲代码教学(很推荐):

  • 视频教程:https://www.youtube.com/watch?v=uLv1Zu8GyUw&t=14s

  • 代码链接:GitHub - wass08/r3f-sims-online

图片

讲的很好,强推一键三连

1.2 服务端(Server)

服务端用 python 实现,看起来应该就比较轻松啦,这里主要挑几个我认为比较核心功能的部分讲一讲。

Function Calls

为了定义 agent 可以执行哪些 action,以及在什么时间、什么场合,哪些行为是合法的,

我们将这些定义都实现在了一个叫 function_calls.py 的文件中。

我们期望有一种方便的实现方式,它能够同时具备:

  1. 能够「根据工具的实现函数」自动转换成「自然语言」,并自动添加到 prompt 中。

  2. 只有「当前满足被使用条件的工具」才能加入到 agent 的待选列表中。

关于第 1 点,我们通过实现一个装饰器@register_function_call_class来完成自动生成 prompt 的功能,

python function 的函数名、函数注释(doc string)、输入变量来自动生成对应的 prompt。

举例来讲,我们实现一个AddMemory的工具,并带上该装饰器:

@register_function_call_class
class AddMemory(BaseFunctionCall):def call(agent_object: object, memory_content: str):"""添加一条记忆信息,通常发生在获取了新的信息之后。Args:agent_object (object): agent 对象,通常传入 self 即可。memory_content (str): 需要添加的记忆内容,一条概括性的关键信息。"""agent_object.character['memories'].append(memory_content)...

之后只需要调用 generate_all_function_calls_prompts() 方法,就会生成对应的 prompt:

当前所有可使用的函数以及对应的解释如下:* AddMemory.call(agent_object, memory_content): 添加一条记忆信息,通常发生在获取了新的信息之后。Args:agent_object (object): agent 对象,通常传入 self 即可。memory_content (str): 需要添加的记忆内容,一条概括性的关键信息。* (其他所有带了装饰器的函数)...

在函数注释中需要写清楚函数作用、输入参数的明确含义,这样能帮助 Agent 更容易做出正确的选择。

关于第 2 点,由于我们并不希望所有的 function 在所有时刻都输入给 Agent 做选择,

因此每一个 function_call 类中会定义 validate_func() 方法(默认返回 True),在每一步生成 function_call prompt 之前,env 会将当前的状态传入 validate_func() 方法中,并将返回值为 True 的 function 加入到当前的 prompt 中。

比如:只有当 Agent 在床的附近才允许选择「睡觉」这个行为。

@register_function_call_class
class Sleep(BaseFunctionCall):...@staticmethoddef validate_func(agent_object,room):"""用于根据当前状态判断,是否需要被加入 agent 当前的行为空间中,若返回 False,则不会被加入,默认返回 True。"""return distance(agent_object.character['position'],room['bed']) < 0.1

Extensions(获取新闻、发布微博等)

项目里使用到的「微博发布」、「新闻热点」这些获取真实世界信息的函数,都被放在了 extensions 目录下,

一共有 2 种进行信息获取:cookie 抓取、html tag 解析。

  • cookie:发布/回复微博、稀土掘金新闻、leetcode。

  • html tag 解析:搜索结果。

对于一些比较好解析的页面,比如搜索页面(项目中使用 搜狗搜索),直接抓取 html 后使用 bs4 进行解析:

图片

找到每个 item 对应的 div 进行内容解析即可

from bs4 import BeautifulSoupresponse = requests.get(url, headers=headers, verify=False)
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'html.parser'
)all_search_results = []
div_contents = soup.find_all(class_='vrwrap')         # 找到内容所在的对应 divfor div_content in div_contents:cur_result = {}a_tag = div_content.find('a')if a_tag:cur_result['title'] = a_tag.get_text().strip()span_tag = div_content.find('p', class_='star-wiki')if span_tag:cur_result['body'] = span_tag.get_text().strip().replace('最佳答案', '').strip()if 'title' in cur_result and 'body' in cur_result:all_search_results.append(cur_result)

而对于另一部分内容「需要多次数据交互」才能获得结果的页面就稍微麻烦一些,

我们需要使用 cookie 的方式来模拟 post/get 请求,来获得服务器的响应结果。

以 leetcode 为例,我们需要经过:获取题目、输入代码、验证代码结果这几个步骤,

为此,我们需要明确找到每一步对应的请求接口,这里以「验证代码结果」为例:

图片

通过抓取网络请求,找到正确调用的实际接口,并按照需要的格式请求获得结果

当填写完 ./extensions 目录下的所有的 COOKIE 后,可以通过一键脚本测试:

(base)>>> python -m extensions.test_all_cookies[❌ Unpassed] GeekNewsFetcher.test_fetch_geek_news
[✅ Passed] GeekNewsFetcher.test_fetch_hot_list
[✅ Passed] NewsFetcher.test_fetch_dongfang_news
[✅ Passed] NewsFetcher.test_fetch_toutiao_news
[✅ Passed] SearchFetcher.test_fetch_sougou_zhihu_results
[❌ Unpassed] LeetCodeFetcher.test_get_leetcode_hot_list
[✅ Passed] LeetCodeFetcher.test_get_question_details
[✅ Passed] LeetCodeFetcher.test_run_code_and_get_result
[✅ Passed] WeiBoTools.test_get_all_my_post_weibo
Testing cookies...: 100%|██████████████████████████████████████████████████████████| 5/5 [00:09<00:00,  1.87s/it]
Pass Rate: 80.00%(8/10).

通过 pass 结果来判断当前哪些 cookie 已过期失效,需要重新获取。

自定义世界

通过修改 default_rooms.json 文件,我们可以自定义家具的位置,以及 agent 的爱好、性格、记忆等:

[{"id": 1,"name": "MAIN ROOM","password": "","items": [{"name": "厨房_燃气灶","size": [2, 2],"gridPosition": [2, 12],                        // 摆放位置"rotation": 2                                   // 旋转角度(x90)},...],"characters": [                                     // agent 属性设置{"id": 1,"session": 1,"name": "徐磊","gender": "male",...,"job": "程序员",                                 // 职业"hobby": ["刷新闻", "研究技术", "吃瓜"],           // 爱好"personality": "坦诚,喜欢分享,实事求是。",        // 人物性格"state": "","memories": []}]}
]
]

2. 一些有趣的观测现象

2.1 不同职业对行为选择的影响

我们尝试赋予 agent 2 种不同的职业:程序员 & 自媒体工作者。

如下图所示,职业的设定的确会对 agent 的行为分布产生较大影响:

  • 程序员:主要聚焦在「刷新闻(八卦)」、「搜索」、「leetcode」、「稀土掘金(一个技术论坛)」。

  • 自媒体工作者:「刷新闻(八卦)」、「搜索」、「查看自己的微博评论」。

图片

不同人设下的行为选择统计

进一步的,我们对 2 个职业选择查看的「所有新闻内容」进行词频统计:

图片

哪边是「程序员」应该不用备注了:)

此外,由于我们允许 agent 对自己好奇的内容进行搜索,所以我们也对两个 agent 的「搜索词」进行统计:

图片

自媒体工作者(左),不知道为什么这么痴迷做饭 & 程序员(右),什么都喜欢搜

2.2 不同人设对行为选择的影响

在同为「程序员」的职业下,我们赋予不同的细节人设:

  1. 佛系的吃货 1 号(对应人设统计图的第一行)。

  2. 热爱编程的极客 2 号(对应人设统计图的第二行)。

我们发现,相比之下极客 2 号搜索 query 会杂一些,而吃货 1 号就一直在搜附近的吃的(=-=)

图片

吃货程序员(左)和极客程序员(右)的搜索词

除了搜索词,我们还发现这两个程序员在选择 leetcode 时偏好的难度也不一样:

图片

佛系 1 号(左)和极客 2 号(右)

吃货程序员会更倾向选择简单(Easy)难度的题来做:选择最多的是 两数之和。

极客程序员会更倾向选择中等(Mdeium)难度的题来做:选择最多的是 两数相加,偶尔也会挑战一把 正数数组中位数(Hard 难度)。

好啦,以上就是全部内容啦,感谢观看~

参考资料

[1]

Agent Life Live Demo: http://192.144.228.48

[2]

Agent Life Action Logging Board: http://192.144.228.48:8901/

[3]

斯坦福小镇: https://arxiv.org/pdf/2304.03442v1

[4]

AI Town: https://www.convex.dev/ai-town

[5]

6个AI合租: https://www.bilibili.com/video/BV1MkxeeYEEb

[6]

第一个版本的 demo: http://192.144.228.48/

[7]

视频: https://www.bilibili.com/video/BV1fbz4YLEcA/

[8]

three.js: https://threejs.org/docs/#manual/zh/introduction/Installation

[9]

Three.js Journey: https://www.bilibili.com/video/BV1Ki4y1a72S

[10]

React Three Fiber(R3F): https://r3f.docs.pmnd.rs/getting-started/introduction

[11]

React: https://react.dev/learn

[12]

streamlit: https://streamlit.io/

[13]

gradio: https://www.gradio.app/

[14]

React Three Fiber: https://r3f.docs.pmnd.rs/getting-started/introduction

[15]

R3F官网: https://r3f.docs.pmnd.rs/getting-started/introduction

[16]

sandbox: https://codesandbox.io/p/sandbox/5g22g7

[17]

tailwind css: https://tailwindcss.com/

[18]

Ready Player Me: https://readyplayer.me/avatar

[19]

mixamo: https://www.mixamo.com/#/

[20]

Wawa sensei: https://www.youtube.com/@WawaSensei

[21]

SIMS ONLINE: https://github.com/wass08/r3f-sims-online

相关文章:

开源 Agent 小屋

知乎&#xff1a;何枝地址&#xff1a;https://zhuanlan.zhihu.com/p/9096314010 Live Demo&#xff08;网站在进入前可能会加载一段时间&#xff0c;需要等一等&#xff09; 人物观测&#xff1a;Agent Life Live Demo[1] 行为统计&#xff1a;Agent Life Action Logging Bo…...

Mina之账户模型

为了能真正提升自己的能力&#xff0c;而不是机械低效的Ctrl C / Ctrl V&#xff0c;先从基本概念入手&#xff0c;利用ChatGPT来弄懂Mina。 Mina Mina Protocol 是一种轻量级区块链&#xff0c;被称为“世界上最轻的区块链”。其目标是通过极小的链上数据大小和强大的隐私…...

STM32 ADC 配置

ADC&#xff08;模数转换器&#xff09;用于将模拟信号转换为数字信号&#xff0c;以便单片机处理。 模数转换器&#xff08;Analog-to-Digital Converter, ADC&#xff09;是电子系统中不可或缺的一部分&#xff0c;它负责将现实世界中的连续物理量&#xff0c;如温度、声音、…...

练9:进制转换

欢迎大家订阅【蓝桥杯Python每日一练】 专栏&#xff0c;开启你的 Python数据结构与算法 学习之旅&#xff01; 文章目录 1 进制转换2 例题分析 1 进制转换 ①任意制转为十进制 【示例】 ②十进制转为任意制 【法一】 【法二】 2 例题分析 题目地址&#xff1a;https:/…...

善于运用指针--函数与指针

文章目录 前言一、函数的指针二、函数指针运用 1函数名地址2指针变量调用函数3指向函数的指针变量做函数参数二、返回指针值的函数总结 前言 如果在程序中定义了一个函数&#xff0c;在编译时会把函数的源代码转换为可执行代码并分配一段空间。这段空间有一个起始地址&#xf…...

Microi吾码低代码平台:前端源码的本地运行探索

文章目录 1.前端源码运行环境要求1.1 操作系统1.2 必备软件工具1.3 项目源码依赖 2.从Git仓库克隆前端源码3.安装项目依赖4.启动本地开发服务器5.常见问题与解决方案5.1 依赖安装失败5.2 端口冲突5.3 代码更新未生效 6.提升本地开发体验的技巧6.1 使用代理解决跨域问题6.2 集成…...

十一、容器化 vs 虚拟化-Docker 使用

文章目录 前言一、Docker Hello World二、Docker 容器使用三、Docker 镜像使用四、Docker 容器连接五、Docker 仓库管理六、Docker Dockerfile七、Docker Compose八、Docker Machine九、Swarm 集群管理 前言 Docker 使用‌ Docker 容器使用、镜像使用、容器连接、仓库管理、Do…...

实践项目2-自动计价电子秤

自动计价电子秤 一、功能说明 基于AVR单片机设计一自动计价电子秤。根据输入的价格以及检测的重量自动计算总价并打印&#xff08;串口模拟&#xff09;。 二、具体要求 1、开机后实时检测重量并显示&#xff1b; 2、通过按键输入并显示价格&#xff0c;具有修改功能&#…...

iOS如何操作更新推送证书

最近收到一份邮件,应该如何操作呢,证书还是跟以前一样冲钥匙串直接申请吗 Hello, As we announced in October, the Certification Authority (CA) for Apple Push Notification service (APNs) is changing. APNs will update the server certificates in sandbox on January…...

WSL2 在vscode无法连接copilot

报错情况&#xff1a; 本机可以使用copilot&#xff0c;但在WSL2上无法连接&#xff0c;报错信息如下&#xff1a; 检查网络情况&#xff1a; ping api.github.com 发现无法连接&#xff1a; github.com:Temporary failure in name resolution 在网上搜集的解决方法&#…...

HTA8998 实时音频跟踪的高效内置升压2x10W免电感立体声ABID类音频功放

1、特征 输出功率(fIN1kHz,RL4Ω&#xff0c;BTL) VBAT 4V, 2x10.6W(VOUT9V,THDN10%) VBAT 4V, 2x8.6W (VOUT9V,THDN1%) 内置升压电路模式可选择:自适应实时音频跟踪 升压(可提升播放时间50%以上)、强制升压 最大升压值可选择&#xff0c;升压限流值可设置 ACF防破音功能 D类…...

用ChatGPT-o1进行论文内容润色效果怎么样?

目录 1.引导问题发现 2.角色设定 3.整理常问修改 4.提供样例 5.小细节 小编在这篇文章中分享如何充分利用ChatGPT-o1-preview来提升论文润色的技巧。小编将持续跟进最新资源和最新的调研尝试结果&#xff0c;为宝子们补充更多实用的写作技巧。这些技巧将有助于您更有效地利…...

《探索 Jetpack Compose:构建现代化 Android UI 的利器》

Jetpack Compose 是谷歌推出的现代化 UI 框架&#xff0c;用于简化 Android 应用开发中的 UI 构建。它使用声明式编程方式&#xff0c;允许开发者以简洁直观的方式创建动态和响应式的 UI。本文将从基础概念到进阶用法&#xff0c;带你全面了解 Compose 的核心功能和使用技巧。 …...

cocos creator 的 widget组件的使用及踩坑

以下的内容基于cocos creator 3.8版本&#xff0c;如有错误&#xff0c;恳请指出。 &#x1f449;官方文档的指引 应用&#xff1a;以上官方指引有非常清晰的使用方式&#xff0c;接下来说明一些注意事项&#xff1a; 1、与canvas搭配的使用&#xff0c;解决多分别率适配问题。…...

Baumer工业相机的EMVA1288 数据报告简介

项目场景&#xff1a; Baumer工业相机堡盟VCX系列和VLX系列为堡盟全系列相机中的主流常用相机和高端相机&#xff0c;性能强大、坚固可靠&#xff0c;易于集成&#xff0c;常用与一般行业的检测定位识别使用。 对应的高端相机系列具有极为丰富的强大技术功能&#xff0c;可轻…...

Docker 安装 中文版 GitLab

Docker 安装系列 安装GitLab、解决服务器内存不足问题、使用域名/IP地址访问项目 1、拉取 [rootTseng ~]# docker pull twang2218/gitlab-ce-zh:latest latest: Pulling from twang2218/gitlab-ce-zh 8ee29e426c26: Pull complete 6e83b260b73b: Pull complete e26b65fd11…...

uni-app 个人课程表页面

uni-app 个人课程表页面 插件参考地址 大部分代码都是参考了上述代码&#xff0c;只对代码做出了优化 1. 页面模板 在 schedule.vue 文件中&#xff0c;编写页面结构&#xff1a; <template><view><u-navbar title"个人中心"><view class&q…...

FPGA工作原理、架构及底层资源

FPGA工作原理、架构及底层资源 文章目录 FPGA工作原理、架构及底层资源前言一、FPGA工作原理二、FPGA架构及底层资源 1.FPGA架构2.FPGA底层资源 2.1可编程输入/输出单元简称&#xff08;IOB&#xff09;2.2可配置逻辑块2.3丰富的布线资源2.4数字时钟管理模块(DCM)2.5嵌入式块 …...

【OpenCV】平滑图像

二维卷积(图像滤波) 与一维信号一样&#xff0c;图像也可以通过各种低通滤波器&#xff08;LPF&#xff09;、高通滤波器&#xff08;HPF&#xff09;等进行过滤。LPF 有助于消除噪音、模糊图像等。HPF 滤波器有助于在图像中找到边缘。 opencv 提供了函数 **cv.filter2D()**&…...

LeetCode300. 最长递增子序列(2024冬季每日一题 30)

给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的 子序列。 示例 1&…...

vue H5如何实现copy功能

vue H5如何实现copy功能 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><link rel"stylesheet" href"https://unpkg.com/vant2.12/lib/index.css" /><title></title><st…...

Golang使用etcd构建分布式锁案例

在本教程中&#xff0c;我们将学习如何使用Go和etcd构建分布式锁系统。分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要。它有助于维护一致性&#xff0c;防止竞争条件&#xff0c;并确保在任何给定时间只有一个进程独占访问资源。 我们将使用Go作为编程语言&am…...

Windows 和 Ubuntu 双系统安装

复现论文的时候&#xff0c;个别包只有Linux版本&#xff0c;并且源码编译比较麻烦&#xff0c;所以干脆直接安装一个双系统&#xff08;WinUbuntu&#xff09;&#xff0c;方便复现论文。 参考视频链接&#xff1a;Windows 和 Ubuntu 双系统的安装和卸载 0.所需工具 4G以上U…...

多媒体文件解复用(Demuxing)过程

多媒体文件的解复用&#xff08;Demuxing&#xff09;过程指的是从一个多媒体容器文件&#xff08;如 MP4、MKV、AVI 等&#xff09;中提取不同类型的多媒体数据流&#xff08;例如视频流、音频流、字幕流等&#xff09;的过程。 容器文件本身并不包含实际的视频或音频数据&…...

从 Zuul 迁移到 Spring Cloud Gateway:一步步实现服务网关的升级

从 Zuul 迁移到 Spring Cloud Gateway&#xff1a;一步步实现服务网关的升级 迁移前的准备工作迁移步骤详解第一步&#xff1a;查看源码第二步&#xff1a;启动类迁移第三步&#xff1a;引入 Gateway 依赖第四步 编写bootstrap.yaml第五步&#xff1a;替换路由配置第六步&#…...

qt之插件编译

QtXlsxWriter sudo apt install qtbase5-private-dev git clone https://github.com/dbzhang800/QtXlsxWriter.git cd QtXlsxWriter/ qmake make -j6 sudo make install #将生成的lib 及 include copy至项目路径的lib 及include里项目配置&#xff1a; QT xlsxbluetoo…...

pandas一行拆成多行

import pandas as pd df pd.DataFrame({Country:[China,US,Japan,EU,UK/Australia, UK/Netherland],Number:[100, 150, 120, 90, 30, 2],Value: [1, 2, 3, 4, 5, 6],label: list(abcdef)})# 法一 推荐 df2df.drop(Country, axis1).join(df[Country].str.split(/, expandTrue).…...

今天调了个转速的小BUG

同事说转速表有个bug&#xff0c;转速停止后&#xff0c;继电器没有恢复到初始状态。若停止之前是报警&#xff0c;继电器吸合&#xff0c;则停止后继电器还是吸合。我心想不会啊&#xff0c;这软件都弄了好几年了&#xff0c;一直也没出现过状况。 经过与调试同事的沟通&#…...

第三节、电机定速转动【51单片机-TB6600驱动器-步进电机教程】

摘要&#xff1a;本节介绍用定时器定时的方式&#xff0c;精准控制脉冲时间&#xff0c;从而控制步进电机速度 一、计算过程 1.1 电机每一步的角速度等于走这一步所花费的时间&#xff0c;走一步角度等于步距角&#xff0c;走一步的时间等于一个脉冲的时间 w s t e p t … ……...

从一个Bug谈前端响应拦截器的应用

一、问题场景 今天在开发商品管理系统时&#xff0c;遇到了一个有趣的问题&#xff1a;当添加重复的商品编号时&#xff0c;页面同时弹出了两条 "商品编号已存在" 错误提示&#xff1a; 这个问题暴露了前端错误处理机制的混乱&#xff0c;让我们从这个问题出发&…...

wordpress 更改标题/平台推广公众平台营销

文章目录一、栈实现计数器思路1、两个栈来保存字符2、比较优先级和计算3、过程会使用到的函数3.1、boolean recognize(char ch)区别是数字还是操作符3.2、int priority(char ch)&#xff0c;用来比较优先级3.3、int operateNum(int num1, int num2, char ch)二、用代码实现三、…...

技术支持 东莞网站建设电脑回收/天津百度seo排名优化

内容安全策略&#xff08;CSP&#xff09;是一个增加的安全层&#xff0c;可帮助检测和缓解某些类型的攻击&#xff0c;包括跨站点脚本&#xff08;XSS&#xff09;和数据注入攻击。这些攻击用于从数据窃取到站点破坏或恶意软件分发的所有内容&#xff08;深入CSP&#xff09; …...

新手学做网站的书/热搜词排行榜

花了一晚上和一上午时间终于搞清楚了。树状数组下标不能从0开始&#xff0c;这样会死循环&#xff0c;树状数组可以求逆序数&#xff0c;但是如果要求一个序列中前面的元素小于等于当前元素的个数和怎么求呢&#xff1f;比如&#xff1a;5个数&#xff1a;1 3 1 5 2&#xff1b…...

网站建设好推荐/推广类软文

最全的cmap的用法 此文是复制来的0.0 1. map最基本的构造函数&#xff1b;map<string ,int>mapstring; map<int,string >mapint;map<sring,char>mapstring; map< char ,string>mapchar;map<char,int>mapchar; map<int ,char>mapint&#x…...

找人做网站价格/搜索引擎排行榜前十名

劳动协商和谈判模式(转载)劳动协商和谈判模式(转载)劳动协商和谈判模式(转载)劳动协商和谈判模式(转载)劳动协商和谈判模式(转载)劳动协商和谈判模式(转载)劳动协商和谈判模式(转载)劳动协商和谈判模式(转载)劳动协商和谈判模式(转载)来自 “ ITPUB博客 ” &#xff0c;链接&am…...

建设网站专业公司/兰州seo实战优化

el5上架设 基本软件需求 tcp_wrappers-7.6-40.4.el5.i386.rpmxinetd-2.3.14-10.el5.i386.rpmtelnet-server-0.17-39.el5.i386.rpm配置步骤 修改 /etc/xinetd.d/telnet &#xff1a;设置 disable no  --方法2 chkconifig telnet on  --方法3 ntsysv 选择开启telnet重启 /…...