code analysis
rospy.init_node('teacher') == 많은 노드들을 관리하고 통합하는 것이 ROS프레임워크 가 하는일이고 그것을 python으로 만든 것이 rospy 라이브러리이다.
ros 시스템상에서 노드들이 topic을 주고 받기 위해서는 노드에 고유의 이름을 할당해야 한다.
def init_node( name, argv= None, anonymous=False , log_level=None, disable_rostime=False , disable_rosout=False, disable_signals=False, xmlrpc_port=0, tcpros_port=0):
두번째 인자는 argv인데 사용자가 지정한 argument를 넘겨 받을 때 사용. 타입은 string의 list이다.
세번째 인자는 anonymous 라는 것인데 default 가 False로 되어있다. 만약 True 라면 노드의 이름이 자동생성된다.
네번쨰 인자는 log_level이다 . 타입은 int 이며 , default로 INFO 레벨이다.
7번쨰인자는 disable_signals이다. True라면 rospy는 사용자의 signal handler를 등록하지 않는다. 사용자가 main thread로부터 init_node를 call 하지 않을 때나, 혹은 사용자가 자신만의 signal handling 을 설정해야하는 환경에서 rospy를 사용할 때 이 flag를 세팅해야한다.
rate = rospy.Rate(2) == 1초에 2번 loop를 반복할 수 있도록 rate라는 객체를 만드는 코드이다. 즉 0.5초에 한번씩 루프를 돌아야한다는 의미.
while not rospy.is_shutdown(): == rospy내부의 shutdown_flag를 검사한다.
pub.publish("call me please") == pub은 전의 코드에서 my_topic이라는 이름의 토픽을 발행하기 위한 Publisher 인스턴스이다.
2가지 Exception이 일어나는데
ROSException 은 rospy 노드가 initialization 되지 않았을 때 생기는 에러이다. 노드는 init_node 함수로 이름을 할당해 주어야 한다.
또 다른 에러는 ROSSerialzationException이다 . 이것은 message를 serialize 할 수 없을 때 일어난다. 보통 type error 일 때가 많다.
ros.spin() == ROS 노드가 shutdown 될 때까지 Block 하는 함수이다. 즉 shutdown signal 을 받을 때 까지 무한루프에 들어가게 된다.
이 무한 루프에서 topic을 받거나 time triggering 같은 이벤트가 발생하면 callback 함수가 호출되지만 그렇지 않으면 sleep 상태가 된다.
사용자의 노드가 callback 이외에 어떤 일도 하지 않는다면 spin() 함수를 사용해야 한다.
rospy.spin과 비슷한 rospy.sleep() 이있다. 차이점은 sleep()은 특정시간이 주어지고 그 시간 동안만 sleep상태가 유지된다.
'자율주행 > ROS python (xytron 강의)' 카테고리의 다른 글
8자주행 odom coverter 과제 답안 (0) | 2021.01.12 |
---|---|
자이카 ROS 패키지 (0) | 2021.01.07 |
ROS 과제 답안 (0) | 2021.01.04 |
ROS day2 (0) | 2020.12.22 |
ROS day1 (0) | 2020.12.21 |