안녕하세요. ROS를 사용해서 모바일 로봇을 제작중인 학생입니다. 도움요청 드립니다.

1,624 views
Skip to first unread message

yyj10...@gmail.com

unread,
Mar 12, 2018, 7:17:04 AM3/12/18
to 한국 ROS 사용자
안녕하세요.

ROS를 사용해서 저만의 모바일 로봇을 제작중인 학생입니다.

하드웨어는 제작이 어느정도 완료 되었고 ROS상에서 프로그램을 작성에 대해 도움을 요청드리고자 글을 남깁니다.

제가 제작하고 있는 모바일 로봇은 아두이노로 모터제어를 하고 PC상에 LRF를 장착하여 SLAM을 진행하려고 하고 있습니다.

모터는 엔코더센서가 부착되어 있는 DC모터를 사용하고 있습니다.

현재 아두이노에서 rosserial로 모터에 명령을 publish하고 동작중의 엔코더 값을 읽어 속도를 계산하는 것까지 진행하였습니다.

더 나아가 Rviz상에서 저의 모바일 로봇의 동작을 표현하고 싶은데 이 과정에 대해 지식이 부족합니다.

제 생각으로는 모터의 속도를 계산하고 데드레커닝으로 선속도와 각속도를 계산하여 /cmd_vel 토픽에 publising합니다.

그 과정에서 구한 선속도와 각속도를 이용해서 odometry를 계산하고 그값을 /odom 토픽에 publishing하여 Rviz상에서 이동을 확인 하는 것이라고 생각하고

있습니다만, 제 생각이 맞는가요?

도움 부탁드립니다.

Sangjin Oh

unread,
Mar 12, 2018, 9:51:27 AM3/12/18
to yyj10...@gmail.com, 한국 ROS 사용자
cmd_val 은 navigtion 패키지에서 로봇의 선속도 각속도를 Publish 하는 메세지 입니다. 
odom trans node에서 encoder 값을 받아서 /odom 값을 publish 하셔야 합니다..

=====================================
(주) 코어벨
오 상 진 책임 연구원
305-806 대전광역시 유성구 가정동 138번지 KT 북대전 지사 신관 3층 
Tel. 042-863-0340
Fax. 042-863-0342
HP. 010-5117-5372
E-Mail: nasa...@gmail.com
=====================================

2018년 3월 12일 오후 8:17, <yyj10...@gmail.com>님이 작성:

--
이 메일은 Google 그룹스 '한국 ROS 사용자' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 korea-ros-users+unsubscribe@googlegroups.com에 이메일을 보내세요.
이 그룹에 게시하려면 korea-ros-users@googlegroups.com에 이메일을 보내세요.
https://groups.google.com/group/korea-ros-users에서 이 그룹을 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/d/optout을(를) 방문하세요.

yyj10...@gmail.com

unread,
Mar 12, 2018, 10:05:28 AM3/12/18
to 한국 ROS 사용자
답변 감사합니다.

말씀주신 대로 엔코더 값 등을 /odom에 publish하여 표시할 수 있고

teleop으로 로봇을 원격 조종할 시 cmd_vel 값을 publish해서 로봇을 조종하게 되는 군요.

또 한가지 질문이 있다면 SLAM을 할때 teleop을 런치해서 원격으로 조종해 맵을 작성하는데 그때 속도를 1.0, 1.5 이런식으로 바꿔 가면서 키보드로 움직일 수 있더라고요.

이때 속도는 1.0m/s 1.5m/s인가요?
또한 그게 맞다면 주어진 속도와 실제 로봇의 속도가 다를 수 있는데 이럴 겅우 위의 원격에서 적용되는 속도는 생각하지 말고 실제 로봇의 엔코더를 통해 얻은 속도 데이터를 가지고 /odom에 publish하여 위치를 rviz상에 표현해야하는건지요?

Jihoon Lee

unread,
Mar 12, 2018, 12:37:54 PM3/12/18
to yyj10...@gmail.com, 한국 ROS 사용자
네 일반적으로 odom은 로봇이 움직였다고 믿는 값을 보여주기에 encoder값을 통해 계산된 정보를 보여줍니다. /cmd_vel은 로봇을 제어하려는 사용자의 input이고 odom은 그 input에 따른 실제 모터가 움직인 결과값을 보여준다고 생각하시면 될꺼같습니다.

--
Google 그룹스 '한국 ROS 사용자' 그룹에 가입했으므로 본 메일이 전송되었습니다.

이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 korea-ros-users+unsubscribe@googlegroups.com에 이메일을 보내세요.
이 그룹에 게시하려면 korea-ros-users@googlegroups.com(으)로 이메일을 보내세요.
https://groups.google.com/group/korea-ros-users에서 그룹을 방문하세요.

Byeong-Kyu Ahn

unread,
Mar 12, 2018, 9:53:31 PM3/12/18
to 한국 ROS 사용자
한가지씩 풀어보면,

1. 속도명령은 cmd_vel 이란 토픽 이름을 많이 사용합니다. (일종의 무언의 규칙같은?) 메시지는 geometry_msgs/Twist 이고요.. 이 메시지를 보시면 아시겠지만, 선속도 (x, y, z), 각속도 (x, y, z)를 입력할 수 있도록 되어 있습니다.
만드실 로봇이 아마도 Diffferential Drive 방식일듯 한데요. 그렇게되면 저 명령 중에서 선속도 (x), 각속도 (z)만 사용하게 됩니다.

2. rosserial을 이용해서 모터에 속도 명령을 주셨다고 하셨으니 하나는 되었고, 엔코더 값을 읽으셨다니 이제 이걸 조인트의 각속도로 변경하시면 됩니다. 순수하게 모터 최종단의 회전속도죠 (기어 감속비를 고려한)

3. 그런 다음, 제어 주기 내에서 바퀴 사이의 간격, 바퀴의 지름을 고려하여 로봇이 움직이는 속도를 구합니다. (로봇의 선속도, 각속도)

4. 이제 3을 시간에 따라 누적하면 로봇이 움직인 거리와 방향이 나옵니다. (이게 데드레코닝)

5. 4의 결과를 odom 이란 토픽 이름으로 publish 합니다. 메시지는 nav_msgs/Odometry 이고요.. 내부를 보시면, 로봇의 pose (누적된 현재위치), twist (현재속도), child_frame (이건 거의 대부분 base_footprint)를 입력하게 되어있죠.

6. rviz에서 보고 싶으시면, 먼저 로봇에 대한  URDF를 작성하셔야 합니다. (링크, 조인트 등의 위치를 표현한)

7. 이런 부분들을 한꺼번해 해줄수 있도록 ros_control에서도 diff_drive_controller를 지원합니다. ros_control의 개념을 이해하시면 훨씬 간편하게 개발이 가능하십니다.

8. 아니라면 1~6까지의 내용을 손수 만드셔야 합니다.^^

yyj10...@gmail.com

unread,
Mar 12, 2018, 10:13:17 PM3/12/18
to 한국 ROS 사용자
답변 감사드립니다.
생각하던 것들이 정리되어 직접 코딩을 해봐야 겠네요. ^^

yyj10...@gmail.com

unread,
Mar 12, 2018, 10:14:42 PM3/12/18
to 한국 ROS 사용자
친절한 답변 감사드립니다.
URDF 과정은 이전에 끝내놓았기 때문에 말씀해주신 1~6번 까지의 과정을 직접 해보려고 합니다. ^^
Reply all
Reply to author
Forward
0 new messages