●9강
https://www.youtube.com/watch?v=VKNVj9IDMeo
이 챕터도 실습할 openCR이 없어서 강의를 온전하게 따라가지 못했다..
그래서 rosserial ROSwiki의 Tutorial 몇 개를 해보는 것으로 대체했다.
●Keyword
-임베디드 시스템, MCU, rosserial, openCR
-rosserial, rostopic
●Study
우선 임베디드 시스템이 무엇인지 찾아보았다.
임베디드 시스템(영어: embedded system, 내장형 시스템)은 기계나 기타 제어가 필요한 시스템에 대해, 제어를 위한 특정 기능을 수행하는 컴퓨터 시스템으로 장치 내에 존재하는 전자 시스템이다. 즉, 임베디드 시스템은 전체 장치의 일부분으로 구성되며 제어가 필요한 시스템을 위한 두뇌 역할을 하는 특정 목적의 컴퓨터 시스템이다.
https://ko.wikipedia.org/wiki/%EC%9E%84%EB%B2%A0%EB%94%94%EB%93%9C_%EC%8B%9C%EC%8A%A4%ED%85%9C, 2021.08.23 검색
내가 사용할 것 중에선 Jetson Nano, 아두이노가 이 임베디드 시스템에 해당한다.
이전 회의에서 Jetson Nano를 메인으로 사용하고 아두이노와 연결해 아두이노는 센서, 모터제어등을 하게 한다고 했던 내용이 오늘 강의에서 자세히 나왔다.
이때 ROS는 Jetson Nano에 설치하고 ROS 설치가 불가능한 아두이노와 usb로 연결하여 rosserial로 통신을 하게 된다.
rosserial에는 제약사항이 있다고 하는데
1. MCU는 메모리가 한정적이기 때문에 publisher, subscriber의 개수, 송수신 버퍼 크기 등을 미리 정의해야 한다.
2. 대부분의 MCU는 64비트 실수 연산을 지원 안한다.(openCR은 지원)
3. 문자열 데이터를 메시지에 넣어 전송할 수 없고 그 포인터 값만 보낼 수 있다.
4. 메시지 개수가 많아지면 속도가 느려질 수 있다.
이외에도 rosserial은 대부분 python 기반을 사용한다는 것, rosserial 프로토콜의 설명, openCR의 소개 등을 하시고 바로 openCR을 활용한 rosserial 실습으로 넘어갔다.
위에서 말했듯이 나는 openCR이 없어서 아두이노를 이용한 ROSwiki의 rosserial tutorial을 몇 개 해봤다.
https://ieworld.tistory.com/11
[우분투/Ubuntu 20.04] 아두이노(Arduino) 간단하게 설치하기
아두이노는 오픈소스를 기반으로 한 단일 보드 마이크로 먼트롤러로 완성된 보드와 관련 개발 도구 및 환경이다 아두이노는 다수의 스위치나 센서로부터 값을 받아들여, LED나 모터와 같은 외
ieworld.tistory.com
우분투 아두이노 설치는 아래 블로그를 참고했다.
http://wiki.ros.org/rosserial_arduino/Tutorials/Arduino%20IDE%20Setup
rosserial_arduino/Tutorials/Arduino IDE Setup - ROS Wiki
Note: This tutorial assumes that you have completed the previous tutorials: ROS Tutorials. Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of y
wiki.ros.org
이후 rosserial과 라이브러리 설치는 ROSwiki를 참고했는데 라이브러리 설치가 계속 안됐다.
/sketch/libraries가 wiki에서 말하는 "typically found in My Documents"에 없어서 내가 mkdir로 만들어보기도 하고 다른 곳을 찾아보기도 했지만 잘 안됐다...
그러다가 아두이노의 라이브러리 매니저를 검색했는데
있다!
ROSwiki의 rosseiral 문서를 좀 찾아보니까 제작자도 Micheal Ferguson으로 같고 버전도 최근 버전 (최신 버전은 0.9.2)인 것을 확인했다.
정상적으로 설치 되었고 wiki방법은 라이브러리랑 예제가 ros_lib으로 생겼지만 이 방법은 rosserial Arudino Library로 생겼다.
바로 실습으로 들어갔다.
1. Helloworld 출력하기 (예제명 HelloWorld)
http://wiki.ros.org/rosserial_arduino/Tutorials/Hello%20World
rosserial_arduino/Tutorials/Hello World - ROS Wiki
Note: This tutorial assumes that you have completed the previous tutorials: Arduino IDE Setup. Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions
wiki.ros.org
시키는 대로 했더니 오류가 난다.
아두이노 코드를 컴파일하면 include <cstring>하는 에러가 뜨는 데 이건 다행히 유튜브에서 해결책을 빨리 찾았다.
라이브러리 매니저로 설치해서 파일이 조금 다른가 보다.
https://www.youtube.com/watch?v=6F5mNGdBhlU
이후 아두이노에 코드도 정상적으로 올라갔고 아두이노IDE랑 보드도 연결된 것을 확인했다.
바로
$rosrun rosserial_python serial_node.py /dev/ttyUSB0
를 했더니 다른 오류가 뜬다.
포트를 못찾는다.....
이때는 아두이노 IDE의 <툴> → <포트>를 보면 뒤쪽에 내 포트의 이름이 나온다.
나의 경우는 /dev/ttyACM0였다.
바로 rosserial 코드 뒤쪽을 바꿔서 실행했다.
잘 연결된 거 같다.
이후 시키는 대로
$rostopic echo chatter
하니까 발행된 chatter라는 topic에 대해 아두이노가 helloworld라는 메시지를 전송해왔다.
성공
2. LED 깜박이기 (강의 코드 변형)
LED 깜박이기는 blink예제 말고 강의 것으로 해보기로 했다.
openCR로 진행된 강의의 코드를 보니 조금 바꾸면 아두이노 내장 LED로도 할 수 있을 거 같아서 해봤다.
#include <ros.h>
#include <std_msgs/String.h>
#include <std_msgs/Byte.h>
int led_pin= 13;
ros::NodeHandle nh;
void messageCb( const std_msgs::Byte& led_msg) {
int i;
if (led_msg.data){
digitalWrite(led_pin, LOW);
}
else {
digitalWrite(led_pin, HIGH);
}
}
ros::Subscriber<std_msgs::Byte> sub("led_out", messageCb );
void setup() {
pinMode(led_pin, OUTPUT);
nh.initNode();
nh.subscribe(sub);
}
void loop() {
nh.spinOnce();
}
그냥 ledpin을 4개가 아닌 1개, 아두이노 내장 led인 13번으로 바꾸고 변수만 조금 바꿔준 것이다.
다만 강의 설명과 다른 부분이 0을 넣으면 led가 off 되는 게 아닌 켜지는 코드였는데 내가 코드를 잘못 해석한 건지 박사님이 그냥 실수하신 건지는 모르겠다..
하튼 위의 코드를 업로드하고 rosserial을 실행시켜주고
$rostopic pub -1 led_out std_msgs/Byte 0
으로 토픽을 publish 해주니 성공적으로 아두이노의 led가 켜졌다!
반대로 0이 아닌 다른 값을 보내니 led가 껴졌다.
+) rostopic 사용법
rostopic - ROS Wiki
kinetic melodic noetic Show EOL distros: EOL distros: electric fuerte groovy hydro indigo jade lunar diamondback: Only showing information from the released package extracted on Unknown. No API documentation available. Please see this page for in
wiki.ros.org
$rostopic <동작> <topic명> <메시지타입> <메시지내용> (동작에 따라 양식이 달라짐)
간단하게 지금까지 사용했던 것만 찾아서 정리해보면
*동작에는 echo, pub 등이 있다. echo는 해당 topic의 메시지를 보여주고 pub은 <topic명>의 topic을 원하는 타입과 내용으로 publish 한다.
*pub을 쓸 때 -1 옵션을 주면 topic을 몇 초 동안만 publish 하고 통신을 끊는다.
*2번 예제의 명령어는 std_msgs/Byte의 타입으로 0이라는 값을 led_out이라는 이름의 topic으로 잠시 동안만 publish 하라는 명령어다.
이외에도 다른 사용법도 많았다.
3. Log 작성 (예제명 : Logging)
이 예제는 그냥 예제 파일을 아두이노에 업로드하고 rosserial을 실행시키면 된다.
한번 코드를 분석해보면
ros::Publisher chatter("chatter", &str_msg);
*아두이노가 publisher가 되어 chatter라는 이름의 str_msg 타입 topic을 publish 할 것 임을 선언한다.
└자세한 설명은 못 찾았는데 chatter는 topic의 한 종류인 것 같다.
char hello[13] = "hello world!";
~~~
str_msg.data = hello;
chatter.publish( &str_msg );
*str_msg에 data로 hello변수, 즉 문자열 "hello world!"를 넣는다.
*chatter라는 이름의 topic에 str_msg를 넣어서 publish 한다.
nh.logdebug(debug);
nh.loginfo(info);
nh.logwarn(warn);
nh.logerror(error);
nh.logfatal(fatal);
*rosserial에서 log(기록)을 띄우는 코드들이다.
*logdebug를 제외하고는 각각 다른 색깔로 경고문 같은 게 출력되었다.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=moonv11&logNo=60179970474
Log 레벨
log4j.properties에 "log4j.rootLogger=DEBUG"로 설정했다면 또는 log4j.xml에 <lev...< p=""> </lev...<>
blog.naver.com
오류의 레벨은 위 블로그에 잘 정리되어 있었다.
코딩에 대한 지식과 경험이 아직 많이 부족해서 이런 게 있는 줄도 몰랐다.
일단 오늘 rosserial 실습은 여기까지 했다.
===============================================================================
정확한 정보 전달보단 공부 겸 기록에 초점을 둔 글입니다.
틀린 내용이 있을 수 있습니다.
틀린 내용이나 다른 문제가 있으면 댓글에 남겨주시면 감사하겠습니다. : )
===============================================================================
'팀 프로젝트' 카테고리의 다른 글
C-2345 자세 제어 4족보행 로봇 #11 (ROS 10, 11강-모바일 로봇, SLAM, Navigation) (0) | 2021.08.29 |
---|---|
C-2345 자세 제어 4족보행 로봇 #10 (ROS 이기종 디바이스 간의 통신 실습) (0) | 2021.08.26 |
C-2345 자세 제어 4족보행 로봇 #8 (ROS 8강-카메라 캘리브레이션 실습) (0) | 2021.08.21 |
C-2345 자세 제어 4족보행 로봇 #7 (ROS 7강-3 roslaunch) (0) | 2021.08.21 |
C-2345 자세 제어 4족보행 로봇 #6 (ROS 7강-2 Python으로 topic, service) (0) | 2021.08.20 |