ROS프로그래밍 전에 알아둬야 할 사항
원활한 소통과 프로그래밍을 위해서는 표현 단위와 방식을 통일해야 함
그 규칙들 sI단위, 오른손 좌표계 등..
프로그래밍 규칙
http://wiki.ros.org/CppStyleGuide
+ 파이썬도 찾아보니 있음 http://wiki.ros.org/PyStyleGuide
실습 과정
topic
1) 패키지 생성
$ cd ~/catkin_ws/src
$ catkin_create_pkg ros_tutorials_topic message_generation std_msgs roscpp
패키지 생성 패키지 이름 의존성
2) 패키지 설정 파일(package.xml) 수정
$ gedit package.xml
package.xml -> 패키지 이름, 저작자, 라이선스, 의존성 패키지 등을 기술
3) 빌드 설정 파일(CMakeLists.txt) 수정
$ gedit CMakeLists.txt
4) 메시지 파일 작성
roscd ros_tutorials_topic 명령어 입력시
roscd: No such package/stack 'ros_tutorials_topic' 라는 에러 메시지가 발생한다. 강의에는 있는데 pdf에는 없어졌다. 이미 그 폴더에 있으니 일단은 넘어간다...
$ mkdir msg
$ cd msg
$ gedit MsgTutorial.msg
time 형의 stamp 이름
int32 형의 data 이름
5) 퍼블리셔 노드 작성
여기서도 roscd명령어는 잘 모르겠어서 어찌저찌 src디렉토리에 들어갔다...
$ cd ..
$ cd ./src
$ gedit topic_publisher.cpp
6) 서브스크라이버 노드 작성
$ gedit topic_subscriber.cpp
7) ROS 노드 빌드
$ cm
cd ~/caktin_ws
catkin_make
단축 명령어 -> cm
헤더 파일과 실행 파일은 catkin_ws/devel/ 에 자동으로 생긴다.
8) 퍼블리셔 실행
$ rosrun ros_tutorials_topic topic_publisher
명령어 입력시
[rospack] Error: package 'ros_tutorials_topic' not found
같은 에러가 발생한다.
$ source ~/catkin_ws/devel/setup.bash
$ rospack find ros_tutorials_topic
이 명령을 진행 후 다시 시도하니 성공!! (+roscore 실행도 잊지말자)
문제 해결 참고 사이트 : https://stackoverflow.com/questions/56139647/how-to-fix-rospack-error-package-my-package-not-found
화면에 보이는 것은 퍼블리셔 하는 것이 아닌 ROS_INFO뿐이다.
$ rostopic list
$ rostopic info /ros_tutorial_msg
현 상황 파악 가능
9) 서브스크라이버 실행
퍼블리셔와 동일
그러나 동일한 오류 발생 동일한 해결 방법... 굉장히 번거롭다 영구적으로 해결할 방법 찾아야함.
+ 찾았다!!! .bashrc 파일에 해결할 때 사용한 명령어를 넣으면 명령창이 열릴때 마다 실행되어 해결.
$ rqt_graph
service
* topic과 거의 동일하므로 차이점과 결과 위주로 작성함
1) 패키지 생성, 2) 패키지 설정 파일(package.xml) 수정, 3) 빌드 설정 파일(CMakeLists.txt) 수정
topic과 거의 동일
4) 서비스 파일 작성
bashrc 파일을 수정하니 전에 문제있던 roscd명령어도 잘 작동함.
서비스 요청
--- (구분자)
서비스 응답
5) 서비스 서버 노드 작성
6) 서비스 클라이언트 노드 작성
7) ROS 노드 빌드
topic과 동일
8) 서비스 서버 실행
9) 서비스 클라이언트 실행
service는 일회성이므로 rqt_graph 등에서 확인 불가능
노드외에
$ rosservice call /ros_tutorial_srv 10 2
로도 요청 가능
또, rqt -> Plugins -> Service -> Service Caller 로도 사용 가능
** 하나의 노드는 복수의 퍼블리셔, 서브스크라이버, 서비스 서버, 서비스 클라이언트 가능
Parameter
service서버를 수정하여 실습
빌드, 실행 하면 ready srv server ! 메시지가 나온다
$ rosparam list
를 통해서
/calculation_method
/rosdistro
/roslaunch/uris/host_localhost__38555
/rosversion
/run_id
확인 가능
$ rosservice call /ros_tutorial_srv 10 5
$ rosparam set /calculation_method 2
$ rosservice call /ros_tutorial_srv 10 5
service와 동일하게 요청하지만 파라미터 셋으로 다른 처리를 이용 가능함
roslaunch
rosrun - 하나의 노드를 실행하는 명령어
roslaunch - 하나 이상의 정해진 노드를 실행
이 외에도 여러 기능
xml기반
$ roscd ros_tutorials_topic
$ mkdir launch
$ cd launch
$ gedit union.launch
<launch>
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher1"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber1"/>
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher2"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber2"/>
</launch>
노드 이름이 같으면 이전의 노드는 죽기에 name을 이용해 지정해줌.
$ roslaunch ros_tutorials_topic union.launch --screen
실행 명령어
--screen을 이용하면 진행상황을 보여줘서 디버깅에 유리
1 : N topic통신 중임을 확인 가능
그러나 퍼블리셔 1은 서브스크라이버1에게 2는 2에게만 메시지를 보내고 싶었다면???
<launch>
<group ns="ns1">
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber"/>
</group>
<group ns="ns2">
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber"/>
</group>
</launch>
union.launch 파일을 이렇게 수정한다. group을 사용해 구분한다.
rqt_graph로 확인하면 원하는 대로 구분된 것을 확인할 수 있다.
이 외의 launch 태그들
출처 : https://youtu.be/iGdQHi_wL1Y?si=RUAScZDmJJl2oeLj
'FOSCAR-(Autonomous Driving) > ROS 스터디' 카테고리의 다른 글
[2025 ROS 스터디] 이영상 #3주차- ROS 기본 프로그래밍 (0) | 2025.01.31 |
---|---|
[2025 ROS 스터디] 이승찬 #3주차 - ROS 기본 프로그래밍 (0) | 2025.01.31 |
[2025 ROS 스터디] 이호휘 #3주차-ROS 기본 프로그래밍 (0) | 2025.01.28 |
[2025 ROS 스터디] 신채영 #2주차 - ROS 용어, 도구 (0) | 2025.01.23 |
[2025 ROS 스터디] 이영상 #2주차- ROS 용어, 명령어, 도구 (0) | 2025.01.22 |