for Robot Artificial Inteligence

开始选择论文主题

|

9月来到了我必须为论文做准备好。

9月开始,当我咨询老师时,他说我必须在两个月内找到我的论文主题。我在搜索怎么开始选择论文主题然后整理了。现在开始一下

1.选择论文主题

1)不要想得太远

主题太大,就出不了结果. 如果想要做出很好的学术贡献,就会掉队

2) 别想得太安逸

事先考虑分析工具和论文的构成然后寻找可能的主题. 应该是能够给出答案的主题

3) 就主张一个

即使结果与我们预期的不同,但是我们要主张值得一个结果

2.论文主题要领

1)可行性 :逻辑依据

2)独创性 : 新的

3)可能性 : 能出结果的

4)有用性 :有时事性的东西

Note : 添加新功能的在已存在或者已经发布的论文。这意味着用新研究改进它

3. 选择主题要领

这个表意思是就自己能做到的主题就做。然后下面写了两个考虑就是教授喜欢的方法都不一样。有一些教授喜欢用偏好技法做研究最新的主题。另一方面, 有一些教授不喜欢最新技法做研究。因为有一些教授不知道最新技法所以不相信最新技法的结果。所以选择主题之前去咨询自己的老师。

4. 确定题目

题目可以以后也决定或者先决定然后以后能改变。

简单的介绍了选择论文主题是要做什么。还有最后我们在所有程序之后要能说出来如果有人问我们

你写的论文是什么论文?请用一句话说

"________________________________________"

用一句说答案的话,做论文过程就没问题了。

参照:심리대화, 공학박사 임철웅 소장의 실전 조언

Comment  Read more

17. Polymorphic Pointer

|

Exercise (Polymorphic Pointer)

Main.cpp

#include "Rectangle.h"
#include "Circle.h"
#include <iostream>

using namespace std;

void introduceShape(Shape*);
double calculateShapeArea(Shape*);
double calculateShapeCircumferece(Shape*);

int main()
{

    Rectangle rectangle1(5,2);
    Circle circle1(3);

    introduceShape(&rectangle1);
    cout << "My area is: " << calculateShapeArea(&rectangle1) << ", my circumference is: " << calculateShapeCircumferece(&rectangle1) << endl << endl;

    introduceShape(&circle1);
    cout << "My area is: " << calculateShapeArea(&circle1) << ", my circumference is: " << calculateShapeCircumferece(&circle1) << endl;

    return 0;
}

void introduceShape(Shape* shapeToIntroduce)
{
    return shapeToIntroduce->introduce();
}

double calculateShapeArea(Shape* shapeToCalculate)
{
    return shapeToCalculate->calculateArea();
}

double calculateShapeCircumferece(Shape* shapeToCalculate)
{
    return shapeToCalculate->calculateCircumference();
}

Rectangle.h

#ifndef RECTANGLE_H_INCLUDED
#define RECTANGLE_H_INCLUDED
#include "Shape.h"

class Rectangle: public Shape
{
    double width;
    double height;
public:
    Rectangle(double, double);
    void introduce();
    double calculateArea();
    double calculateCircumference();

};


#endif // RECTANGLE_H_INCLUDED

circle.h

#ifndef CIRCLE_H_INCLUDED
#define CIRCLE_H_INCLUDED
#include "Shape.h"

class Circle: public Shape
{
    double radius;
public:
    Circle(double);
    void introduce();
    double calculateArea();
    double calculateCircumference();
};


#endif // CIRCLE_H_INCLUDED

Rectangle.cpp

#include "Rectangle.h"
#include <iostream>

Rectangle::Rectangle(double width, double height)
{
    this->width = width;
    this->height = height;
}
void Rectangle::introduce()
{
    std::cout << "I AM A RECTANGLE !" << std::endl;
}
double Rectangle::calculateArea()
{
    return width*height;
}
double Rectangle::calculateCircumference()
{
    return 2*(width+height);
}

Circle.cpp

#include "Circle.h"
#include <iostream>
#define PI 3.14

Circle::Circle(double radius)
{
    this->radius = radius;
}
void Circle::introduce()
{
    std::cout << "I AM A CIRCLE !" << std::endl;
}
double Circle::calculateArea()
{
    return PI*radius*radius;
}
double Circle::calculateCircumference()
{
    return 2*PI*radius;
}

Exercise 2 (Virtual destructor)

  • 동적 함수로 직사각형과, 원을 Instance 한다.
  • 그렇게 되면 rectangle과 circlel은 Shape 클래스에 포인터 함수가 되여 동적으로 사용 할 수 있다.
  • 사용 후 Delete 될때 shape.h에서 가상 destructor도 종료가 되면서 모든 값이 초기화 된다.

main.cpp

#include "Rectangle.h"
#include "Circle.h"
#include <iostream>

using namespace std;

void introduceShape(Shape*);
double calculateShapeArea(Shape*);
double calculateShapeCircumferece(Shape*);

int main()
{
    Shape* rectangle1 = new Rectangle(5,2);
    Shape* circle1 = new Circle(3);

    introduceShape(rectangle1);
    cout << "My area is: " << calculateShapeArea(rectangle1) << ", my circumference is: " << calculateShapeCircumferece(rectangle1) << endl << endl;

    introduceShape(circle1);
    cout << "My area is: " << calculateShapeArea(circle1) << ", my circumference is: " << calculateShapeCircumferece(circle1) << endl << endl;

    delete rectangle1;
    delete circle1;
    return 0;
}

void introduceShape(Shape* shapeToIntroduce)
{
    return shapeToIntroduce->introduce();
}

double calculateShapeArea(Shape* shapeToCalculate)
{
    return shapeToCalculate->calculateArea();
}

double calculateShapeCircumferece(Shape* shapeToCalculate)
{
    return shapeToCalculate->calculateCircumference();
}

shape.h

#ifndef SHAPE_H_INCLUDED
#define SHAPE_H_INCLUDED
#include <iostream>

class Shape
{
    public:
        virtual ~Shape() {std::cout << "Shape destructor !" << std::endl;};
        virtual void introduce() = 0;
        virtual double calculateArea() = 0;
        virtual double calculateCircumference() = 0;
};

#endif // SHAPE_H_INCLUDED

rectangle.h

#ifndef RECTANGLE_H_INCLUDED
#define RECTANGLE_H_INCLUDED
#include "Shape.h"

class Rectangle: public Shape
{
    double width;
    double height;
public:
    Rectangle(double, double);
    ~Rectangle();

    void introduce();
    double calculateArea();
    double calculateCircumference();
};


#endif // RECTANGLE_H_INCLUDED

circle.h

#ifndef CIRCLE_H_INCLUDED
#define CIRCLE_H_INCLUDED
#include "Shape.h"

class Circle: public Shape
{
    double radius;
public:
    Circle(double);
    ~Circle();

    void introduce();
    double calculateArea();
    double calculateCircumference();
};


#endif // CIRCLE_H_INCLUDED

circle.cpp

#include "Circle.h"
#include <iostream>
#define PI 3.14

Circle::Circle(double radius)
{
    this->radius = radius;
}

Circle::~Circle()
{
    std::cout << "Circle destructor !" << std::endl;
}

void Circle::introduce()
{
    std::cout << "I AM A CIRCLE !" << std::endl;
}

double Circle::calculateArea()
{
    return PI*radius*radius;
}

double Circle::calculateCircumference()
{
    return 2*PI*radius;
}

rectangle.cpp

#include "Rectangle.h"
#include <iostream>

Rectangle::Rectangle(double width, double height)
{
    this->width = width;
    this->height = height;
}

Rectangle::~Rectangle()
{
    std::cout << "Rectangle destructor !" << std::endl;
}

void Rectangle::introduce()
{
    std::cout << "I AM A RECTANGLE !" << std::endl;
}
double Rectangle::calculateArea()
{
    return width*height;
}
double Rectangle::calculateCircumference()
{
    return 2*(width+height);
}

결과값

Comment  Read more

(jekyll) Github 홈페이지 구글 애드센스 광고 사이드바,게시물 추가하기

|

이번 글에서는 github 홈페이지에 구글 애드센스를 추가해보겠습니다.(구글링을 하면 자료가 많지만 제 홈페이지에 적용하는데 좀 오래걸렸습니다.) 그럼 시작하겠습니다.

구글애드센스 가입

Github 홈페이지에 광고를 추가하시려면 우선 구글 애드센스Google Adsense에 가입을 해야합니다.

구글 매인홈페이지에 들어가 위에 빨간 버튼을 눌러 가입을 합니다.(VPN사용중이라 일본어로 나오네요). 가입을 했으면 사이트 설정에 들어가서 사이트 추가를 누르셔서 광고를 기재하고자 하는 사이트를 입력합니다. (저는 이미 등록을 한 상태이기 때문에 준비로 나옵니다.)

입력을 하면 애드센스에서 사이트 연결을 해주는 코드를 줍니다.

이 코드를 include -> head.html 에서 제일 윗 상단 <head> 다음에 넣어주시면 됩니다.

위 코드를 삽입을 완료가 되었으면, 구글애드센스에 돌아가 완료 버튼을 누루시면 됩니다. 다른 블로그나 인터넷에서 보며는 게시물이 적을경우 구글애드센스 승인 거절을 당한다고 하는데, 저는 게시물도 적지만 구글애드센스 승인완료하는데 있어서 보통 2~3일 걸리는것 같습니다. 승인 거절을 당해도 거절에 대한 답변이 있으니 부족한 부분 보완하여서 재도전 하시면 될것 같습니다.

AbSense 광고 삽입

구글애드센스 광고 합격을 받았으면 아래와 같이 이메일을 받게 되십니다.

여기서 Get Started 버튼을 눌러서 이제 광고 삽입 하는 방법에 대해 설명하겠습니다.

구글애드센스 화면에 들어가서 Ads -> Ad Units에 들어갑니다.(한글 버전이신 분들은 그림따라 따라 오시면 됩니다.) 들어가면 3가지에 광고 유형이 있습니다.

  • Display
  • In-feed
  • in-article

여기서 우리는 광고의 기본 형태인 Display형을 선택하시면 됩니다.

유닛을 선택하시면 이와 같은 창이 뜹니다. 맨 위에는 광고 형태에 대한 이름, 그리고 오른쪽 상단에는 광고 형태에 대한 종류가 있습니다(Square, Horizontal, Vertical). 그 옆에는 광고 크기를 자동으로 맞출 것인지 크기를 커스터마이즈 할 것인지 정할 수 있습니다. 우선 horizontal에 저는 저장을 하겠습니다.

저장을 하면 이와 같이 코드와 함께 창이 뜹니다. 코드를 복사하고 이제 포스터나, 사이드바에 광고를 기재하는 방법을 해보겠습니다.

게시물에 광고 삽입

이제 게시물에 광고를 삽입을 하겠습니다. 홈페이지 관리하는 프로젝트의 폴더에 들어가 Include 폴더에 advertisement.html 파일을 만들고, 구글애드센스에서 광고를 복사한 코드를 붙여 넣습니다.

이와 같이 붙여 넣기를 한 후 _layouts -> Page.html 에다가 이와 같이 코드를 써주시면 각 게시물에 광고가 설정이 완료가 됩니다.

빈공간 오른쪽 사이드바에 광고 게시하기

빈공간 오른쪽 사이드 바에 광고를 게시는 포스터 게시보다 조금 복잡합니다. 먼저 _scss 폴더 -> Component 폴더 -> _sidebar.scss 파일에 들어갑니다. 들어가시고 맨 아래로 스크롤을 내린다음 다음과 같은 코드를 추가시킵니다.

# 오른쪽 배너
.fixed-bottom-right{
  position: fixed; bottom:auto;top: 105px;left: 90%; margin-bottom: 0 auto;z-index: 900;
}
# 왼쪽 배너
.fixed-bottom-left{
  position: fixed; bottom:auto;top: 105px; margin-bottom: 0 auto;z-index: 900;
}

완료가 되면 이러한 형태로 될 것 입니다..

_sidebar.scss에 위에 코드를 추가가 완료되었으면, include 폴더 -> sidebar.html에 들어갑니다. 들어가시고 맨 아래로 스크롤을 내린다음 다음과 같은 코드를 추가 시켜주시면 됩니다.

완료가 되면 이러한 형태로 될 것 입니다.

그리고 git commit -> push를 하시고 1분 뒤 홈페이지를 열으시면 오른쪽 빈 공간 사이드 배너에 광고가 나오고, 각 게시물에 광고가 나올 것 입니다.

이번 포스팅은 여기서 마치겠습니다. 감사합니다.

Comment  Read more

Smart Stick for the blind

|

이번 글에서는 대학교 3학년때 프로젝트를 하면서 개발한 Smart Stick 소개드리려 합니다.

Every thing is within Smart Devices

2015년도 친구들과 함께 캡스톤 디자인 브레인스토밍을 하면서 앨런 머스크 말 처럼 사람은 점점 사이보그로 진화하고 있다고 생각했다. 사람과 핸드폰만 있으면 무엇이든 정보와 지식을 얻을 수 있고 해결 할 수 있다. 하지만 이 스마트 시대에 있어 아직 이런 편리를 느끼시지 못하는 분들이 있다.

우리는 이런 통계를 보고 우리가 주어진 시간 안에 만들 수 있는 발명품이 무엇이 있을지 고민하였고, 시각장애를 가지고 계신 분들을 위한 스마트스틱을 만들자는 결론이 나왔다.

FIRST OUR DESIGN & GOAL

우리는 인터넷 조사 결과 시각 장애를 가지신 분들은 내리막 길이 어렵다는 것을 알게 되었다. 이에 적외선 센서를 이용하여 휴대하기 편하게 손전등이 같이 개발하여 일정 각도와 안전 거리에 벗어나게 되면 계단이라고 인식하는 알고리즘을 만들기로 하였다.

하지만 법규상 시각장애를 가지고 계신 분들은 안전상의 목적으로 하얀색 지팡이를 지니고 다녀야 한다라는 법적 조항이 있다. 이에 우리는 흰지팡이에 아두이노를 이용하여 적외선 센서들과 초음파 센서, 자이로센서 등을 부착하여 스마트 지팡이를 만들기로 하였다.

Introduction of EYE-Devices’s functions

첫번째 기능으로 초음파 센서를 사용하여 3미터 앞에 있는 장애물을 탐지 할 수 있게 프로그램 하였다.

두번째 기능으로 자이로 센서와 적외선 센서를 이용하여 안전거리 범위에서 갑자기 적외선 센서의 측정거리가 높아지거나 각도가 커지면 부저 센서를 이용해 알람을 울리는 기능을 만들었다.

세번째로 집안에서 지팡이를 찾지 못하거나 잃어버렸을 경우 핸드폰과 연동 bluetooth를 통해 부저가 울리도록 설계하였다.

마지막으로 지팡이 끝에 전선을 연결하여 물 웅덩이에 닿았을 경우 부저가 울려 사용자가 웅덩이를 피해갈 수 있게 설계하였다.

Future outlook & improvement

안타깝게도 약 4년전에 만든 작품이라 저장해 놓은 작동하는 동영상을 백업하지 못하여 보여드릴 수 없는점이 아쉽다. 우리는 만든 작품들을 다산관 대강당에서 발표를 하였고 좋은 Demostration과 함께 좋은 점수를 받았던 것을 기억한다. 4년전에 같이 고생한 오세홍, 봉석이형, 성호 에게 감사하다. 이것으로 포스터를 마치겠습니다.

Comment  Read more

16. Static-Variables-and-Functions

|

(Static-Variables-and-Functions)[https://ju3un.github.io/global-static/]

  • 프로그래밍을 처음 배울 때 우리는 지역 변수, 전역 변수라는 용어를 흔히 들을 수 있다.
  • 지역 변수는 말그대로 정의되는 시점에서 생성되고 초기화되며, 정의된 스코프(블록)이 끝나는 지점에서 소멸한다.
  • 그렇다면 전역 변수는 이름 그대로 지역 변수와는 반대로 전역에서 사용할 수 있다고 추측할 수 있다

전역 변수(Global Variable)와 정적 변수(Static Variable)

  • 이 둘의 공통점은 지역 변수와는 다르게 프로그램이 끝날 때 비로소 소멸된다는 것을 알고 있다

1. 전역 변수(Global Variable)

  • 한 번 할당된 변수의 메모리와 값은 프로그램이 종료될 때까지 유지된다. (=lifetime 프로그램 종료시.)
  • 해당 프로그램의 어느 파일, 함수에서도 접근 가능하다
  • 다른 파일에서 접근하기 위해서는 아래와 같이 extern 키워드를 사용하여 변수를 선언하고 사용해야 한다
  • 필요할 때 초기화를 언제든 몇번이든 할 수 있다.
  • 초기화를 하지 않아도 메모리가 할당된다. (초기화 시 data영역에 존재)
int g_iValue;           // 본문 선언
extern int g_iValue;    // 다른 파일에서 선언 후 사용

2. 전역 변수(Static Variable)

  • 한 번 할당된 변수의 메모리와 값은 프로그램이 종료될 때까지 유지된다. (=lifetime 프로그램 종료시.)
  • 해당 변수가 선언된 파일, 함수내에서만 접근 가능하다.
  • 선언 시 static 키워드를 반드시 사용해야 한다.
  • 초기화는 단 한번만 할 수 있으며 초기화는 반드시 소스 파일 에서 해야 한다.
  • 본문 / 다른 파일 사용 방법은 없음(x)
  • 초기화하지 않은 상태로 어느 곳에서도 사용되지 않으면 메모리가 할당되지 않는다. (초기화 시 data영역에 존재)
static int s_iValue;    // 본문 선언
  • 해당 클래스의 모든 인스턴스들의 공통적인 공유 자원(해당 클래스가 여러 개의 객체가 생성되어도 해당 변수는 단 한번만 생성되고 초기화된다.)
  • 객체가 생성되기 전에 이미 메모리가 할당되어, 생성자에서 초기화해줄 수 없다.
  • 각 인스턴스의 귀속 값이 아니기 때문에 호출 시, 클래스명을 명시하여 호출하는 것이 올바르다.
  • C++에서 정적 멤버란 클래스에는 속하지만, 객체 별로 할당되지 않고 클래스의 모든 객체가 공유하는 멤버를 의미합니다.
  • 멤버 변수가 정적(static)으로 선언되면, 해당 클래스의 모든 객체에 대해 하나의 데이터만이 유지 관리됩니다.
  • 정적 멤버 변수는 클래스 영역에서 선언되지만, 정의는 파일 영역에서 수행됩니다.
  • 이러한 정적 멤버 변수는 외부 연결(external linkage)을 가지므로, 여러 파일에서 접근할 수 있습니다
  • 정적 멤버 변수에도 클래스 멤버의 접근 제한 규칙이 적용되므로, 클래스의 멤버 함수나 프렌드만이 접근할 수 있습니다.
  • 하지만 정적 멤버 변수를 외부에서도 접근할 수 있게 하고 싶으면, 정적 멤버 변수를 public 영역에 선언하면 됩니다.
this.m_iValue   // (x)
Price::m_iValue // (o) 올바른 표현

예제

class Person

{

private:

    string name_;

    int age_;

public:

    static int person_count_;            // 정적 멤버 변수의 선언

    Person(const string& name, int age); // 생성자

    ~Person() { person_count_--; }       // 소멸자

    void ShowPersonInfo();

};  

...

int Person::person_count_ = 0; // 정적 멤버 변수의 정의 및 초기화

실행 결과

1 번째 사람이 생성되었습니다.

이 사람의 이름은 길동이고, 나이는 29살입니다.

2 번째 사람이 생성되었습니다.

이 사람의 이름은 순신이고, 나이는 35살입니다.

(정적 함수)[http://tcpschool.com/cpp/cpp_encapsulation_staticConst]

  • C++에서는 클래스의 멤버 함수도 정적(static)으로 선언할 수 있습니다.
  • 이렇게 선언된 정적 멤버 함수는 해당 클래스의 객체를 생성하지 않고도, 클래스 이름만으로 호출할 수 있습니다.
  • 정적 멤버 함수는 정적 멤버 변수를 선언하는 방법과 같이 static 키워드를 사용하여 선언합니다.
  • 이러한 정적 멤버 함수는 다음과 같은 특징을 갖습니다.
    1. 객체를 생성하지 않고 클래스 이름만으로 호출할 수 있습니다.
    2. 객체를 생성하지 않으므로, this 포인터를 가지지 않습니다
    3. 특정 객체와 결합하지 않으므로, 정적 멤버 변수밖에 사용할 수 없습니다.

예제

class Person

{

private:

    string name_;

    int age_;

public:

    static int person_count_;            // 정적 멤버 변수의 선언

    static int person_count();           // 정적 멤버 함수의 선언

    Person(const string& name, int age); // 생성자

    ~Person() { person_count_--; }       // 소멸자

    void ShowPersonInfo();

};

...

int Person::person_count_ = 0; // 정적 멤버 변수의 정의 및 초기화

...

int Person::person_count()     // 정적 멤버 함수의 정의

{

    return person_count_;

}

실행 결과

1 번째 사람이 생성되었습니다.

2 번째 사람이 생성되었습니다.

현재까지 생성된 총 인원 수는 2명입니다.

Exercise

Main.cpp

#include <iostream>
#include "user.h"

using namespace std;
/*static properties and static methods */

int main()
{


    cout << User::getCounter() << endl;

    return 0;
}

user.h

#ifndef USER_H_INCLUDED
#define USER_H_INCLUDED

class User
{
        int ID;
        static int counter;
    public:
        User();
        ~User();
        int getID() { return ID; }
        static int getCounter() { return counter; }
};

#endif // USER_H_INCLUDED

farm.cpp

#include "user.h"

int User::counter = 0;

User::User()
{
    counter++;
    ID = counter;
}
User::~User()
{

}


Comment  Read more