📜  在 ROS-Python 中使用 Turtlesim 画一个圆圈

📅  最后修改于: 2022-05-13 01:54:21.678000             🧑  作者: Mango

在 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

输出: