학습 내용
거북이 토픽 전송 예제
구현 방법
키보드로 거북이를 조종하는 프로그램을 토픽 방식의 통신을 사용하여 구현한다. 전체 통신 과정은 subscriber인 노드 2에서 마스터(core)로 메시지 수신을 요청한 뒤 마스터가 publisher인 노드 1의 정보를 subscriber에게 전달한다. 이후 노드 간 접속 요청을 통해 연결이 이루어져 메시지를 전송한다.
실습 과정
실습을 위해 4개의 터미널을 열고 각 화면마다 roscore 실행, teleop_turtle_key 노드 실행, turtlesim_node 노드 실행, 그리고 rosnode과 rostopic을 실행한다.
먼저 터미널 1에 $ roscore 명령어를 입력하여 roscore를 실행시킨다. 이 roscore는 프로그램 실행 동안 계속 돌아가고 있어야 한다. 이후 roscore가 잘 동작하는지 확인하기 위해 터미널 4에 $ rosnode list 명령어를 입력하여 확인한다. 이때 /rosout이 출력되면 정상적으로 동작하고 있는 것이다. 다음으로 터미널 2에 $ rosrun turtlesim turtlesim_node 명령을 실행하여 토픽을 받아서 거북이를 이동시키는 노드를 생성한다.
$ roscore // 터미널 1
$ rosnode list // 터미널 4
$ rosrun turtlesim turtlesim_node // 터미널 2
다시 터미널 4에서 거북이 명령이 제대로 동작하는 지 확인해 보면 /turtlesim이 추가된 것을 알 수 있다.
이제 키보드를 통해 거북이를 움직이기 위해 터미널 3을 열고 roscore와 turtlesim_node가 실행 중인 상태에서 $ rosrun turtlesim turtle_teleop_key 명령을 입력하여 실행한다.
$ rosrun turtlesim turtle_teleop_key
이때 $ rqt_graph 명령을 통해 노드와 토픽 관계를 시각적으로 확인할 수도 있다.
$ rqt_graph
터미널 4를 열어서 $ rostopic list 명령으로 어떤 토픽이 날아다니는지 살펴볼 수 있다. 또한 $ rostopic echo/turtle1/cmd_vel 명령을 통해 토픽에 담긴 메시지의 내용을 볼 수 있다.
$ rostopic list
$ rostopic echo/turtle1/cmd_vel
터미널에서 토픽을 직접 발행할 수도 있다. 아래의 명령을 터미널에 입력하면 화면의 거북이가 이동한다.
// rostopic pub [발행 수] [토픽] [메시지 타입] -- [메시지 내용]
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
pub.cpp
#include "ros/ros.h"
#include "geometry_msgs/Twist.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, "my_node", ros::init_options::AnonymousName);
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 1);
geometry_msgs::Twist msg;
msg.linear.x = 2.0;
msg.linear.y = 2.0;
msg.linear.z = 2.0;
msg.angular.x = 0.0;
msg.angular.y = 0.0;
msg.angular.z = 1.8;
ros::Rate rate(1);
while (ros::ok())
{
pub.publish(msg);
rate.sleep();
}
return 0;
}
sub.cpp
#include "ros/ros.h"
#include "turtlesim/Pose.h"
#include <iostream>
void callback(turtlesim::Pose msg) {
std::cout<<msg.x<<", "<<msg.y;
}
int main(int argc, char **argv) {
ros::NodeHandle nh;
ros::init(argc, argv, "my_listener", ros::init_options::AnonymousName);
ros::Subscriber sub = nh.subscribe<turtlesim::Pose>("/turtle1/pose", 1, callback);
ros::spin();
return 0;
}
'Study > ROS' 카테고리의 다른 글
[ROS 튜토리얼] 과제 #1. 누락 없이 모두 잘 도착하는가? (0) | 2023.10.03 |
---|---|
[ROS 튜토리얼] ROS 통신 중 발생하는 다양한 문제 상황과 해결 방법 (1) | 2023.10.03 |
[ROS 튜토리얼] ROS 노드 통신 프로그래밍 (0) | 2023.09.27 |
[ROS 튜토리얼] ROS 설치 방법 (0) | 2023.09.25 |
[ROS 튜토리얼] ROS 기초 (0) | 2023.09.25 |