[독서후기] 기계 요소 설계 (3판)

태생이 전자 공돌이라, 소프트웨어까진 어떻게 해본다 쳐도, 기구설계는 완전 다른 이야기인듯 하다. 물론 요즘에야 개발 도구들이 잘 되어 있어 뚝딱뚝딱 만들어 볼수 있다곤 하지만, 그래도 기본적인 사항은 알아야 이해를 하고 만들어볼 수 있는 듯.

3D 프린터를 좀더 알차게 사용해보고 싶은 마음에, 서점 간 김에 그래도 좀 예제가 많아보이는 책을 구입했다. 기초적인 요소들에 대한 설명과 각종 수치들이 있고, 한국에선 요런거 사용함 등등의 내용이 보인다. 아주 자세히 보진 못하겠지만, 간단한 기구 설계할 때 유용하게 사용할 수 있을 듯 하다.

교보문고: http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788942907403&orderClick=LAH&Kc=#N

Advertisements

[독서후기] 칼만 필터는 어렵지 않아

아마 예전 책 제목은 “칼만 필터의 이해”였던 것 같다. 칼만필터를 로봇에 적용해서 사용하긴 하는데 (OpenCV에서 함수 형태로 있으니…) 이게 어떻게 동작하는 것인지, 왜 적용해야 하는지에 대한 궁금함이 항상 있던 차에 예전 판본을 보고 이해했던 기억이 난다.

이번에 새로 개정되어 제목도 바뀌어 출시되었길래, 또 다시 구입했다. 내용도 약간 증가한듯 하고, 비록 매틀랩 코드이지만 예제도 잘 구현되어 있다. (이걸 파이썬이나 다른 언어로 바꾸는거야 머, 쉬운 작업이니)

교보문고: http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791156644415&orderClick=LEB&Kc=

소라게 집 바꿔주기

한달 전 쯤? 아들 녀석이 방과후 학교에서 소라게 한마리를 가지고 왔습니다. 조그만 플라스틱 케이스와 젤리처럼 생긴 먹이 하나와 같이요. 사실 며칠 지나지 않아 죽거나 할 줄 알았는데 의외로? 한달이 지났는데도 잘 지내고, 밤이 되면 부스럭부스럭 조그만 케이스를 탈출하고자 노력하더군요. ㅠㅠ

인터넷을 검색해보니 소라게의 수명이 엄청 길더라고요. 자연에서 사는 녀석들은 몇십년을 산다고도 하고… 암튼 이대로는 안되겠다 싶어 인터넷을 검색해보고, 다이소에서 적당한 집 (큰 플라스틱 케이스)을 사오고, 코코칩이라 불리는 바닥재, 먹이용 젤리를 주문했습니다.

두텁게 코코칩을 깔아주고, 소라게를 새로운 집에 옮겨주고 젤리를 하나 까서 같이 놓아주었습니다.

원래 소라게의 습성이 어두운 밤에 주로 움직이고, 저런 코코칩 같은 바닥재를 깔아주면 파고 들어가서 산다고 하네요. 지금도 계속 바닥으로 파고들고, 가끔씩 먹이 있는 쪽으로 움직여 젤리를 파먹고 하고 있습니다. 새로운 집을 맘에 들어 하는 것 같습니다.

바닥재는 3주 정도에 한번씩 갈아주고, 그 동안은 너무 건조해지지 않도록 스프레이로 물을 조금씩 뿌려주면 되고, 젤리도 갈아주면 된다고 합니다. 혼자는 외로워할테니 한마리 더 넣어줘도 좋을듯 한데… 저 녀석이 암컷인지 숫컷인지 알 방법이 없네요.?? ^^

스팸무스비

이름은 뭔가 있어보이는데, 그냥 스팸 들어간 김밥인데 모양은 좀 다른 것. 아주~ 간단히 만들수 있고 재료를 좀더 추가하면 고급스럽게도 만들수 있다.

재료: 밥 2공기, 참기름 두 큰술, 깨소금 약간, 소금 약간, 스팸 작은 통 하나, 김밥용 김 2장.

  1. 밥 2공기를 큰 그릇에 덜어놓고 한소큼 식힌다. 참기름 혹은 들기름 2 큰술, 소금 약간, 깨소금 약간 넣고 잘 섞어준다. 밥의 간은 약간 싱겁게 해야 나중에 스팸의 간과 섞여 괜찮다.
  2. 스팸 작은 통을 열고 다 꺼낸 다음 스팸통 길이 방향으로 4개로 나눈다.
  3. 자른 스팸은 후라이팬에 잘 구워준다.
  4. 투명랩을 좀 크게 잘라, 빈 스팸통에 잘 깔아준다.
  5. 밥을 통의 1/3민큼 채우고, 그 다음 구운 스팸을 넣어준다.
  6. 나머지 공간을 또 밥으로 채운다.
  7. 랩을 잘 싸서 꺼낸다.
  8. 4 ~ 7 과정을 반복.
  9. 김밥용 김을 반으로 나눈다.
  10. 8번까지 만든 것을 김밥 중앙에 넣고, 김을 잘 싸준다.
  11. 먹기 좋게 썰어서 먹는다.

스팸 이외에 계란스크램플, 볶음양파, 볶음 김치 등을 추가해서 싸 먹어도 별미임.

끝!

Blockly 블럭 만들기 #1

Blockly는 사용자가 원하는 기능의 블럭을 자유롭게 만들수 있다. 기본 제공된 블럭 외에 사용자의 로봇이나 기타 기능과 연동하기 위한 블럭을 생성하고, 이를 툴박스에 넣어 사용하면 된다.

Blockly는 이러한 블럭들을 쉽게 만들수 있도록 도구를 제공한다. 재밌게도 블럭을 생성하는 것도 블럭으로 만든다. 물론 나중에 좀 익숙해지만 텍스트로 편집하는게 좀더 쉬울 수 있지만, 제공되는 도구를 이용하면 생성되는 블럭 모양을 확인하면서 수정이 가능하다.

먼저 Blockly Developer Tools를 사용해보자. 사파리나 크롬 등 브라우저를 열고 (https://blockly-demo.appspot.com/static/demos/blockfactory/index.html)으로 이동한다.

위와 같은 화면이 나오는데, 왼쪽은 블럭을 생성하기 위한 블럭 코딩 영역, 오른쪽 상단엔 생성된 블럭 모양을 실시간으로 확인이 가능하고, 오른쪽 중앙엔 추후 코드에 삽입하기 위한 JSON 코드, 오른쪽 하단엔 블럭을 실제 코드로 생성하기 위한 generator 코드가 생성된다.

일단 흐름을 보기 위해 아주 간단한 블럭을 생성해보도록 한다. 사용자의 문자열 입력을 받아 console에 출력하는 블럭을 만들어 보록 한다. 먼저 블럭의 name을 수정한다. 여기선 console_print로 한다.

다음으로 이 블럭은 다른 블럭들과 상하 연결하여 사용 가능해야 하므로, connection을 top+bottom connections로 변경한다. 이렇게 되면 미리보기 창의 블럭 모양이 변경됨을 볼 수 있다.

다음으로 사용자의 문자열을 입력 받아야 한다. 왼쪽 툴박스 창에서 Input 카테고리내에 value input 블럭을 inputs에 추가한다. 이 입력을 받아서 내부에서 처리하기 위한 변수명은 value_input 옆에 있는 NAME이다. 이를 필요에 따라 적절하게 수정한다.

이제 블럭에 기능을 설명하기 위한 텍스트 블럭을 추가한다. (Field 카테고리 Text 블럭)

입력은 Text만 받아야 하므로, 입력 type에 String 블럭을 추가한다.

마지막으로 블럭의 색상과, 이 블럭을 사용하는데 필요한 tooltip, help url 등을 입력한다.

이제 생성된 블럭의 모양을 확인해보면,

와 같이 간단한 모양의 블럭이 생성되었다. 생성된 JSON 코드를 확인해보면,

{
  "type": "console_print",
  "message0": "console print %1",
  "args0": [
    {
      "type": "input_value",
      "name": "NAME",
      "check": "String"
    }
  ],
  "previousStatement": null,
  "nextStatement": null,
  "colour": 330,
  "tooltip": "Block for printing the user message",
  "helpUrl": "https://ahnbk.com"
}

그리고, 이와 같이 생성된 Generator stub을 보면,

Blockly.JavaScript['console_print'] = function(block) {
  var value_name = Blockly.JavaScript.valueToCode(block, 'NAME', Blockly.JavaScript.ORDER_ATOMIC);
  // TODO: Assemble JavaScript into code variable.
  var code = '...;\n';
  return code;
};

와 같이 되어 있다. 자 이제 블럭이 생성되었으므로, 이를 지난번에 만들었던 예제에 생성된 블럭을 추가해보도록 한다. 예제 디렉토리로 이동하여, my_blocks.js 파일을 생성하고, 다음과 같이 입력한다.

'use strict';

goog.require('Blockly.Blocks');
goog.require('Blockly');

Blockly.defineBlocksWithJsonArray(
[
    // insert blocks here

]);

이제 “insert blocks here 부분에 위에서 생성된 코드를 붙여 넣는다.

'use strict';

goog.require('Blockly.Blocks');
goog.require('Blockly');

Blockly.defineBlocksWithJsonArray(
[
    {
        "type": "console_print",
        "message0": "console print %1",
        "args0": [
          {
            "type": "input_value",
            "name": "NAME",
            "check": "String"
          }
        ],
        "previousStatement": null,
        "nextStatement": null,
        "colour": 330,
        "tooltip": "Block for printing the user message",
        "helpUrl": "https://ahnbk.com"
      },
]);

저장한 다음, index.html 파일을 열고 위 파일을 로딩하도록 추가한다.

<!DOCTYPE html>
<!-- HTML file to host Blockly in a mobile WebView. -->
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <style type="text/css">
    html, body, #blocklyDiv {
      border: 0;
      height: 100%;
      margin: 0;
      padding: 0;
      width: 100%;
    }
  </style>
  <script src="blockly_compressed.js"></script>
  <script src="blocks_compressed.js"></script>
  <!-- TODO: Select msg file based on locale. -->
  <script src="msg/js/en.js"></script>
  <script src="toolbox_standard.js"></script>
  <script src="my_blocks.js"></script>
</head>
<body>
  <div id="blocklyDiv"></div>
  <script type="text/javascript">
    var workspacePlayground = Blockly.inject('blocklyDiv', {
          media: 'media/',
          toolbox: BLOCKLY_TOOLBOX_XML['standard'],
          zoom: {controls: true}
        });
  </script>
</body>
</html>

바로 이전 포스팅에서 만든 Custom 카테고리에 생성된 블럭을 추가한다.

+ '<category name="Custom" colour="100">'
+   '<block type="console_print">'
+   '</block>'
+ '</category>'

자, 이제 예제를 다시 열어보면,

Custom 카테고리에 console print 블럭이 추가되어 있음을 볼 수있다. 만약 문자열 입력에 default 값을 넣어 주고 싶다면, 툴박스에 코드를 다음과 같이 수정한다.

+ '<category name="Custom" colour="100">'
+   '<block type="console_print">'
+     '<value name="NAME">'
+       '<shadow type="text">'
+         '<field name="TEXT">Hello Blockly</field>'
+       '</shadow>'
+     '</value>'
+   '</block>'
+ '</category>'

이제 다시 예제를 확인해보면,

와 같이 되어 있음을 확인할 수 있다. 다음엔 좀더 다양한 모양의 블럭을 만들어보록 한다.