#ros
#розенкранц
Вопрос:
Я пытаюсь получить координаты x, y из rviz и получить подписку на тему, поэтому, когда я публикую точку и нажимаю на любое свободное место в rviz, я получаю его координаты x, y, z в теме / clicked_point, я хочу подписаться на эти точки и распечатать их на терминале. Код, который у меня есть, — это простой подписчик на тему / clicked_point.
Но когда я запускаю код, я получаю x, y как 0.0, а не нужные координаты, которые я нажимаю.
Может ли кто-нибудь помочь мне, пожалуйста, посмотреть на мой код. Я подозреваю, что это должно быть как-то связано с атрибутами, отмеченными точками.
Пожалуйста, дайте мне знать
Полный код
#!/usr/bin/env python
import rospy
from geometry_msgs.msg import PointStamped
import tf
import random
import numpy as np
global x,y,z
x = 0.0
y = 0.0
z = 0.0
def callback(msg):
point = PointStamped()
point.header.stamp = rospy.Time.now()
point.header.frame_id = "/map"
point.point.x = x
point.point.y = y
point.point.z = z
rospy.loginfo("coordinates:x=%f y=%f" %(x,y))
def listener():
rospy.init_node('goal_publisher', anonymous=True)
rospy.point_pub = rospy.Subscriber('/clicked_point', PointStamped, callback)
rospy.spin()
if __name__ == '__main__':
listener()
В терминале
varun-flox@varunflox:~/Desktop$ ./ros_localisation_subscriber.py
[INFO] [1607606216.839750]: coordinates:x=0.000000 y=0.000000
[INFO] [1607606221.911950]: coordinates:x=0.000000 y=0.000000
В другом терминале с rostopic echo /clicked_point
varun-flox@varunflox:~$ rostopic echo /clicked_point
header:
seq: 31
stamp:
secs: 1607606021
nsecs: 774185596
frame_id: "map"
point:
x: -4.99073648453
y: -4.93864154816
z: -0.00288152694702
---
header:
seq: 32
stamp:
secs: 1607606216
nsecs: 838675541
frame_id: "map"
point:
x: -4.98981332779
y: -4.96337604523
z: -0.0113334655762
---
Заранее спасибо
Ответ №1:
Вы должны изменить свое назначение переменных в функции обратного вызова. См.
def callback(msg):
x = msg.point.x
y = msg.point.y
z = msg.point.z
rospy.loginfo("coordinates:x=%f y=%f" %(x,y))
Объяснение Fir переменная msg, переданная в качестве параметра для функции обратного вызова, обертывает тип msg с меткой точки и может быть распакована, как показано выше.
Ответ №2:
Вот ваш код, измененный и протестированный, поблагодарите меня позже.
#!/usr/bin/env python
import rospy
from geometry_msgs.msg import PointStamped
global x,y,z
def callback(msg):
rospy.loginfo("coordinates:x=%f y=%f" %(msg.point.x,msg.point.y))
def listener():
rospy.init_node('goal_publisher', anonymous=True)
rospy.point_pub = rospy.Subscriber('/clicked_point', PointStamped, callback)
rospy.spin()
if __name__ == '__main__':
listener()