ROS 강좌 107 rosblidge client 만들기

10484 단어 파이썬ROS

환경



이 기사는 다음 환경에서 작동합니다.


품목



CPU
Core i5-8250U

우분투
16.04

ROS
키네틱

Gazebo
7.0.0

파이썬
2.7.12


설치에 대한 자세한 내용은 ROS 강좌02 설치을 참조하십시오.
또한이 기사의 프로그램은 github에 업로드되었습니다. ROS 강좌 11 git 저장소을 참조하십시오.

개요



지난번 에 rosbridge_server를 세우고 브라우저의 javascript에서 액세스하는 예를 소개했습니다. 이번에는 roslibpy를 사용하여 rosbridge_server에 연결하는 클라이언트를 파이썬으로 만듭니다.

설치



pip 문제



이번에는 roslibpy를 설치하기 위해 pip를 사용합니다. pip(라고 하는 것보다도 python)의 곤란한 일로서 인스톨 하는 디렉토리가 다양하고, 섞으면 꽤 귀찮게 됩니다. 예를 들면
  • 시스템 영역( /usr/local/lib/python2.7/ )
    apt로 pip를 취득한 경우 · sudo pip로 취득했을 경우
  • 사용자 영역( ~/.local/lib/python2.7/ )pip --user 에 넣은 경우

  • 이렇게하면 다음 명령을 실행하면 환경이 더러워지고 pip에서 오류가 발생합니다.

    이 작업을 수행 한 후 오류가 발생합니다.
    sudo apt install python-pip
    pip install --upgrade pip
    

    apt와 pip를 함께 사용하면 문제가 많으므로 apt를 사용하지 않고 설치하는 것이 좋습니다. 위의 작업을 수행 할 때 해결책으로 다음 명령을 사용하여 pip를 모두 제거 할 수 있습니다.

    pip 제거
    sudo python -m pip uninstall pip
    sudo apt autoremove python-pip
    

    실행할 명령



    다음을 실행하면 roslibpy를 설치할 수 있습니다.

    roslibpy 설치
    curl -kL https://bootstrap.pypa.io/get-pip.py | sudo python
    sudo pip install roslibpy
    sudo pip install service_identity
    

    소스 코드



    web_lecture/scripts/rosbridge_client.py
    #!/usr/bin/env python
    # -*- coding:utf8 -*-
    import time
    from roslibpy import Message, Ros, Topic
    import time
    
    class rosbridge_client:
        def __init__(self):
            self.ros_client = Ros('127.0.0.1', 9090)
            print("wait for server")
            self.publisher = Topic(self.ros_client, '/cmd_vel', 'geometry_msgs/Twist')
            self.listener = Topic(self.ros_client, '/odom', 'nav_msgs/Odometry')
            self.listener.subscribe(self.callback)
    
            self.ros_client.on_ready(self.start_thread, run_in_thread=True)
            self.ros_client.run_forever()
    
        def callback(self, message):
            x = message["pose"]["pose"]["position"]["x"]
            y = message["pose"]["pose"]["position"]["y"]
            print(x, y)
    
        def start_thread(self):
            while True:
                if self.ros_client.is_connected:
                    self.publisher.publish(Message({
                        'linear': {
                            'x': 0.5,
                            'y': 0,
                            'z': 0
                        },
                        'angular': {
                            'x': 0,
                            'y': 0,
                            'z': 0.5
                        }
                    }))
                else:
                    print("Disconnect")
                    break
                time.sleep(1.0)
    
    if __name__ == '__main__':
        rosbridge_client()
    
  • self.ros_client = Ros('127.0.0.1', 9090) 에서 rosbridge_server에 대한 연결을 설정합니다.
  • self.ros_client.is_connected 로 rosbridge_server에 연결되어 있는지 확인합니다.
  • 끊어져도 self.ros_client.connect() 로 재연결을 시도합니다.

  • Message() 에서 메시지를 json으로 작성하고 self.publisher.publish() 로 publish합니다.
  • self.listener.subscribe(self.callback)로 subscribe했을 때의 callback을 등록합니다. callback 함수의 인수로 수신 메시지를 건네줄 수 있어, x = message["pose"]["pose"]["position"]["x"] 와 같이 액세스 합니다.
  • self.ros_client.on_ready(self.start_thread, run_in_thread=True) 에서 스레드를 생성할 수 있습니다.

  • 실행



    sim 실행
    roslaunch web_lecture web_if.launch 
    

    roslibpy 클라이언트 실행
    roscd web_lecture/scripts && rospy_client.py`で実行できます。
    



    사용 사례



    rosbridge는 원래 ros가 설치되지 않은 시스템에서 ros에 액세스하는 도구입니다. 그러나이 느슨하게 결합 된 시스템을 사용하면 아래 그림과 같이 멀티 마스터 시스템을 구성 할 수 있습니다.


    참고



    roslibpy의 example
    구현에 대해 자세히 알아보기

    목차 페이지 링크



    ROS 강좌의 목차에 대한 링크

    좋은 웹페이지 즐겨찾기