본문 바로가기
IT/C++

ROS(Robot Operating System) 프로그래밍(Hello World Example, C++)

by icebear3000 2023. 4. 11.
반응형

 이 글에서는 이전 글에서 설명한 내용을 기반으로 "Hello_world" 문자열 메시지를 보내기 위해 hello_world라는 기본 패키지와 publisher 노드 및 subscriber 노드를 만듭니다.


Creating a hello_world Package

 ROS에서 프로그램은 패키지로 구성됩니다. 그래서 우리는 프로그램을 작성하기 전에 ROS 패키지를 만들어야 합니다. ROS 패키지를 만들려면 패키지 이름을 지정한 다음 패키지 내부의 프로그램을 컴파일하는 데 도움이 되는 종속 패키지를 지정해야 합니다. 예를 들어 패키지에 C++ 프로그램이 있으면 "roscpp"를 종속성으로 추가해야 하고, Python이면 "rospy"를 종속성으로 추가해야 합니다. 패키지를 생성하기 전에 먼저 src 폴더로 전환합니다:

$ catkin_create_pkg hello_world roscpp rospy std_msgs

The output of catkin_create_pkg

이제 생성된 여러 파일을 살펴볼 수 있습니다.

 

package.xml: 패키지 및 종속성에 대한 정보가 있습니다.
CMakeLists.txt file: 패키지를 빌드하는 데 필요한 CMake의 최소 버전과 프로젝트 이름이 파일 맨 위에 있습니다.


 find_package()는 이 패키지의 필요한 종속성을 찾습니다. 이러한 패키지를 사용할 수 없으면 이 패키지를 만들 수 없습니다. catkin_package()는 빌드 시스템에 catkin 관련 정보를 지정하는 데 사용되는 catkin 제공 CMake 매크로입니다.


Creating a ROS C++ Node

 패키지를 생성한 후 다음 단계는 ROS 노드를 생성하는 것입니다. C++ 코드는 src 폴더에 보관됩니다. 다음은 첫 번째 ROS 노드입니다. "Hello World" 문자열 메시지를 publish하기 위한 C++ 노드입니다. (src/talker.cpp)

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char **argv)
{
  ros::init(argc, argv, "talker");
  ros::NodeHandle n;
  ros::Publisher chatter_pub = n.advertise<std_
  msgs::String>("chatter", 1000);
  ros::Rate loop_rate(10);
  int count = 0;
  while (ros::ok())
  {
    std_msgs::String msg;
    std::stringstream ss;
    ss << "hello world" << count;
    msg.data = ss.str();
    ROS_INFO("%s", msg.data.c_str());
    chatter_pub.publish(msg); 
    ros::spinOnce();
    loop_rate.sleep();
    ++count;
}
return 0; }

 다음으로 talker.cpp에서 게시한 topic을 구독하는 listener.cpp가 표시됩니다. 항목에서 데이터를 가져온 후 해당 메시지를 인쇄합니다. (src/listener.cpp)

#include "ros/ros.h"
#include "std_msgs/String.h"
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);
  ros::spin();
  return 0;
}

listener.cpp에서 "chatter" 항목은 topic에 대한 콜백 함수인 chatterCallback을 subscribing하고 registering하는 것입니다. 콜백은 코드의 시작 부분에 정의됩니다. "chatter" 항목에 메시지가 표시될 때마다 이 콜백이 실행됩니다. 콜백 내부에는 메시지의 데이터가 인쇄됩니다.

 ros::spin()은 subscribe 콜백을 실행하고 노드가 대기 상태를 유지하도록 도와 Ctrl+C를 누를 때까지 종료되지 않습니다.


Editing the CMakeLists.txt File

 

Building C++ Nodes

 

Executing C++ Nodes

 

Creating Launch Files

 

Visualizing a Computing Graph

 

 

 

반응형

'IT > C++' 카테고리의 다른 글

C++ Strings(c_str() / Substrings)  (0) 2023.05.29
C++ References 정리  (0) 2023.05.28
C++이란?  (0) 2023.05.27
C++ Pointers 정리  (0) 2023.05.27
C++ 기초 총정리 요약  (0) 2023.04.24

댓글