14. • Ubuntu 14.04 & ROS
PC(x86)
wget https://raw.githubusercontent.com/oroca/oroca-ros-pkg/master/ros_indigo_install.sh
sh ros_indigo_install.sh
[출처] ROS 설치 이보다 편할순 없다! (오픈소스 소프트웨어 &a mp; 하드웨어: 로봇 기술 공유 카페
(오로카)) |작성자 표윤석
http://www.ros.org/wiki/ROS/Tutorials
21. cmd_vel topic
$ rostopic info cmd_vel
Type: geometry_msgs/Twist
$ rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular float64 x
float64 y
float64 z
22. Create the Package
$ cd ~/ros_workspace
$ roscreate-pkg robot_mover geometry_msgs rospy roscpp
$ rospack profile
$ rosmake robot_mover
Create the Program
$ roscd robot_mover
$ mkdir nodes/
$ touch nodes/mover.py
$ chmod +x nodes/mover.py
Run the Program
$ roscd robot_mover
$ make
$ rosrun robot_mover mover.py
Make Robot_mover node
68. SLAM example
Map & Path :given scan data &
odometry
SLAM
robot path posterior
MCL
mapping with known pose
Occupancy Grid Map
Factorization first introduced by Murphy in 1999
1. 인사말
안녕하세요 /이번 발표를 맏은 탐사로봇 입니다.
2.아이번 세미나에서는 자작 로봇 발표 순서가 있다고 해서
저는 저쪽 입구 쯤애서
단순한 전시나 옹기종기 모여 문답하는 거로 생각했는데
일이 이렇게 커질줄은 몰랐읍니다
3. 다만 카페 회원의 한사람으로서 다른분들과 자작 경험을 공유
하고느것 이 의미가 있을거 같아서 나서게 되었읍니다
4.흥미가 있어 여가시간에 조금씩 취미생활한 것이라 내용에 좀 부족한 면이 있더라도 양해 바랍니다
5.다만 제 발표에는 다른 분들과 다르게 특별한 것 이 있읍니다
10분 짧읍니다.
1. 말씀 드릴 순서
제작 순서 와 동일
프레임 준비
+
ROS node
1.일 단 프레임 이 잇어야 겠지요
2.ROS 가 돌아갈수 있는 컴퓨터
3.모터제어및 각종 센서 가 붙을 마이크로 컨트롤러
알미늄 판 두개를 수직으로 붙이고
모터와 바퀴를 붙인 사진 입니다
만들때 찍어논게 없어 분해해서 찍은겁니다.
바퀴는 소형 오토바이 바퀴
직각으로 바꿔주는 1:1 기어 박스.백래쉬 없는 걸로
모터와 엔코더 사이는 타이밍 풀리
1.마이크로 인피니티 MEMS 센서 회전각과 각속도를
오랜시간 지나도 드리프트가 거의 없음
2.배터리는 보쉬 40암페어 소형 차랼용
3.ebay 헤멤: 사기도 만음
SICK 센서:중고 장터에서 구입
4.모터는 30 와트 짜리 BLDC 모터 인데 중고 시장에서
개당 3만에 구입
5.드라이버는 시리얼 명령이 가능한 BLDC 드라이버
아두이노에 서 시리얼 명령으로 컨트롤 목적으로
6.바퀴는 미니모터스라는 소형 전기 오토바이 전문샵에서 구입 개조
0-3000까지 속도 조절 가능
시리얼 통신
대충 조립한 상태
배터리와 아두이노 앤코더
시리얼 코넥터
범퍼 역할 스케이트 보드 바퀴
클립프 샌서는 집에 절벽이 없는 관계로 생략
그냥 앞에서 본 모습
붉은 보드가 짝퉁 아두이노 메가 보드
갈색-BLDC 드라이버
Host PC 는 Ubuntu+ ROS 가 운영되는 PC 인데
host pc 는 ubuntu 와 ROS 운영되는 메인 컴퓨터 인데
아두이노와 rosserial 로 통신하게 되면 제 로봇의 경우에는
각종주요 노드를 실행 하게 됩니다.
따라서 성능이 좋으면 좋겠지만 전력소모도 염두에 두고
주로 노트북이나 라즈베리파이 등을 많이 사요 하게 됩니다
노트북 라즈베리파이 오로이드 비글본 등
아무래도 이런 SBC 는 설치가 까다롭겠지요
인텔 nuc BXBT-q1900 은 quadcore baytrail celeron
인데 이전 nuc 와 달리
TDP10W 에 1Power 12v
전체 20-25와트
노트북 기준으로
notebook 기준으로 ubuntu 14.04를 설치하고
indigo 설치합니다
ubuntu 어원 : 함께사는 사회
win win
인디고 설치는 대표님 스크립트 사용
아두이노는 API 가 많이 개발되어 있고
Easy IDE/개발 환경이 이쁘게 잘 되어 있읍니다
ARm 계열은 IDE 종류도 많고 특히 무료 IDE 설정이 복잡해서
비교가 됩니다
아두이노를 통해 BLDC 모터를 시리얼통신을 할생각이므로
시리얼 포트가 많은
Multiple Serial ports
아두이노메가 를 선택 하였읍니다
아두이노 IDE 설치
위와 같이 다운로드 하고
설치 한후
패스를 설정
다음은 ROSSERIAL 설치
다음과 같이 다운 받아서
라이브러리를 만들고
예제로 ACM0포트를 통해 실행할수 있읍니다
이제 host client 통신 준비가 된것이지요
자 이제 준비가 되었으니 teleoperation 에 도전 해보겠읍니다
처음에 야망을 가지고 도전 했다가도 뭔가 보이는 결과물이 없으면 추진력을 잃게 되기 쉬운데
teleoperation 해서
나도 ROS 로 뭔가 움직여 봤다는 자부심을 느끼게 도
맨밑에 붉은 동그라미 부분입니다
teleoperation node 를 만들어서 rosserial 을 통해
ROS 명령을 내려 보내야 겠지요
텔레오퍼래이션 노드는 geometric_msgs 인 cmd_vel topic
을 publish 하고 아두이노 측에서는 이것을 subscrive 하는 형태가 되겠지요
우리로봇은 평면에서만 홝동 하니까 linear .X ,angular.Z 만 신경 쓰면 되겠지요
ros_build vs catkin build
시간이 없어 캐킨 슬라이드 못만들었읍니다
create pkg dependency 써주고
mover. py 를 edit 하여 node folder 를 만들어 넣어준후
실행 파일로 만들어줌
키를 누르면 각 키에 따라 필요한 명령어를 publish 할수 있게끔 코드가 짜여 있읍니다
i 는 전진 ㅡM 은 후진
j 는 좌측 L은 우측 K는 스톱
나중에 Gmapping 할때도 이노드를 쓰게된다
hrobotics open source differential drive robot
아두이노측 subscriber 는 이 geometry_msgs 를 subscribe 하게 되면 실측 모터 명령에 적합하게 환산 상수를 곱해
즉 BLDC 수치가 500 일때 0.1m/s 이면
subscribe 받은 linear.x 에 5000을 곱해야 되니까
x,th 변수에 저장
전진 할때,후진 할때 rmsid 아까 구한 환산지수곱한 수치
제자리 회전하는시는 각속도를 바퀴속도로 맞춰 주려면
speed_=(b/2)*th
로봇이 어느점을 중심으로 크게 돌때는 약간의 추가 계산이 필요 하겠죠
아두이노 배선
시리얼 커넥션은
아두이노 우측 16,17핀
좌측 18,19 핀아웃에 연결
GND
다음에 설명할 엔코더는 인터럽트 핀인 우(2.3)좌( 20,21)
핀에 연결
아까 계산한 speed right,speed left를 각각 오른 바퀴 왼바퀴에 써주면 된다(드라이버 레퍼런스참조)
예를들어
BLDC spped 500 으로 하고 로봇을 이동시켜서
시간과 거리 엔코더 카운트를 잰다
오도메트리 노드에 temporary debugging code 를 넣어 수치 획득
여러번해서 그래프로 만들어도 된다
이동거리 1.5m 15초 15000틱이 나오면
초당 0.1 미터 속도니까
BLDC speed= 0.1 X ( k="5000") = 500이 나오게
k를 실측을 통해 구해주면 된다
실측 하는 모습
자로 했을때 오차가 많이 생길수 있는데 이런 방법도 있다
encoder 카운트는 library 활용
그대로 가져다 쓰고
Rt pulse Lt pulse 아두이노에서 pc 로 publish 해줍니다
아까말씀드린대로 3,4 20,21 번 인터럽트 핀 사용
BLDC모타는 선이 두가닥이 아니고 6가닥인데
그림이 없어서 그냥 DC 모타로 표현한것임
텔레오퍼레이션 처움 성공 했을때 찍어둔 영상
나중에 형태가 좀 바꾸어서 똑같지는 안읍니다.
처음 운행이 시작된곳-->추적 항법
앤코더 수치와 자이로 수치를 좀합하여 계산
자이로 에서 들어온 데이터와
엔코더 데이터를 가지고 오도메트리 메시지를
가지고 x,y,th갱신하고
Tf
odom 발행
즉 이동후의 x,y ,orientation 정보
delta 가 붙는다
를 publish
갱신 하는(=odometry localization)
방법에 3가지
방법이 있다
이동추정거리 S 에 바로 삼각함수 곱
x'=x+deltaS*cos(th)=Vxy_ave*T *cos(th)
y'= sin sin
X,Y 는 오차
w는 정확
중간위치에서의 접선 사용
오차 적음
정확한 계산
로봇 이동시 이동 궤적 반지름은
( 원주길이/주기=속도)/(360한바퀴도는 주기)
삼각형 닮음꼴 따라 이리저리 뒤집으면 위에 공식 나옴
코드를 는 이와 같읍니다
좀더 자세히 보면
우선 아두이노 chatter node 에서 올라오는 앤코더 정보를 subscribe
gyro 정보를 받아들입니다
현재시간을 정의
dt 는 오도메트리 이전것과 지금 것 사이시간
dth 는 각도변화/dt
로봇 중심점 이동거리 dxy_ave
처음부터 총이동거리 x
처음부터 총 흐른시간 y
갱신된 x,y,th
quaternian 형태로 변환(Z축 중심이니까 yaw)
구조체가 있다
message definition
geometry_msgs::TransformStamped
message definition
구조체에 대입하여 퍼블리시
header
frame ID
geometry_msgs/Vector3 translation
geometriy_msgs/Quaternion rotation
publish
odometry
로봇의 현위치정보-kinematic state 와 3
현 움직임 속도 - dynamic state publish 6
nav_msgs/Odometry /odom
header
child frame ID
geometry_msgs/TwistWithCovariance twist
geometry_msgs/PoseWithCovariance pose
--------------------------------------------------------------
geometry_msgs/PoseWithCovariance pose
geometry_msgs/Point position(x,y,z,)
geometry_msgs/Quaternion orientation(x,y,z,w)
geometry_msgs/TwistWithCovariance twist
geometry_msgs/Twist
geometry_msgs/Vector3 linear(x,y,z)
geometry_msgs/angular3(x,y,z)
Laser footprint=Base_link 와 레이져 스캐너 원점과 바퀴위치
tf node 만들어줌
그내용을 RVIZ 로 보면
점선이 tf
붉은 화살표가 pose velosity
mapframe odomframd base_link 좌우휠
상대 관계
센서노드는 다른 생각할것없이 그대로 다운 로드 사용
sensor _msgs/LaserScan
willow garage 에 있음
move base setup &cofiguration files
5+2
5 parameter
2 mlaunch file
create package
dependency
5+2
2 launch file
5 parameter
여기는 별 설명 할게 없음
필여한 노드를 다 불러준다
mover rosserial move_base RVIZ sensor
레이저 센서를 달고
막 돌아다녔더니
지도를 그렸다
화살표
xt 를 예측하려면 Ut Zt
Zt --m,Xt
지도가 있으면 내위치를 알기가 수월할텐데...
내위치를 알면 지도 그리기가 수월 할텐데...
이 두가지를 동시 해결=어려움:
의뜻
slam_gmappingg node -> 775 lines
RaoBlackwellization
map=path 추정 by particle filter and occupancy grid map
Factorization introduced by Murphy 1999
그리드 맵 그리는 과정입니다
샌서 데이터에 따라
범위내에 있는 해당 cell 들에 각각
inverse sensor model
locc,lfree,unkown value 를 주고
이전 cell 상태를 고려 하여
baysian uodate
이후 조금씩 그려진 각각의 local map을 합쳐서 전체 지도로 만듬
rkr local map 을 합쳐서 global map 을 만들어 준다
지도를 그리기위한것
아까 mover 가 여기서 쓰일거라고 말씀 드렸지요
내용은
odometry/Tf
sensor node
gmapping_slam node
mover node
slam_gmapping node
RVIZ -node 불러줌니다
mover 로 로봇을 조정하며 집안을 돌아다녀
지도 그리기
다그렸으면 지도를 저장해 줍니다
마지막
( after motion update )
추측항법에서 발생된 오차포함 (motion update?)
scan data 로 sensor update
motion update 시 오차 발생
sensor update 통해 오차 보정
이론
MCL
state of maximum confusion
sensor update--gain info scan data
motion update--lose info (due to noise)
그림엔 없지만 lose information
다시 센서 업데이트--gain info
하다보면 particle 이 고갈 되겠지요(적자생존이란 표현을 쓴사람도 )
그래서 선택된 파티클의 weight 에따라 새끼를 친다