Я хочу подписаться на опубликованное сообщение geomtery.Но внутри узла, который также является издателем при условии.
Мой узел публикует сообщение cmd_vel, когда объект находится рядом с роботом, чтобы сказать роботу остановиться.а если нет, то он движется с постоянной скоростью.
Но теперь я хочу, чтобы робот подписался на cmd_vel, который публикуется, когда условие не выполняется, например, чтобы иметь возможность его перемещать с помощьюиспользуя клавиатуру или другие.
Я пытался написать это, но ничего не работает, поэтому я не думал, что будет полезно показать вам, что не работает.Потому что это не работает.Вместо этого, если бы вы могли мне помочь, как это сделать, особенно в части кода, я буду благодарен.
Я также хочу спросить, есть ли способ, чтобы он публиковался в теме только тогда, когдаусловие выполнено, и просто не публикуется, когда оно не выполняется.
#!/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()