roscore
로 실행되는 노드)가 담당~/.bashrc
파일 내 IP 설정이 잘못된 경우, ROS 노드들이 마스터 노드에 접속하지 못해 오류가 발생nano ~./bashrc
명령으로 ~/.bashrc
내 ROS_MASTER_URI
에 설정된 IP 수정 후 터미널 재시작하거나 source ~/.bashrc
명령으로 업데이트~/catkin/ws
에 저장, catkin_create_pkg
로 프로젝트 빠르게 생성CMakeLists.txt
파일과 package.xml
파일에 명시해야 함*.msg
), 서비스(*.srv
) 파일을 작성하고 CMakeLists.txt
파일에 명시src
폴더 아래에 저장*.launch
파일을 프로젝트 launch
폴더 아래에 저장catkin_make
로 빌드ROS STUDY #6 : Topic 퍼블리시 실습에서 작성했던 코드 다시 한 번 깊게 분석하기
오랫동안 Ubuntu 환경을 사용하지 않았다면 각종 업데이트가 밀려있을 것이다. 우선 밀린 업데이트를 설치해주도록 하자.
1 2 |
$ sudo apt update $ sudo apt upgrade |
1 |
$ au |
ROS STUDY #6에서 했던 내용과 동일한 코드입니다. 다만 프로젝트 생성 방법과 구조가 확실하게 기억나지 않는다면 다시 한 번 연습해보시기 바랍니다.
1 |
$ catkin_create_pkg cmd_vel_pub message_generation roscpp geometry_msgs message_runtime |
cmd_vel_pub
는 패키지 이름이다. 만약 기존 패키지 이름과 겹치다면 새로 만들어보고, 이후 설정에서도 반영해 보도록 하자.
이번 실습에서는 터미널 창보다 VSCode 상에서 한 번에 프로그래밍할 예정이다. 방금 만든 패키지를 폴더 째로 열자.
1 |
$ code cmd_vel_pub |
cmd_vel_pub
이 아니라면 폴더명도 다를 것이므로 알맞게 수정하도록 하자.
또는, 여러 패키지를 동시에 작업하고 싶다면, VSCode에서 폴더열기 (Ctrl+K Ctrl+O)
를 아예 ~/catkin_ws/src
로 지정하거나 터미널에서
1 |
$ code ~ /catkin_ws/src |
VSCode 폴더가 제대로 열렸는지 확인한다.
cmd_vel_pub
또는 자신이 지정한 패키지명 폴더 아래 msg
폴더를 생성하고, 그 안에 새 파일을 만든다.
1 |
geometry_msgs/Twist cmd_vel |
cmd_vel_msg.msg
라는 파일은 임의로 지정해도 상관 없다. 다만, 내용 중 cmd_vel
은 다른 패키지에서도 참조할 이름이므로 다른 이름을 사용하면 작동하지 않는다. cmd_vel_msg.msg
외에 다른 이름을 사용해보고, 이후 CMakeLists.txt
파일과 노드 소스코드에서도 해당 변경사항을 반영해보자.
src
폴더 내 새 파일을 만든다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include "ros/ros.h" #include "cmd_vel_pub/cmd_vel_msg.h" #define PUB_NODE_NAME "cmd_vel" // name of node #define SUB_NODE_NAME "cmd_vel_sub" // name of node #define TOPIC_NAME "cmd_vel_topic" // name of topic : cmd_vel_pub float vel_x, vel_y; int main( int argc, char **argv){ ros::init(argc, argv, PUB_NODE_NAME); ros::NodeHandle nh; geometry_msgs::Twist cmd_vel; // variable to publish ros::Publisher cmd_vel_publisher = nh.advertise<geometry_msgs::Twist>(TOPIC_NAME, 100, true ); ros::Rate loop_rate(0.3); cmd_vel.linear.x = 0; cmd_vel.linear.y = 0; while (ros::ok()){ 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(); // Goes to sleep according to the loop rate defined above. } return 0; } |
src
폴더 내 새 파일을 만든다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include "ros/ros.h" #include "cmd_vel_pub/cmd_vel_msg.h" #define PUB_NODE_NAME "cmd_vel" // name of node #define SUB_NODE_NAME "cmd_vel_sub" // name of node #define TOPIC_NAME "cmd_vel_topic" // name of topic : cmd_vel_pub void messageCb( const geometry_msgs::Twist& cmd_vel){ ROS_INFO( "linear.x : %f\n" , cmd_vel.linear.x); ROS_INFO( "linear.y : %f\n" , cmd_vel.linear.y); ROS_INFO( "linear.z : %f\n" , cmd_vel.linear.z); ROS_INFO( "angular.x : %f\n" , cmd_vel.angular.x); ROS_INFO( "angular.y : %f\n" , cmd_vel.angular.y); ROS_INFO( "angular.z : %f\n" , cmd_vel.angular.z); } int main( int argc, char **argv){ ros::init(argc, argv, SUB_NODE_NAME); ros::NodeHandle nh; ros::Subscriber cmd_vel_subscriber = nh.subscribe(TOPIC_NAME, 10, messageCb); ros::spin(); return 0; } |
add_message_files
에 우리가 사용할 메시지 파일들을 등록한다.generate_messages
를 활성화한다catkin_package
를 활성화하고, dependent 패키지들을 등록한다.add_executable
등록add_dependencies
등록target_links_libraries
등록
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
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 'msg' folder add_message_files( FILES cmd_vel_msg.msg # 새로 만들 메세지 이름 ) ## Generate services in the 'srv' folder # add_service_files( # FILES # Service1.srv # Service2.srv # ) ## Generate actions in the 'action' folder # add_action_files( # FILES # Action1.action # Action2.action # ) ## Generate added messages and services with any dependencies listed here generate_messages( # 의존성 DEPENDENCIES geometry_msgs ) ##캐킨 패키지 옵션으로 라이브러리, 캐킨 빌드 위존성, 시스템 의존 패키지를 기술한다 catkin_package( INCLUDE_DIRS include LIBRARIES cmd_vel_pub CATKIN_DEPENDS geometry_msgs message_generation message_runtime roscpp DEPENDS system_lib ) include_directories( # include ${catkin_INCLUDE_DIRS} ) ##실행파일 add_executable(cmd_vel_pub src/cmd_vel_pub.cpp) # cmd_vel_pub:노드, cmd_vel_pub.cpp: 노드를 만들 때 참고해야할 소스코드 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/topic_subscriber.cpp) # topic_subscriber:노드, topic_subscriber.cpp: 노드를 만들 때 참고해야할 소스코드 add_dependencies(topic_subscriber ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) target_link_libraries(topic_subscriber ${catkin_LIBRARIES}) |
build_depend
, build_export_depend
, exec_depend
를 모두 depend
로 변경하고, 중복된 항목을 삭제해준다.depend
는 build_depend
, build_export_depend
, exec_depend
를 모두 포함하는 태그이다.catkin
패키지는 빌드 시 필요하므로 buildtool_depend
는 되도록 수정하지 않는다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<? xml version = "1.0" ?> < package format = "2" > < name >cmd_vel_pub</ name > < version >1.0.0</ version > < description >The cmd_vel_pub package</ description > < maintainer email = "TODO" >TODO</ maintainer > < license >TODO</ license > < buildtool_depend >catkin</ buildtool_depend > < depend >geometry_msgs</ depend > < depend >message_generation</ depend > < depend >roscpp</ depend > < depend >message_runtime</ depend > < export > </ export > </ package > |
우선, 작업한 파일 모두 저장되었는지 확인하고 빌드를 진행한다. 터미널은 VSCode에서 단축키 CTRL+`
로 띄워 이용하자.
1 2 |
$ cd ~ /catkin_ws $ catkin_make |
1 |
$ makeros |
~/catkin_ws
로 매번 이동한 후에 명령을 입력할 필요가 없어 편리하다.
CTRL+SHIFT+P
를 눌러 VSCode 자체 명령 리스트를 띄우고, ros start
라고 검색한다. ROS: start
항목을 선택하면 터미널 창을 경유하지 않고도 roscore
를 실행할 수 있다. 화면 아래 ROS1.melodic이라는 표시 앞 ❎표시가 ✅가 되었다면 VSCode에서도 정상 인식한 것이다.
1 |
$ rosrun cmd_vel_pub topic_subscriber |
1 2 |
$ rosrun cmd_vel_pub cmd_vel_pub Input velocity: |
cmd_vel
을 Publish하므로 다른 패키지의 노드를 활용할 수 있다.turtlesim/turtlesim_node
/turtle1/cmd_vel
로 맞춰 publish해주어야 turtlesim_node
에서 정상적으로 값을 subscribe한다. 노드 소스코드상에서 토픽 이름을 바꿔보자.