본문 바로가기

팀 프로젝트

C-2345 자세 제어 4족보행 로봇 #6 (ROS 7강-2 Python으로 topic, service)

반응형

지금 듣고 있는 표윤석 박사님의 ROS강의는 C++로 진행되고 있지만 나는 파이썬으로 ROS를 다루고 싶다.

 

 

둘 다 조금씩 배워봤지만 파이썬이 더 편하고 쉽기도 하고 앞으로의 활용성이 더 좋다고 판단하기 때문이다.

 

 

그래서 앞으로 강의의 실습을 C++버전으로 따라 하고 이후 직접 조사해서 파이썬으로도 실습을 해볼 예정이다.

 

 

 

 

파이썬으로 간단한 topic publisher, subscriber 만들기는 

https://doljokilab.tistory.com/m/17

 

[ROS] 간단한 Publisher과 Subscriber 예제(python)

!!진행시 경로를 잘 확인하세요. 저는 윈도우 10에서 wsl2를 사용해 ros를 구동중입니다. 이전 게시물들을 참고하여 설정 후 진행하면 도움이 될 것 같습니다. 사전 환경세팅용 참고 게시물 [ROS] ubun

doljokilab.tistory.com

 

https://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28python%29

 

ROS/Tutorials/WritingPublisherSubscriber(python) - ROS Wiki

Writing the Publisher Node "Node" is the ROS term for an executable that is connected to the ROS network. Here we'll create the publisher ("talker") node which will continually broadcast a message. Change directory into the beginner_tutorials package, you

wiki.ros.org

위 두 블로그와 ROSwiki를 참고했다.

 

 

여기에 나오는 파이썬 코드는 ROSwiki의 것을 가져와 일부 수정한 것이다.

 

 

 

 

파이썬으로 노드를 만들 때 c++과 가장 크게 다른 점은 CMake를 통해 빌드 과정을 거치지 않아도 된다는 점이다.

 

 

그냥 소스코드 (확장자 .py)파일을 rosrun으로 실행시키면 된다.

 

 

C++로 실습할 때 CMakeLists.txt. 작성에 애 좀 먹었는데 정말 다행이다.

 

 

기본적인 순서는 C++과 99% 똑같다.

 

 

1. /catkin/src 이동

$cs

 

 

2. 패키지 생성

$catkin_create_pkg
ros_python_topic rospy message_generation std_msgs

*패키지의존성 : c++은 roscpp을 넣었지만 파이썬은 대신 rospy를 넣어주면 된다.

 

 

3. 패키지 디렉터리로 이동

&cd 
ros_python_topic

 

 

4. package.xml 수정(패키지 설정 파일)

$gedit package.xml

*여기도 c++과 똑같이 작성했다. 의존성 부분만 다른 건 다 지우고 build_depend를 depend로 바꿔줬다.

 

 

5. 메시지 파일 작성

$mkdir msg
$cd msg
$gedit Msg.msg
&cd ..

*원래 5번은 CMakeLists.txt를 수정하는 거였지만 파이썬은 빌드를 하지 않아도 되기에 바로 메시지 파일을 작성해준다.

 

*topic이니까 publisher→subscriber로 가는 메시지 타입과 이름만 정의해준다. 나는 int64 word로 했다.

 

 

6. publisher node 작성

&gedit python_publisher.py

*publisher의 파이썬 소스코드 파일을 만든다.

 

#!/usr/bin/env python3

import rospy

from std_msgs.msg import String

def talker():

    pub = rospy.Publisher('chatter', String, queue_size=10)

    rospy.init_node('python_publisher', anonymous=True)

    rate = rospy.Rate(10) # 10hz

    while not rospy.is_shutdown():

        hello_str = "hello world %s" % rospy.get_time()

        rospy.loginfo(hello_str)

        pub.publish(hello_str)

        rate.sleep()

   

if __name__ == '__main__':

    try:

        talker()

    except rospy.ROSInterruptException:

        pass

 

 

*다른 블로그나 wiki는 맨 윗줄의 코드를 #!/usr/bin/env python로 했는데 

 

  /usr/bin/env: python: No such file or directory 

  /usr/bin/env python' 그런 파일이나 디렉터리가 없습니다

 

의 오류가 계속 났다.

 

https://stackoverflow.com/questions/3655306/ubuntu-usr-bin-env-python-no-such-file-or-directory/61608129

 

ubuntu /usr/bin/env: python: No such file or directory

I update the kernel, after that the Ubuntu doesn't work well, PS: I try to exec "meld" command, it will report that "/usr/bin/env: python: No such file or directory", then I exec "sudo apt-get ins...

stackoverflow.com

위의 스택오버플로우 글을 참고했다.

 

Possible Solution #1은 이미 python3가 깔려 있어서 실패했고

Possible Solution #2를 보니 python이 python3로 이름이 바뀌어서 코드가 못 찾는 거리고 하는 거 같아 그냥 원래 코드 python부분에 3만 붙여줬다.

 

/usr/bin/env python3

 

바로 성공

 

 

*노드 초기화도 원래 코드는 노드명을 talker로 했는데 나는 그냥 python_publisher로 바꿨다.

 

rospy.init_node('python_publisher'anonymous=True)

 

 

 

 

 

*hello world부분도 그냥 마음에 안 들어서 조금 고쳤다.

 

hello_str = "hello world %s" % rospy.get_time()

 

가 원래 코드였는데 파이썬 기초 강의에서 포맷팅에 %s를 쓰는 건 not pythontic 하다고 (진짜 이렇게 말씀하셨다.) 하셔서

 

hello_str = "hello world %{}".format(rospy.get_time())

 

이렇게 바꿨다. 당연히 정상 작동한다.

 

 

 

 

7. subscriber node 작성

&gedit python_subscriber.py

*subscriber의 파이썬 소스코드 파일을 만든다.

 

#!/usr/bin/env python3

import rospy

from std_msgs.msg import String

 

def callback(data):

    rospy.loginfo(rospy.get_caller_id() + "I heard %{}".format(data.data))

 

def listener():

    rospy.init_node('python_subscriber', anonymous=True)

    rospy.Subscriber("chatter", String, callback)

    rospy.spin()

 

if __name__ == '__main__':

    listener()

 

 

*여기도 수정은 publisher랑 똑같이 했다.

 

 

 

 

9. node에 실행 권한 주기
$chmod
+x python_publisher.py
$chmod
+x python_subscriber.py

*파이썬으로 노드를 만들면 빌드를 안 해도 되지만 rosrun으로 바로 실행할 수는 없기에 리눅스 명령어를 이용해. py을 실행 가능하도록 권한을 줘야 한다.

 

https://recipes4dev.tistory.com/175

 

리눅스 chmod 명령어 사용법. (Linux chmod command) - 리눅스 파일 권한 변경.

1. 리눅스 파일 사용 권한 리눅스에서, 파일(File)을 사용해 할 수 있는 작업은 크게 세 가지로 나눌 수 있습니다. 파일에 저장된 데이터를 읽기. (r = read). 파일에 데이터를 쓰기. (w = write). 파일 실

recipes4dev.tistory.com

참고로 =x가 아닌 +x를 넣었기 때문에 실행 모드로 바뀐 것이 아닌 추가된 것이다. 즉 이후에도 코드 수정은 가능하다.

 

 

 

 

10. 빌드한 node들 테스트
$rosrun
ros_python_topic python_publisher.py
$rosrun
ros_python_topic python_subscriber.py

*역시 c++과 다르게. py파일 자체를 rosrun으로 실행시키면 된다.

 

*당연히 roscore를 먼저 실행시켜야 한다.

 

파이썬으로 만든 간단한 topic 전송 패키지
rqt_graph

정상적으로 잘 작동하고 rqt_graph도 정상적으로 나왔다.

 

 

근데 node의 이름 뒤에 붙은 숫자는 뭔지 모르겠다. 껐다가 다시 실행시키면 저 숫자가 바뀐다. 노드의 id가 아닐까 추측해본다.

 

 

 

 

 

 

===============================================================================

정확한 정보 전달보단 공부 겸 기록에 초점을 둔 글입니다.

틀린 내용이 있을 수 있습니다.

틀린 내용이나 다른 문제가 있으면 댓글에 남겨주시면 감사하겠습니다.   : )

===============================================================================

반응형