'2008/09'에 해당되는 글 12건
- [김정훈(15기)] Multi-agent 기반 Context-aware Middleware | 2008/09/05
- [김정훈(18기)] 무선인터넷 수신감도 측정하는 방법 | 2008/09/04
- [김정훈(18기)] 네트워크 관련 각종 정보 얻어오는 방법 | 2008/09/04
- [이호성(17기)] 청소마스터 연계 중간 HW 진행상황 | 2008/09/04
- [정지성(17기)] 시리얼통신을 이용한 시간 값 거리환산 | 2008/09/04
- [손영태(17기)] FPGA에 uart 모듈 추가 구성 | 2008/09/03
- [정성문(18기)] Window 개인 사용자 정보관련 처리부분 (2) | 2008/09/03
- [권현일] zigbex mote를 이용한 근거리 위치추적 | 2008/09/03
- [안진영(18기)] 가상화를 위한 파일시스템 필터 드라이버 | 2008/09/03
- [dlwn98] MFC CWinThread 를 상속받아 스레드를 만들 때의 주의할 점 (1) | 2008/09/03
Multi-agent 기반 Context-aware Middleware :: 2008/09/05 14:46 by 김정훈(15기)
본 과제의 주된 목적은 Multi-agent System을 기반으로 Context-awareness가 가능한 middleware를 개발하는 것이다.
과제의 중간 및 완료발표 그리고 시현의 중점이 Context-awareness관련 내용이 될 것이다.
따라서 블로그를 통해 Multi-agent System에 대한 이야기를 해 볼까 한다. (시작발표때의 요청도 있었고...)
다음과 같이 총 3부로 계획하고 있으며(절대 지훈이가 3개쓰라고 해서 그런것은 아니다. ^^)
과연 3개의 글 속에 Multi-agent System의 감동을 전달할 수 있을지 걱정이 앞선다.
1. Multi-agent System이란?
2. Prisoner's dilemma
3. Nash Equilibrium
먼저 오늘은 Multi-agent System이 무엇인지에 대한 이야기를 해볼까 한다.
Multi-agent system을 그대로 직역하면 다중-에이전트 시스템 이다.
쉽게 풀어보면, 에이전트가 많이 존재하고 그들이 서로 상호작용하여 어떠한 목적을 달성하는 시스템이라 볼 수 있겠다.
그럼 에이전트란 무엇일까?
에이전트의 사전적 의미는 '대리인'이다. 즉, 자신이 해야 할 일을 다른 사람에게 위임하여 시키는 경우, 이 상황에서
일을 위임할 '다른 사람'을 '대리인'이라 볼 수 있다.
사전적 의미에서는 사람이지만, 우리는 계산(전산)의 관점에서 바라봐야 하므로 어떠한 기능을 하는 하나의 '모듈'이라 하자.
또한, 사람은 스스로 움직이므로(능동적) 이 모듈 또한 스스로 움직여야 한다.
참고로 이러한 특징을 전산학에서는 autonomous라 한다.
주저리 주저리 많은 말을 했지만, 지금까지의 내용을 정리하면 에이전트라는 것은 autonomous한 하나의 모듈이라는 것이다.
하지만 이런 autonoumous한 모듈이 과연 어디에 쓰일까?
스스로 어떠한 동작을 하는 모듈이란 것이 숫자 1을 while(1) 속에 넣고 찍어주는 함수를 callback으로 호출하는것도
그러한 모듈일 수 있으니, 머 굳이 쓰일때는 없다. ㅡㅡ;
따라서 등장하는 것이 Intelligent Agent(이하 IA)이다.
캬~ 말은 좋다. ^^; 제가 굳이 이런말을 하는 이유는 Intelligent에 대한 정의를 한번 짚고 넘어가야 할 것 같아서이다.
여러분은 Intelligent가 무엇이라 생각하는가?
이것의 사전적 의미는 '지능', '지능적인' 머 이런것들이다.
하지만, 이것 또한 계산(전산)의 관점에서 바라본다면, 우리가 상식적으로 간주하고 생각하는 '지능'과는 거리가 있다.
(솔직히 이런 말은 계산기의 Architecture, 성능에 좌우되는 변명이다.)
학부 때, 인공지능(artificial intelligence, 이하 AI) 수업을 들어본 사람이 있는가?
내가 그 수업에서 유일하게 기억나는 것은 "인공지능이란 무엇인가?" 인데, 그 때의 기억에 따라
은사님이 말씀하신 인공지능이란,
천막이 처진 2개의 방에 질문 답변기가 있다.
(하나의 방에는 진짜 사람이 답변을 하고, 하나의 방에는 질문답변기(answer machine)이 있다.)
이러한 상황에서 당신은 1번방에 들어가서 어떤 질문을 하고 답변을 듣는다.
그리고 2번방에 들어가서 같은 질문을 하고 답변을 듣는다.
당신은 1, 2번 방중에 누가 사람이고 누가 machine인지 구분할 수 있겠는가?
이때, 구분할 수 없다면 그 machine은 AI를 가진 machine이다.
이렇게 인공지능 정의를 곱씹어본 이유는, 전산학에서의 '지능'은 먼가 정확하고, 똑똑하고, 세련되고, 지적인 것이 아니라
"인간을 똑같이 흉내낼 수 있는가?" 로 정의될 수 있기 때문이다.
즉, 어떠한 명제가 진실인지 아닌지 그것이 당신에게 도움이 되는지 안되는지와 같은 것은 전혀 중요하지 않다는 것이다.
인간은 항상 실수를 하고 멍청한 짓을 더 많이 한다. (당신은 아닌가? 난 거의 대부분이 그렇다 ㅠㅠ)
다시 IA의 정의로 돌아와 정리하면, IA란 인간을 똑같이 흉내내는 에이전트이다. 이것은 즉, '대리인'이다.
다시 원래의 정의로 돌아왔다. ㅡㅡ; (하지만, '대리인'을 계산으로 만들어보자이다. 동일한 개념은 아닌것이다.)
아무튼 이러한 IA를 만들기 위해 10여년간 학계에서 활발한 연구가 진행되었지만, 별 소득이 없었다.
그나마 하나의 소득이 있다. 그것은 "현재의 계산기 architecture와 성능으로는 IA가 불가능하다"라는 것이다.
그럼 이대로 포기할 것인가? 당연히 그렇지 않겠지 ㅋㅋ
그래서 등장한 것이 Multi-agent system이다. 즉, 하나의 '에이전트'라는 가상대리인을 만들고 싶었지만 불가능하다 판단하고 다른방식으로 가상대리인을 만들자는 것이다.
이 방법의 핵심은 기존의 IA연구에서 가장 중요한 문제인 에이전트에 부하되는 계산의 복잡도를 경량화하자는 것이다. 현재의 전산성능이 커버할 수 있을정도로
그리고 이러한 에이전트(경량화된)를 많이 만들어 서로 상호작용하게 만들어 기존의 목적을 달성 하자는 것이다.
비슷한 개념이 "분산처리", "그리드 컴퓨팅"이라 할 수 있겠다.
지금까지의 내용을 환기하여 다시 정리해 보자.
Multi-agent system은 단순한(계산이 경량화 된) 다수의 에이전트(능동적 모듈)들이 서로 상호작용하며
특정한 목적을 달성하기 위한 시스템이다.
이제 생각해야 하는것은 상호작용과 그 상호작용을 통해 특정한 목적을 달성하는 것에 대한 문제이다.
이 문제를 쉽게(?) 비유하면, 바보들 10명을 대리고 전구를 교환하는 문제라 할 수 있겠다.
이 바보들은 자신에게 떨어진 하나의 일만을 할 수 있다. 2개의 일을 못한다.
이러한 상황, 이미 사용할 수 있는 자원은 정해진, 에서 문제를 해결할 수 있는 방법은 어떻게 이들을 조정하고
조화시킬까의 문제이다. 이것을 "협업 정책(Collaboration strategy)"이라 부른다.
하지만 이 협업정책이란 것은 전산학의 개념이라기 보다는 경제학과 사회학의 개념이며
그 분야에서 더욱 연구되고 발전되었다.
이에 2부와 3부에서는 이러한 협업정책을 살펴보기 위해 경제학과 사회학의 이야기들을 해볼 생각이다.
무선인터넷 수신감도 측정하는 방법 :: 2008/09/04 18:09 by 김정훈(18기)
수신감도를 얻어오는 방법에는 C++ 에서 무선 인터넷 신호강도를 측정하는 방법과 둘째로 DDK 에서 지원하는데 이를 이용하는 것. 그리고 마지막으로 아래처럼 WMI 와 비슷한 Query 형식으로 값을 쉽게 얻을수 있다.
HRESULT hres = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM MSNdis_80211_ReceivedSignalStrength Where active=true"),
와 같은 형태로 사용되는데 MSNdis_80211_ReceivedSignalStrength 로 검색해보니, WMI 로 제공되고 있었다.
MSDN 에보니 C++ 로 WMI 사용을 하는 방법이 나와 있는것으로 보아 어느정도 안정성이 보장된다고 생각된다.
http://msdn.microsoft.com/en-us/library/aa389762(VS.85).aspx
MSDN 에 C++ 에서 WMI 를 사용하는 방법이 자세히 나와있다.
그리고 필요한 Query 는 아래와 같다.
Namespace : root\WMI
Classes : MSNdis_80211_ReceivedSignalStrength
자, 돌아가서 C++ 을 가지고 WMI Application 을 개발하는 방법부터 살펴보자. 친절한 MSDN 을 살펴보면 다음과 같이 하면 된다고 일러주고 있다.
To create an application for WMI using C++: you must initialize COM, access and set WMI protocols, and perform a manual cleanup. However, C++ does have the advantage of flexibility and power. Therefore, while you are better served in using Visual Basic Scripting Edition (VBScript) or Microsoft JScript for simple processes, C++ works better for more sophisticated applications and is required for writing providers.
The following procedure describes how to create a WMI application.
To create a WMI application
- Initialize COM.
Because WMI is based on COM technology, you must perform calls to the CoInitializeEx and CoInitializeSecurity functions to access WMI.
- Create a connection to a WMI namespace.
By definition, WMI runs in a different process than your application. Therefore, you must create a connection between your application and WMI.
- Set the security levels on the WMI connection.
To use the connection you create to WMI, you must set the impersonation and authentication levels for your application.
- Implement the purpose of your application.
WMI exposes a variety of COM interfaces use to access and manipulate data across your enterprise. For more information, see Manipulating Class and Instance Information, Receiving a WMI Event, and COM API for WMI.
This is where the bulk of your WMI client application should exist, such as accessing WMI objects or manipulating data.
- Cleanup and shut down your application.
After you complete your queries to WMI, you should destroy all COM pointers and shut down your application correctly.
For more information and a code example about how to create a WMI application, see Example: Creating a WMI Application.
이해가 잘 안간다면 하단에 나와 있듯이 Example: Creating a WMI Application 를 보면 한눈에 방법을 알 수 있다.
중요한것은 COM 을 초기화할때(Initialize) 반드시 main 함수에서 해야 한다는 것이다. 즉 최초에 하지 않으면 안됀다. 이것 때문에 조금 애를 먹었으나 이것을 제외하고는 WMI 를 C++ 에서 사용하는데 크게 문제가 없었다.
네트워크 관련 각종 정보 얻어오는 방법 :: 2008/09/04 18:05 by 김정훈(18기)
IP주소를 얻어오기 위한 방법에는 여러가지가 존재한다. 처음 IP주소를 얻기 위해서 자료를 찾아 보았는데 레지스트리에서 값을 가져오는 방법이 있었다. 그래서 이 방법을 쓰려 했지만, 상당히 복잡하였다. 우선 디바이스 장치의 이름을 얻어온 후, 그 값을 토대로 다시 검색을 해야 하기 때문이다. 더불어 레지스트리에서 가져온다는 것 자체가 어떤 프로그램에서 기록을 한 것을 다시 가져오는 샘이니까 신뢰가 되지 않았다. 그래서 찾아 보았다.
GetAdaptersInfo 라는 함수를 이용하면 좀더 쉽게 원하는 값을 가져올 수 있엇다.
MSDN : http://msdn.microsoft.com/en-us/library/aa365917.aspx
주의할점은 MSDN 하단에 나와 있듯이 (Requirements) 라이브러리를 추가시켜 주어야 한다.
Iphlpapi.h 헤더를 추가시켜야 하고 Iphlpapi.lib 를 사용하면 되고 Iphlpapi.dll 가 필요하다.
얻어올수 있는 값으로는 Sub Mask 를 비롯하여 GateWay, IP, Device Name 등이 있다.
#pragma comment(lib, "C:\\WinDDK\\6001.18001\\lib\\wxp\\i386\\Iphlpapi.lib")
아래처럼 코드가 상당히 간략하다
IP_ADAPTER_INFO AdapterInfo[16];
DWORD dwStatus = GetAdaptersInfo(AdapterInfo, &dwBufLen);
TRACE("%s\n", pAdapterInfo->Description);
TRACE("%s\n", pAdapterInfo->IpAddressList.IpAddress.String);
pAdapterInfo = pAdapterInfo->Next;
}
while(pAdapterInfo);
}
실행하면 다음과 같은 정보들을 볼 수 있다.
Wirtten by 김성욱
청소마스터 연계 중간 HW 진행상황 :: 2008/09/04 03:33 by 이호성(17기)
대회가 얼마 안 남은 이 시점에 우리가 계획했던 부분에서 차질이 빚어지고 있다.
1. 프레임 재설계
2. 집진부 구성
3. 미니 PC 탑재
4. 현재 문제점
5. 문제 해결방안
1. 프레임 재설계
이번 프레임 설계는 SolidWorks2008로 진행하였다.
처음 다뤄보는 툴이었지만 간단한 설계라서 큰 어려움없이 설계할 수 있었지만 제일 어려웠던 것은
치수 계산이었다. 집진통, 집진구멍, 모터의 자리배치에 엄청 신경 써야 했기 때문이다.

2. 집진부 구성
메인 프레임 중앙 부분에 길게 구멍을 만들어 놓았다.
집진통은 적당한 크기의 밀폐용기를 사용. 용기 뚜껑에 흡입모터를 장착. 집진통의 탈부착을 용이하게
하였다.
프레임 설계 그림 뒷부분에 보면 집진통이 단단히 고정 되도록 하였다.
3. 미니 PC 탑재
미니 PC는 현재 DC파워 모듈을 구입하여 윈도우 설치까지 마친상태.
배터리 전원으로 구동을 테스트 하여야 한다.
4. 현재 문제점
1) 로봇 자체의 지상고
-> 방구조에서 턱 같은 장애물이 있을때 넘을려면 적당히 지상고가 높아야 하는데 현재 흡입 능력으로 볼때 최대한 지상고를 낮춰야 될 것 같다.
2) 흡입 모터의 구동 전압
-> 12V 구동을 계획하였는데 흡입 능력이 현저히 떨어져서 16V이상의 전원이 필요하다.
3) 집진부 설계의 문제
-> 집진 능력을 극대화 시키려면 좀더 생각을 해보고 테스트를 거쳐야 된다.
4) 미니 PC 구동전압
-> 안정적인 12V정도의 전원이 필요한데 배터리 전압을 체크해 보니 13V가 넘어서 아직 테스트 보류 상태이다.
5. 문제 해결 방안
* 모든 부분에서 많은 테스트를 요구 하고 있다. 일단 빨리 진행 될 수 있는 부분을 마친 다음 집진부를 진행할 계획이다. 대회가 얼마 안 남았기 때문에 이번주 내에 하드웨어는 완료 하는 것으로 계획 중이다.
* 하드웨어가 완성 되면 이번 주말부터는 모터정밀제어와 센서데이터 획득, 그리고 알고리즘과 연동을 시작한다.
** 하드웨어가 완성 되는데로 업데이트 하겠습니다.
시리얼통신을 이용한 시간 값 거리환산 :: 2008/09/04 00:05 by 정지성(17기)

시리얼 통신을 이용하여 지그비로부터 넘어온 시간데이터를 거리값으로 환산하였다

환산한 거리값을 프로그램상의 맵의 크기에 맞게 환산한 후 디스플레이한 모습이다
FPGA에 uart 모듈 추가 구성 :: 2008/09/03 23:54 by 손영태(17기)

일반 PC에서도 FPGA를 이용한 카운트 값을 받아 볼수 있게 하기 위하여 uart모듈을 구성하였다.
Window 개인 사용자 정보관련 처리부분 :: 2008/09/03 23:20 by 정성문(18기)
Application Virtualization 프로젝트를 위해 각 컴퓨터 사용자에 따른 User Directory와 Registry정보에 대한 부분을 처리하기 위한 처리에 대해 정리해 보았다.
우선 Window에서 기본으로 사용하는 path의 경로는 다음과 같다.
|
Variable |
Windows XP |
Windows Vista |
|
%ALLUSERSPROFILE% |
C:\Documents and Settings\All Users |
C:\ProgramData |
|
%APPDATA% |
C:\Documents and Settings\{username}\Application Data |
C:\Users\{username}\AppData\Roaming |
|
%COMPUTERNAME% |
{computername} |
{computername} |
|
%COMMONPROGRAM |
C:\Program Files\Common Files |
C:\Program Files\Common Files |
|
%COMMONPROGRAM |
C:\Program Files (x86)\Common Files |
C:\Program Files (x86)\Common Files |
|
%COMSPEC% |
C:\Windows\System32\cmd.exe |
C:\Windows\System32\cmd.exe |
|
%HOMEDRIVE% |
C:\ |
C:\ |
|
%HOMEPATH% |
C:\Documents and Settings\{username} |
C:\Users\{username} |
|
%PATH% |
C:\Windows\system32;C:\Windows; |
C:\Windows\system32;C:\Windows; |
|
%PATHEXT% |
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.WSF;.WSH |
.com;.exe;.bat;.cmd;.vbs;.vbe;.js;.jse;.wsf;.wsh;.msc |
|
%PROGRAMFILES% |
C:\Program Files |
C:\Program Files |
|
%PROGRAMFILES(X86)% |
C:\Program Files (x86) (only in 64-bit version) |
C:\Program Files (x86) (only in 64-bit version) |
|
%PROMPT% |
Code for current command prompt format. Code is usually $P$G |
Code for current command prompt format. Code is usually $P$G |
|
%SYSTEMDRIVE% |
C: |
C: |
|
%SystemRoot% |
The Windows directory, usually C:\Windows, formerly C:\WINNT |
C:\Windows |
|
%TEMP% and %TMP% |
C:\Documents and Settings\{username}\Local Settings\Temp |
