Я написал образец подписчика. Я хочу передать данные, полученные от rospy.Subscriber, в другую переменную, чтобы потом использовать их в программе для обработки. На данный момент я мог видеть, что подписчик работает, поскольку я могу видеть, что подписанные значения печатаются, когда я использую функцию rospy.loginfo (). Хотя я не знаю, как сохранить эти данные в другой переменной. Я попытался назначить его напрямую переменной с помощью оператора присваивания '=', но получаю сообщение об ошибке.
Я попытался написать функцию обратного вызова с rospy.loginfo, чтобы распечатать данные позиции из подписанного объекта. Я подписался на JointState, и он содержит массивы заголовка, положения, скорости и усилий. с помощью rospy.loginfo я могу проверить, подписывается ли подписчик. Но когда я попытался назначить его напрямую переменной, я получил сообщение об ошибке.
Я показываю логин из функции обратного вызова следующим образом
def callback(data):
rospy.loginfo(data.position)
global listen
listen = rospy.Subscriber("joint_states", JointState,
callback)
rospy.spin()
и это прекрасно работает. Но когда я немного изменяю код для присвоения подписанных значений, я получаю следующую ошибку, т.е.
listen1 = rospy.Subscriber("joint_states", JointState,
callback=None)
listen = listen1.position
#rospy.loginfo(listen)
print(listen)
rospy.spin()```
The error is as follows,
```listen = listen1.position
AttributeError: 'Subscriber' object has no attribute 'position'
РЕДАКТИРОВАТЬ: вот мой узел, который я определил в своей программе,
#rospy.loginfo(msg.data)
global tactile_states
tactile_states = data.data
def joint_callback(data):
#rospy.loginfo(data.position)
global g_joint_states
global g_position
global g_pos1
g_joint_states = data
#for i in len(data.position):
#g_position[i] = data.position[i]
g_position = data.position
if len(data.position) > 0:
print("jointstate more than 0")
g_pos1 = data.position[0]
#print(g_position)
def joint_modifier(*args):
#choice describes what the node is supposed to do whether act as publisher or subscribe to joint states or tactile sensors
rospy.init_node('joint_listener_publisher', anonymous=True)
pub1 = rospy.Publisher('joint_states', JointState, queue_size = 10)
if(len(args)>1):
choice = args[0]
joint_name = args[1]
position = args[2]
else:
choice = args[0]
if (choice == 1):
rate = rospy.Rate(1)
robot_configuration = JointState()
robot_configuration.header = Header()
robot_configuration.name = [joint_name]
robot_configuration.position = [position]
robot_configuration.velocity = [10]
robot_configuration.effort = [100]
while not rospy.is_shutdown():
robot_configuration.header.stamp = rospy.Time.now()
rospy.loginfo(robot_configuration)
break
pub1.publish(robot_configuration)
rospy.sleep(2)
if (choice == 2):
#rospy.Timer(rospy.Duration(2), joint_modifier)
listen = rospy.Subscriber("joint_states", JointState, joint_callback)
rospy.spin()
if (choice == 3):
#rospy.Timer(rospy.Duration(2), joint_modifier)
tactile_sub = rospy.Subscriber("/sr_tactile/touch/ff", Float64, tactile_callback)
rospy.spin()
Вот как я вызываю узел внутри основной части программы,
joint_modifier(2)
print("printing g_position")
print(g_position)#to check the format of g_position
print("printed g _position")
leg_1 = Leg_attribute(g_position[0], g_position[1], g_position[2], velocity1 = 10, velocity2 = 10, velocity3 = 10, effort1 = 100, effort2 = 100, effort3 = 100, acceleration=1)
При таком вызове программа застревает на joint_modifier(2)
, поскольку эта функция имеет rospy.spin()
.