[ROS/WSL2] ROS Bridge를 사용하는 여러 대의 기기(여러 개의 ROS 마스터) 간의 통신

개시하다
이것은 ROS Advent Calendar 2021의 다음날 보도입니다!
지난번 보도[ROS/WSL2] WSL2의 ROS와 외부 PC를 통해 통신하고 싶습니다.에서 WSL2의 ROS와 외부 PC의 ROS 통신을 시도했지만 순조롭지 못했다.
이번엔 ROS Bridge를 쓰면 통신이 가능하니까 소개합니다!
ROS 노드는 다음과 같습니다.

초개요는 이런 느낌.

이걸 사용하면...
- 여러 대의 기기 & 여러 개의 ROS 마스터(roscore) 간의 통신이 가능하다.
- 모든 주제를 다른 주제로 복사할 수 있습니다.
- 주제 이름도 구별할 수 있습니다.그럼요, 그래도 돼요.
예(두 모드 모두 가능):
/cmd_vel =>/cmd_vel
/cmd_vel =>/robot_a/cmd_vel
컨디션
다음 환경에서 작업을 확인 중입니다.
  • PC1
  • Jetson Nano
  • ROS Melodic
  • PC2
  • Windows10
  • WSL2
  • ROS Melodic
  • 작업을 확인할 수 없습니다.
    (roslibpy를 제대로 설치할 수 없음)
    환경 준비
    종속성 설치
    사용하는 소프트웨어는
    -ROS Bridge(서버)
    -ROS Bridge(Pythhon 클라이언트)
    - ROSpy Message Converter ( http://wiki.ros.org/rospy_message_converter )
    .
    다음 명령을 사용하여 설치합니다.
    $ sudo apt-get install ros-<rosdistro>-rosbridge-server
    $ pip install roslibpy
    $ sudo apt-get install ros-<rosdistro>-rospy-message-converter
    
    ※ WSL2 사용 시
    WSL2용 설정
    WSL2를 사용할 때 Windows에서 WSL2로의 Ubuntu로 포트를 전송하는 설정과 방화벽 설정이 필요합니다. 아래 명령을 실행하십시오.9090 포트에서 ROS bridge를 사용해야 하는 전제 조건입니다.
    포트 전달 설정
    $ netsh.exe interface portproxy add v4tov4 listenport=9090 connectaddress=(wsl -d Ubuntu-18.04 exec hostname -I).trimend()
    
    Firewall 설정
    $ New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort 9090 -Action Allow -Protocol TCP
    $ New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort 9090 -Action Allow -Protocol TCP
    
    부팅
    시작 방법에 대한 ROS 노드는 기본적으로 시작 시rostopic list에 확인 가능한 모든 항목을 브리지합니다.
    물론 배제할 화제를 지정하거나 특정한 화제만 연결할 수도 있다.
    ROS bridge의 Websocket 서버를 미리 시작하십시오.
    여러 대의 기계를 사용하여 테스트를 할 때, 어느 기계든지 시동을 걸어 주십시오.
    $ roslaunch rosbridge_server rosbridge_websocket.launch
    
    ※ 확인을 위해, 예를 들어 거북이를 이동하려면 해당 시점에 시동을 걸어야 합니다.
    PC1에서 거북이 시뮬레이션 시작
    $ rosrun turtlesim turtlesim_node
    
    PC2에서 거북이의 Teleop 시작
    $ rosrun turtlesim turtle_teleop_key
    
    부팅 방법
    자세한 내용은 다음에 설명합니다. 이것은 시작 방법입니다.로컬에서subscribe를 진행하려면,publish를 원하는 사람 (다리를 연결하고 싶은 사람) 이 시작하면 동작을 확인할 수 있습니다.
    시작할 때의 매개 변수도 다음과 같이 요약한다.원격 호스트의 IP 주소remote_host를 변경하여 외부 PC에 연결합니다.필요에 따라 다른 매개변수를 변경하십시오.
    $ roslaunch ros_to_rosbridge rosbridge_to_rosbridge.launch remote_host:={remote PC ip address}
    
    매개변수 이름
    묵인
    설명
    local_host
    127.0.0.1
    로컬 Websocket 서버가 시작하는 IP 주소
    local_port
    9090
    로컬 Websocket 서버가 시작하는 포트
    remote_host
    127.0.0.1
    원격 웹소켓 서버가 시작하는 IP 주소(※ 대부분의 경우 변경이 필요함)
    remote_port
    9090
    원격 Websocket 서버 시작 포트
    use_id_for_ns
    false
    conf 파일의 id를 화제로 할지 여부 (/cmd vel 테마는/id/cmd vel와 같습니다)
    프로파일ros_to_rosbridge/conf 폴더에 교차할 테마 등 설정 파일이 있습니다.
    기본값은 다음과 같습니다.
    와일드카드를 /turtle1/*처럼 지정할 수도 있습니다.include_topics에서 주제를 지정한 후 주제만 브리지합니다.
    ros_to_rosbridge/conf/config.yaml
    id : robot_a
    exclude_topics:
      - /rosout
      - /rosout_agg
      - /client_count
      - /connected_clients
      # - /turtle1/*
    include_topics:
      # - name : /cmd_vel 
      #   type : geometry_msgs/Twist
      # - name : /odom
      #   type : nav_msgs/Odometry
    
    항목
    설명
    id
    브릿지 끝의 화제명은 시작 id에 적혀 있습니다
    exclude_topics
    브리지 제외 항목
    include_topics
    브리지할 테마(테마 이름과 데이터 형식)
    ROS 노드의 개요
    사실 이번에 우리는 두 가지 방법을 써서 실시했다.
    ↑의 시동은 1이다.2 GiitHub의여기.에 조용히 있습니다.
    1. 로컬 ROS bridge에서 원격 ROS Bridge로
    2. 로컬 ROS에서 원격 ROS bridge로 통신
    나는 장점(특징)과 단점이 다음과 같다고 생각한다.
    #
    이점(피쳐)
    결점
    1
    코드에서 메시지 형식을 호출하지 않고 실행할 수 있습니다
    로컬 통신도 특별히 웹 소켓 통신을 사용한다
    2
    로컬 통신은 ROS
    메시지 형식은 하드 인코딩입니다
    그림은 다음과 같다.빨간색 자격증으로 둘러싸인 ROS 노드입니다.
    1의 이미지는 다음과 같습니다.

    2 이미지는 다음과 같습니다.빨간색 화살표 부분은 1과 다릅니다.

    WSL2의 ROS와 통신
    이 시스템은 WSL2의 ROS에서도 사용할 수 있습니다.
    아니면 그걸 하고 싶어서 많은 걸 찾았는데 생각보다 시스템이 커졌어요.
    포트 전송을 설정하면 다음과 같은 통신을 할 수 있습니다.
    아마 9090호라는 특정 포트만 열면 될 것 같아서요.

    끝말
    드디어 목표 시스템을 완성했습니다!
    기릿허브에 공개된 것은 이번이 처음이다.아무것도 없을지 몰라도 엿볼 수만 있다면 기뻐요.
    LGTM 등도 격려가 되겠습니다!끝까지 봐주셔서 감사합니다.
    참고 자료

    좋은 웹페이지 즐겨찾기