차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
activity:public:2021:ros:7 [2021/11/09 15:00:42] – package.xml 수정 반영 david | activity:public:2021:ros:7 [2021/11/09 17:22:38] (현재) – 최종수정 david | ||
---|---|---|---|
줄 1: | 줄 1: | ||
+ | ======ROS STUDY #7====== | ||
+ | =====1. ROS 스터디 전반 복습===== | ||
+ | |||
+ | ====1.1. ROS, 노드의 집합체==== | ||
+ | |||
+ | ===1.1.1 노드=== | ||
+ | * 각 노드는 특정한 역할을 맡은 독립적인 프로그램 | ||
+ | * 노드끼리 Topic, Service, Action 등을 이용하여 **데이터를 교환하면서 "큰 프로그램" | ||
+ | |||
+ | ===1.1.2 Topic=== | ||
+ | * 기본개념 [[https:// | ||
+ | * **Publisher에서 데이터 단방향 송신** | ||
+ | * Subsciber에서 데이터 수신 | ||
+ | * 활용법 [[activity: | ||
+ | |||
+ | ===1.1.3 Service=== | ||
+ | * 기본개념 [[https:// | ||
+ | * Client에서 Server로 데이터 요청 | ||
+ | * **요청을 받은 Server는 Client에게 응답(데이터 전송)** | ||
+ | * 활용법 [[activity: | ||
+ | |||
+ | ===1.1.4 Action=== | ||
+ | * 기본개념 [[https:// | ||
+ | * Clinet에서 Server로 데이터 요청 | ||
+ | * 요청을 받은 Server는 Client애개 | ||
+ | * **작업 진행 중 상황을 지속적으로 송신(feedback)** | ||
+ | * 중간에 Client에서 취소 요청이 있을 경우 실행 중단 | ||
+ | * 작업 완료 후 Client에게 최종 응답(result) | ||
+ | * ROS 기본 타입이기는 하나, 실제로는 Service와 Topic 여러 개가 조합되어있는 조립체로, | ||
+ | * 간단하게 다루기에는 불필요하게 길어지는 코드가 많아 본 스터디에서는 비중있게 다루지 않았음 | ||
+ | |||
+ | ===1.1.5. 노드 사이의 통신=== | ||
+ | * 노드 서로의 정체를 확인하고 통신을 시작하는데 필요한 중계소 역할은 **마스터 노드**('' | ||
+ | * 한 로봇을 완성하기 위한 여러 노드들이 *반드시 한 컴퓨터에서 실행될 필요는 없음* - 네트워크 상에서 각 노드가 실행되고 있는 각 컴퓨터들이 서로를 *볼 수 있는(자유롭게 통신 가능한)* 상황이면 여러 디바이스를 통합 사용 가능 | ||
+ | * '' | ||
+ | * '' | ||
+ | * 활용예 | ||
+ | * 라즈베리파이3B를 얹은 터틀봇3과 명령/ | ||
+ | * 로봇 위에 얹은 저사양 컴퓨터는 모터 제어 노드만 실행, 이미지 분석 등 고성능 연산 필요한 것은 별도 고성능 컴퓨터에서 실행하여 연동 | ||
+ | |||
+ | ====1.2. ROS 노드 실행과 관리==== | ||
+ | * 명령어 목록은 [[activity: | ||
+ | * 각종 명령어 활용 예제는 [[activity: | ||
+ | |||
+ | ====1.3. ROS 프로그래밍 절차==== | ||
+ | * 제작하는 패키지는 '' | ||
+ | * 해당 패키지에서 필요한 의존 패키지는 '' | ||
+ | * 토픽('' | ||
+ | * 토픽 구성은 [[activity: | ||
+ | * 서비스 구성은 [[activity: | ||
+ | * 노드 소스코드는 프로젝트 '' | ||
+ | * 여러 노드와 설정 파일을 담아 한 번에 간편 실행하려면, | ||
+ | * '' | ||
+ | |||
+ | ====1.4. 예제분석==== | ||
+ | [[activity: | ||
+ | ===1.4.1. ROS 환경 준비=== | ||
+ | 오랫동안 Ubuntu 환경을 사용하지 않았다면 각종 업데이트가 밀려있을 것이다. 우선 밀린 업데이트를 설치해주도록 하자. | ||
+ | <sxh bash title: | ||
+ | $ sudo apt update | ||
+ | $ sudo apt upgrade | ||
+ | </ | ||
+ | <sxh bash title: | ||
+ | $ au | ||
+ | </ | ||
+ | |||
+ | ===1.4.2. 프로젝트 생성=== | ||
+ | // | ||
+ | <sxh bash title: | ||
+ | $ catkin_create_pkg cmd_vel_pub message_generation roscpp geometry_msgs message_runtime | ||
+ | </ | ||
+ | **'' | ||
+ | 이번 실습에서는 터미널 창보다 VSCode 상에서 한 번에 프로그래밍할 예정이다. 방금 만든 패키지를 폴더 째로 열자. | ||
+ | <sxh bash title: | ||
+ | $ code cmd_vel_pub | ||
+ | </ | ||
+ | **마찬가지로, | ||
+ | 또는, 여러 패키지를 동시에 작업하고 싶다면, VSCode에서 '' | ||
+ | <sxh bash title: | ||
+ | $ code ~/ | ||
+ | </ | ||
+ | |||
+ | VSCode 폴더가 제대로 열렸는지 확인한다. | ||
+ | |||
+ | ===1.4.3. 메시지 파일 추가=== | ||
+ | * VSCode 좌측 파일 목록에서 '' | ||
+ | <sxh cpp title: | ||
+ | geometry_msgs/ | ||
+ | </ | ||
+ | **'' | ||
+ | |||
+ | ===1.4.4. Publisher 노드 추가=== | ||
+ | * VSCode 좌측 파일 목록에서 패키지 폴더 내 '' | ||
+ | <sxh cpp title: | ||
+ | #include " | ||
+ | #include " | ||
+ | |||
+ | #define PUB_NODE_NAME " | ||
+ | #define SUB_NODE_NAME " | ||
+ | #define TOPIC_NAME " | ||
+ | |||
+ | float vel_x, vel_y; | ||
+ | |||
+ | int main(int argc, char **argv){ | ||
+ | ros:: | ||
+ | ros:: | ||
+ | geometry_msgs:: | ||
+ | |||
+ | ros:: | ||
+ | ros::Rate loop_rate(0.3); | ||
+ | |||
+ | cmd_vel.linear.x = 0; | ||
+ | cmd_vel.linear.y = 0; | ||
+ | |||
+ | while (ros:: | ||
+ | std::cout << "Input velocity: " << std::endl; | ||
+ | std::cin >> vel_x >> vel_y; | ||
+ | |||
+ | float current_x = cmd_vel.linear.x; | ||
+ | float current_y = cmd_vel.linear.y; | ||
+ | |||
+ | loop_rate.sleep();// | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===1.4.5. Subscriber 노드 추가=== | ||
+ | * VSCode 좌측 파일 목록에서 패키지 폴더 내 '' | ||
+ | |||
+ | <sxh cpp title: | ||
+ | #include " | ||
+ | #include " | ||
+ | |||
+ | #define PUB_NODE_NAME " | ||
+ | #define SUB_NODE_NAME " | ||
+ | #define TOPIC_NAME " | ||
+ | |||
+ | void messageCb(const geometry_msgs:: | ||
+ | ROS_INFO(" | ||
+ | ROS_INFO(" | ||
+ | ROS_INFO(" | ||
+ | ROS_INFO(" | ||
+ | ROS_INFO(" | ||
+ | ROS_INFO(" | ||
+ | } | ||
+ | |||
+ | int main(int argc, char **argv){ | ||
+ | ros:: | ||
+ | ros:: | ||
+ | |||
+ | ros:: | ||
+ | |||
+ | ros:: | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===1.4.6. CMakeLists.txt 수정=== | ||
+ | * VSCode 좌측 파일 목록에서 패키지 폴더 내 해당 파일을 연다. | ||
+ | * 수정사항 | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * 노드를 등록한다. 각 노드에 대해... | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | <sxh cpp title: | ||
+ | cmake_minimum_required(VERSION 3.0.2) | ||
+ | project(cmd_vel_pub) | ||
+ | |||
+ | find_package(catkin REQUIRED COMPONENTS | ||
+ | geometry_msgs | ||
+ | message_generation | ||
+ | message_runtime | ||
+ | roscpp | ||
+ | ) | ||
+ | |||
+ | ## Generate messages in the ' | ||
+ | add_message_files( | ||
+ | FILES | ||
+ | cmd_vel_msg.msg | ||
+ | ) | ||
+ | |||
+ | ## Generate services in the ' | ||
+ | # add_service_files( | ||
+ | # FILES | ||
+ | # | ||
+ | # | ||
+ | # ) | ||
+ | |||
+ | ## Generate actions in the ' | ||
+ | # add_action_files( | ||
+ | # FILES | ||
+ | # | ||
+ | # | ||
+ | # ) | ||
+ | |||
+ | ## Generate added messages and services with any dependencies listed here | ||
+ | generate_messages( | ||
+ | DEPENDENCIES | ||
+ | geometry_msgs | ||
+ | ) | ||
+ | |||
+ | ##캐킨 패키지 옵션으로 라이브러리, | ||
+ | catkin_package( | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | ) | ||
+ | |||
+ | |||
+ | include_directories( | ||
+ | # include | ||
+ | ${catkin_INCLUDE_DIRS} | ||
+ | ) | ||
+ | |||
+ | ## | ||
+ | |||
+ | add_executable(cmd_vel_pub src/ | ||
+ | add_dependencies(cmd_vel_pub ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) | ||
+ | target_link_libraries(cmd_vel_pub ${catkin_LIBRARIES}) | ||
+ | | ||
+ | add_executable(topic_subscriber src/ | ||
+ | add_dependencies(topic_subscriber ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) | ||
+ | target_link_libraries(topic_subscriber ${catkin_LIBRARIES}) | ||
+ | </ | ||
+ | |||
+ | ===1.4.7. package.xml 수정=== | ||
+ | * VSCode 좌측 파일 목록에서 패키지 폴더 내 해당 파일을 연다. | ||
+ | * 패키지 생성 시 거의 자동으로 설정해 준 상태이다. 다음을 수정한다: | ||
+ | * '' | ||
+ | * 원래는 각 파트별로 따로 dependent 패키지를 지정해주어야 하나, 그 수가 많지 않고 dependent 관련 오류를 줄이기 위해 단순화하였다. | ||
+ | * '' | ||
+ | * '' | ||
+ | <sxh xml title: | ||
+ | <?xml version=" | ||
+ | <package format=" | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | |||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | |||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | ===1.4.8. 실행 준비: 빌드=== | ||
+ | 우선, 작업한 파일 모두 저장되었는지 확인하고 빌드를 진행한다. 터미널은 VSCode에서 단축키 '' | ||
+ | <sxh bash title: | ||
+ | $ cd ~/catkin_ws | ||
+ | $ catkin_make | ||
+ | </ | ||
+ | <sxh bash title: | ||
+ | $ makeros | ||
+ | </ | ||
+ | 위의 일반 명령어와 축약명령어는 완전히 동일하다. 축약명령어를 사용하면 '' | ||
+ | |||
+ | ===1.4.9. 실행=== | ||
+ | * VSCode 터미널 창을 여러 개로 분할한다. 여러 노드를 실행할 예정이다. | ||
+ | * '' | ||
+ | * 해당 표시가 없다면, VSCode에 ROS Extension이 설치되어있지 않은 것이다. 좌측 Extension 메뉴에서 ROS Extension을 설치하도록 하자. | ||
+ | ==1.4.9.1. Subscriber 노드 실행== | ||
+ | <sxh bash title: | ||
+ | $ rosrun cmd_vel_pub topic_subscriber | ||
+ | </ | ||
+ | 토픽이 Publish될때까지 아무런 출력이 없는 것이 정상이다. | ||
+ | ==1.4.9.1. Subscriber 노드 실행== | ||
+ | <sxh bash title: | ||
+ | $ rosrun cmd_vel_pub cmd_vel_pub | ||
+ | Input velocity: | ||
+ | </ | ||
+ | 차례대로 x 병진속도와 y 병진속도를 입력하면 해당 값대로 cmd_vel이 Publish되는 것을 subscriber 노드를 통해 확인할 수 있다. | ||
+ | ===1.4.10. 응용=== | ||
+ | * '' | ||
+ | * 예) '' | ||
+ | * 해당 노드의 경우 토픽 이름을 ''/ | ||
+ | * 다른 패키지의 노드에 원하는 값을 publish하면 모든 노드를 전부 직접 만들지 않아도 원하는 기능을 쉽게 구현할 수 있다. ROS의 효과적인 활용을 위해서는 토픽 publish-subscribe, |