[vscode] 원격에 있는 머신의 코드를 수정하기

코드 편집기로 Visual Studio Code를 사용하고 있다. 주로 로봇의 PC에 설치하여 모니터와 키보드를 연결하고 작업을 하지만, 어느 정도 완성이 되고 나면 로봇을 동작시키면서 개발을 해야 하므로 모니터와 키보드는 더이상 연결할 수 없게 된다.

ssh를 이용하여 접속한 후 GUI를 미러링하여 사용할 수 있지만, 그렇게 되면 많이 느려지게 된다. 그래서 간단한 작업들은 터미널에서 vim을 이용하여 코드를 수정하곤 하는데, 이것저것 다수의 코드를 수정하려면 다소 힘들게 된다.

Visual Studio Code의 확장기능 중 Remote – SSH가 이럴 경우 대단히 유용한다. 로봇(또는 그냥 원격머신)의 PC에 ssh로 접속하여 그냥 로컬머신에서 vscode를 사용하는 것과 동일하게 사용할 수 있다.

설치는 Extentions 탭으로 이용하여 Remote – SSH를 찾아 설치하면 끝.

그렇게 되면 왼쪽 탭에 모니터와 같은 모양의 아이콘이 생성된다.

처음 실행하게 되면, 위와 같이 host를 설정하라는 메시지가 나온다. Configure를 클릭하면

와 같이 나오는데, 주로 본인 계정하에서 사용하므로 첫번째와 같이 본인의 홈 폴더에 생성하도로 한다. 그렇게 되면 기존 config 파일이 나오거나, 없으면 다음과 같이 템플릿을 생성하여 보여준다.

# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
Host alias
    HostName hostname
    User user

자 이제 원격PC에 접속하기 위한 계정 정보를 입력한다.

# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
Host robot1_pc
    HostName 192.168.9.10
    User robot

위와 같이 계정 정보와 서버의 주소를 입력한다. 만약 hosts 파일에 컴퓨터명을 등록했으면 주소 대신 컴퓨터명을 적으면 된다. 위의 내용을 터미널 상에서 ssh를 접속하게 된다면 다음과 같은 내용이라고 보면 된다.

$ ssh robot@192.168.9.10

저장하고 나면, 왼쪽 Connections 창에 이름이 나타난다. 이제 이름 옆 창 표시를 클릭하면, 새로운 vscode 창이 생기면서 원격 머신에 접속하게 된다.

접속이 완료되면, 왼쪽 하단에 원격 PC이름이 나타나고, 터미널도 역시 원격 PC의 터미널이 보임을 알 수 있다. 또한, Open Folder를 클릭하면 원격 PC의 디렉토리 및 파일들이 나타난다. 이제부턴 로컬 머신과 같이 사용가능하다. (물론 파일 복사나 이동 등도 가능)

팁.

매번 접속시 비밀번호를 묻는게 귀찮다면, 원격PC의 known_hosts에 로컬PC의 ssh 퍼블릭 키를 등록하면 된다. 키 생성은 ssh-keygen으로 하고, 생성된 id_rsa.pub 파일의 내용을 원격 PC의 known_hosts 파일에 추가한다.

Refresh hosts on macOS

많은 이유로 /etc/hosts 파일에 아이피 및 호스트 이름을 추가하여 사용할 경우가 많은데, Ubuntu에선 hosts 파일을 수정하기만해도 반영이 되는 반면, macOS에선 반영이 되지 않는다. (아마 이번 Catalina에서부터 그런듯..)

구글링을 해본 결과 hosts 파일을 수정하고, 터미널을 열어 다음과 같이 실행 해줘야 업데이트 되는듯 하다.

$ sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

끝.

macOS Launchpad 관련 팁

적어놓고 보니 예전 포스트(https://ahnbk.com/?p=340)랑 같은 내용인데… 사라진 어플리케이션 추가하는 방법 추가.

레이아웃 수정

기본 배열은 7×5로 되어 있음. 더 많은 수의 아이콘을 배열할 수도 있는데, 예를 들어 8×6으로 배치하고 싶다면 터미널을 열고,

$ defaults write com.apple.dock springboard-columns -int 8
$ defaults write com.apple.dock springboard-rows -int 6 
$ killall Dock

와 같이 입력하고 런치패드를 보면 변경되어 있는 것을 확인 가능.

기본값으로 돌리고 싶다면, 터미널을 열고

$ defaults delete com.apple.dock springboard-rows
$ defaults delete com.apple.dock springboard-columns
$ killall Dock

와 같이 입력하면 됨.

런치패드 리셋

Launchpad를 초기 설치 상태로 초기화 하고 싶다면,

$ defaults write com.apple.dock ResetLaunchPad -bool true
$ killall Dock

설치된 앱 아이콘이 런치패드에 안보인다면

Finder를 열고, /Application으로 이동. Cmd+A를 이용해서 어플리케이션들을 모두다 선택하고 이를 끌어서 Launchpad 아이콘 위에 놓는다. 그렇게 하면 앱 리스트 업데이트 됨.

Set display scale for Ubuntu 18.04 on Parallels 14

패러럴즈에 Ubuntu 18.04를 설치하고, 패러럴즈 툴을 설치했음에도 불구하고 해상도 설정이 좀 이상한 경우가 있다. 특히 Display scale을 조절할 수 있는 옵션이 나타나지 않는데, 이 경우 흐리멍텅한 화면이나, 네이티브 해상도 (아주 작은 글씨)로만 사용해야 한다.

검색해보니 설정에는 안보이지만, 터미널 상에서 UI 스케일을 조정할 수 있는 방법이 있었다.

$ gsettings set org.gnome.desktop.interface scaling-factor 2

원하는 스케일 팩터를 뒷부분에 적으면 된다. 2는 200%를 의미한다.

다시 초기값으로 돌리려면,

$ gsettings reset org.gnome.desktop.interface scaling-factor

와 같이 입력한다.

터미널에서 명령어를 입력 후, 재부팅하거나 Logout 후 재로그인하면 설정이 반영된다.

Kinematic Model for 3 Wheel Omni Drive Robot

3 Wheel Omni Drive 로봇은 메카넘휠(90º) 3개를 120º 간격으로 배치하여 구성하며, 바퀴 속도의 조합에 따라 전방향으로 이동 가능하다.

식은 다음과 같이 나타낼 수 있다.

 \dot{\phi} = J_{2}^{-1} J_{1f} R(\theta) \dot{\xi_{I}}  \dot{\xi_{I}} = R(\theta)^{-1}J_{1f}^{-1}J_{2}\dot{\phi}

여기서,

 \dot{\phi} = \begin{bmatrix} \dot{\phi}_{1} \\ \dot{\phi}_{2} \\ \dot{\phi}_{3} \end{bmatrix}  \dot{\xi_{I}} = \begin{bmatrix} \dot{x} \\ \dot{y} \\ \dot{\theta} \end{bmatrix}   J_{2} = \begin{bmatrix} 2r & 0 & 0 \\ 0 & 2r & 0 \\ 0 & 0 & 2r \end{bmatrix}  J_{1f} = \begin{bmatrix} sin(\frac{\pi}{3}) & -cos(\frac{\pi}{3}) & -l \\ 0 & -cos(\pi) & -l \\ sin(-\frac{\pi}{3}) & -cos(-\frac{\pi}{3}) & -l \end{bmatrix}  R(\theta) = \begin{bmatrix} cos \theta & sin\theta & 0 \\ -sin \theta & cos \theta & 0 \\ 0 & 0 & 1\end{bmatrix}

r는 바퀴의 반지름, l은 로봇 중심으로부터 바퀴까지의 거리이다.

이제 바퀴의 속도 변경에 따른, 로봇의 움직임을 구하려면,

 \begin{bmatrix} \dot{x} \\ \dot{y} \\ \dot{\theta} \end{bmatrix} = \begin{bmatrix} cos \theta & sin\theta & 0 \\ -sin \theta & cos \theta & 0 \\ 0 & 0 & 1\end{bmatrix}^{-1} \begin{bmatrix} sin(\frac{\pi}{3}) & -cos(\frac{\pi}{3}) & -l \\ 0 & -cos(\pi) & -l \\ sin(-\frac{\pi}{3}) & -cos(-\frac{\pi}{3}) & -l \end{bmatrix}^{-1} \begin{bmatrix} 2r & 0 & 0 \\ 0 & 2r & 0 \\ 0 & 0 & 2r \end{bmatrix} \begin{bmatrix} \dot{\phi}_{1} \\ \dot{\phi}_{2} \\ \dot{\phi}_{3} \end{bmatrix}

여기서 나온 결과, 즉 로봇의 속도 (\dot{x}, \dot{y}, \dot{\theta})를 누적하면 Odometry 정보를 얻을 수 있다.

이제 로봇을 제어하기 위해서, 원하는 로봇의 선속도 (\dot{x}, \dot{y} ), 각속도 (\dot{\theta})가 입력이 되면,

 \begin{bmatrix} \dot{\phi}_{1} \\ \dot{\phi}_{2} \\ \dot{\phi}_{3} \end{bmatrix} =  \begin{bmatrix} 2r & 0 & 0 \\ 0 & 2r & 0 \\ 0 & 0 & 2r \end{bmatrix}^{-1} \begin{bmatrix} sin(\frac{\pi}{3}) & -cos(\frac{\pi}{3}) & -l \\ 0 & -cos(\pi) & -l \\ sin(-\frac{\pi}{3}) & -cos(-\frac{\pi}{3}) & -l \end{bmatrix}  \begin{bmatrix} cos(0) & sin(0) & 0 \\ -sin(0) & cos(0) & 0 \\ 0 & 0 & 1\end{bmatrix}  \begin{bmatrix} \dot{x} \\ \dot{y} \\ \dot{\theta} \end{bmatrix}

와 같이 각 바퀴의 속도를 구할 수 있다. 이제 이 속도를 바퀴 모터에 적용하면 로봇이 원하는 방향으로 움직인다.

참고: