在 ROS 2 中,可以使用 turtlesim 包来实现绘制圆形的功能。turtlesim 是一个简单的模拟器,常用于教学和演示基本的 ROS 概念。要在 turtlesim 中控制乌龟绘制一个圆形,需要发布恰当的线速度和角速度组合到 /turtle1/cmd_vel 主题。
想一想在scratch中和Python里面是怎么画圆的,就知道这里怎么画里,其实原理是一样的,只是控制的方法不太相同而已。
一.建立turtlesim_node
首先确保运行了turtlesim,这个在各大教程中都有,主要是这么几步:
ros2 run turtlesim turtlesim_node
这一步会建立一个turtle的视图,类似于python中的tkinter
二. 发布消息
接下来就是发布消息里,一般,我们会用teleop来控制乌龟的走向,但是teleop的延时太厉害,以至于画一个五角星可以耗费整整半小时。太难了,所以既然是几何概念,那么我们就用代码来实现。
1.建立包
当然,我还是设置在主目录下,在主目录下建立一个文件夹,叫做ROSproject。在这个文件夹下建立src,通过terminal进入文件夹
建立ros项目。
ros2 pkg create --build-type ament_python my_ros_py_package
然后进入 my_ros_py_package
建立circleNode.py
touch circleNode.py
现在的目录树是这样的:
└── my_ros_py_package
├── my_ros_py_package
│ ├── circleNode.py
│ └── __init__.py
├── package.xml
├── resource
│ └── my_ros_py_package
├── setup.cfg
├── setup.py
└── test
├── test_copyright.py
├── test_flake8.py
└── test_pep257.py
2.编写代码
在circleNode.py中写入以下代码
import rclpy
import math
from rclpy.node import Node
# from std_msgs.msg import String
from geometry_msgs.msg import Twist
class MinimalPublisher(Node):
def __init__(self):
super().__init__('my_pub')
self.publisher_ = self.create_publisher(Twist, 'turtle1/cmd_vel', 10)
timer_period = 1 # seconds
self.timer = self.create_timer(timer_period, self.timer_callback)
self.i = 0
def timer_callback(self):
vel = Twist()
# vel.data = 'My Hello World: %d' % self.i
t = self.i/10
vel.linear.x = 2.0
vel.angular.z = 2.0
self.publisher_.publish(vel)
self.get_logger().info('Publishing: 线速度x: %f 角速度z: %f' % (vel.linear.x,vel.angular.z))
# self.get_logger().info('Publishing: z"%f"' % vel.angular.z)
self.i += 1
def main(args=None):
rclpy.init(args=args)
minimal_publisher = MinimalPublisher()
rclpy.spin(minimal_publisher)
# Destroy the node explicitly
# (optional - otherwise it will be done automatically
# when the garbage collector destroys the node object)
minimal_publisher.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
3.修改setup.py
修改setup.py为:
from setuptools import find_packages, setup
package_name = 'my_ros_py_package'
setup(
name=package_name,
version='0.0.0',
packages=find_packages(exclude=['test']),
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='harebert',
maintainer_email='harebert@todo.todo',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'circleNode = my_ros_py_package.circleNode:main'
# circleNode为节点名称
# my_ros_py_package为包名称
# circleNode 为py文件名称
# main为执行方法
],
},
)
三.编译并运行
在src目录外命令:
colcon build
source install/setup.bash
ros2 run my_ros_py_package circleNode
turtlesim画圆