1. 프로그래밍 전에 알아둬야 할 사항
1) 표준단위: SI 단위 사용(angle: radian, frequency: hertz, force: newton, power: watt, voltage: volt, length: meter, mass: kilogram, time: second, current: ampere, temprature: celsius)
2) 좌표 표현 방식(x: forward, y: left, z: up), 오른손의 법칙
3) 프로그래밍 규칙
2. 토픽, 퍼블리셔, 서브스크라이버
1) 패키지 생성
cd ~/catkin_ws/src
catkin_create_pkg ros_tutorials_topic message_generation std_msgs roscpp(topic_publisher이 message_generation,std_msgs,roscpp의존)
cd ros_tutorials_topic
2) 패키지 설정 파일 수정(필수 설정 파일 중 하나인 package.xml은 패키지 정보를 담은 XML 파일로서 패키지 이름, 저작자, 라이선스, 의존성 패키지 등 기술
gedit package.xml
package부터 package까지: name, version, description(패키지 문구), license, author, email, maintainer(변경 가능, 연락처), bugtracker, repository, website, buildtool_depend, build_depend, run_depend
3) 빌드 설정 파일(CMakeLists.txt) 수정
gedit CMAkeLists.txt
cmake_minimun_required(V ~~), project(패키지 명), find_package, add_message-files(메시지 생성), generate_messages(메시지의 의존성), catkin_package(라이브러리, 캐킨 빌드 의존성, 시스템의존 패키지 기술), LIBRARIES, CATKIN_DEPENDS(의존성), include_directoried(인클루드 디렉터리 설정), ***add_executable(실행 파일 설정), add_dependencies(추가 의존성 설정), target_link_libraries(타겟 링크 라이브러리 설정)
2개 publisher, subscriber
ex)
add_executable(
topic_subscriber
src/topic_subscriber.cpp)
-> src/topic_subscriber.cpp 참조해서 topic_subscriber 만들어라.
4) 메시지 파일 작성
roscd ros_tutorials_topic
mkdir msg
cd msg
gedit MsgTutorial.msg
time(메시지 형식, 메시지 시간을 넣어주기 위함) stamp(메시지 이름)
int32(메시지 형식, 데이터를 보내주기 위함) data(메시지 이름)
5) 퍼블리셔 노드
roscd ros_tutorials_topic/src 패키지의 소스 폴더로 이동
gedit topic_publisher.cpp 소스 파일 신규 작성 및 내용 수정
6) 서브스크라이버 노드 작성
7) ROS 노드 빌드
cd ~/catkin_ws catkin 폴더로 이동
catkin_make catkin 빌드 실행
8) 퍼블리셔 실행
rosrun ros_tutorials_topic topic_publisher(로스의 노드 실행 명령어인 rosrun을 이용하여 ros_tutorials_topic라는 패키지의 topic_publisher 노드 구동)
rostopic list(현재 모든 토픽)
rostopic info /ros_tutorial_msg(타입, 누가 퍼블리셔)
rostopic echo /ros_tutorial_msg(커밋 되고 있는거 테스트 창에서 확인)
3. Service/ Service server/ Service client
1) 패키지 생성
cd ~/catkin_ws/src
catkin_create_pkg ros_tutorials_service message_generation std_msgs roscpp
cd ros_tutorials_service
2) 패키지 설정 파일 수정
gedit package.xml
3) 빌드 설정 파일
gedit CMAkeLists.txt
서비스 선언: add_service_files
4) 서비스 파일 작성
add_service_files
roscd ros_tutorials_service
mkdir srv
cd srv
gedit SrvTutorial.srv
int64(메시지 형식) a(서비스 요청)
---(요청과 응답 구분)
int64 result(서비스 응답)
5) 서비스 노드 작성
add_executable(service_server src/service_server.cpp)
roscd ros_tutorials_service/src
gedit service_server.cpp
*res.result=req.a+req.b(서비스 요청 시 받은 a, b의 값을 더하여 서비스 응답 값에 저장
6) 서비스 클라이언트 노드 작성
add_executable(service_client src/service_client.cpp)
7) ROS 노드 빌드
cd ~/catkin_ws&&catkin_make(catkin 폴더로 이동 후 catkin 빌드 실행)
8) 서비스 서버 실행
rosrun ros_tutorials_service service_server
9) 서비스 클라이언트 실행
rosrun ros_tutorials_service service_client 2 3
*rqt_graph 못씀(일회성)
*rosservice call/<path>
4. Parameter
5. roslaunch: 하나 이상의 정해진 노드를 실행시킴
1)
- 패키지의 매개변수, 노드 이름, 노드 네임스페이스 설정, ROS_ROOT, ROS_PACKAGE_PATH 설정, 환경 변수 설정 등의 옵션 붙일 수 있음
- '*.launch'라는 파일 사용(xml 기반, 태그별 옵션)
ex) <node pkg="..."(어떤 패키지 안에) type="..."(이 노드를 실행한다) name="..."(그런데 이름을 바꾼다. 따라서 같은 노드를 여러 번 실행할 때 발생하는 종료를 막을 수 있음.)
*--screen: 모든 노드들의 출력들을 한 화면에서 볼 수 있음
- <group ns= "ns!">: 별도의 그룹으로 쓸 수 있음, 토픽 명, 노드 이름 변경
2) launch 태그
- launch: roslaunch 구문의 시작과 끝
- node: 노드 실행에 대한 태그(패키지, 노드명, 실행명 변경)
- machine: 노드를 실행하는 PC의 이름, 주소, ros-root, ros-package-path 등을 설정할 수 있다.
- include: 다른 패키지나 같은 패키지에 속해 있는 다른 launch를 불러와 하나의 launch 파일처럼 실행
- remap: 노드 이름, 토픽 이름 등의 노드에서 사용 중인 ROS 변수의 이름을 변경.
- env: 경로, IP 등의 환경 변수를 설정함.
- param: 매개변수 이름, 타이프, 값 등 설정
- rosparam: ropsparam 명령어처럼 load, dump, delete 등 매개변수 정보의 확인 및 수정
- group: 실행되는 노드를 그룹화
- test: 노드 테스트
- arg: launch 파일 내 변수를 정의 할 수 있음. 매개변수 변경.
CmakeLists.txt
cmake_minimum_required(VERSION 3.0.2) #버전
project(ros_python_tutorial) #이름 설정
find_package(catkin REQUIRED COMPONENTS #catkin 패키지 및 의존성 찾기
message_generation
rospy
std_msgs
)
add_message_files( #MsgTutorial.msg 파일을 메시지로 추가
FILES
MsgTutorial.msg
)
generate_messages( # 메시지 생성 시 std_mgs 의존
DEPENDENCIES
std_msgs
)
catkin_package( # 런타임 메시지 사용을 위한 의존성 등록
CATKIN_DEPENDS message_runtime rospy std_msgs
)
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
catkin_install_python(PROGRAMS #노드 등록
src/topic_publisher.py
src/topic_subscriber.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
package.xml
<?xml version="1.0"?> #xml 선언
<package format="2"> #패키지 시작
<name>ros_python_tutorial</name> #이름
<version>0.0.0</version> #버전
<description>The ros_python_tutorial package</description> #설명
<maintainer email="foscar@todo.todo">foscar</maintainer> #관리자(?) 연락처
<license>TODO</license>
<buildtool_depend>catkin</buildtool_depend> #catkin 빌드 시스템 사용
<build_depend>message_generation</build_depend> #코드를 만들 때 필요함
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<build_export_depend>rospy</build_export_depend> #다른 패키지가 이걸 쓸 때 같이 필요함
<build_export_depend>std_msgs</build_export_depend>
<exec_depend>rospy</exec_depend> #실행할 때 필요함
<exec_depend>message_runtime</exec_depend>
<exec_depend>std_msgs</exec_depend>
<export>
</export>
</package> #패키지 끝
MsgTutorial.msg
time stamp #(메시지 타입) (메시지 이름)
int32 data
topic_publisher.py
import sys
import rospy
from ros_python_tutorial.msg import MsgTutorial
if __name__ == '__main__':
rospy.init_node('topic_publisher', sys.argv) #노드 초기화, 노드 이름: topic_publisher
ros_tutorial_pub = rospy.Publisher('ros_tutorial_msg', MsgTutorial, queue_size=100) #노드가 publish할 토픽 이름: ros_tutorial_msg, publish 메시지 타입: MsgTutorial, 큐 사이즈(임시저장공간):100
loop_rate = rospy.Rate(10) #루프 속도
cnt = 0 #int32 data
msg = MsgTutorial() #메시지 인스턴스 생성(stamp, data)
while not rospy.is_shutdown():
msg.stamp = rospy.Time.now()
msg.data = cnt
rospy.loginfo(f'send msg = {msg.stamp.secs}') #출력
rospy.loginfo(f'send msg = {msg.stamp.nsecs}')
rospy.loginfo(f'send msg = {msg.data}')
ros_tutorial_pub.publish(msg) #메시지 전송
loop_rate.sleep() # 다음 반복 전까지 대기
cnt += 1
topic_subscriber.py
import sys
import rospy
from ros_python_tutorial.msg import MsgTutorial
def msgCallback(msg: MsgTutorial):
rospy.loginfo(f'recieve msg = {msg.stamp.secs}')
rospy.loginfo(f'recieve msg = {msg.stamp.nsecs}')
rospy.loginfo(f'recieve msg = {msg.data}')
if __name__ == '__main__':
rospy.init_node('topic_subscriber', sys.argv)
ros_tutorial_sub = rospy.Subscriber("ros_tutorial_msg", MsgTutorial, msgCallback) #토픽 이름, 메시지 타입, 콜백 함수
rospy.spin()
'FOSCAR-(Autonomous Driving) > ROS 스터디' 카테고리의 다른 글
[2025 ROS 스터디] 장우혁 #2주차 - ROS 중요 컨셉, 명령어, 도구 (1) | 2025.05.01 |
---|---|
[2025 ROS 스터디] 윤윤지 #2주차-중요 컨셉, 명령어, 도구 (0) | 2025.05.01 |
[2025 ROS 스터디] 한상민 #2주차-ROS의 중요 컨셉, 명령어, 도구 (0) | 2025.04.30 |
[2025 ROS 스터디] 전예림 #2주차 - 중요 컨셉, 명령어, 도구 (0) | 2025.04.30 |
[2025 ROS 스터디] 김승현 #3주차-ROS 기본 프로그래밍 (0) | 2025.04.29 |