模仿COM架构+源码

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

一:区分组建与对象

      组件(Component)是系统中一种物理的、可代替的部件、它封装了实现并提供了一系列可用的接口。一个组件代表一个系统中实现的物理部分,包括软件代码(源代码,二进制代码,可执行代码)或者一些类似内容,如脚本或者命令文件。简而言之,组件就是对象,是对数据和方法的简单封装。

     对象(Object)是指现实世界中客观存在的事物。

     组件基于对象,同时又是对象的一种,可插入系统中的对象。

   组件可以在另一个称为容器(有时也称为承载者或宿主)的应用程序中使用,也可以作为独立过程使用;
   组件可以由一个类构成,也可以由多个类组成,或者是一个完整的应用程序;
   组件为模块重用,而对象为代码重用。

     我的理解:组件相对于对象来说,更加复杂化,更加整合,它可以被当作一个独立的主体拿来用,在不同的系统中实现组件的替换,组件的粒度大于对象,组件是对对象的一种装饰,将简单的对象根据不同的需求加以封装成单一功能的组件,使用起来更加方便灵活,组件的粒度大于对象,组件之间是通过接口实现交互,接口内含有多个信息,而对象之间交互是单个信息,用信件传送信息时,对象需要一封一封的传送,而组件则是将所有信息一次性传送完,再举一个生活化的例子:盖房子的时候需要用到水泥、沙土、石子等原材料,而有一种材料叫做混凝土,它是用水泥作胶凝材料,砂、石作集料,加上一定比例的水制成的一种材料,前者可以看做是对象,后者可以看做是组件,而不同的粒度也因此显现出来。

     有两个问题:关于组件和对象的关系有没有更为精准的描述词语?面向组件技术优于面向对象技术吗?

     关于面向组件和面向对象技术的知识还有许多,期待大家继续去探索……

二、区分组建与对象

     1. 用户一般希望能够定制所用的应用程序,而组件技术从本质上讲就是可被定制的,因而用户可以用更能满足他们需要的某个组件来替换原来的那个。

     2.由于组件是相对应用程序独立的部件,我们可以在不同的程序中使用同一个组件而不会产生任何问题,软件的可重用性将大大的得到增强。      3.随着网络带宽及其重要性的提高,分布式网络应用程序毫无疑问的成为软件市场上越来越重要的买点。组件价构可以使得开发这类应用程序的过程得以简化。


1.首先我们先为动态库的加载以及接口的获取做准备工作

1、

#ifndef MODULE_HEAD_FILE
#define MODULE_HEAD_FILE
#pragma once
#include <AfxWin.h>



//查询接口
#define QUERYINTERFACE(Interface,Guid)                                                                      \
        if(IID_##Interface==Guid)                                                                           \
           return static_cast<Interface *>(this);	

//查询接口
#define QUERYINTERFACE_IUNKNOWNEX(BaseInterface,Guid)                                                       \
        if(Guid==IID_IUnknownEx)                                                                            \
           return static_cast<IUnknownEx *>(static_cast<BaseInterface *>(this));

//查询接口
#define QUERY_ME_INTERFACE(Interface)		                                                                \
	((Interface *)QueryInterface(IID_##Interface))

//查询接口
#define QUERY_OBJECT_INTERFACE(Object,Interface)									                        \
	((Interface *)Object.QueryInterface(IID_##Interface))

//查询接口
#define QUERY_OBJECT_PTR_INTERFACE(pObject,Interface)														\
	((pObject==NULL)?NULL:((Interface *)pObject->QueryInterface(IID_##Interface)))




//基础接口
static const GUID IID_IUnknownEx = { 0x5feec21e,0xdbf3,0x46f0,0x9f,0x57,0xd1,0xcd,0x71,0x1c,0x46,0xde };
struct IUnknownEx
{
	//释放对象
	virtual void Release() = NULL;
	//接口查询
	virtual void * QueryInterface(REFGUID Guid) = NULL;
};

//组件创建函数
typedef VOID * (ModuleCreateProc)(REFGUID Gudi);

//组件辅助类模板
template <typename IModeluInterface> 
class CTempldateHelper
{
	//接口属性
public:
	REFGUID							m_Guid;					//接口标识

																		//组件属性
public:
	char							m_szCreateProc[32];			//创建函数
	wchar_t							m_szModuleDllName[MAX_PATH];		//组件名字

													//内核变量
public:
	HINSTANCE						m_hDllInstance;				//DLL 句柄
	IModeluInterface *				m_pIModeluInterface;				//模块接口

																		//辅助变量
public:
	wchar_t							m_szDescribe[128];			//错误描述

																		//函数定义
public:
	//构造函数
	CTempldateHelper(REFGUID Guid);
	//构造函数
	CTempldateHelper(REFGUID Guid, wchar_t* pszModuleDll, char* pszCreateProc);
	//析构函数
	virtual ~CTempldateHelper();

	//管理函数
public:
	//释放组件
	bool CloseInstance();
	//创建组件
	bool CreateInstance();

	//配置函数
public:
	//创建信息
	void SetModuleCreateInfo(wchar_t* pszModuleDllName, char * pszCreateProc);

	//辅助函数
public:
	//获取错误
	inline wchar_t* GetErrorDescribe() const;
	//指针重载
	inline IModeluInterface * operator->() const;
	//获取接口
	inline IModeluInterface * GetInterface() const;
};

//构造函数
template <typename IModeluInterface>
CTempldateHelper<IModeluInterface>::CTempldateHelper(REFGUID Guid):m_Guid(Guid)
{
	//辅助变量
	m_szDescribe[0] = 0;

	//内核信息
	m_hDllInstance = NULL;
	m_pIModeluInterface = NULL;

	//组件属性
	memset(&m_szCreateProc, 0,sizeof(m_szCreateProc));
	memset(&m_szModuleDllName,0, sizeof(m_szModuleDllName));

	return;
}

//构造函数
template <typename IModeluInterface>
CTempldateHelper<IModeluInterface>::CTempldateHelper(REFGUID Guid, wchar_t* pszModuleDll, char* pszCreateProc) :m_Guid(Guid)
{
	//辅助变量
	m_szDescribe[0] = 0;

	//内核信息
	m_hDllInstance = NULL;
	m_pIModeluInterface = NULL;

	//组件属性
	strcpy(m_szCreateProc, pszCreateProc);
	lstrcpy(m_szModuleDllName, pszModuleDll);

	return;
}
//析构函数
template <typename IModeluInterface>
CTempldateHelper<IModeluInterface>::~CTempldateHelper()
{
	//辅助变量
	m_szDescribe[0] = 0;

	//内核信息
	m_hDllInstance = NULL;
	m_pIModeluInterface = NULL;

	//组件属性
	memset(m_szCreateProc, 0, sizeof(m_szCreateProc));
	memset(m_szModuleDllName, 0, sizeof(m_szModuleDllName));

	return;
}
//释放组件
template <typename IModeluInterface>
bool CTempldateHelper<IModeluInterface>::CloseInstance()
{
	//设置变量
	m_szDescribe[0] = 0;
	//销毁对象
	if (m_pIModeluInterface != NULL)
	{
		m_pIModeluInterface->Release();
		m_pIModeluInterface = NULL;
	}
	//释放 DLL
	if (m_hDllInstance != NULL)
	{
		AfxFreeLibrary(m_hDllInstance);
		m_hDllInstance = NULL;
	}
	return true;
}

//创建组件
template <typename IModeluInterface>
bool CTempldateHelper<IModeluInterface>::CreateInstance()
{
	//释放组件
	CloseInstance();

	//创建组件
	try
	{
		//效验参数
		ASSERT(m_szCreateProc[0] != 0);
		ASSERT(m_szModuleDllName[0] != 0);

		//加载模块
		m_hDllInstance = AfxLoadLibrary(m_szModuleDllName);
		if (m_hDllInstance == NULL)
		{
			_sntprintf(m_szDescribe, 128, TEXT("“%s”模块加载失败"), m_szModuleDllName);
			return false;
		}

		//寻找函数
		ModuleCreateProc * CreateProc = (ModuleCreateProc *)GetProcAddress(m_hDllInstance, m_szCreateProc);
		if (CreateProc == NULL)
		{
			_sntprintf(m_szDescribe, 128, TEXT("找不到组件创建函数“%s”"), m_szCreateProc);
			return false;
		}

		//创建组件
		m_pIModeluInterface = (IModeluInterface *)CreateProc(m_Guid);
		if (m_pIModeluInterface == NULL)
		{
			_sntprintf(m_szDescribe, 128, TEXT("调用函数“%s”生成对象失败"), m_szCreateProc);
			return false;
		}
	}
	catch (LPCTSTR pszError)
	{
		_sntprintf(m_szDescribe, 128, TEXT("由于“%s”,组件创建失败"), pszError);
		return false;
	}
	catch (...)
	{
		_sntprintf(m_szDescribe, 128, TEXT("组件创建函数“%s”产生未知异常错误,组件创建失败"), m_szCreateProc);
		return false;
	}

	return true;
}
//创建信息
template <typename IModeluInterface>
void CTempldateHelper<IModeluInterface>::SetModuleCreateInfo(wchar_t* pszModuleDllName, char* pszCreateProc)
{
	//组件属性
	strcpy(m_szCreateProc, pszCreateProc);
	lstrcpy(m_szModuleDllName, pszModuleDllName);

	return;
}

//获取错误
template <typename IModeluInterface>
inline wchar_t* CTempldateHelper<IModeluInterface>::GetErrorDescribe()const
{

	return m_szDescribe;
}
//指针重载
template <typename IModeluInterface>
inline IModeluInterface * CTempldateHelper<IModeluInterface>::operator->() const
{
	return GetInterface();
}

//获取接口
template <typename IModeluInterface>
inline IModeluInterface * CTempldateHelper<IModeluInterface>::GetInterface() const
{
	return m_pIModeluInterface;
}

//////////////////////////////////////////////////////////////////////////////////
//组件辅助宏

//组件创建函数
#define DECLARE_CREATE_MODULE(OBJECT_NAME)																	\
extern "C" __declspec(dllexport) VOID * Create##OBJECT_NAME(REFGUID Guid)		                            \
{																											\
	C##OBJECT_NAME * p##OBJECT_NAME=NULL;																	\
	try																										\
	{																										\
		p##OBJECT_NAME=new C##OBJECT_NAME();																\
		if (p##OBJECT_NAME==NULL) throw TEXT("创建失败");													\
		VOID * pObject=p##OBJECT_NAME->QueryInterface(Guid);									\
		if (pObject==NULL) throw TEXT("接口查询失败");														\
		return pObject;																						\
	}																										\
	catch (...) {}																							\
	delete p##OBJECT_NAME;																				    \
	return NULL;																							\
}

//组件辅助类宏
#define DECLARE_MODULE_DYNAMIC(OBJECT_NAME)																	\
class C##OBJECT_NAME##Helper : public CTempldateHelper<I##OBJECT_NAME>										\
{																											\
public:																										\
	C##OBJECT_NAME##Helper() : CTempldateHelper<I##OBJECT_NAME>(IID_I##OBJECT_NAME) { }	                    \
};

//组件辅助类宏
#define DECLARE_MODULE_HELPER(OBJECT_NAME,MODULE_DLL_NAME,CREATE_FUNCTION_NAME)								\
class C##OBJECT_NAME##Helper : public CTempldateHelper<I##OBJECT_NAME>										\
{																											\
public:																										\
	C##OBJECT_NAME##Helper() : CTempldateHelper<I##OBJECT_NAME>(IID_I##OBJECT_NAME,	                        \
    MODULE_DLL_NAME,CREATE_FUNCTION_NAME) { }										                        \
};

//////////////////////////////////////////////////////////////////////////////////

#endif

2、我们写一个动态库来进行测试一下

  1、接口文件:Isort.h

#pragma once
#include"Module.h"

//模块定义
#define PROCESS_CONTROL_DLL_NAME	TEXT("Sort.dll")		//组件名字


//冒泡排序
static const GUID IID_IBubbleSort = { 0x5feec22e,0xdbf3,0x46f0,0x9f,0x57,0xd1,0xcd,0x71,0x1c,0x46,0xde };
struct IBubbleSort:public IUnknownEx
{
	virtual void BubbleSort(char* ptr, int len)=NULL;
};
//快速排序
static const GUID IID_IQuickSort = { 0x5feec23e,0xdbf3,0x46f0,0x9f,0x57,0xd1,0xcd,0x71,0x1c,0x46,0xde };
struct IQuickSort:public IUnknownEx
{
	virtual void QuickSort(char* ptr, int Low, int High) = NULL;
};
//一个循环
static const GUID IID_IOneWhileSort = { 0x5feec24e,0xdbf3,0x46f0,0x9f,0x57,0xd1,0xcd,0x71,0x1c,0x46,0xde };
struct IOneWhileSort:public IUnknownEx
{
	virtual void OneWhileSort(char* Array, int len) = NULL;
};

//////////////////////////////////////////////////////////////////////////////////

//组件创建
DECLARE_MODULE_HELPER(BubbleSort, PROCESS_CONTROL_DLL_NAME, "CreateSort")
DECLARE_MODULE_HELPER(QuickSort, PROCESS_CONTROL_DLL_NAME, "CreateSort")
DECLARE_MODULE_HELPER(OneWhileSort, PROCESS_CONTROL_DLL_NAME, "CreateSort")
//////////////////////////////////////////////////////////////////////////////////

  2.算法头文件:Sort.h

#pragma once
#include "ISort.h"
class CSort : public IBubbleSort, public IQuickSort, public IOneWhileSort
{  	
public:
	//释放对象
	virtual void Release() {};
	//接口查询
	virtual void * QueryInterface(REFGUID Guid);
	//冒泡排序
	virtual void BubbleSort(char* ptr, int len);
	//快速排序
	virtual void QuickSort(char* ptr, int Low, int High);
	//一个循环
	virtual void OneWhileSort(char* Array, int len);
};

 3、算法源文件:Sort.cpp

#include "stdafx.h"
#include "Sort.h"
void* CSort::QueryInterface(REFGUID Guid)
{
	QUERYINTERFACE(IBubbleSort, Guid)
	QUERYINTERFACE(IQuickSort, Guid)
	QUERYINTERFACE(IOneWhileSort, Guid)
	QUERYINTERFACE_IUNKNOWNEX(IBubbleSort, Guid)
}
//冒泡排序
void CSort::BubbleSort(char* ptr, int len)
{
	for (int i = 0; i<len - 1; i++)
	{
		for (int j = i + 1; j<len; j++)
		{
			if (ptr[i]>ptr[j])
			{
				ptr[i] += ptr[j];
				ptr[j] = ptr[i] - ptr[j];
				ptr[i] = ptr[i] - ptr[j];
			}
		}
	}
	return;
}
//快速排序
void CSort::QuickSort(char* ptr, int Low, int High)
{
	if (Low>High)
		return;
	char temp = ptr[Low];
	int tempLow = Low;
	int tempHigh = High;
	while (tempLow<tempHigh)
	{
		while (tempLow<tempHigh&&temp <= ptr[tempHigh])
		{
			tempHigh--;
		}
		char tempData = ptr[tempHigh];
		ptr[tempHigh] = ptr[tempLow];
		ptr[tempLow] = tempData;
		while (tempLow<tempHigh&&temp>ptr[tempLow])
		{
			tempLow++;
		}
		tempData = ptr[tempHigh];
		ptr[tempHigh] = ptr[tempLow];
		ptr[tempLow] = tempData;
	}
	QuickSort(ptr, Low, tempLow - 1);
	QuickSort(ptr, tempLow + 1, High);
	return;
}
//一个循坏排序
void CSort::OneWhileSort(char* Array, int len)
{
	int temp = 0;
	int i = 0;
	while (i < len)
	{
		temp++;
		if (i == 0 || Array[i - 1] <= Array[i])
		{
			i += temp;
			temp = 0;
		}
		else
		{
			int t = Array[i];
			Array[i] = Array[i - 1];
			Array[i - 1] = t;
			i--;
		}
	}
	return;
}
DECLARE_CREATE_MODULE(Sort)

3.mian函数的调用

#include "stdafx.h"
#include "Array.h"
#include "Module.h"
#include "ISort.h"


int main()
{   

	//冒泡排序
	CBubbleSortHelper BubbleSort;
	BubbleSort.CreateInstance();
	IBubbleSort* pBubbleSort = BubbleSort.GetInterface();

	char data1[10] = { 15,5,8,20,5,4,10,5,6,25 };
	pBubbleSort->BubbleSort(data1, 10);
	for (int i = 0; i < 10; i++)
		printf("%d\n", data1[i]);

	//快速排序
	CQuickSortHelper QuickSort;
	QuickSort.CreateInstance();
	IQuickSort *pQuickSort = QuickSort.GetInterface();

	char data2[10] = { 15,5,8,20,5,4,10,5,6,25 };
	pQuickSort->QuickSort(data2, 0,9);
	for (int i = 0; i < 10; i++)
		printf("%d\n", data2[i]);

    return 0;
}

  

王者荣耀前端模仿 作品初衷 因为想着要写答辩,网页这东西展现的会更直观一点,刚好也复习一下自己基础我牢固的前端知识,也想着提升一下自己前端网页排版能力逻辑能力 作品简介 编辑器:sublime 语言:html+css+js 代码量:6000行 编辑时长:30天 基本结构 主页面 主页面应该是框架结构最完善的,因为这个页面是最开始写的,也因为布局的原因修改过很多次。因为页面元素多,比较复杂,所以到后边就难免会造成布... 阅读详情

相关推荐

基于LeRobot框架在SO-101机器人上训练ACT模仿学习策略的完整实践指南

模仿学习是机器人领域实现技能传递的关键技术,其核心原理是通过学习专家演示数据,让机器人掌握复杂任务的动作策略。基于Transformer架构的ACT(Action Chunking with Transformers)策略,通过预测未来一段时间内的动作序列块,显著提升了动作的连贯性规划效率,在机器人操作任务中展现出重要技术价值。该技术特别适用于桌面级协作机械臂的抓取、放置等精细操作场景。本文以SO-101机器人为硬件平台,结合LeRobot开源框架,详细解析从仿真环境搭建、数据采集、模型训练到真机部署的全

weixin_30448603的博客 406

使用面向组件编程面向对象编程有什么区别

使用面向组件编程面向对象编程有什么区别

qq_35370166的博客 1127

组件Component)对象(Object)之间的区别

组件是一个可重用的模块,它是由一组处理过程、数据封装用户接口组成的业务对象(Rules Object)。组件看起来像对象,但不符合对象的学术定义。它们的主要区别是: 1)组件可以在另一个称为容器(有时也称为承载者或宿主)的应用程序中使用,也可以作为独立过程使用; 2)组件可以由一个类构成,也可以由多个类组成,或者是一个完整的应用程序; 3)组件为模块重用,而对象为代码重用。现在,比较流行的组件模型有COMComponent Objiect Module,对象组件模型)/DCOM( Distr...

第7维度 - 日常笔记 2771

面向对象开发与面向组件开发的区别

摘要:本文通过面向对象面向组件开发方法的对比,强调了面向组件是粗粒度的、针对业务领域的,并且需要容器。通过面向对象面向组件的方法的比较可以将Spring、Hibernate等一些面向对象的技术框架与SCA、OSGi等面向组件编程规范与实现区分开来。 关键字:面向对象,面向组件,面向服务 [b]通过对SOA、SCA、OSGi、JPF等面向组件理论技术的理解,整理一篇面向对象开发与面...

teamlet 700

网狐棋牌(十) 成也萧何败也肖何? IUnknowEx

相关UML: 看下某个查询接口的代码: ////////////////////////////////////////////////////////////////////////// //接口查询宏 #define QUERYINTERFACE(Interface,Guid,dwQueryVer)                                  

mergerly的专栏 3708

QT模仿出来的PS界面

QT模仿出来的PS界面,目前源码已在GITHUB上。 虽然是一个个人项目,但我们有志打造开源的PS,如果对图形编程有兴趣的开发者,请加入我们,欢迎C/C++开发者,UI设计者,文档管理,成为开发合作伙伴。 GITHUB源码目录:https://github.com/shinehanx/openphoto.git ...

IeSneaker的专栏 2221

为什么TWIST选择“全身模仿“:人形机器人遥操作的3个关键设计决策

TWIST(Teleoperated Whole-Body Imitation System,遥操作全身模仿系统)是一个面向人形机器人的全身模仿遥操作系统:通过遥操作采集人类全身动作,再借助模仿学习让机器人完整复现,已被 CoRL 2025 正式接收。这篇文章为你拆解它背后的 3 个关键设计决策,帮助新手理解"全身模仿"到底解决了什么问题、又为什么难。 ## 先认识 TWIST:人形机器人遥操作

gitblog_00224的博客 896

[地球人]BlogEngine.NET[Appwo.com版]+采集器

由于本网站定位不清晰,所以决定把源码发布出来。如果有问题请联系:cbcye@live.com. 另外如果你用本源码搭建了网站那么请麻烦添加对http://appwo.com/的友情链接。谢谢了! 本系统是在Blogengine.NET的中文演化版博义1.8的基础上改进而来的。具体的改进包括:1.增加了新的界面,模仿CnBeta.com2.自定义多线程采集器  采集的技术未使用大部份采集器使用的关...

weixin_34306593的博客 410

关于COM组件

  <!--google_ad_client = "pub-4159669282587342";google_alternate_color = "FFFFFF";google_ad_width = 468;google_ad_height

952

模仿网易云音乐鲸云特效动效

JinyunEffect 项目地址:tyhjh/JinyunEffect 简介: 模仿网易云音乐鲸云特效动效 更多:作者提 Bug 标签: # Android 粒子特效--网易云鲸云特效 文档没更新,建议阅读原文:https://www.jianshu.com/p/d2996afeb3e1 最近网易云音乐出了一个叫鲸云音效东西,效果怎么样不是很清楚,但是播放...

未来很长,但我会努力的走下去。 1874

Dex Retargeting在DexMV项目中的应用:机器人手部模仿学习的核心技术

想要让机器人手像人类一样灵巧地操作物体吗?Dex Retargeting技术正是实现这一目标的关键!作为DexMV项目中的核心技术,这个开源工具能够将人类手部动作精准地映射到机器人手上,为机器人模仿学习提供了强大的技术支撑。无论你是机器人学习的新手还是资深开发者,掌握Dex Retargeting都将为你打开机器人灵巧操作的新世界。 ## 🔍 什么是Dex Retargeting? Dex

gitblog_01139的博客 970

GitHub实战学习Python:从模仿到精通的四步心法

在编程学习领域,掌握一门语言的核心往往在于理解其实际应用场景与工程化实践。Python作为一门广泛应用于自动化、数据分析、Web开发等领域的高级语言,其学习路径不应局限于语法规则,而应深入到真实项目的构建与迭代过程中。通过拆解优秀开源项目的代码结构、提交历史工程配置,学习者能够直观理解从需求分析到功能实现的完整链路,掌握依赖管理、测试编写文档维护等关键工程素养。这种基于GitHub的实践学习方法,将抽象概念转化为可运行的代码模块,让学习者在模仿中理解设计模式,在重构中内化编程思维,最终形成从项目驱动到自

weixin_30608503的博客 445

TinyCLIP-ViT-8M-16-Text-3M-YFCC15M源码精读:CLIPModel架构与推理流程全解析

想要快速理解TinyCLIP模型的核心架构与推理流程吗?作为一款基于亲模仿权重继承技术的轻量级CLIP蒸馏模型,TinyCLIP-ViT-8M-16-Text-3M-YFCC15M在保持高性能的同时大幅减少了参数量。本文将为你详细解析这个项目的源码结构、模型配置推理实现,帮助你快速上手这个高效的视觉-语言预训练模型。 ## 🔍 项目概述:TinyCLIP的核心优势 TinyCLIP是

gitblog_00618的博客 584

WPF界面设计源码分享

WPF界面设计源码分享 去发现同类优质开源项目:https://gitcode.com/ 这里提供了一个模仿金山卫士、360卫士、鲁大师等软件界面的WPF界面设计完整源码。这份资源可以帮助开发者更好地学习并掌握WPF界面设计技巧。如果您对此感兴趣,欢迎下载学习交流! 去发现同类优质开源项目:https://gitcode.com/ ...

gitblog_06749的博客 350

一条 send_action 跑通模仿学习:LeRobot 开源机器人框架上手实践

LeRobot 是 Hugging Face 团队推出的**开源机器人框架**,把机器人硬件控制、数据集存储、策略模型训练统一放在一套 PyTorch 工具链里。想完成第一次"演示采集 → 训练 → 真机/仿真评估"闭环,你只需要一支低成本机械臂、一个摄像头本文列出的几条命令,不用自己写通信协议,也不用手工处理视频与状态数据的对齐。 [![LeRobot 开源机器人框架多机器人控制演示](ht

gitblog_00373的博客 370

HumanPlus——斯坦福ALOHA团队打造的如影随形机器人:通过RGB相机驱动机器人模仿人类动作完成数据采集,然后仿真中训小脑HST、真实中训大脑HIT

今天只是一个平常的日子,不过看到了两篇文章一篇是《半年冒出近百家新公司,「具身智能」也有春天》我看完之后转发到朋友圈,并评论道:让机器人翻一万个后空翻,不如让机器人打好一个螺钉,毕竟在目前阶段 炫酷没有意义,所以我们近期全力为工厂去赋能,解决一个个工业场景期待我司与更多工厂合作,从前期的验证、评估开始另外一篇文章便是之前斯坦福Moblie aloha团队竟然开源推出了他们的人形机器人,虽然我司下半年暂不涉足人形机器人(更多还是解决工厂实际业务场景 怎么把活干好、干漂亮则怎么来,是否人形不重要)

结构之法 算法之道 2万+

java编程pig编码_AngryPig 模仿愤怒的小鸟做的游戏,用java写的,比较容易看懂 Game Program 238万源代码下载- www.pudn.com...

文件名称: AngryPig下载 收藏√ [5 4 3 2 1]开发工具: Java文件大小: 6998 KB上传时间: 2013-05-13下载次数: 6提 供 者: 王久力详细说明:模仿愤怒的小鸟做的游戏,用java写的,比较容易看懂-Angry Birds do imitate games, written in java, it is easier to understan...

weixin_36195837的博客 110
上一篇: epoll的简单实现
下一篇: base64编码原理+源码
IT小狼狗
博客等级 码龄11年 57粉丝 22原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值