Gazebo 시뮬레이터로 AR drone 2.0을 웹에서 조작

농업이나 경비라든지 화상 인식할 수 있는 정보 수집 드론에
관심있는 사람 누군가 없으세요~?
개인의 지속은 외로운 것입니다.

지난번 다음에 시뮬레이터 내의 드론을 웹과 GUI의 인터페이스에서 조작할 수 있도록 했습니다.

참고로 한 것은 이쪽
AR drone 2.0 Simulator 위키페이지

환경은 지난번과 변함없이
우분투 14.04

※ROS의 catkin_ws는 ~/catkin_ws로 설정되어 있습니다.

~/catkin_ws/src 디렉토리에서
roslibjs 패키지 설치
$ git clone https://github.com/RobotWebTools/roslibjs


참고 페이지에 따라이 시점에서 websocket을 실행하면 rosauth
들어 있지 않다는 오류가 발생했습니다.

~/catkin_ws/src에 rosauth를 넣은 다음
build합니다.
$ git clone https://github.com/GT-RAIL/rosauth.git
$ catkin_make

drone.html의 이름으로 아래 html 파일
아래 디렉토리에 저장

▼저장처
~/catkin_ws/src/roslibjs/examples
▼파일 내용
 <!DOCTYPE html> 
 <html> 
 <head> 
 <meta charset="utf-8" /> 
 <script src="http://cdn.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js"></script> 
 <script src="../build/roslib.js"></script> 

 <script> 
  // Connecting to ROS 
  // ----------------- 
  var ros = new ROSLIB.Ros(); 

  // If there is an error on the backend, an 'error' emit will be emitted. 
  ros.on('error', function(error) { 
    document.getElementById('connecting').style.display = 'none'; 
    document.getElementById('connected').style.display = 'none'; 
    document.getElementById('closed').style.display = 'none'; 
    document.getElementById('error').style.display = 'inline'; 
    console.log(error); 
  }); 

  // Find out exactly when we made a connection. 
  ros.on('connection', function() { 
    console.log('Connection made!'); 
    document.getElementById('connecting').style.display = 'none'; 
    document.getElementById('error').style.display = 'none'; 
    document.getElementById('closed').style.display = 'none'; 
    document.getElementById('connected').style.display = 'inline'; 
  }); 

  ros.on('close', function() { 
    console.log('Connection closed.'); 
    document.getElementById('connecting').style.display = 'none'; 
    document.getElementById('connected').style.display = 'none'; 
    document.getElementById('closed').style.display = 'inline'; 
  }); 

  // Create a connection to the rosbridge WebSocket server. 
  ros.connect('ws://localhost:9090'); 

 // Write your code here, to publish or subscribe in topics

 function Takeoff() { 
 // First, we create a Topic object with details of the topic's name and message type. 
  var takeoff = new ROSLIB.Topic({ 
    ros : ros, 
    name : 'ardrone/takeoff', 
    messageType : 'std_msgs/Empty' 
  }); 

  // Then we create the payload to be published. The object we pass in to ros.Message matches the 
  // fields defined in the geometry_msgs/Twist.msg definition. 
  var msg = new ROSLIB.Message(''); 

  // And finally, publish. 
  takeoff.publish(msg); 
 } 

 function Land() { 
 // First, we create a Topic object with details of the topic's name and message type. 
  var land = new ROSLIB.Topic({ 
    ros : ros, 
    name : 'ardrone/land', 
    messageType : 'std_msgs/Empty' 
  }); 

  // Then we create the payload to be published. The object we pass in to ros.Message matches the 
  // fields defined in the geometry_msgs/Twist.msg definition. 
  var msg = new ROSLIB.Message(''); 

  // And finally, publish. 
  land.publish(msg); 
 } 

 function GoTo(){ 
 var TheForm; 
 TheForm = document.movingForm; 

  var coordinate = new ROSLIB.Topic({ 
    ros : ros, 
    name : 'tum_ardrone/com', 
    messageType : 'std_msgs/String' 
  }); 

  // Then we create the payload to be published. The object we pass in to ros.Message matches the 
  // fields defined in the geometry_msgs/Twist.msg definition. 
  var msg = new ROSLIB.Message({data : "c goto 20 20 5 2"}); 
  // And finally, publish. 
  coordinate.publish(msg); 
 } 
 </script> 
 </head> 

 <body> 
   <h1>Drone Application</h1> 
 <input type="button" value= "Takeoff" onclick="Takeoff()" style="width:150px"/> 
 <br> 
 <input type="button" value= "Land" onclick="Land()" style="width:150px"/> 
 <form name=movingForm> 
    <input type="text" name= "coordinate" style="width:142px"/> 
    <br> 
    <input type="button" value= "Go to" onclick="GoTo()" style="width:150px"/> 
 <form/> 
 <br> 
  <div id="statusIndicator"> 
    <p id="connecting"> 
      Connecting to rosbridge... 
    </p> 
    <p id="connected" style="color:#00D600; display:none"> 
      Connected 
    </p> 
    <p id="error" style="color:#FF0000; display:none"> 
      Error in the backend! 
    </p> 
    <p id="closed" style="display:none"> 
      Connection closed. 
    </p> 
  </div> 
 </body> 
 </html>

터미널에서 웹 소켓을 시작합니다.
$ roslaunch rosbridge_server rosbridge_websocket.launch

성공하면 포트 9090에서 서버가 시작한 메시지 표시를 확인할 수 있습니다.
[INFO] [WallTime: 1455515889.569402] Rosbridge WebSocket server started on port 9090
지난번 준비한 AR drone 2.0 시뮬레이션 환경을 시작하십시오.
$roslaunch cvg_sim_gazebo ardrone_testworld.launch

자, 이제 drone.html을 브라우저에서 열면
Connected!라는 표시로 웹 소켓에 클라이언트가 연결되어 있습니다.
Takeoff, Land, Go to 버튼을 사용할 수 있게 되어 있을 것입니다.
내가 시험했던 곳, Takeoff와 Land로 이륙, 착륙은 버튼으로 확인할 수 있었습니다만 Go To에서의 목적지의 지정 방법을 지금 몰랐습니다.

그래서 다른 GUI 컨트롤러도 시도해 보겠습니다.

~/catkin_ws/src에 패키지를 설치합니다.
$git clone http://www.ros.org/wiki/tum_ardrone

tum_ardrone 아래의
tum_ardrone.launch를 사용하여 실행했습니다.
$ cd ~/catkin_ws/src/tum_ardrone/launch
$ roslaunch tum_ardrone tum_ardrone.launch 

이런 식으로 GUI 컨트롤러, 드론 카메라 영상, 비행 좌표 추적 정보 창이 열릴 것입니다.
GUI의 Control Source를 Keyboard로 지정하여 움직여 보겠습니다.


i: 전진
k: 후퇴
l:오른쪽 선회
j:좌회전
s:이륙
d:착륙

움직였습니다!

다음 번에는 녹화 한 동영상에서 인식에
인간, 해수, 해충, 작물 등 필요한 정보를 인식할 수 있도록 할 수 있으면 좋겠다
darknet이라는 프레임 워크는 매우 쉽습니다.
고성능 기능을 실현할 수있어 편리합니다.
darknet

실제로 수집한 3D 데이터로 만든 가상 공간에서
자동 해충 제거를 시뮬레이션하고 싶습니다.
아래 페이지가 좋을 것 같습니다.

No.3-3 : 환경을 만들자! (Digital Elevation Models 편)

좋은 웹페이지 즐겨찾기