[Robotics] ROS에 대하여
Introduce ROS를 처음 공부하기 위해 블로그를 찾아본 결과 아래와 같은 사이트 https://robertchoi.gitbook.io/ros/ ROS 하루에 입문하기 - ROS 하루에 입문하기 문서 작성을 위해서 최규남, 이상우, 성규현, 설
aisj.tistory.com
이어서 적도록 하겠다
빈 화면만 나왔던 문제를 해결해보자
그러기 위해서는 ROS 의 구동방식을 Remind 할 필요가 있는데
아래의 그림을 참고하자
그렇다면 rqt_graph가 빈 화면으로 나왔던 이유는 무엇일까???
사용했던 코드를 보면
roscore && rosrun pkg_test app.py
다음을 한번에 하려하다가
roscore 를 실행했다가 끈나음
rosrun pkg_test app.py 를 실행시키고
새로운 터미널에 rqt_graph를 실행시켰다
이러면 master를 찾을 수가 없는 것이 당연한 것이
보면 roscore를 종료를 하는 순간 master가 꺼지는데 자꾸 master에게 정보를 요청하니 안되었던 것이다
어찌어찌 하다가 rqt_graph를 띄워도 아무것도 안뜨는 것은 당연한 것이였다
해결방법은 터미널 3개를 띄운다음에
각각
roscore
rosrun pkg_test app.py
rqt_graph
를 실행시켜주고 또한
실행시킬때 복잡하게 경로에 접근을 하는 것이 아니라
catkin_make는 catkin 작업공간과 같이 사용하기에 무척 편리한 명령입니다. 현재 폴더를 살펴보면 'build'와 'devel'폴더가 생긴 것을 알 수 있습니다. 'devel'폴더의 안에는 몇 가지 setup.*sh파일이 들어있습니다. 이 파일들을 쉘에 등록하면 이 작업공간이 ROS 환경의 최상위에 오버레이됩니다. 자세한 이해를 위해서는 catkin링크를 이용하시길 바랍니다. 새로운 setup.*sh파일을 쉘에 적용하기 전에 아래를 참고하시길 바랍니다.
작업공간을 ROS 환경의 최상위에 오버레이 하려면 아래의 코드를 실행시켜주자
source devel/setup.bash
이 코드를 실행하면 이미 ROS 환경의 최상위에 오버레이 하기 때문에 그냥 실행시키면 된다
다음같이 위의 세개의 코드를 각각의 터미널에 실행시켜 준다
추가로 사용한 app.py는
#!/usr/bin/env python3
from rospy import Publisher, Rate, init_node
from std_msgs.msg import Int64
import rospy
if __name__ == '__main__':
init_node("publisher_test") #publisher_test라는 node를 만들어 줌
publisher = Publisher(name="simple_pub", data_class=Int64, queue_size=1)
#simple_pub이라는 이름의 topic을 가지는 Int64 타입의 Publisher
'''Publisher parameter
name : Publisher가 발행하는 topic 이름 (ROS 네트워크 상에서 존재하는 유니크한 값),
data_class : Publisher가 발행할 메세지 타입(클래스),-> Ros에서 제공해주는 메세지 클래스(std_msg 라이브러리에서 가져와야한다)
ex) Int64 -> from std_msgs.msg import Int64
queue_size : 데이터의 Queue 사이즈,
subscriber_listener,
tcp_nodelay,
latch,
headers,
'''
rospy.spin() #해당 노드가 멈추지 않고 돌 수 있도록 해줌
다음같이 그냥 기본으로 publisher_test 라는 node를 만든 것이다
다음과 같이 성공적으로 Node graph가 띄워지는 것을 확인할 수 있다
이렇게 만들어진 node들의 message Topic을 확인하고 싶으면
rostopic list -v
simple_pub 이라는 Publisher(msg로 int를 날리는 )가 만들어진 것을 확인할 수 있다
아래의 예제코드로 바꿔 보면 (이름또한 pub.py 로 바꿈)
출처 : https://velog.io/@7cmdehdrb/PublisherAndSubscriber
#!/usr/bin/python3
import rospy
from random import randint
from std_msgs.msg import Int64
if __name__ == '__main__':
rospy.init_node("publisher_test") #publisher_test라는 node를 만들어 줌
publisher = rospy.Publisher(
name="simple_pub", data_class=Int64, queue_size=1)
#simple_pub이라는 이름의 topic을 가지는 Int64 타입의 Publisher
r = rospy.Rate(1) #보내는 주기(sec)
while not rospy.is_shutdown(): #루프 돌게 도와줌
msg = Int64()
msg.data = randint(0, 255)
rospy.loginfo(msg)
publisher.publish(msg)
r.sleep()
random 함수를 사용하여서 0~244 까지 랜덤한 값을 1초 주기로 발생시킴
roscore를 실행시키면
다음과 같은 에러가 나오게 되는데 이는 setup.bash를 불러오지 않아서 이다
사용하는 setup.bash는 두가지인데
source /opt/ros/noetic/setup.bash
위에는 ROS_ROOT, ROS_PACKAGE_PATH 등의 환경변수들을 가져오는 코드이다
source ~/catkin_ws/devel/setup.bash
이거는 catkin_make를 실행 시키면 사용자가 직접 생성한 src 외에 build 와 devel 폴ㄹ더가 생기는데
이때 실행관련 파일인 devel에 저장된다
즉, 이 devel 안에 있는 setup.bash는 빌드 시스템과 관련된 환경 파일을 불러온다
그렇다면 매번 터미널을 열때 마다 위에 두개의 코드를 실행시켜야 하는데
이는 매우 번거롭기 때문에
~/.bashrc를 바꿔서 터미널을 열면 자동으로 수행하게 해주자
기존엔 vim으로 했는데 이번엔 gedit을 이용해보자
gedit ~/.bashrc
#set ROS noetic
source /opt/ros/noetic/setup.bash
source ~/catkin_ws/devel/setup.bash
# set ROS NETWORK
export ROS_HOSTNAME=192.168.1.71
export ROS_MASTER_URI=http://${ROS_HOSTNAME}:11311
# set ROS NETWORK (one device)
#export ROS_HOSTNAME=localhost
#export ROS_MASTER_URI=http://localhost:11311
위에 코드를 bashrc 맨아래에 붙여 넣기 해주면 된다
one device 는 하나의 pc에서 모든 ROS패키지를 구동하는 경우
이러고 나서 다시 터미널을 열고 roscore를 하면 자동으로 불러와진다
그러고 나서 python 파일을 실행
rosrun pkg_test pub.py
[rosrun] Couldn't find executable named pub.py below /home/kist/catkin_ws/src/pkg_test
[rosrun] Found the following, but they're either not files,
[rosrun] or not executable: [rosrun] /home/kist/catkin_ws/src/pkg_test/src/pub.py
해당 이름을 가진 실행가능한 파일이 없단다. 찾기는 했는데 file이 아니거나 실행시킬 수 없다고 친절하게 말해준다
이는 파이썬 파일에 실행권한을 주지 않았기 때문이다
chmod +x ~/catkin_ws/src/pkg_test/src/pub.py
실행 권한 부여해준다음
다시 실행
만약 이 오류
/opt/ros/noetic/bin/rosrun: /home/kist/catkin_ws/src/pkg_test/src/pub.py: /usr/bin/python: bad interpreter: No such file or directory
가 나온다면
코드부분에 맨 윗줄을 #~~~~python이 아닌 python3로 바꿔보자
그러면 다음과 같이
코드가 실행되면서 숫자가 보내지고
rostopic
을 하면 추천 명령어들이 나온다
kist@kist-MS-7D96:~$ rostopic
rostopic is a command-line tool for printing information about ROS Topics.
Commands:
rostopic bw display bandwidth used by topic rostopic delay display delay of topic from timestamp in header rostopic echo print messages to screen rostopic find find topics by type rostopic hz display publishing rate of topic rostopic info print information about active topic rostopic list list active topics rostopic pub publish data to topic rostopic type print topic or field type
그러면 밑에 코드
rostopic echo /simple_pub
하면 잘 받아지는 것을 볼 수 있다
관계를 보고 싶으면
rostopic list -v
Punlisher가 정상적으로 만들어 지고 int64를 보내는 것을 볼 수 있다
subscriber는 log 왔다갔다 하는 거 같다
rqt_graph
저녀석의 정체는 rostopic_echo 이다 (나름 받아서 계속 출력중이자나)
그래서 echo를 ctrl + c 로 끄고
다시 rqt를 보면
사라지는 것을 볼 수 있다
그러면 이제 Subscriber 하나를 만들어서 둘이 통신하는 상황을 만들어보자
(단, 초반이니 단일 pc에서 실행이기에 IP등은 조절할 필요가 없다)
다음과 같은 구조를 만들어 보자
/home/***/catkin_ws/src/pns_test/
├── CMakeLists.txt
├── Makefile
├── mainpage.dox
├── manifest.xml
└── src
├── app.py
├── pub.py
└── sub.py
그리고 sub.py를 다음과 같이 적어줬다
#!/usr/bin/python3
import rospy
from std_msgs.msg import Int64
data = None #전역변수로 선언을 해주고
def callbackFunction(msg): #기본 argument는 구독한 메세지 객체
#callback : topic이 발행되는 이벤트가 발생하였을 때 event lisner함수를 콜백함수로 요구
global data
data = msg
rospy.loginfo(data)
if __name__ == '__main__':
rospy.init_node("sublisher_test")
subscriber = rospy.Subscriber(
name="simple_pub", data_class=Int64, callback=callbackFunction)
r = rospy.Rate(1) #publisher와 Rate 동일하게 설정
while not rospy.is_shutdown():
r.sleep() #별 다른 기능은 넣지 않았습니다
메인함수에 Subscriber 객체를 rospy를 이용하여서 선언을 해준다음
Subscriber의 파라미터
name : 구독할 토픽명 (Publisher와 동일한 값),
data_class : 구독할 토픽의 데이터값 (Publisher와 동일한 값),
callback,
callback_args,
queue_size,
buff_size,
tcp_nodelay
를 작성해 줍니다
여기서 포인트는 Callback 입니다
callback변수는, Topic이 발행되는 이벤트가 발생했을 때, 어떤 동작을 할 것인지 콜백함수의 형태로 요구한다
roscore
ctrl + alt + T
rosrun pkg_test pub.py
만약 실행권한을 주지않았다면
chmod +x ~/catkin_ws/src/pkg_test/src/sub.py
ctrl+alt+T
rosrun pkg_test sub.py
잘 주고 받아지는 것을 볼 수 있다
이들의 관계를 보고 싶으면
실행을 돌리고 있는 상태에서
rqt_graph
publisher_test가 발행한 Simple_pub이라는 Topic을 Sublisher_test가 받고 있는 것을 볼 수 있다 (Sublisher는 단순 오타입니다)
'Robotics > ROS' 카테고리의 다른 글
[Robotics] 기존 프로젝트 분석 (0) | 2023.04.05 |
---|---|
[Robotics] Intel® RealSense™ Depth Camera D455 (0) | 2023.04.05 |
[Robotics] ROS 명령어 및 용어 정리 (0) | 2023.03.28 |
[Robotics] ROS에 대하여 (0) | 2023.03.23 |
[Robotics] 아두이노 우분투 개발환경 설정 (0) | 2023.03.23 |