Posts

AVR for Arduino/Atmel MCU

Image
AVR 코딩에 대한 이해가 필요해서 아래와 같이 정리를 했다. 1. AVR이란 Atmel에서 개발한 MCU의 등록 상표인데, 아두이노 우노 보드에 쓰여서 많이 쓰이고 있다. 2. 아두이노는 Atmel의 MCU를 메인 프로세서로 사용하고, 언어 특성은 C/C++ 이다. 하지만 AVR 코딩 특성을 일부 반영하여서 아두이노 보드를 고속으로 동작시킬 수 있다. 3. 즉 아두이노에서 사용되는 명령어 세트들은 아두이노 보드를 보다 고속으로 작동시킬 수 있도록 AVR 수준 내지는 어셈블리어 형태에 가까운 특별한 명령어들이 사용된다. 그래서 외부로부터의 인터럽트 처리과정 (ISR)과 각 핀들의 입출력 모드 설정 (pinMode) 및 입출력에 해당하는 명령어를 혼합 사용하여 아두이노 보드의 연산 속도를 끌어올릴 수 있다. 4. 핀 모드 설정 방식 - pinMode(pin#, OUTPUT); pinMode(pin#, INPUT); - PORT  아두이노 우노 보드의 PIN PORT는 아래와 같이 정의된다.     - PORTD: Digital pin 0~7 - PD0 ~ PD7     - PORTB: Digital pin 8~13 - PB0 ~ PB5     - 이렇게 PORTD, PORTB로 정의된 것은 C/C++에서 정의되는 것이 아니라, AVR에서 정의한 것이다. 5. 아두이노의 핀맵을 살펴보면서 설정을 어떻게 하는 지 보자. Arduino UNO Pin Map 위의 아두이노 핀맵에서 Digital Pin으로 설정된 0 ~ 13을 사용하려면, 4번의 방법으로 pinMode(pin, args)으로 미리 설정해주어야 한다. 참고로 이 pinMode는 "Arduino.h"에서 정의되어 이용이 가능한 것이다.  혹은 PORTD, PORTB를 이용해서 설정할 수도 있다. 참고로 이 PORTD, PORTB, DDRD, DDRB는 AVR에서 정의되는 ...

RS-485 Communication 구현

Image
RS-485 Communication Line 구현 1. 현재는 UART로 통신하는 기계를 Noise Robustness와 N:N Communication을 위해서 hardware와 software를 구현하는 과정을 적는다. 2. 메인 통신 모듈은 Teensy 3.5 (pin 버젼)이며, RS-485 Transceiver는 SP3485의 Breakout 모듈을 사용한다. 3. Digikey Order 내역 (1~2주 정도 걸림) - SP3485 Transceiver, RS-485 Interface Evaluation Board: 1568-1589-ND Datasheet: https://www.sparkfun.com/datasheets/Components/General/sp3485CN-LTR.pdf Schematics of the Module: https://cdn.sparkfun.com/datasheets/BreakoutBoards/RS485_Breakout_v10.pdf RS-485 모듈 SP3485 Schematics - Teensy 3.5: 1568-1464-ND Datasheet1: Find MK64FX512VMD12 at NXP Datasheet2: https://media.digikey.com/pdf/Data%20Sheets/Sparkfun%20PDFs/DEV-14056_Web.pdf Tutorials: https://www.pjrc.com/teensy/tutorial.html https://www.pjrc.com/teensy/pins.html https://www.pjrc.com/teensy/usb_debug_only.html Teensy 3.5 with Hearders Teensy 3.5 Pin Map (Frontside) Teensy 3.5 Pin Map (Backside) 4. pySerial + Arduino ...

Quaternion Base

Image
쿼터니언 (4원수) 회전 정리 1. 3차원에서 Quaternion rotation을 할 때, 특정 벡터를 쿼터니언으로 표기를 하면 아래와 같다. 4차원 세상의 쿼터니언과 3차원의 벡터가 연결되는 다리를 만드는 과정이라고 생각하면 된다. P = (P v , P w ) P = (p, 0) 실수부가 0이고, 허수부가 p인 pure Quaternion이 된다. [그림 1] 2. rotation axis u, rotation angle theta 를 통해 Quaternion rotation q를 정의해보자. 이 때, rotation Quaternion q의 크기는 1 (norm(q) == 1) 인 unit Quaternion이 되어야 한다. 이 unit Quaternion은 극형식으로 나타낸다. e^(u_q * theta) = u_q * sin(theta) + cos(theta) -> Quaternion version of Euler formula 3. Ken Shoemaker라는 분의 Quaternion 관련된 논문에 의하면,  Quaternion P를 축 u_q 중심으로 2theta 만큼 회전하는 것은 아래와 같이 표현이 된다. (Quaternion P is rotate 2*theta around u_q) q * p * q ^-1 q는 unit Quaternion이므로 다시 정리하면, q * p * q ^* 이 공식을 이용하여서 2 * theta 만큼 회전된 결과인 쿼터니언의 허수부를 구할 수 있다. 4. 연속으로 q에 대해서, 그리고 r에 대해서 회전을 할 경우 아래와 같다. e^(u_q * theta) = u_q * sin(theta) + cos(theta) e^(u_r * theta) = u_r * sin(theta) + cos(theta) r * (q  *  p  *  q ^*) * r ^* =   ( ...

Arduino MCU Register ATmega328P

Image
아두이노 UNO의 MCU ATmega328P Register Set-up 아래의 low-level motor control을 하기 위해서 set up에 관련된 Arduino 코드이다. 아래의 setup에 대해서 code analysis를 해보자~ =======================================================================  // put your setup code here, to run once:   TCCR1A = 0; // set entire TCCR1A register to 0   TCCR1B = 0; // same for TCCR1B   TCNT1  = 0; //initialize counter value to 0   OCR1A = 62500 / _accIncrementFrequency; // compare match register (16MHz/256)/ Frequency, int _accIncrementFrequency = 100; //Hz   TCCR1B |= (1 << WGM12);   // CTC mode   TCCR1B |= (1 << CS12);    // 256 prescaler   TIMSK1 |= (1 << OCIE1A);  // enable timer compare interrupt   TIMSK1 &= ~(1 << OCIE1A); // disable compare interrupt ======================================================================= 우선 timer/counter register의 diagram을 보면 아래와 같다. 이 diagram의 흐름대로 이해하면 될 것 같다. 16 bit t...

Deep Reinforcement Learning - Biped Robot Locomotion with Proximal Policy Optimization

Image
강화학습 클래스 프로젝트 정리 기계공학과 전기공학을 전공하다보니, 사실 CS에서 전문적으로 하는 일들에 대해서는 잘 모른다. 하지만 워낙 로보틱스 분야에서도 강화학습이 hot하다보니, 클래스 프로젝트로 지난 학기에 진행했었다. CS 전공이 아니기에 Proximal Policy Optimization (PPO)의 알고리즘은 전적으로 OpenAI에 의지를 했다. PPO가 이제는 강화학습에서 out of date (?) 되는 느낌이다. ( J. Schulman, F. Wolski, P. Dhariwal, A. Radford, and O. Klimov, “Proximal policy optimization algorithms.”)  이 분야는  새로운 논문이 업데이트되는 속도가... 너무 빠르다... 너무 너무 빠르다. 여튼 PPO의 가장 핵심은 아래 그림이 아닐까한다. Plots for single time step of the surrogate objective functionLCLIPas a function ofthe probability ratio r, for positive advantage function (left) and negative advantage function(right).  The red circle on each plot presents the starting point of the optimization.  clipping으로 간단하게 policy의 destructive update을 막는다는 개념으로 policy gradient method를 사용하는 것이다. 물론 PPO 코드를 디버깅하고, 재생산하는 것보다는 모델링하는 데 시간을 많이 사용했던 것 같다. 대략 위와 같은 프로세스로 진행했다. MuJoCo physics engine이 워낙 openAI 코드들이랑 fit이 잘 맞아서 사용했고, URDF에서 MJCF 컴파일하고 physical para...

UART Communication

Image
- 로보틱스에서 액츄에이터(모터)와 통신을 할 때, 가장 많이 이용되는 serial communication이 UART 통신이다. MCU에서 UART (TTL Level) pin이 항상 붙어 있어서 쉽게 이용가능함. - MCU 단에서 나오는 UART RX, TX pin에 추가로 RS-232 혹은 RS-485의 moduel or IC를 붙여야 한다. 그냥 MCU 단에서 나오는 데이터는 Raw UART(?)이다. 보통 혼용해서 부르는 데, 확실히 485나 232로 구현하기 위해서는 driver를 붙여야함. - UART == TTL 로 생각하면 될 것 같다. 그리고 RS는 Recommended Standard이다. - UART로 daisy chain 통신을 구현할 수 있다. 하지만 1:N 통신은 RS-485로 구현하자. - UART 패킷 구조 - 9600 baud rate의 경우, start bit - 8 bits of data - no parity bit - 1 stop bit으로 구성된다. - 485로 Bulk read, bulk write을 구현가능 - 직렬 통신 방식이란? 데이터 비트를 1개의 비트 단위에 따라서 외부로 송신 혹은 수신하는 방식이다. 구현하기 쉽다. 멀리갈 수 있다. 기존의 통신선로를 쉽게 활용할 수 있다. 대표적으로 LAN, RS-232 등이 있다. - 많은 사람들이 비동기식 직렬 통신 방식을 RS-232라고 알고 있는 데, 실제로는 RS-232라는 것은 비동기식 통신 컨트롤러에서 나오는 디지털 신호를 외부와 연결시키는 전기적인 신호 방식의 하나일 뿐이다. 또한 UART는 RS-232와 voltage 만 제외하고 모두 같다. 아래와 같이 UART(TTL Level)보다 높은 전압으로 좀 더 먼거리의 통신이 가능하게 한다. UART: Logic 0 -> 0V / Logic 1 -> 3.3V or 5V RS-232: Logic 0 -> +12V (+3 to +25V) / Logic 1 -...