Node change from publisher to subscriber under conditional statement
I want to subscribe to a geomtery message that is being published. But inside a node that is also a publisher under a condition.
My node publishes a cmd_vel message when an object is near the robot, to tell the robot to stop. and if not, then it moves to a constant speed.
But now I want the robot to subscribe to a cmd_vel that is being published when the condition is not met, for example, to be able to move it by using keyboard or others.
I have tried to write it but nothing is working, so I did not think it is useful to show to you what did not work. Because it does not work. Instead if you could give me help on how to do this, especially with the code part, I will be thankful.
I also want to ask if there is a way so that it publishes on the topic only when the condition is met, and just not publishing when it does not.
#!/usr/bin/env python
import rospy
from sensor_msgs.msg import LaserScan
from geometry_msgs.msg import Twist
class Obstacle():
def __init__(self):
self.LIDAR_ERR = 0.05
self._cmd_pub = rospy.Publisher('cmd_vel', Twist, queue_size=1)
self.obstacle()
def get_scan(self):
msg = rospy.wait_for_message("scan", LaserScan)
self.scan_filter =
for i in range(360):
if i <= 15 or i > 335:
if msg.ranges[i] >= self.LIDAR_ERR:
self.scan_filter.append(msg.ranges[i])
def obstacle(self):
self.twist = Twist()
while not rospy.is_shutdown():
self.get_scan()
if min(self.scan_filter) < 0.2:
self.twist.linear.x = 0.0
self.twist.angular.z = 0.0
self._cmd_pub.publish(self.twist)
rospy.loginfo('Stop!')
else:
self.twist.linear.x = 0.5
self.twist.angular.z = 0.0
rospy.loginfo('distance of the obstacle : %f', min(self.scan_filter))
self._cmd_pub.publish(self.twist)
def main():
rospy.init_node('turtlebot3_obstacle')
try:
obstacle = Obstacle()
except rospy.ROSInterruptException:
pass
if __name__ == '__main__':
main()
message ros
add a comment |
I want to subscribe to a geomtery message that is being published. But inside a node that is also a publisher under a condition.
My node publishes a cmd_vel message when an object is near the robot, to tell the robot to stop. and if not, then it moves to a constant speed.
But now I want the robot to subscribe to a cmd_vel that is being published when the condition is not met, for example, to be able to move it by using keyboard or others.
I have tried to write it but nothing is working, so I did not think it is useful to show to you what did not work. Because it does not work. Instead if you could give me help on how to do this, especially with the code part, I will be thankful.
I also want to ask if there is a way so that it publishes on the topic only when the condition is met, and just not publishing when it does not.
#!/usr/bin/env python
import rospy
from sensor_msgs.msg import LaserScan
from geometry_msgs.msg import Twist
class Obstacle():
def __init__(self):
self.LIDAR_ERR = 0.05
self._cmd_pub = rospy.Publisher('cmd_vel', Twist, queue_size=1)
self.obstacle()
def get_scan(self):
msg = rospy.wait_for_message("scan", LaserScan)
self.scan_filter =
for i in range(360):
if i <= 15 or i > 335:
if msg.ranges[i] >= self.LIDAR_ERR:
self.scan_filter.append(msg.ranges[i])
def obstacle(self):
self.twist = Twist()
while not rospy.is_shutdown():
self.get_scan()
if min(self.scan_filter) < 0.2:
self.twist.linear.x = 0.0
self.twist.angular.z = 0.0
self._cmd_pub.publish(self.twist)
rospy.loginfo('Stop!')
else:
self.twist.linear.x = 0.5
self.twist.angular.z = 0.0
rospy.loginfo('distance of the obstacle : %f', min(self.scan_filter))
self._cmd_pub.publish(self.twist)
def main():
rospy.init_node('turtlebot3_obstacle')
try:
obstacle = Obstacle()
except rospy.ROSInterruptException:
pass
if __name__ == '__main__':
main()
message ros
As far as I understand your problem, you are trying to pass the control from one node to another under some conditions. Am I correct?
– Darkproduct
Nov 23 '18 at 16:51
Yes, I want to pass the control to another node, if the condition is not met. to be more specific to a Rosbridge that is subscribing to an API and then publishing to cmd_vel topic.
– 강천사
Nov 24 '18 at 3:07
add a comment |
I want to subscribe to a geomtery message that is being published. But inside a node that is also a publisher under a condition.
My node publishes a cmd_vel message when an object is near the robot, to tell the robot to stop. and if not, then it moves to a constant speed.
But now I want the robot to subscribe to a cmd_vel that is being published when the condition is not met, for example, to be able to move it by using keyboard or others.
I have tried to write it but nothing is working, so I did not think it is useful to show to you what did not work. Because it does not work. Instead if you could give me help on how to do this, especially with the code part, I will be thankful.
I also want to ask if there is a way so that it publishes on the topic only when the condition is met, and just not publishing when it does not.
#!/usr/bin/env python
import rospy
from sensor_msgs.msg import LaserScan
from geometry_msgs.msg import Twist
class Obstacle():
def __init__(self):
self.LIDAR_ERR = 0.05
self._cmd_pub = rospy.Publisher('cmd_vel', Twist, queue_size=1)
self.obstacle()
def get_scan(self):
msg = rospy.wait_for_message("scan", LaserScan)
self.scan_filter =
for i in range(360):
if i <= 15 or i > 335:
if msg.ranges[i] >= self.LIDAR_ERR:
self.scan_filter.append(msg.ranges[i])
def obstacle(self):
self.twist = Twist()
while not rospy.is_shutdown():
self.get_scan()
if min(self.scan_filter) < 0.2:
self.twist.linear.x = 0.0
self.twist.angular.z = 0.0
self._cmd_pub.publish(self.twist)
rospy.loginfo('Stop!')
else:
self.twist.linear.x = 0.5
self.twist.angular.z = 0.0
rospy.loginfo('distance of the obstacle : %f', min(self.scan_filter))
self._cmd_pub.publish(self.twist)
def main():
rospy.init_node('turtlebot3_obstacle')
try:
obstacle = Obstacle()
except rospy.ROSInterruptException:
pass
if __name__ == '__main__':
main()
message ros
I want to subscribe to a geomtery message that is being published. But inside a node that is also a publisher under a condition.
My node publishes a cmd_vel message when an object is near the robot, to tell the robot to stop. and if not, then it moves to a constant speed.
But now I want the robot to subscribe to a cmd_vel that is being published when the condition is not met, for example, to be able to move it by using keyboard or others.
I have tried to write it but nothing is working, so I did not think it is useful to show to you what did not work. Because it does not work. Instead if you could give me help on how to do this, especially with the code part, I will be thankful.
I also want to ask if there is a way so that it publishes on the topic only when the condition is met, and just not publishing when it does not.
#!/usr/bin/env python
import rospy
from sensor_msgs.msg import LaserScan
from geometry_msgs.msg import Twist
class Obstacle():
def __init__(self):
self.LIDAR_ERR = 0.05
self._cmd_pub = rospy.Publisher('cmd_vel', Twist, queue_size=1)
self.obstacle()
def get_scan(self):
msg = rospy.wait_for_message("scan", LaserScan)
self.scan_filter =
for i in range(360):
if i <= 15 or i > 335:
if msg.ranges[i] >= self.LIDAR_ERR:
self.scan_filter.append(msg.ranges[i])
def obstacle(self):
self.twist = Twist()
while not rospy.is_shutdown():
self.get_scan()
if min(self.scan_filter) < 0.2:
self.twist.linear.x = 0.0
self.twist.angular.z = 0.0
self._cmd_pub.publish(self.twist)
rospy.loginfo('Stop!')
else:
self.twist.linear.x = 0.5
self.twist.angular.z = 0.0
rospy.loginfo('distance of the obstacle : %f', min(self.scan_filter))
self._cmd_pub.publish(self.twist)
def main():
rospy.init_node('turtlebot3_obstacle')
try:
obstacle = Obstacle()
except rospy.ROSInterruptException:
pass
if __name__ == '__main__':
main()
message ros
message ros
edited Nov 26 '18 at 3:06
Darkproduct
18915
18915
asked Nov 22 '18 at 3:57
강천사강천사
64
64
As far as I understand your problem, you are trying to pass the control from one node to another under some conditions. Am I correct?
– Darkproduct
Nov 23 '18 at 16:51
Yes, I want to pass the control to another node, if the condition is not met. to be more specific to a Rosbridge that is subscribing to an API and then publishing to cmd_vel topic.
– 강천사
Nov 24 '18 at 3:07
add a comment |
As far as I understand your problem, you are trying to pass the control from one node to another under some conditions. Am I correct?
– Darkproduct
Nov 23 '18 at 16:51
Yes, I want to pass the control to another node, if the condition is not met. to be more specific to a Rosbridge that is subscribing to an API and then publishing to cmd_vel topic.
– 강천사
Nov 24 '18 at 3:07
As far as I understand your problem, you are trying to pass the control from one node to another under some conditions. Am I correct?
– Darkproduct
Nov 23 '18 at 16:51
As far as I understand your problem, you are trying to pass the control from one node to another under some conditions. Am I correct?
– Darkproduct
Nov 23 '18 at 16:51
Yes, I want to pass the control to another node, if the condition is not met. to be more specific to a Rosbridge that is subscribing to an API and then publishing to cmd_vel topic.
– 강천사
Nov 24 '18 at 3:07
Yes, I want to pass the control to another node, if the condition is not met. to be more specific to a Rosbridge that is subscribing to an API and then publishing to cmd_vel topic.
– 강천사
Nov 24 '18 at 3:07
add a comment |
2 Answers
2
active
oldest
votes
Subscribing and unsubscribing just like publishing and unpublishing is not a optimal way since it takes time to construct and deconstruct them what you can do is set up both publisher and subscriber and control when they will be updated and published:
- control when you publish by adding an
if
beforeself._cmd_pub.publish(self.twist)
. - set up your callback and update your variables with data from callback if your condition mets.
Thank you for your help
– 강천사
Nov 25 '18 at 14:39
add a comment |
You have two options here and they differentiate in what you are trying to archive:
You have different tasks for the robot to do. Take a look into the actionlib.
E.g. the robot should drive to house x and park in the garage. Then you can split this into multiple tasks:
- Drive to the garage.
- Park in the garage.
This split makes sense because the nature of the maneuvers are very different and you'll probably wont to write another node (or multiple nodes) for only this maneuver.
From your question I'm a little bit confused because it seems like you are trying to implement a "safety" feature, which should be able to take control in all possible cases.
Unfortunately, ROS has, as far as I know, no good way to differentiate between the publishers of a ROS message. A ROS message can have as many publishers and subscribers as you want and you are not able to select "listen here, but ignore these messages".
The best way I found to do something like this, is to create a new subscriber in every
cmd_vel
publisher and if your "safety" node sends "stop" (or bool false/true in this case) the publisher stops publishing.
One last recommendation: Try to bundle up your navigation tools to one branch for every different task with only one end node, which publishes cmd_vel
. And every safety and control mechanism you need is packed underneath and not "in parallel" so to speak.
This makes everything much easier and you can use the actionlib to its full potential. You can even share nodes between the branches, without interfering, because the end publisher will be silenced if not needed.
Thank you, I will try it, yes I am thinking of the second case you are saying
– 강천사
Nov 25 '18 at 14:39
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53423668%2fnode-change-from-publisher-to-subscriber-under-conditional-statement%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Subscribing and unsubscribing just like publishing and unpublishing is not a optimal way since it takes time to construct and deconstruct them what you can do is set up both publisher and subscriber and control when they will be updated and published:
- control when you publish by adding an
if
beforeself._cmd_pub.publish(self.twist)
. - set up your callback and update your variables with data from callback if your condition mets.
Thank you for your help
– 강천사
Nov 25 '18 at 14:39
add a comment |
Subscribing and unsubscribing just like publishing and unpublishing is not a optimal way since it takes time to construct and deconstruct them what you can do is set up both publisher and subscriber and control when they will be updated and published:
- control when you publish by adding an
if
beforeself._cmd_pub.publish(self.twist)
. - set up your callback and update your variables with data from callback if your condition mets.
Thank you for your help
– 강천사
Nov 25 '18 at 14:39
add a comment |
Subscribing and unsubscribing just like publishing and unpublishing is not a optimal way since it takes time to construct and deconstruct them what you can do is set up both publisher and subscriber and control when they will be updated and published:
- control when you publish by adding an
if
beforeself._cmd_pub.publish(self.twist)
. - set up your callback and update your variables with data from callback if your condition mets.
Subscribing and unsubscribing just like publishing and unpublishing is not a optimal way since it takes time to construct and deconstruct them what you can do is set up both publisher and subscriber and control when they will be updated and published:
- control when you publish by adding an
if
beforeself._cmd_pub.publish(self.twist)
. - set up your callback and update your variables with data from callback if your condition mets.
answered Nov 24 '18 at 12:23
Mohammad AliMohammad Ali
31528
31528
Thank you for your help
– 강천사
Nov 25 '18 at 14:39
add a comment |
Thank you for your help
– 강천사
Nov 25 '18 at 14:39
Thank you for your help
– 강천사
Nov 25 '18 at 14:39
Thank you for your help
– 강천사
Nov 25 '18 at 14:39
add a comment |
You have two options here and they differentiate in what you are trying to archive:
You have different tasks for the robot to do. Take a look into the actionlib.
E.g. the robot should drive to house x and park in the garage. Then you can split this into multiple tasks:
- Drive to the garage.
- Park in the garage.
This split makes sense because the nature of the maneuvers are very different and you'll probably wont to write another node (or multiple nodes) for only this maneuver.
From your question I'm a little bit confused because it seems like you are trying to implement a "safety" feature, which should be able to take control in all possible cases.
Unfortunately, ROS has, as far as I know, no good way to differentiate between the publishers of a ROS message. A ROS message can have as many publishers and subscribers as you want and you are not able to select "listen here, but ignore these messages".
The best way I found to do something like this, is to create a new subscriber in every
cmd_vel
publisher and if your "safety" node sends "stop" (or bool false/true in this case) the publisher stops publishing.
One last recommendation: Try to bundle up your navigation tools to one branch for every different task with only one end node, which publishes cmd_vel
. And every safety and control mechanism you need is packed underneath and not "in parallel" so to speak.
This makes everything much easier and you can use the actionlib to its full potential. You can even share nodes between the branches, without interfering, because the end publisher will be silenced if not needed.
Thank you, I will try it, yes I am thinking of the second case you are saying
– 강천사
Nov 25 '18 at 14:39
add a comment |
You have two options here and they differentiate in what you are trying to archive:
You have different tasks for the robot to do. Take a look into the actionlib.
E.g. the robot should drive to house x and park in the garage. Then you can split this into multiple tasks:
- Drive to the garage.
- Park in the garage.
This split makes sense because the nature of the maneuvers are very different and you'll probably wont to write another node (or multiple nodes) for only this maneuver.
From your question I'm a little bit confused because it seems like you are trying to implement a "safety" feature, which should be able to take control in all possible cases.
Unfortunately, ROS has, as far as I know, no good way to differentiate between the publishers of a ROS message. A ROS message can have as many publishers and subscribers as you want and you are not able to select "listen here, but ignore these messages".
The best way I found to do something like this, is to create a new subscriber in every
cmd_vel
publisher and if your "safety" node sends "stop" (or bool false/true in this case) the publisher stops publishing.
One last recommendation: Try to bundle up your navigation tools to one branch for every different task with only one end node, which publishes cmd_vel
. And every safety and control mechanism you need is packed underneath and not "in parallel" so to speak.
This makes everything much easier and you can use the actionlib to its full potential. You can even share nodes between the branches, without interfering, because the end publisher will be silenced if not needed.
Thank you, I will try it, yes I am thinking of the second case you are saying
– 강천사
Nov 25 '18 at 14:39
add a comment |
You have two options here and they differentiate in what you are trying to archive:
You have different tasks for the robot to do. Take a look into the actionlib.
E.g. the robot should drive to house x and park in the garage. Then you can split this into multiple tasks:
- Drive to the garage.
- Park in the garage.
This split makes sense because the nature of the maneuvers are very different and you'll probably wont to write another node (or multiple nodes) for only this maneuver.
From your question I'm a little bit confused because it seems like you are trying to implement a "safety" feature, which should be able to take control in all possible cases.
Unfortunately, ROS has, as far as I know, no good way to differentiate between the publishers of a ROS message. A ROS message can have as many publishers and subscribers as you want and you are not able to select "listen here, but ignore these messages".
The best way I found to do something like this, is to create a new subscriber in every
cmd_vel
publisher and if your "safety" node sends "stop" (or bool false/true in this case) the publisher stops publishing.
One last recommendation: Try to bundle up your navigation tools to one branch for every different task with only one end node, which publishes cmd_vel
. And every safety and control mechanism you need is packed underneath and not "in parallel" so to speak.
This makes everything much easier and you can use the actionlib to its full potential. You can even share nodes between the branches, without interfering, because the end publisher will be silenced if not needed.
You have two options here and they differentiate in what you are trying to archive:
You have different tasks for the robot to do. Take a look into the actionlib.
E.g. the robot should drive to house x and park in the garage. Then you can split this into multiple tasks:
- Drive to the garage.
- Park in the garage.
This split makes sense because the nature of the maneuvers are very different and you'll probably wont to write another node (or multiple nodes) for only this maneuver.
From your question I'm a little bit confused because it seems like you are trying to implement a "safety" feature, which should be able to take control in all possible cases.
Unfortunately, ROS has, as far as I know, no good way to differentiate between the publishers of a ROS message. A ROS message can have as many publishers and subscribers as you want and you are not able to select "listen here, but ignore these messages".
The best way I found to do something like this, is to create a new subscriber in every
cmd_vel
publisher and if your "safety" node sends "stop" (or bool false/true in this case) the publisher stops publishing.
One last recommendation: Try to bundle up your navigation tools to one branch for every different task with only one end node, which publishes cmd_vel
. And every safety and control mechanism you need is packed underneath and not "in parallel" so to speak.
This makes everything much easier and you can use the actionlib to its full potential. You can even share nodes between the branches, without interfering, because the end publisher will be silenced if not needed.
edited Nov 24 '18 at 20:32
answered Nov 24 '18 at 19:26
DarkproductDarkproduct
18915
18915
Thank you, I will try it, yes I am thinking of the second case you are saying
– 강천사
Nov 25 '18 at 14:39
add a comment |
Thank you, I will try it, yes I am thinking of the second case you are saying
– 강천사
Nov 25 '18 at 14:39
Thank you, I will try it, yes I am thinking of the second case you are saying
– 강천사
Nov 25 '18 at 14:39
Thank you, I will try it, yes I am thinking of the second case you are saying
– 강천사
Nov 25 '18 at 14:39
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53423668%2fnode-change-from-publisher-to-subscriber-under-conditional-statement%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
As far as I understand your problem, you are trying to pass the control from one node to another under some conditions. Am I correct?
– Darkproduct
Nov 23 '18 at 16:51
Yes, I want to pass the control to another node, if the condition is not met. to be more specific to a Rosbridge that is subscribing to an API and then publishing to cmd_vel topic.
– 강천사
Nov 24 '18 at 3:07