Written by
LSM
on
on
Robotics : ROS
ROS 프로그래밍
- 표준 단위 : SI 단위 사용
- ex. 각속도 = radian/s, 속도 = m/s
- 좌표 표현
- 회전방향 : 반시계 방향이 정방향 (오른손 법칙)
- x : 앞, y : 옆, z : 위
- 프로그래밍 규칙
- python : pep8 규칙을 따름
ROS 기본 프로그래밍
Publisher, Subscriber, Message
- catkin_create_pkg
- 자동으로 패키지에서 꼭 필요한 파일, 폴더를 만들어주는 명령어
- catkin_create_pkg 패키지명 (패키지가 의존하는 다른 패키지)
- 추가해주지 않으면 후에 package.xml에 넣어줘야 함
- package.xml
- 정보를 담고 있는 패키지
- xml을 이용해 내용이 구성됨
- 의존하는 패키지, 버전정보, 원작자 정보 등이 들어가 있음
- pacakage format은 version 2를 사용(ros2는 version 3 사용)
- description : 패키지의 정보를 적어줌(2 ~ 3줄)
- bugtracker : 버그에 대한 문제를 표현한 것
- buildtool_depend : 빌드 시 어떤 빌드 툴을 사용할 것인지
- catkin : cmake의 ros 특화 버전
- depend : 빌드 시 의존하게되는 패키지 정보
- 빌드 안된 것부터 빌드 후 자신의 소스 코드를 빌드
- std_msgs : 기본적인 자료형 포함하는 패키지
- message_generation : 메시지를 만드는 패키지
- export : meta-package나 플러그인일 때 명시하면 됨
- build 설정 파일 : CMakeLists.txt
- 빌드 옵션, 빌드 관련 정보는 CMakeLists.txt에 작성되어 있음
- project : 패키지명
- find_package : 패키지 빌드시 필요한 의존 패키지를 적어줘야 함
- add_message_files : 만드는 메시지 명
- generate_messages : 메시지가 의존하는 메시지를 작성
- catkin_package : 다른 사람이 내가 만든 패키지를 사용할 때 의존해야할 패키지
- include_directories : 헤더 파일을 추가할 시 사용
- add_executable : 실행 가능한 파일을 빌드
- add_executable(파일명 실행시킬 소스파일)
- add_dependencies : 빌드 우선권 옵션, 다른 것들부터 우선 빌드해라
- target_link_libraries : 필요한 라이브러리를 추가해 빌드 cf) opencv
- message
- 폴더명은 msg가 되어야함
- 확장자 .msg
- 자동으로 빌드되어 사용할 수 잇게 파일이 생성됨
-
cf) catkin_make 1패키지만 빌드 = catkin_make –pkg 패키지명
- code
- ros/ros.h : 기본적인 ros 헤더
- init() :노드명 초기화
- NodeHandle : 노드의 통신을 관장하는 역할
- advertise : 버퍼로 사용. 통신이 원활하지 않을 때 큐에 메시지 내용을 저장
- loop_rate : 주어진 주기로 반복
- Time::now() : 현재 시간을 가져오게 됨
- ROS_INFO() : 터미널 창 화면에 표시하는 것 = printf
- publish() : 메시지를 발행
- sleep() : 주기에 따라 슬립 발생
- spin() : 수신될 때까지 대기하고 수신되면 콜백 함수 호출
- rostopic
- hz : 주파수
- bw : 대역폭
- ROS는 이미 실행시킨 노드를 다시 실행시키면 기존의 노드가 죽어버림
- 이름을 다르게 설정하면 동시에 실행 시키는 것이 가능
- rosrun ros_tutorial_topic topic_publisher __name:=p2
Service
- 양방향 통신을 서비스를 이용해 이뤄짐
- Service Server
- CMakeLists.txt
- add_service_files() : 만들려는 서비스 정보를 다음 함수에 등록
- 서비스 파일 확장자 : .srv
- 서비스 파일은 —을 이용해 요청과 응답을 구분
(요청) int64 a int64 b --- (응답) int64 result
- CMakeLists.txt
- 보통은 쿼리 형태로 많이 사용함
- 너의 현재 위치는 어디?
- 너의 관절값은 어덯게 되니?
- Service Client
- ros_tutorial_service_client.call(srv) : 서비스를 요청하고 응답하는 것을 받음
- 응답을 받고 나면 서비스 서버와 클라이언트는 접속이 끊김
- rosservice call
- 클라이언트 노드를 만들지 않고 서비스를 사용할 수 있는 명령어
- service server 체크 기능을 가지고 있어 일부 시도 이후 종료시킬 수 있음
- 서비스는 그래프로 확인 불가
- 예제는 Node가 1개의 기능만을 가지고 있지만 보통은 Node는 2개의 역할 이상을 많이 가짐
Parameter
- 글로벌 변수, 글로벌 파라미터 등이라 생각하면 편함
- 소스의 빌드, 변경 없이 사용할 수 있는 것
- 네트워크에 존재해 네트워크에 있는 Node들이 사용할 수 있음
- navigation 등에서 많이 사용
- spinOnce() : 콜백함수 처리 루틴.
- spin() : 거의 사용하지 않음
- rosparam list : 네트워크에 있는 모든 패러미터를 확인할 수 있음
roslaunch
- 복수의 노드를 실행
- 이름, 패키지명 등의 환경설정을 할 수 있음
- –screen : 모든 노드들의 값을 스크린에 출력
- rosnode list : 노드의 정보 및 개수를 확인할 수 있음
- group
- group을 통해 namespace로 node를 나눔
- 복수개의 로봇을 사용할 때 많이 사용
- 매번 parameter가 바뀐다면 launch 파일 안에 넣어서 값을 넘겨주면 됨
- include : launch 파일 안에 다른 launch 파일을 가져오는 것
모바일 로봇
- 터틀봇3, 오픈 소스 & 오픈 하드웨어
TF Tree
- 로봇의 전체 상대 좌표를 표현한 것
- 트리 구조를 갖음
SLAM & Navigation
-
터틀봇3는 navigation을 기본으로 탑재
- SLAM
- Simultaneous Localization And Mapping
- 필수 요소
- 위치 : GPS
- 빌딩 숲 속에서는 난반사
- 실내에서는 값을 가져오지 못함
- 실내는 gps를 대체할 수 있는 indoor gps, wifi slam, beacon 등을 사용
- Dead Reckoning
- 상대 위치 기술
- IMU를 이용한 보정 있음
- lidar를 통해 얼마나 이동했는지 알 수 있음
- opencr의 코드 참조
- 센싱
- 거리, 비전, depth 등의 다양한 센서 사용
- 지도
- 길과 장애물 정보가 들어 있음
- 외부지역 지도는 있지만 내부에 지도가 없는 경우가 많음
- SLAM을 통해 지도를 만듦
- 경로
- 주어진 정보를 이용해 길을 찾아가는 것
- particle filter, dynamic window approach를 이용해 slam을 구현
- 위치 : GPS
- 위치 + 센싱 -> 지도 == SLAM
- 위치 + 센싱 + 지도 -> 경로 == Navigation
- OGM
- 2차원 점유 격자 지도
- 회색 공간 : 어떤 공간인지 알 수 없음
- 검정 공간 : 로봇이 이동 불가능한 영역
- 흰색 공간 : 로봇이 이동 가능한 영역
- Node
- 센서 노드
- Lidar, Laser 등
- scan 데이터 형태로 보냄
- tf
- 센서가 어디 위치해 있는가
- telep(조종기) + turtlebot_core
- gmapping
- tf, scan 데이터를 이용해 지도를 생성해냄
- map_server
- map_server가 .pgm 파일로 지도를 만들어냄
- 센서 노드
- 위치 추정
- Kalman Filter가 많이 쓰임
- 최근은 Particle Filter를 이용해서 사용됨 (gmapping은 Particle Filter를 사용함)
- Navigation
- Dynamic Window Approach
- 충돌 가능한 장애물을 회피하면서 목표점까지 빠르게 갈 수 있는 속도를 선택
- Dynamic Window Approach
- ros 관련 sw
- gazebo
- autoware : ros 기반 자율주행
- moveit
Manipulator
- 수직다관절형이 가장 자유도가 높음. 산업현장에서도 수직다관절형이 많이 사용됨
URDF
- 로봇 모델링을 위한 기술 언어
- XML로 되어 있음
- Moveit을 사용 가능
- Manipulator를 위한 기능이 들어 있음
IK (Inverse Kinematics)
- 로봇 관절 각도가 주어졌을 때 로봇의 자세를 구하는 것
- 해가 없을 수도 있고 해가 여러개가 있을 수 있음
Moveit
- 줘야 할 정보 => URDF를 사용하면 가능!!!!!!
- link
- 외형 정보
- 기하학적 정보
- joint
- 회전형? 병진형? 운동 정보
- offset 정보
- 전/후 링크와의 관계
- 한계 값
- link
예제 code
- urdf
- xml 형식으로 이뤄짐
- link : 이름을 명시
- collision
- 링크의 기하학 정보를 담음
- origin : 링크의 상대 정보
- geometry : 형태/크기 정보
- stl resolution 정보 적은거
- visual
- 링크의 기하학 정보를 담음
- material : 색 등을 지정할 수 있음
- stl resolution 정보를 넣을 수 있음
- visual과 collision을 나눠 고퀄리티로 보여줌
- 같이 하게 되면 연산양이 엄청 많음
- interial
- mass : 무게 정보
- interia : 관성 정보
- collision
- joint : 이름 명시, type : 회전형? 병진형?을 명시
- child link, parent link
- 링크의 상하관계를 정의
- origin 상대 좌표
- axis : 축 정보
- limit : joint의 힘, 최대/최소 정보를 명시
- child link, parent link
- launch
- arg : 사용자가 변환 시킬 수 있는 인자를 의미
- parameter : ros parameter를 의미
cf) 액츄레이터는 반만 joint이다. joint는 회전축 자체만 joint가 액츄레이터 자체는 link 이다.