차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
activity:public:2021:ros:6 [2021/10/03 15:40:10] – [ROS STUDY #6 : Topic 퍼블리시 실습] yhy01625 | activity:public:2021:ros:6 [2021/10/03 21:10:19] (현재) – 99dohyung | ||
---|---|---|---|
줄 1: | 줄 1: | ||
+ | ======ROS STUDY #6 : Topic 퍼블리시 실습====== | ||
+ | |||
+ | {{youtube> | ||
+ | |||
+ | =====1. 만들어야 하는 패키지 분석===== | ||
+ | |||
+ | ====1.1. CMD_VEL이란? | ||
+ | {{: | ||
+ | |||
+ | 터틀봇의 속도 제어 명령을 내릴 때 사용하는 토픽이다. | ||
+ | 일반적으로 로봇의 이동을 제어하기 위해 많이 사용된다. | ||
+ | 형식은 geometry_msgs/ | ||
+ | |||
+ | ====1.2. Twist==== | ||
+ | <sxh bash> | ||
+ | linear.x | ||
+ | linear.y | ||
+ | linear.z | ||
+ | angular.x | ||
+ | angular.y | ||
+ | angular.z | ||
+ | </ | ||
+ | Twist 메시지 형식은, Vector3 형식을 기반으로 한다. | ||
+ | x,y,z축 방향으로의 선속도(linear), | ||
+ | |||
+ | =====2. topic 패키지 생성===== | ||
+ | <sxh bash> | ||
+ | catkin_create_pkg cmd_vel_pub message_generation roscpp geometry_msgs message_runtime | ||
+ | catkin_create_pkg [만들 패키지 이름] [의존성 패키지1] [의존성 패키지2]... | ||
+ | </ | ||
+ | catkin_ws로 이동 후, 터미널에서 위의 명령어 입력 | ||
+ | |||
+ | ====2.1. package.xml==== | ||
+ | <sxh xml title: | ||
+ | <package format=" | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | |||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ====2.2. CMakeLists.txt==== | ||
+ | 작성한 노드를 빌트 할때 즉 소스코드 작성 후 실행파일을 만들때 사용되는 옵션들 | ||
+ | <sxh cpp title: | ||
+ | cmake_minimum_required(VERSION 2.8.3) | ||
+ | project(cmd_vel_pub) | ||
+ | |||
+ | find_package(catkin REQUIRED COMPONENTS message_generation roscpp geometry_msgs) | ||
+ | |||
+ | include_directories(${catkin_INCLUDE_DIRS}) | ||
+ | |||
+ | add_message_files(FILES Cmd_vel_msg.msg) | ||
+ | generate_messages(DEPENDENCIES geometry_msgs) | ||
+ | |||
+ | ##캐킨 패키지 옵션으로 라이브러리, | ||
+ | catkin_package( | ||
+ | INCLUDE_DIRS | ||
+ | CATKIN_DEPENDS roscpp geometry_msgs | ||
+ | DEPENDS | ||
+ | ) | ||
+ | |||
+ | ########### | ||
+ | ## Build ## | ||
+ | ########### | ||
+ | |||
+ | ## | ||
+ | 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(sub_test src/ | ||
+ | add_dependencies(sub_test ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) | ||
+ | target_link_libraries(sub_test ${catkin_LIBRARIES}) | ||
+ | </ | ||
+ | |||
+ | =====3. 메세지(msg) 등록===== | ||
+ | <sxh cpp title: | ||
+ | geometry_msgs/ | ||
+ | </ | ||
+ | |||
+ | |||
+ | =====4. 노드 코드 작성===== | ||
+ | |||
+ | ====4.1. 퍼블리셔(publisher)==== | ||
+ | <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::cin >> vel_x >> vel_y; | ||
+ | |||
+ | float current_x = cmd_vel.linear.x; | ||
+ | float current_y = cmd_vel.linear.y; | ||
+ | |||
+ | |||
+ | loop_rate.sleep();// | ||
+ | |||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ====4.2. 서브스크라이버(subscriber)==== | ||
+ | <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:: | ||
+ | |||
+ | ros:: | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||