본문 바로가기

Nvidia Jetson

Nvidia Jetson CAN 통신

차량 소프트웨어를 개발할때라면 우리가 반드시 개발해야할 것은 CAN 통신 파트입니다.

차량의 많은 기능들이 단독으로 구현되지 않고 단일 기능 유닛의 ECU들의 통신에 의해 이루어지기 때문이고요.

만약 Nvidia Jetson 보드와 같이 카메라나 라이다의 데이터를 이용하여 ADAS 로직을 처리하고자 할때 다른 ECU 와 데이터를 주고받고자 할때는 정말 좋은 방법론이 될 수 있습니다.

센서 데이터를 이용해서 perception 하고자 할때부터 일부 차량 데이터는 CAN 을 통해서 받을 수있고, 

로직에 의해 behavior 를 결정한 후 control 을 하고자 할때 직접 하지 않고 controller 쪽으로 결과값을 보내며 요청을 해야하는데 이 때 CAN 통신을 이용하고자 하면 CAN 통신의 멀티 마스터 full duplex 의 유용함과 ethernet 급의 안정된 통신 기능을 이용할 수 있다는 것이죠.

그런데 의외로 로봇이나 산업 장비에서도 모터 제어를 위해서도 이용되고 있다고 하네요.

 

그래서 Jetson 보드를 가지고 CAN 통신 테스트를 이것 저것 해보았습니다.

일단 Nano 는 하드웨어에서 지원하지 않기 때문에 제외하고 TX2 와 Xavier 에서 테스트를 해보았습니다.

 

Jetson TX2 + CAN Controller
Jetson Xavier + CAN Controller

CAN통신을 위한 Jetson TX2 와 Xavier 의 가장 큰 차이점은 다음과 같습니다.

 

Jetson TX2 는 커널 빌드가 필요합니다. 그런데 커널 빌드 정보가 Jetson Jetpack 3.3 버전까지만 제공되고 있어서 Jetpack 최신 버전 테스트가 불가능합니다. (2019년 12월 기준)

 

Jetson Xavier 는 레지스터 변경만으로 가능하기 때문에 커널 빌드가 필요없습니다. 그래서 Jetpack 최신 버전도 문제없습니다. 

 

공통점은 자체 CAN Controller가 들어있지 않기 때문에 CAN Controller 를 연결해야한다는 것이네요.

네.. 핀은 납뗌해야합니다...

Xavier 와 CAN 연결은 자료가 인터넷에 제법 많으니 다음에 올리기로 하고 오늘은 TX2만 포스팅합니다.

 

일단 우선 골치 아픈 커널 빌드는 다음과 같이 진행하면 되요.

$ git clone https://github.com/jetsonhacks/buildJetsonTX2Kernel.git

$ cd buildJetsonTX2Kernel

$ ./getKernelSources.sh

$ ./makeKernel.sh

$ ./copyImage.sh

 

커널 configuration

그리고 나서는 TX2의 핀과 CAN Controller 를 연결하고

CAN Link (http://www.trace32.com/wiki/index.php/CANlink_%EC%86%8C%EA%B0%9C) 라는 CAN 통신 테스트 장비와 연결을 하고 테스트를 하면 되겠네요.

물리적인 연결이 끝나면 TX2에 (Xavier 도 마찬가지입니다.) 연결 세팅을 해야합니다.

세팅이 되면 canutil 을 설치한다음

다음과 같은 기본 테스트가 가능합니다.

 

그리고 사실 리눅스에서 CAN 통신 소스는 CAN socket 을 이용하기때문에 소켓 소스와 다를점이 없습니다.

그래서 can util 을 사용하지 않아도 코딩해서 뭐든 통신을 할 수 있습니다.

 

수신 데이터를 그냥 그대로 되돌려 보내는 에코를 테스트해보면 쉽습니다.
CAN LINK 에서 저렇게 보내면 고대로 되돌아온다는거죠.

그래서.. 뭐든 할 수 있게 되는겁니다.. ^-^...

 

추가로..

 

리눅스 CAN 통신에 대한 공식 문서는 여기 참조.

산업용 모터 제어에 대한 CAN 프로토콜에 대한 스팩은 여기 참조.

CANOpen 에 대한 위키는 여기 참조.

 

젯팩 4.3 에서 커널빌드는 여기 참조

github.com/jetsonhacks/buildJetsonTX2Kernel