embedded/ROS

4. pub & sub 메시지 통신

crab. 2021. 8. 31. 19:27

이어서 전에 설정해둔 단축키를 통해 패키지를 생성한다.

cs
catkin_create_pkg pub_sub_msg_pkg std_msgs roscpp message_generation actionlib actionlib_msgs
cm
roscd pub_sub_msg_pkg/src

위의 마지막 코드로 pub_sub_msg_pkg/src 디렉터리로 이동한다.

 

이후 talker와 listener를 작성할건데 각각 퍼블리셔와 서브스크라이버이다.

 

pub_sub_msg_pkg/src 디렉터리에서 퍼블리셔, 서브스크라이버 코드를 차례대로 작성한다.

[편집기] talker.cpp
#include "ros/ros.h"
#include "std_msgs/Int32.h"
#include <iostream>

int main(int argc, char **argv){

  ros::init(argc, argv, "talker");
	
  ros::NodeHandle n;
  ros::Publisher pub = n.advertise<std_msgs::Int32>("/numbers", 10);
    
  ros::Rate loop_rate(10);
    
  int count = 0;   
  while(ros::ok()){    
    
    std_msgs::Int32 msg;
    
    msg.data = count;
        
    ROS_INFO("%d", msg.data);
        
    pub.publish(msg);
        
    ros::spinOnce();
        
    loop_rate.sleep();
    ++count;
  }
  
  return 0;
}

============================================================================

[편집기] listener.cpp
#include "ros/ros.h"
#include "std_msgs/Int32.h"
#include <iostream>


void numberCallback(const std_msgs::Int32::ConstPtr& msg){
   ROS_INFO("Recieved: [%d]", msg->data);
}

int main(int argc, char **argv){

   ros::init(argc, argv, "listener");
   
   ros::NodeHandle n;
   ros::Subscriber sub = n.subscribe("/numbers", 10, numberCallback);
   
   ros::spin();
   
   return 0;
}

그 다음 package.xml과 CMakeLists.txt를 수정하는데 

 

나중에 많이 알아보니까 이 부분이 은근 어렵고 중요한 것 같다.. 아마도 익숙하지 않아서 그런것같다.

 

make의 개념과 응용에 익숙해져야 한다.

 

참고사이트에 나왔지만 자세히 봐야하는데 cs(= cd  ~/catkin_ws/src)로 이동한 후에 

 

 pub_sub_msg_pkg 디렉터리로 이동하여 이미 존재하는 package.xml과 CMakeLists.txt를 수정한다.

cs
cd pub_sub_msg_pkg
ls //확인용도
[편집기] package.xml
// 수정할 필요없다.
[편집기] CMakeLists.txt

주어진 코드 외에도 이미 존재하는 코드들이 있었는데 코드를 지우지는 않고 추가만 했다.

 

(순서를 지키면서 해야한다.)

 

이후 

cm pub_sub_msg_pkg

을 하고 이후 참고 사이트가 나같은 초보자에게는 살짝 헷갈릴 수도 있지만 

cm

을 한다.

그럼 이렇게 뜨는데 이후 새로운 터미널 4개의 창에 각각 

roscore

rosrun pub_sub_msg_pkg talker

rosrun pub_sub_msg_pkg listener

rqt_graph

을 순서대로 치면

이런식으로 roscore의 작동과 pub와 sub가 정상적으로 움직이는 것을 그래프로 확인할 수 있다.

 

원은 노드이며, 화살표 방향으로 퍼블리셔와 서브스크라이버의 관계를 알 수 있다. 화살표 위에 있는 /numbers는 어떠한 토픽으로 메시지를 송수신하고 있는지 알 수 있다.

 

이제 정말 어쩌면 지금까지 과정중 제일 큰 산인 실시간 스트리밍이 남았다.

'embedded > ROS' 카테고리의 다른 글

6. ROS & opencv (cv_bridge) 실시간 스트리밍...성공!  (1) 2021.09.01
5. ROS & opencv (cv_bridge) 실시간 스트리밍...실패  (0) 2021.09.01
3. ROS 설치완료  (0) 2021.08.31
2. ROS-Melodic 설치  (0) 2021.08.30
1. ROS 시작  (0) 2021.08.30