ROS: Rviz — точка публикации — подписчик — получить координаты x, y

#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()