로봇 조립 중 다이나믹셀의 전선을 바짝 붙여야 할 일이 생겼습니다. 전선이야 케이블타이로 잘 정리하면 되겠지만 그렇게 묶은 전선이 로봇 관절이 움직일때 영향을 줄 수도 있어서 정리하기 위한 커버가 필요했습니다.
사용하려는 모델은 H42P-020-S300-R 이고, 프로 모델 중에선 가장 작은 타입입니다.
다행스럽게 로보티즈에서 도면 및 step 모델 등을 제공해주므로 쉽게 만들수 있습니다. 일단 onshape.com으로 가서, 다운로드한 모터의 step 파일을 업로드해서 만듭니다.
이제 모델의 크기를 반영해서 커버를 만들어줍니다. 전선이 지나갈 홈도 파 주고요. 다 그렸으면 어셈블리로 모터에 붙여서 크기가 잘 맞는지 확인해봅니다.
잘 맞는것 같네요. 이제 이걸 stl 파일로 export하고, 슬라이서 프로그램을 통해 gcode를 생성해줍니다. 양쪽 두개가 필요하니까 한꺼번에 두개를 배치하고 생성!. 표면이 거칠어도 사용하는데는 큰 무리가 없으니, 적측두깨는 0.2mm로 강도는 좀 있어야 하니 채움은 30% 정도?
M5Stack은 ESP32를 사용하여 만들어진 개발용 킷트이다. 현재 참여하고 있는 EduBot에도 ESP32가 들어가는데, 이번에 구입한 FIRE 버전은 16M Flash와 4M PSRAM을 가진 ESP32가 들어가 있다. (좀더 용량이 낭낭하게 많아졌단 얘기, 램도.. 어쨌든 다다익선).
현재 알리익스프레스에서 팔고 있고, 한국에서도 위즈넷(?)이란 곳에서 판매하고 있다고 한다.
가격은 대략 7만원 ~ 8만원대인데, 구성이 상당히 알차게 들어 있다. 마이크, 스피커, BLE, WiFi, 가속도, 자이로, 지자기센서, LCD, 버튼, RGB LED 등등 단독으로 사용해도 뭔가 재밌는 것을 만들어볼수 있을 것 같다. 물론 확장포트도 있어서, 외부센서를 추가로 연결할 수 있다. 배터리도 내장되어 있어 충전독 혹은 USB-C 케이블을 이용하여 충전한다.
io.m5go.com 웹페이지를 이용하여 온라인으로 블럭코딩 및 코딩을 하여 M5Stack를 제어할 수 있다. WiFi가 지원된다는 이점을 활용한 것 같다.
위 웹페이지에서 만든 블럭코딩 결과물을 실행하면, 현재 내가 갖고 있는 M5Stack에서 바로 실행된다. (WiFi가 연결되지 않으면 당연히 사용할 수 없음)
코어 성능도 빠방하고, 직접 개발시 Arduino Sketch를 사용하고 M5Stack에 대한 Library도 충분히 지원되니 환경 설정에 애먹고 시간을 허비하는 일은 거의 없을 듯 하다.
이외에도 요새 유행한다는 마이크로 Python도 돌아간다고 하고… 뭐 용도는 무궁무진할 듯.
받은 파일을 ~/Developer에 풀고, 디렉토리 이름을 closure-library로 변경한다.
$ cd ~/Developer
$ tar zxf ~/Downloads/google-closure-library-v20190301-20-gde66a8a.tar.gz
$ mv google-closure-library-de66a8a closure-library
이제 다시 blockly 디렉토리로 이동하여 빌드한다.
$ cd blockly-1.20190215.0
$ ./build.py
여러 메시지가 쭈욱 나오고, 에러가 없이 마무리되면 다음과 같은 파일이 생성된다. (이미 컴파일된 파일이 있긴 하지만, 업데이트 된다) 만약 java.lang.RuntimeException: INTERNAL COMPILER ERROR와 같은 에러가 발생한다면, 잠시후 다시 실행하면 정상적으로 빌드 된다.
...
SUCCESS: msg/js/tlh.js
SUCCESS: msg/js/ba.js
SUCCESS: blockly_uncompressed.js
SUCCESS: blockly_accessible_uncompressed.js
SUCCESS: blockly_compressed.js
Size changed from 2637 KB to 780 KB (30%).
SUCCESS: blockly_accessible_compressed.js
Size changed from 2739 KB to 826 KB (30%).
SUCCESS: blocks_compressed.js
Size changed from 154 KB to 74 KB (48%).
SUCCESS: javascript_compressed.js
Size changed from 85 KB to 47 KB (56%).
SUCCESS: python_compressed.js
Size changed from 71 KB to 36 KB (51%).
SUCCESS: php_compressed.js
Size changed from 74 KB to 38 KB (52%).
SUCCESS: lua_compressed.js
Size changed from 66 KB to 33 KB (50%).
SUCCESS: dart_compressed.js
Size changed from 78 KB to 41 KB (52%).
인두기를 구입할 때 납걸이 (릴납 스탠드)를 같이 구매했어야 됐는데, 시기를 놓치니 그냥 귀찮더라도 릴납에서 납을 조금씩 풀어서 사용하고 있었습니다. 대충 6,000원 정도 하는데 그것만 주문하기도 좀 애매하기도 했고, 다른 것 주문할 땐 꼭 까먹더라고요.
3D 프린터도 요즘 슬슬 사용하고 있겠다, 모델링 하는 것도 어렵진 않아서 사용하고 있는 릴납 기준으로 납걸이를 만들어보았습니다. 사용하고 있는 실납입니다, (http://eleparts.co.kr/goods/view?no=3224253)유연 실납으로 땜질할 때도 냄새도 거의 나지 않고, 품질도 좋습니다. 저정도 양이면… 특별한 일이 없는 한 거의 평생 사용할 것 같네요.
크기는 자를 이용해서 가운데 봉이 들어갈 부분의 지름과 전체 길이, 전체 지름 등을 재고, onshape.com에서 모델을 만듭니다. 총 3개의 파트로 구성되고, 베이스, 릴납이 끼워질 부분, 양쪽으로 움직이지 못하게 하는 마개 부분이네요.
이제 이것을 STL 파일로 변환해서 슬라이서 툴에 넣고, gcode를 생성합니다. 워낙 단순 생김새이니 infill은 15%, 적층두께는 0.2mm로 좀더 빠르게 설정했습니다. 필라멘트 색상을 교환해 가면서 뽑으면 좀더 이쁘겠지만, 역시 귀차니즘에 의해서 그레이 색상으로 통일.
Blockly (블럭클리?, 블로키?)는 구글에서 오픈소스로 개발하고 있는 visual programming editors (소위 블럭코딩)을 개발하기 위한 Javascript 라이브러리이다. Scratch 3.0도 블럭을 제어하기 위한 부분은 Blockly 라이브러리를 가져와 수정하여 사용하고 있다.
대다수의 블럭코딩 툴들이 Blockly를 기반으로 개발되고 있다. 라이센스는 Apach 2.0을 사용하며, 소스는 https://github.com/google/blockly에 있다. 상업적 사용이 가능하고, 변경 및 배포에 아무런 제약이 없다.
Scratch 3.0이 그만의 프레임웍에 맞추어 개발해야 했다면, Blockly는 사용자가 자유롭게 변형하여 목적에 맞는 프로그램을 개발 가능하다.
블럭으로 만들어놓은 부분을 각종 언어 (Javascript, Pythom, Lua, Dart 등)로 생성이 가능하다. 또 사용자가 원하는 블럭도 생성이 가능하다. 코어가 Javascript로 되어 있어, 웹은 물론 Android, iOS에서도 WebView를 통해 실행이 가능하다. (동일한 코드로)
모든 개발이 완료되고, 배포를 해야 하는 경우에 윈도우의 경우 exe 파일, macOS의 경우 .app으로 패키징하여야 한다. 물론 소스 파일을 배포하고 사용자가 지난번 포스팅(https://ahnbk.com/?p=366, https://ahnbk.com/?p=383)과 같이 개발환경을 갖추어서 실행할 수 있지만 매우 복잡하고, 릴리즈 모드가 아닌 관계로 살짝 느린 면이있다.
Scratch 3.0은 React.js를 사용하여 개발되었다. 즉 이를 실행하기 위해선 웹브라우저가 필요하다. 개발 시에는 webpack-dev-server를 이용하였다. 이를 대체할 것이 필요한데, 이때 필요한 것이 Electron(https://electronjs.org)이다.
Electron은 NodeJS, Chromium을 이용하여 JavaScript, HTML, CSS를 이용하여 동일한 소스로 Windows, macOS, Linux 등에서 실행 가능한 Desktop 앱을 개발할 수 있는 플랫폼이다.
Electron은 npm을 이용하여 쉽게 설치할 수 있다.
$ npm install -g electron
다음으로 지금까지 개발한 Scratch 3.0을 릴리즈 형태로 빌드한다. Scratch-gui 디렉토리로 이동하여 다음과 같이 입력한다.
$ cd scratch-gui
$ npm run-script build
이제 빌드가 완료되면, build 디렉토리에 release 모드로 빌드된 파일들이 생성되어 있음을 볼 수 있다.
이제 편의상 scratch-app 디렉토리를 하나 생성하고 위 build 디렉토리를 복사한다. 다음으로 election 앱을 만들기 위해 다음과 같이 입력한다.
$ cd scratch-app
$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help json` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
package name: (scratch-app)
version: (1.0.0)
description: Scratch 3.0 for OROCA Edubot
entry point: (index.js) main.js
test command:
git repository:
keywords: scratch, oroca, edubot, block-coding
author: Byeong-Kyu Ahn
license: (ISC) BSD-2-Clause
About to write to /Users/byeongkyu/Developer/scratch/scratch-app/package.json:
{
"name": "scratch-app",
"version": "1.0.0",
"description": "Scratch 3.0 for OROCA Edubot",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"scratch",
"oroca",
"edubot",
"block-coding"
],
"author": "Byeong-Kyu Ahn",
"license": "BSD-2-Clause"
}
Is this OK? (yes)
위와 같이 사용자의 환경에 맞추어 입력하게 되면, package.json 파일이 생성되어 있음을 볼수 있다. package.json 파일을 에디터를 이용해 다음과 같이 수정한다.
먼저 확장카드에 대한 부분을 수정해보록 한다. 지난번 설명했던 바와 같이, 확장카드는 scratch/scratch-gui/src/lib/libraries/extensions/index.jsx 파일 내에 위치한다. Edubot의 경우엔 다음과 같이 되어 있다.
{
name: 'OROCA Edubot',
extensionId: 'edubot',
collaborator: 'OROCA',
iconURL: edubotImage,
insetIconURL: edubotMenuImage,
description: (
<FormattedMessage
defaultMessage="Play with powerful small robot!"
description="Description for the 'OROCA_Edubot' extension"
id="gui.extension.edubot.description"
/>
),
featured: true,
disabled: false,
bluetoothRequired: true,
launchPeripheralConnectionFlow: true,
useAutoScan: false,
peripheralImage: edubotPeripheralImage,
smallPeripheralImage: edubotMenuImage,
connectingMessage: (
<FormattedMessage
defaultMessage="Connecting"
description="Message to help people connect to their edubot."
id="gui.extension.edubot.connectingMessage"
/>
),
helpLink: 'https://github.com/oroca/OROCA-EduBot'
},
여기에서 다국어 지원이 가능한 부분은 description의 “Play with powerful small robot!”과 connectingMessage의 “Connecting”이다. 이 부분은 각각 gui.extension.edubot.description과 gui.extension.edubot.connectingMessage와 같은 id를 가지고 있다.
이제 다시 scratch-l10n으로 가서 다음의 경로에 있는 파일을 수정한다.
scratch/scratch-l10n/editor/interface/en.js
파일을 열고, 임의의 곳에 다음과 같이 입력한다.
"gui.extension.edubot.description": "Play with powerful small robot!",
"gui.extension.edubot.connectingMessage": "Connecting",
이제 한국어를 지원하게 하려면, 같은 경로의 ko.js 파일을 열고 다음과 같이 입력한다.
"gui.extension.edubot.description": "조그맣지만 강력한 로봇과 놀아보세요.",
"gui.extension.edubot.connectingMessage": "연결 중",
저장한 다음, 빌드한다. 실제로 빌드를 하여야 scratch-gui에서 사용할 수 있는 파일이 만들어진다.
$ cd scratch/scratch-l10n
$ npm run-script build
빌드 과정이 완료되면, dist와 locales 디렉토리가 생성되고 위에서 수정된 내용을 반영하여 파일을 만들어준다. 이제 Scratch를 실행하고, 잘 적용되었는지 확인해본다.
다국어의 선택은 왼쪽 상단의 지구본 모양을 눌러서 선택한다.
먼저 영어 버전은 다음과 같다.
다음으로 인터페이스를 한국어로 바꾸면,
한글도 잘 적용됨을 볼 수 있다.
확장블럭
블럭들도 위와 마찬가지로 각 요소별로 id를 가지고 있다. 이 id를 각 언어에 맞추어 작성해주면 된다. 반복 작업이 대부분이므로 한가지 예만 들어보도록 한다. Edubot의 블럭 중 버튼에 관련된 다음의 블럭에 대해 한국어로 표시되게끔 해보도록 한다.
위 블럭에 대한 서술은 scratch/scratch-vm/src/extensions/scratch3_edubot/index.js 파일에 있다. getInfo() 함수 내에
{
opcode: 'whenButtonPressed',
text: formatMessage({
id: 'edubot.whenButtonPressed',
default: 'when button pressed',
description: 'when the button on the edubot is pressed'
}),
blockType: BlockType.HAT,
arguments: {
}
},
{
opcode: 'isButtonPressed',
text: formatMessage({
id: 'edubot.isButtonPressed',
default: 'button pressed?',
description: 'is the button on the edubot pressed?'
}),
blockType: BlockType.BOOLEAN,
arguments: {
}
},
와 같이 되어 있는데, 좀 전과 마찬가지로 각 텍스트에 대해 id가 부여되어 있음을 볼수 있다. 따라서 이에 대한 부분을 수정해주면 된다. 블럭에 관련한 부분은 scratch/scratch-l10n/editor/extensions 디렉토리에 있다. 먼저 영어 대한 부분부터 작성한다. en.js 파일을 열고 임의의 위치에 다음과 같이 입력한다.
이제 Scratch Link와 확장블럭에 대한 모든 것이 준비되었으니 실제 사용해보록 한다.
지난번 포스팅에서 언급했던 개발환경 (https://ahnbk.com/?p=366)은 모두 갖춰져 있다는 가정하에 진행한다.
scratch 3.0의 원래 소스를 가져와 현재 작업중인 OROCA-EduBot에 대한 확장블럭을 작성하였다. 수정된 소스는 다음의 링크에서 확인 가능하다. 지난번과는 달리 scratch-blocks에 대한 부분은 현재까진 수정할 필요가 없으므로, 이는 사용하지 않는다.
Scratch 3.0에서 외부 기기 및 서비스를 이용하기 위해선 Scratch Link를 사용해야 한다. 물론 확장 프로그램에서 직접 하드웨어에 접속하게 해도 되지만, Scratch 개발자들은 다양한 하드웨어를 같은 프로토콜로 연결하기 위해 Scratch Link를 외부에 실행하고, 이를 통해 하드웨어와 연결한다.
Scratch와 Scratch Link는 websocket을 이용하여 통신한다. 패킷 내용은 까보면 json으로 구성되어 있다. Scratch Link는 시리얼통신 (블루투스 시리얼 포함), Bluetooth LE를 이용해 외부 하드웨어와 연결한다. Linux, macOS의 경우 위 기능을 모두 지원하나, 윈도우의 경우 10버전에서만 Bluetooth LE를 지원한다.
Scratch Link는 아직 소스가 공개되어 있지 않으므로, 설치하기 위해선 다음의 링크를 이용한다.
Scratch Link를 사용하기 위해선 hosts 파일의 수정이 필요하다. 이유는 모르겠지만 Scratch Link의 서버 주소가 Local에서 실행되고 있음에도 불구하고 device-manager.scratch.mit.edu로 되어 있기 때문에 그냥 사용하게 되면 연결이 되지 않는다. 따라서 위 주소를 Local로 접속하도록 만들어야 되는데, 이를 위해 hosts 파일을 수정한다.
macOS
macOS에서 hosts 수정은 아주 간단하다. 터미널을 열고
$ sudo vi /etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
127.0.0.1 device-manager.scratch.mit.edu
255.255.255.255 broadcasthost
::1 localhost
시스템 파일이기 때문에, 계정 암호가 필요하다. 위와 같이 수정하고 저장한다. 그 다음
$ ping device-manager.scratch.mit.edu
PING device-manager.scratch.mit.edu (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.045 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.053 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.107 ms
...
와 같이 나오면 성공.
Windows 10
윈도우의 hosts 파일은 C:\Windows\System32\drivers\etc에 위치한다. 하지만 직접 수정하는 것을 막아놨기 때문에, 탐색기로 위 위치로 이동한 후 hosts 파일을 임의의 위치로 복사한다.
Notepad나 기타 편집기를 이용하여, 다음과 같이 수정한다.
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host
127.0.0.1 device-manager.scratch.mit.edu
그런 다음 수정된 파일을 C:\Windows\System32\drivers\etc에 복사해 넣는다.
와 같이 나오고, 덮어 씌우겠다고 선택하면,
와 같이 나오는데, Continue를 눌러 진행한다. 그런 다음 코맨드 창을 열고 ping을 테스트해보면,
와 같이 나오면 성공.
설치된 Scratch Link를 실행하면 websocket 서버가 백그라운드에서 실행된다.
Scratch가 3.0으로 버전이 올라가면서 사용자가 확장 블럭 (Extension)을 추가하는 것이 좀더 간단해졌다. 확장 블럭은 Scratch의 기본 기능 외에 다양한 하드웨어나 클라우드 서비스의 기능을 사용할 수 있는 것인데, 메인 화면 왼쪽 하단의 버튼을 눌러 추가한다.
Scratch에 기본적으로 포함되어 있는 확장 블럭은 다음과 같다. 외부 기기나 하드웨어 클라우드 서비스 등이 포함된다.
이제 이것들 이외에 사용자만의 블럭을 추가 할 수 있다. 이 작업은 크게 두가지로 나뉠 수 있는데, 처음은 위 화면에서 본것과 같은 확장 카드를 추가하기, 다음으론 확장 블럭 생성하기이다.
먼저 사용할 이미지를 준비한다. 위 확장 카드에서 가장 크게 보이는 이미지로, 크기는 600×372 이고, png 타입이다.
준비된 이미지를 다음의 경로에 복사한다. (경로는 앞 포스트에서 설명한 경로를 기준으로 설명함).
다음으로 확장카드에 들어갈 작은 이미지와 추후 메인화면의 카테고리에 들어갈 중간 사이즈의 이미지를 준비한다. 이 이미지는 가급적이면 SVG 타입의 벡터 이미지를 사용한다. (벡터 이미지는 Illustrator, Sketch, Affinity Designer 등의 툴을 사용하면 쉽게 생성 가능)
import edubotImage from './edubot.png';
import edubotPeripheralImage from './peripheral-connection/edubot/edubot-illustration.svg';
import edubotMenuImage from './peripheral-connection/edubot/edubot-small.svg';
이제 중간 쯤 적당한 곳에 블럭 생성을 위한 코드 삽입.
{
name: 'OROCA_Edubot',
extensionId: 'edubot',
collaborator: 'OROCA',
iconURL: edubotImage,
insetIconURL: edubotMenuImage,
description: (
<FormattedMessage
defaultMessage="Play with powerful small robot!"
description="Description for the 'OROCA_Edubot' extension"
id="gui.extension.oroca_edubot.description"
/>
),
featured: true,
disabled: false,
bluetoothRequired: true,
launchPeripheralConnectionFlow: true,
useAutoScan: false,
peripheralImage: edubotPeripheralImage,
smallPeripheralImage: edubotMenuImage,
connectingMessage: (
<FormattedMessage
defaultMessage="Connecting"
description="Message to help people connect to their edubot."
id="gui.extension.edubot.connectingMessage"
/>
),
helpLink: 'https://github.com/oroca/OROCA-EduBot'
},
각 설정값의 의미는 다음과 같다.
이외에도
extensionId: 확장블럭에 대한 고유 이름
launchPeripheralConnectionFlow: 선택시 기기를 연결하기 위한 다이얼로그를 실행할 지 여부
useAutoScan: 다이얼로그를 띄운 뒤, 자동 스캔 시작 여부
일단 저렇게 수정한 파일을 저장한다. 다음으로 확장블럭에 대한 파일을 작성한다. 해당 경로는 다음과 같다.
~/Developer/scratch/scratch-vm/src/extensions
위 디렉토리에 확장 블럭의 파일을 위한 디렉토리를 생성하고, index.js 파일을 생성한다. index.js 파일의 템플릿은 ~/Developer/scratch/scratch-gui/src/examples/extensions/example-extension.js 를 참고한다.
아래의 설명에서 디렉토리의 경로는 macOS를 기준으로 설명하나, 다른 OS에서도 유사하므로 감안하여 사용하도록 한다.
Scratch는 크게 세개의 파트로 구성되어 있다. 사용자가 직접 Interaction 할 수 있는 GUI를 제공하는 scratch-gui, Scratch의 실행 (Back-end)을 담당하는 scratch-vm, Scratch의 블럭 디자인 및 블럭간의 연결, 관리 등을 담당하는 scratch-blocks이다.
실제론 위 세개의 Repository를 자신의 Repository로 Fork하여 사용하는 것을 권장하고 있다. 위와 같이 공식 Repository를 Clone하여 사용하는 경우, 개발자가 수정한 다음 commit 및 push가 불가능 하므로 (승인없이는), github의 계정을 생성하고 위 Repository를 Fork하여 사용하도록 한다.
scratch-blocks는 사용자가 수정할만한 요소가 없다. 따라서 이 설치 과정에서 scratch-blocks는 건너뛰어도 됨.
이제 https://github.com/llk/scratch-gui, https://github.com/llk/scratch-vm, https://github.com/llk/scratch-blocks를 Fork 하여 자신의 Repository로 가져온다.
이제 Scratch의 소스를 받아온다. 임의의 디렉토리를 생성하고 (여기선 ~/Developer/scratch) 이동한 후 다음과 같이 입력한다.
$ cd scratch-vm
$ npm install
$ npm link
--- 이과정은 무시 ---
$ cd ../scratch-blocks
$ npm install
$ npm link
--- 이과정은 무시 ---
$ cd ../scratch-gui
$ npm install
$ npm link scratch-vm
참고로 npm link 명령은 local (현재 PC)에 저장된 모듈을 사용하겠다는 의미이다. 따라서 scratch-gui에서 scratch-blocks와 scratch-vm은 온라인에서 받아오는게 아닌 우리가 받아서 저장한 것을 사용한다. 실제 위 명령을 실행하고 난 다음의 결과 메시지가 다음과 같이 보인다.
Scratch (https://scratch.mit.edu)는 전세계적으로 가장 널리 알려진 블럭 코딩 툴이다. 다른 거의 대부분의 블럭 코딩 도구들이 참조를 하고 있고, 거의 유사한 형태로 개발되고 있기도 하다.
MIT 미디어랩의 Lifelong Kindergarten Group에서 프로젝트로 개발되고 있고, 이전 버전은 사용해보지 않아서 모르겠지만 3.0은 오픈소스 형태로 개발중이며, 사용하고 있는 거의 모든 소스를 공개해 놓고 있다.
블럭 관련한 부분은 구글 Blockly를 가져와 디자인, 일부 동작 관련한 부분을 수정하여 사용하고 있으며, 나머지는 그룹에서 자체 개발 중인듯 하다.
사용하고 싶은 기업이나 개발자들은 자유롭게 복사해서 수정, 재배포 등이 가능하다. Scratch의 스크린샷을 책이나 발표자료에 사용하는 것도 가능하며, 브로셔 등에도 삽입이 가능하다. 다만 각 자료에 다음과 같은 내용을 담아주길 권고하고 있다.
“Scratch is a coding language and online community where you can create your own interactive stories, games, and animations — and share your creations with others around the world. As young people create and share Scratch projects, they learn to think creatively, reason systematically, and work collaboratively. Scratch is a project of the Scratch Foundation in collaboration with the Lifelong Kindergarten group at the MIT Media Lab. It is available for free at https://scratch.mit.edu“
해결 방법을 찾아보면 9570 뿐만이 아니라, 외장 GPU를 사용하는 대부분의 델 랩탑에 해당되는 내용인듯. Ubuntu를 사용하다가 노트북을 닫거나, Sleep 모드로 전환 후 다시 노트북을 깨우려고 하면 멈춰버리는 현상이 발생함. 어쩔수 없이 강제 재부팅을 해야 되서 엄청 불편한데, 구글링 후 해결 방법을 찾아봄.
리디북스에서 가볍게 읽을만한 책을 고르다가 선택한 책. 영화 “딥 임팩트”의 원작(?)정도 되겠음. 딥 임펙트의 시대적 배경이 현재라면, 이 책의 배경은 미래의 얘기. 화성과 달에 사람들이 거주하고, 이미 한 세대가 지나 화성인, 지구인으로 구별되어 있을 정도로 먼 미래 얘기.
지구를 향해 다가오는 소행성을 처리하기 위해, 추진체를 소행성에 부착하여 궤도를 바꾸기 위해 노력한다든가, 이를 방해하기 위한 이상한 존재들과의 대립, 또 실패 후 우주선을 이용해 해결해보려는 노력 등.
영화와는 달리 목숨을 건 희생이 있진 않고, 나름 해피 엔딩으로 마무리 됨. 가볍게 술술 읽을만한 책.
지난번 구입했던 델은 순수하게 리눅스 작업용으로 사용 중입니다. 물론 윈도우도 필요할 때마다 사용중이긴 한데, 대부분 Ubuntu에서 ROS 패키지 개발 전용이죠.
기존에 사용하던 맥북 (MacBook Pro 15″ 2012mid)이 요즘따라 계속 버벅이고 발열도 심한 통에 간단한 문서 작업용으로만 사용 중이었는데 (이전엔 요녀석으로 Ubuntu/ROS 작업을 했습니다), 6년 정도 사용한 지금 이젠 보내줘야 할 듯 하여 새로운 녀석으로 구입하였습니다.
이 녀석도 오랜 기간 사용해야 할 녀석이기에 사양은 일단 가능 좋은 녀석으로 골랐는데, 가격이 거의 2배네요. ㅠㅠ.
CPU가 명성이 자자한 i9이어서 그런지, 뭔가 백그라운드에서 작업을 계속 해대서 그런지 발열도 살짝 나는것 같습니다만 이런 문제는 언제든지 잡힐테고요. 어쨌든 새로운 기기 사용해보는 것은 언제나 재밌습니다. 요녀석 사용해서 돈 많이 벌로 재밌는 것들 많이 해봐야겠습니다.
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-yank'
set -g mouse on
set -g destroy-unattached on
setw -g monitor-activity on
set -g visual-activity on
set -g default-terminal "screen-256color"
set -g history-limit 30000
set -g base-index 1
set -g pane-base-index 1
# Pane splitting.
bind \\ split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
bind r source-file ~/.tmux.conf \; display "Reloaded ~/.tmux.conf"
run '~/.tmux/plugins/tpm/tpm'
터미널을 실행할 때 자동으로 tmux를 실행하게 하려면, Terminal > Preferences > Profiles
현재 사용하고 있는 맥북프로 레티나 2012mid 모델이 오래된 티를 내는지 Ubuntu에서 조금만 빡센 작업을 하면 쓰로틀링이 걸려 엄청 느려지기 시작했습니다.
Ubuntu/ROS를 사용하면서 성능도 괜찮은 노트북을 검색하다가 맨처음 맘에 들었던 제품은 Razer Blade 15 2018 이었는데, 아쉽게도 아직 한국에 정식 출시도 안되었고 직구하기엔 시간이 좀 걸리는 관계로… 다음 순위였던 델 노트북으로 선택.
들고 다닐수 있는 고성능 노트북 중 그래도 납득할 만한 가격과 어느 정도 받쳐주는 성능으로 DELL XPS15-9570 D662X9570508KR을 선택하였습니다. 4k 디스플레이, GTX1050Ti, 인텔 i9 8세대, 램 16GB. 이정도면 큰 무리없이 몇년간은 사용할만한 사양인듯 합니다.
libusb를 이용한 디바이스를 Ubuntu에 연결하고, 관련 프로그램을 실행시 “Permission denied” 혹은 알수없는 오류를 발생하는 경우가 있다. 보통 sudo 명령을 이용하여 실행하면 잘 해결되는 경우인데, 매번 sudo를 붙여서 실행하는 것이 번거롭다. 이때는 udev 룰을 추가하면 해결된다. (제조사에서 제공하는 경우도 있다.)
사용자가 udev 룰을 추가하려면 해당 디바이스의 Vender ID, Product ID를 알아내야 한다. 이는 디바이스를 연결하고, 터미널에서 다음과 같이 입력한 다음 확인이 가능하다.
$ dmesg
이때 나오는 메시지 중 idVendor, idProduct에 나오는 값을 기억한다.
/etc/udev/rules.d 에 다음과 같이 파일을 작성한다.
$ cd /etc/udev/rules.d
$ vi 99-<user_device>.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="<Vendor ID>", ATTRS{idProduct}=="<Product ID>", MODE="0666"
If you have an error when you install python package using pip like this,
Cannot uninstall '~~~'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
IMU를 이용한 자세추정 방법은 보통 보상 필터를 많이 사용한다. 3축 가속도 센서와 3축 자이로스코프를 사용하고, 3축 지자기 센서를 이용하여 보정한다. 가속도 센서는 3축의 가속도 값 (m/s^2)을 두번 적분하여 위치를 구할수 있으나 회전 및 진동 등에 의해서 값이 변하는 단점이 있고, 자이로스코프는 3축의 각속도 (rad/s)를 한번 적분하여 회전각을 알아낼수 있지만 각 축에 포함된 화이트 노이즈 덕분에 시간이 흐를수록 값이 변한다 (일명 드리프트 현상).
따라서 각각의 센서가 가지는 장점을 뽑아서 사용하자는게 보상필터이고, 간단하게는 Low-pass filter, High-pass filter를 사용하거나, 두개의 Band-pass filter를 사용하는게 일반적이다. 이게 바로 보상 (complementary) 필터이다.
직접 구현해서 사용하는 것도 방법이긴하나, 이미 많이 알려진 알고리즘이고 ROS에 패키지로도 존재하므로 쉽게 사용이 가능하다.
사용할 패키지는 imu_complementary_filter이다. 사용 방법은 연결된 링크의 wiki 페이지에 자알~ 되어있다. 논문을 기반으로 개발된 것 같고, 간단한(?) 블록 다이러그램은 다음과 같다.
자료나 글을 충실하게 올리는 블로그는 아니었다. 툭탁툭탁 뭔가 만들고 삽질하는 것이 재밌어 시작한 것이었고, 그 외의 목적은 별 관심이 없었다. 가상서버호스팅을 사용해서 리눅스에서 웹서버를 구축하고, 툴을 설치하고, 이리저리 테마를 고치는게 주 목적인 블로그이다. 이런 과정을 거치면서 배우는 점도 있고, 리눅스에 좀더 친근하게 다가갈 수 있기도 했던 것 같다.
그간 WordPress를 잘 사용하다가 약간 지루하기도 하여, 요즘(?) 유행한다는 Ghost를 사용해 보았는데 몇가지 블로그로 사용하기엔 문제가 많을 것 같았다.
글을 묶을수 있는 방법이 존재하지 않았다. WordPress의 카테고리와 같은 기능인데, Tag를 사용할 수 있지만, 글들을 묶고 분류하기엔 부족했다.
이미지에 대한 처리 기능이 부족하다. 리사이즈도 사용자 몪. 요 근래 버전이 올라가면서 기능을 지원하게 되었으나, 여전히 살짝 모자른듯.
모양을 고치긴 위해 다른 툴들과 마찬가지로 CSS를 사용한다. 하지만 테마를 수정하려면 다른 것들과는 다르게 수정 이후 웹서버에 접속해 ghost를 다시 시작해야 한다. 불편.
댓글 시스템이 없다. 다른 프로그램을 설치하고 연동은 가능하나 테마 업데이트시 수정된게 날라간다. ㅠㅠ
결국 다시 WordPress로 돌아왔다. 마침 5.0 버전 베타가 시작되었고, 기본 테마는 Twentynineteen이 되었다. (오호~~ 또 새로운 삽질꺼리다!!!)