service cannot process request: service [/state_changes] already registered

asked 2018-10-08 10:12:42 -0500

Nijesh gravatar image

updated 2018-10-08 10:29:56 -0500

gvdhoorn gravatar image

Everything works fine except this error below: Error: (Everytime i click the buttons, i get this error)

[ERROR] [1539010817.234135]: [Client 14] [id: call_service:/state_changes:3] call_service ServiceException: service [/state_changes] responded with an error: service cannot process request: service [/state_changes] already registered

html:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />

<script type="text/javascript" src="http://static.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js"></script>
<script type="text/javascript" src="http://static.robotwebtools.org/roslibjs/current/roslib.min.js"></script>

<script type="text/javascript" type="text/javascript">
  // Connecting to ROS
  // -----------------

  var ros = new ROSLIB.Ros({
    url : 'ws://localhost:9090'
  });

  ros.on('connection', function() {
    console.log('Connected to websocket server.');
  });

  ros.on('error', function(error) {
    console.log('Error connecting to websocket server: ', error);
  });

  ros.on('close', function() {
    console.log('Connection to websocket server closed.');
  });


  //initializing variables for usage later
  var fromPlayer;
  Boolean(fromPlayer);
  var ballposition;
  var topic_ballposition;
  //Create a subscriber to the topic /state_changes_tracker
  //subsriber gets the data abt state changes and has to see if 
  //state changes allow the human player to pass ball
  topic_listener = new ROSLIB.Topic({
  ros : ros,
  name : '/state_changes_tracker',
  messageType : 'std_msgs/Int64'
  });

  topic_listener.subscribe(function(message) {
  console.log('Received message on ' + topic_listener.name + ': ' + message.data);
  check_button_enable(message.data);
  });

  function check_button_enable(topic_ballposition){
  //refering to random function if the ballposition is 1 or 2 i.e. 
  //one of the non-human players
    if(topic_ballposition == 0 ) {
    fromPlayer = true;
    }
    else {
    fromPlayer = false;
    }
  }

  //passLeft function
  function passLeft(fromPlayer) {
    if(fromPlayer == true) {
    ballposition = 1
    service_update(ballposition)
    console.log("LEFT PASS INITATED");
    }
    else { 
    console.log("YOU DON'T HAVE THE BALL")
    }
  }

  //passRight function
  function passRight(fromPlayer) {
    if(fromPlayer == true) {
    ballposition = 2  
    service_update(ballposition)
    console.log("RIGHT PASS INITATED");
    }
    else {
    console.log("YOU DON'T HAVE THE BALL")
    }
  }

service_listener = new ROSLIB.Service({
  ros : ros,
  name : '/state_changes',
  serviceType : 'ros_cyberball/service_data'
   });

function service_update(ballposition){
  var request = new ROSLIB.ServiceRequest({
    data : ballposition
   });
  // Creating a Service to send ballposition data to backend
  service_listener.callService(request, function(result) {
    console.log('Result for service call on ' + service_listener.name + ': ' + result.data);
  }); 

}

</script>
</head>

<body>
  <h1>Cyberball</h1>
  <form name="ctrlPanel">
    <p>Pass left or right by clicking the buttons below:</p>
    <button id="sendMsg" type="button" onclick="passLeft(fromPlayer)">Pass left</button>
    <button id="sendMsg" type="button" onclick="passRight(fromPlayer)">Pass right</button>
  </form>
  <div id="feedback"></div>
</body>
</body>
</html>

Python:

#!/usr/bin/env python
import rospy
import random
from std_msgs.msg import Int64
from ros_cyberball.srv import service_data

class cyberball_implemetation:
    # assigning global variables
    global topic_pub, rate, ballposition, request,s
    rospy.init_node("cyberball_backend", anonymous=True)
    topic_pub = rospy.Publisher('state_changes_tracker', Int64, queue_size=10)

def main(ballposition):
    while not rospy.is_shutdown():
       topic_pub.publish(ballposition)
       if ballposition != 0:
         ballposition = pass_Random()
       else:
         s = rospy.Service('state_changes', service_data, change_state)
         rospy.spin()
       rospy.sleep(1)

def change_state(request):
    print("changing state to: " + str(request.data))
    if request.data == 1:
        ballposition = 1
        pass_Random()
        topic_pub.publish(ballposition)
        main(ballposition)
    elif request.data == 2:
        ballposition = 2
        pass_Random()
        topic_pub.publish(ballposition)
        main(ballposition)
    else:
        ballposition = 0
    return None

def pass_Random():
    print("passing random")
    ballposition = random.randint(0,2)
    return ballposition

    #setting up ...
(more)
edit retag flag offensive close merge delete