[ROS] ROS 퍼블리셔, 서브스크라이버
ROS 패키지 생성
- 패키지 생성
cd ~/catkin_ws/src
beginner_tutorials
패키지 생성
catkin_create_pkg [pakage_name] [depend1] [depend2] [depend2]
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
- beginner_tutorials 폴더가 생성이되고
CMakeList.txt
,package.xml
이 생성된다. 여기에 위에서 설정한 패키지에 대한 설명을 포함한다.
cd beginner_tutorials
- 빌드 디렉토리 이동
$ cd ~/catkin_ws
$ ls
include # 헤더 파일 폴더
src # 소스 코드 볼더
CMakeList.txt # 빌드 설정 파일
package.xml # 패키지 설정 파일
catkin_make
와catkin build
를 혼용해서 사용했울 경우 에러가 발생할 수 있다.
catkin clean # 이전 빌드 초기화
- 저는
catkin_make
로는 노드 생성이 되지 않아catkin build
사용합니다.
catkin build
source ~/catkin_ws/devel/setup.bash
패키지 설정 파일
vim package.xml
- 아래와 같이 패키지 설정 파일 작성
<?xml version="1.0"?>
<package format="2">
<name>beginner_tutorials</name>
<version>0.1.0</version>
<description>The beginner_tutorials package</description>
<maintainer email="you@yourdomain.tld">Your Name</maintainer>
<license>BSD</license>
<url type="website">http://wiki.ros.org/beginner_tutorials</url>
<author email="you@yourdomain.tld">Jane Doe</author>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>rospy</exec_depend>
<exec_depend>std_msgs</exec_depend>
</package>
빌드 설정 파일 작성
vim CMakeList.txt
- 아래와 같이 빌드 설정 파일 작성
# %Tag(FULLTEXT)%
cmake_minimum_required(VERSION 2.8.3)
project(beginner_tutorials)
## Find catkin and any catkin packages
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)
## Declare ROS messages and services
add_message_files(FILES Num.msg)
add_service_files(FILES AddTwoInts.srv)
## Generate added messages and services
generate_messages(DEPENDENCIES std_msgs)
## Declare a catkin package
catkin_package()
## Build talker and listener
include_directories(include ${catkin_INCLUDE_DIRS})
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)
# %EndTag(FULLTEXT)%
메시지 파일 작성
cd ~/catkin_ws/beginner_tutorials
mkdir msg
vim Num.msg
Num.msg
에 아래 작성int64
형식의 num 생성int64 num
서비스 파일 작성
cd ~/catkin_ws/beginner_tutorials mkdir srv vim AddTwoInts.srv
Num.msg
에 아래 작성int64
형식의 num 생성
응답
---
요청
int64 a
int64 b
---
int64 sum
퍼블리셔 노드 생성
- 파일 생성
cd ~/catkin_ws/src
vim talker.cpp
- talker.cpp에 코드 내용 작성
#include "ros/ros.h" // ROS 기본 헤더 파일
#include "std_msgs/String.h" //std_msg 패키지 파일 헤더
#include <sstream>
//주어진 문자열에서 필요한 정보를 빼낼 때 유용하게 사용
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker"); // 노드명 초기화
ros::NodeHandle n; //ROS 시스템과 통신을 위한 노드 핸들 선언
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
// std_msgs 패키지의 스트링 사용,
// 퍼블리셔 chatter_pub를 작성
// 토픽 명은 chatter 이며, 큐 사이즈를 1000으로 설정
ros::Rate loop_rate(10);
// 루프 주기 설정 , 0.1초 간격으로 처리 반복
int count = 0;
while (ros::ok())
{
std_msgs::String msg; // 타입이 std_msgs::String인 메시지 변수 msg 선언
std::stringstream ss;//stringstream 생성
ss << "hello world " << count;
//helloworld랑 count 변수 붙이기
msg.data = ss.str(); // 현재 stringstream이 저장하고 있는 문자열의 복사본을 반환
ROS_INFO("%s", msg.data.c_str());
//msg.data의 string의 첫번째 문자열 주소값 반환
// 한것을 터미널에 해당 문쟈열 출력
chatter_pub.publish(msg); //chatter_pub 퍼블리셔에 msg 발행
ros::spinOnce(); // 실행 반복...?!
loop_rate.sleep(); // 루프 주기에 따라 잠자기에 들어간다.
++count;
}
return 0;
}
서브스크라이버 노드 생성
- 파일 생성
cd ~/catkin_ws/src vim listener.cpp
- listener.cpp에 코드 내용 작성
#include "ros/ros.h"
#include "std_msgs/String.h"
/**
* This tutorial demonstrates simple receipt of messages over the ROS system.
*/
// 메시지 콜백 함수
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
// 받은 메시지 터미널에 출력
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener"); // 노드 명 초기화
ros::NodeHandle n; // 통신을 위한 노드 핸들 선언
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
// 서브스크라이버 sub 생성
// 토픽 명은 chatter
// 메시지가 수신되기를 대기
ros::spin();
return 0;
}
빌드 및 실행
- 세 터미널 실행
roscore
cd ~/catkin_ws catkin build rosrun beginner_tutorials talker
cd ~/catkin_ws catkin build rosrun beginner_tutorials listener
[ INFO] [1596938764.747689806]: hello world 348
[ INFO] [1596938764.847676088]: hello world 349
[ INFO] [1596938764.947665128]: hello world 350
[ INFO] [1596938765.047666848]: hello world 351
[ INFO] [1596938765.147679626]: hello world 352
[ INFO] [1596938765.247687048]: hello world 353
[ INFO] [1596938765.347670694]: hello world 354
[ INFO] [1596938765.447668962]: hello world 355
[ INFO] [1596938765.547665370]: hello world 356
[ INFO] [1596938765.647671929]: hello world 357
[ INFO] [1596938765.747660301]: hello world 358
[ INFO] [1596938765.847673416]: hello world 359
[ INFO] [1596938765.947716690]: hello world 360
[ INFO] [1596938766.047669841]: hello world 361
[ INFO] [1596938766.147662413]: hello world 362
[ INFO] [1596938766.247682612]: hello world 363
[ INFO] [1596938766.347711041]: hello world 364
[ INFO] [1596938766.447673138]: hello world 365
[ INFO] [1596938766.547666443]: hello world 366
[ INFO] [1596938766.647668220]: hello world 367
[ INFO] [1596938766.747673589]: hello world 368
[ INFO] [1596938766.847683292]: hello world 369
[ INFO] [1596938763.748036248]: I heard: [hello world 338]
[ INFO] [1596938763.848012166]: I heard: [hello world 339]
[ INFO] [1596938763.948053175]: I heard: [hello world 340]
[ INFO] [1596938764.047965859]: I heard: [hello world 341]
[ INFO] [1596938764.147991623]: I heard: [hello world 342]
[ INFO] [1596938764.247966580]: I heard: [hello world 343]
[ INFO] [1596938764.347989641]: I heard: [hello world 344]
[ INFO] [1596938764.448160705]: I heard: [hello world 345]
[ INFO] [1596938764.548239325]: I heard: [hello world 346]
[ INFO] [1596938764.648190572]: I heard: [hello world 347]
[ INFO] [1596938764.748104385]: I heard: [hello world 348]
[ INFO] [1596938764.848014076]: I heard: [hello world 349]
[ INFO] [1596938764.947999450]: I heard: [hello world 350]
[ INFO] [1596938765.047973004]: I heard: [hello world 351]
[ INFO] [1596938765.147984068]: I heard: [hello world 352]
[ INFO] [1596938765.248072914]: I heard: [hello world 353]
[ INFO] [1596938765.348087031]: I heard: [hello world 354]
[ INFO] [1596938765.448014236]: I heard: [hello world 355]
[ INFO] [1596938765.548036212]: I heard: [hello world 356]
[ INFO] [1596938765.648083477]: I heard: [hello world 357]
[ INFO] [1596938765.747949715]: I heard: [hello world 358]
[ INFO] [1596938765.848048490]: I heard: [hello world 359]
[ INFO] [1596938765.948121244]: I heard: [hello world 360]
[ INFO] [1596938766.047971012]: I heard: [hello world 361]
[ INFO] [1596938766.147932184]: I heard: [hello world 362]
[ INFO] [1596938766.248045944]: I heard: [hello world 363]
[ INFO] [1596938766.348182636]: I heard: [hello world 364]
[ INFO] [1596938766.448031058]: I heard: [hello world 365]
[ INFO] [1596938766.547941110]: I heard: [hello world 366]
[ INFO] [1596938766.647945751]: I heard: [hello world 367]
[ INFO] [1596938766.748001039]: I heard: [hello world 368]
[ INFO] [1596938766.848097269]: I heard: [hello world 369]