FOSCAR-(Autonomous Driving)/ROS 스터디
[2025 ROS 스터디] 조원영 #3주차- ROS 기본 프로그래밍
reveroftrillion
2025. 5. 8. 15:09
반응형
ROS 기본 프로그래밍
1. ROS 프로그래밍 전에 알아둬야 할 사항
표준 단위
- Angle = Radian
- Frequency = Hertz
- Force = Newton
- Power = Watt
- Voltage = Volt
- Length = Meter
- Mass = Kilogram
- Time = Second
- Current = Ampere
- Temperature = Celsius
좌표 표현 방식
- X = Forward, Y = Left, Z = Up
- 오른손 법칙
프로그래밍 규칙
- under_scored: 패키지, 토픽, 서비스 등
- CamelCased: 타입, 클래스, 구조체, 함수, 메소드 등
- ALL_CAPITALS: 상수, 매크로 등
2. Publisher와 Subscriber 노드 작성 및 실행
1. 패키지 생성
$ cd ~/catkin_ws/src
$ catkin_create_pkg ros_tutorials_topic message_generation std_msgs roscpp
$ cd ros_tutorials_topic
$ ls
2. 패키지 설정 파일 (package.xml) 수정
$ gedit package.xml
3. 빌드 설정 파일 (CMakeLists.txt) 수정
$ gedit CMakeLists.txt
4. 메시지 파일 작성
$ roscd ros_tutorials_topic
$ mkdir msg
$ cd msg
$ gedit MsgTutorial.msg
메시지 파일 내용 (MsgTutorial.msg):
time stamp
int32 data
5. Publisher 노드 작성
$ roscd ros_tutorials_topic/src
$ gedit topic_publisher.cpp
// topic_publisher.cpp
#include "ros/ros.h"
#include "ros_tutorials_topic/MsgTutorial.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, "topic_publisher");
ros::NodeHandle nh;
ros::Publisher ros_tutorial_pub = nh.advertise("ros_tutorial_msg", 100);
ros::Rate loop_rate(10);
ros_tutorials_topic::MsgTutorial msg;
int count = 0;
while (ros::ok())
{
msg.stamp = ros::Time::now();
msg.data = count;
ROS_INFO("send msg = %d", msg.stamp.sec);
ROS_INFO("send msg = %d", msg.stamp.nsec);
ROS_INFO("send msg = %d", msg.data);
ros_tutorial_pub.publish(msg);
loop_rate.sleep();
++count;
}
return 0;
}
6. Subscriber 노드 작성
$ roscd ros_tutorials_topic/src
$ gedit topic_subscriber.cpp
// topic_subscriber.cpp
#include "ros/ros.h"
#include "ros_tutorials_topic/MsgTutorial.h"
void msgCallback(const ros_tutorials_topic::MsgTutorial::ConstPtr& msg)
{
ROS_INFO("receive msg = %d", msg->stamp.sec);
ROS_INFO("receive msg = %d", msg->stamp.nsec);
ROS_INFO("receive msg = %d", msg->data);
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "topic_subscriber");
ros::NodeHandle nh;
ros::Subscriber ros_tutorial_sub = nh.subscribe("ros_tutorial_msg", 100, msgCallback);
ros::spin();
return 0;
}
7. ROS 노드 빌드
$ cd ~/catkin_ws
$ catkin_make
8. Publisher 실행
$ rosrun ros_tutorials_topic topic_publisher
9. Subscriber 실행
$ rosrun ros_tutorials_topic topic_subscriber
3. 서비스 서버와 클라이언트 노드 작성 및 실행
양방향 통신일 때, Service를 사용하고, 요청이 있을 때만 응답하는 서비스 서버, 요청하고 응답을 받는 서비스 클라이언트로 나뉜다.
1. 패키지 생성
2. 패키지 설정 파일 (package.xml) 수정
3. 빌드 설정 파일 (CMakeLists.txt) 수정
4. 서비스 파일 작성
5. 서비스 서버 노드 작성
6. 서비스 클라이언트 노드 작성
7. ROS 노드 빌드
8. 서비스 서버 실행
9. 서비스 클라이언트 실행
4. Parameter 사용법
1. 파라미터를 활용한 노드 작성
2. 노드 빌드 및 실행
3. 매개변수 목록 보기
“rosparam list” 명령어로 현재 ROS 네트워크에 사용된 파라미터의 목록을 확인할 수 있다.
5. Roslaunch 사용법
rosrun은 하나의 노드를 실행하는 명령어이다. roslaunch는 하나 이상의 정해진 노드를 실행시킬 수 있다.
- 패키지의 매개변수나 노드 이름 변경
- 노드 네임스페이스 설정
- ROS_ROOT 및 ROS_PACKAGE_PATH 설정
- 환경 변수 변경
- ‘.launch’라는 파일을 사용해 실행 노드 설정
- XML 기반
- 태그별 옵션 제공
1. launch 파일 작성하기
$ roscd ros_tutorials_topic
$ mkdir launch
$ cd launch
$ gedit union.launch
2. 작성한 launch 파일 실행하기
$ roslaunch ros_tutorials_topic union.launch --screen
launch 태그의 종류
각종 옵션들을 설정하는 다양한 태그들이 존재하며, 예를 들어 아래와 같은 태그들이 있습니다:
반응형