使用Xbox控制器在turtlesim中移动乌龟。 >
#!/usr/bin/env python
import rospy
from geometry_msgs.msg import Twist
from sensor_msgs.msg import Joy
# DEFINING CLASS
class pubSub:
def __init__(self):
# DEFINE VARIABLE TO KEEP LAST VALUE
rospy.init_node('c2t')
self.twt = Twist()
self.hold = Twist()
def callback_function(self,joyData):
self.twt.linear.x = 4*joyData.axes[1]
self.twt.angular.z = 4*joyData.axes[0]
self.hold = self.twt
def assuming_cont(self):
pub = rospy.Publisher('turtle1/cmd_vel', Twist, queue_size=10)
rospy.Subscriber("joy", Joy, self.callback_function, queue_size=10)
pub.publish(self.twt)
ps = pubSub()
while not rospy.is_shutdown():
ps.assuming_cont()
第二个-使用全局变量和带有
if __name__ == '__main__'
的rospy.spin()
#!/usr/bin/env python
import rospy
from geometry_msgs.msg import Twist
from sensor_msgs.msg import Joy
# FUNCTION - GET JOY VALUES TRANSFORM TO TURTLE MOVE
def joy_to_twist_transform(jData):
twt = Twist()
twt.linear.x = 5*jData.axes[1]
twt.angular.z = 4*jData.axes[0]
pub.publish(twt)
# FUNCTION - START PROCESS
def process():
global pub
pub = rospy.Publisher('turtle1/cmd_vel', Twist, queue_size=10)
sub = rospy.Subscriber("joy", Joy, joy_to_twist_transform, queue_size=1)
rospy.init_node('control_2turtle')
rospy.spin()
# MAIN
if __name__ == '__main__':
try:
process()
except rospy.ROSInterruptException:
pass
我的问题更理论化: >
1-我对节点的工作方式了解是:他循环运行代码,直到关闭为止。但这不能回答为什么我仍然可以保存主题中发布的最后一个值(在我的脑海中,如果我循环运行我的代码,每次都会从头开始)
2-为什么有必要在每个循环中继续创建
rospy.Publisher
和rospy.Subscriber
?只能一次创建这些家伙?(例如,在第二个示例中将其用于init函数)3-
while not rospy.is_shutdown():
和if __name__ == '__main__'
与rospy.spin()
有什么区别? br /> 4-什么是rospy.spin()
?在任何文档中都说可以使您的节点保持运行,但是我看到他将代码停留在该行中并仅保留在那里。很多。#1 楼
if __name__ == '__main__':
在这里无关紧要(在第二个代码中),您也可以像这样在没有它的情况下运行您的代码: br /> ie当您不希望在其他python代码中导入代码时运行该代码时,应使用if __name__ == '__main__':
更多信息。
代码和第二个代码是第二个代码使用了
rospy.spin()
方法,这是一个内置的ROS循环,它在另一个线程中触发publisher
和subscriber
,因此您不需要像第一个示例那样在代码中使用内部while
。 br /> 相关问题。