service cannot process request: service [/state_changes] already registered
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 ...
add a comment