在 ROS-Python 中使用 Turtlesim 画一个圆圈
在本文中,我们将了解如何在 ROS-Python 中使用 Turtlesim 绘制圆。
ROS代表机器人操作系统。 ROS 是一组帮助构建机器人应用程序的库和工具。它广泛用于机器人项目。 ROS 是一个开源的机器人元操作系统。 ROS 生态系统中的软件既有依赖于语言的工具,也有独立于语言的工具。 ROS 支持Python、C++、Lisp 等语言。
rospy是一个纯Python客户端库 ROS。我们将利用这个库来实现我们的代码。 Turtlesim 是专门用于教授 ROS 和 ROS 包的常用工具。
这个想法是从geometry_msgs.msg库中导入Twist并为速度分量分配适当的值。 Twist表示海龟在 3D 空间中的速度,分为 3 个线性分量和 3 个角度分量。这里的海龟是 2D 的,由 1 个线性分量(x 分量)和 1 个角度分量(z 分量)控制。这是因为海龟不能在 y 或 z 方向移动。因此。所有其他组件都等于 0。
分步实施:
第一步:首先,导入程序中用到的所有包。 rospy是一个 ROS-python 库,它包含不同的功能,如创建节点、获取时间、创建发布者等。 geometry_msgs库包含一个有用的变量类型Twist ,用于描述 3D 中的速度。
Python3
import rospy
from geometry_msgs.msg import Twist
import sys
Python3
def turtle_circle(radius):
rospy.init_node('turtlesim', anonymous=True)
pub = rospy.Publisher('/turtle1/cmd_vel',
Twist, queue_size=10)
rate = rospy.Rate(10)
vel = Twist()
Python3
rospy.loginfo("Radius = %f", radius)
pub.publish(vel)
rate.sleep()
Python3
if __name__ == '__main__':
try:
turtle_circle(float(sys.argv[1]))
except rospy.ROSInterruptException:
pass
Python3
#!/usr/bin/env python
# @uthor : Sumanth Nethi
import rospy
from geometry_msgs.msg import Twist
import sys
def turtle_circle(radius):
rospy.init_node('turtlesim', anonymous=True)
pub = rospy.Publisher('/turtle1/cmd_vel',
Twist, queue_size=10)
rate = rospy.Rate(10)
vel = Twist()
while not rospy.is_shutdown():
vel.linear.x = radius
vel.linear.y = 0
vel.linear.z = 0
vel.angular.x = 0
vel.angular.y = 0
vel.angular.z = 1
rospy.loginfo("Radius = %f",
radius)
pub.publish(vel)
rate.sleep()
if __name__ == '__main__':
try:
turtle_circle(float(sys.argv[1]))
except rospy.ROSInterruptException:
pass
第 2 步:接下来,我们定义我们的turtle_circle函数,在该函数中我们启动我们的turtlesim 节点和我们的发布者。我们还指定了一个等于 10Hz 的速率,即程序每秒执行 10 次循环。还创建了一个 Twist 变量 'vel'。
蟒蛇3
def turtle_circle(radius):
rospy.init_node('turtlesim', anonymous=True)
pub = rospy.Publisher('/turtle1/cmd_vel',
Twist, queue_size=10)
rate = rospy.Rate(10)
vel = Twist()
第 3 步:我们现在创建一个 while 循环,允许海龟无限循环运行。在 while 循环中,我们按照上面方法中的讨论适当地提供乌龟的速度分量,然后将它们发布到乌龟。我们还使用rospy.loginfo()函数打印每个循环的半径。 rate.sleep()添加在最后。 rate 对象跟踪自上次执行 rate.sleep() 以来的时间,并在正确的时间内休眠以保持 10Hz 频率。
蟒蛇3
rospy.loginfo("Radius = %f", radius)
pub.publish(vel)
rate.sleep()
第 4 步:最后,我们有调用函数并处理异常(如果存在)的主循环:
蟒蛇3
if __name__ == '__main__':
try:
turtle_circle(float(sys.argv[1]))
except rospy.ROSInterruptException:
pass
执行Turtlesim的步骤:
使用以下命令在终端中启动 ROS:
$ roscore
使用以下命令在新终端上启动turtlesim节点:
$ rosrun turtlesim turtlesim_node
使用以下命令执行程序:
$ rosrun my_package turtlesim.py 2.0
下面是实现:
蟒蛇3
#!/usr/bin/env python
# @uthor : Sumanth Nethi
import rospy
from geometry_msgs.msg import Twist
import sys
def turtle_circle(radius):
rospy.init_node('turtlesim', anonymous=True)
pub = rospy.Publisher('/turtle1/cmd_vel',
Twist, queue_size=10)
rate = rospy.Rate(10)
vel = Twist()
while not rospy.is_shutdown():
vel.linear.x = radius
vel.linear.y = 0
vel.linear.z = 0
vel.angular.x = 0
vel.angular.y = 0
vel.angular.z = 1
rospy.loginfo("Radius = %f",
radius)
pub.publish(vel)
rate.sleep()
if __name__ == '__main__':
try:
turtle_circle(float(sys.argv[1]))
except rospy.ROSInterruptException:
pass
输出: