ROS2入门:turtlesim的奇妙曲线轨迹


时间:2021.10.2
(注意:需要确保tutlesim与python的安装)


安装turtlesim并运行一个简单节点


首先,在自己的环境下安装turtlesim。本文中的ROS2版本为foxy,读者可以根据自己的需求将代码中的foxy替换为自己的ROS2版本。

sudo apt update
sudo apt install ros-foxy-turtlesim

如果不确定自己的环境里是否已经安装了turtlesim,可以在终端中输入:

ros2 pkg executables turtlesim

如果安装成功,或者之前已经安装过了,就会在终端返回如下结果:

turtlesim draw_square
turtlesim mimic
turtlesim turtle_teleop_key
turtlesim turtlesim_node

要启动turtlesim,请在终端中输入以下命令:

ros2 run turtlesim turtlesim_node

模拟器窗口应该出现,中间有一个随机的海龟。

每次,出现的小乌龟都有可能不同,要是看厌了小乌龟,当然可以整活儿!

在命令下的终端中,将看到来自节点的消息:

[INFO] [1633058705.906234086] [turtlesim]: Starting turtlesim with node name /turtlesim
[INFO] [1633058705.910190716] [turtlesim]: Spawning turtle [turtle1] at x=[8.367925], y=[6.273585], theta=[0.000000]

通过使用turtle_teleop_key实现对turtlesim的键盘控制


打开一个新的终端窗口,并输入:

ros2 run turtlesim turtle_teleop_key

在该窗口下将会出现:

Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
Use G|B|V|C|D|E|R|T keys to rotate to absolute orientations. 'F' to cancel a rotation.
'Q' to quit.

根据以上指示使用键盘对turtlesim进行简单的控制。

在ROS1的官网教程中有关于如何用python编写publiser使turtlesim按照直线轨迹运动,左转右转,到达固定位置的教程。在这里就不过多阐述了,感兴趣的读者可以直接去官网查看。
而在广大网友的不懈努力之下,turtlesim也整出了新活,比如说:画圆形轨迹,画矩形轨迹,画三角形轨迹等等。接下来,以圆形为例,讲解如何使用python编写publisher使turtlesim按照圆的轨迹持续运动。


使用python编写publisher控制turtlesim按照圆的轨迹运动


借助圆的几何原理:
其实,并不难发现,只要我们能指定小龟的角速度与线速度皆为定制,就可以实现圆形曲线的绘制。
代码如下:

import rclpy
import math
from rclpy.node import Node# from std_msgs.msg import String
from geometry_msgs.msg import Twistclass MinimalPublisher(Node):def __init__(self):super().__init__('my_pub')self.publisher_ = self.create_publisher(Twist, 'turtle1/cmd_vel', 10)timer_period = 1  # secondsself.timer = self.create_timer(timer_period, self.timer_callback)self.i = 0def timer_callback(self):vel = Twist()
#        vel.data = 'My Hello World: %d' % self.it = self.i/10vel.linear.x =  2.0vel.angular.z =  2.0self.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 += 1def 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()

结果如下:


使用python编写publisher控制turtlesim按照椭圆的轨迹运动


联系上文,沿用编写圆形轨迹的publisher的思路,当小龟的角速度固定时,小龟的线速度无论是怎样的定值,小龟的轨迹总为圆。在此,需要借助椭圆与圆的几何关系。观察椭圆轨迹的绘制:

可以发现,在角速度固定的情况下,线速度随时间周期性变化,或者在线速度不变的情况下,使角速度周期性变化。就可以实现椭圆轨迹的绘制。
在此,还需要联系椭圆在平面坐标系下的方程:

以角速度固定的情况下,线速度随时间周期性变化为例:

import rclpy
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  # secondsself.timer = self.create_timer(timer_period, self.timer_callback)self.i = 0def timer_callback(self):vel = Twist()t = self.ia = 1.5  b = 3 - (a * ( math.cos(t)) )vel.linear.x = 0.4*bvel.angular.z = 0.5self.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()

结果如下:

当然,通往答案的路不止一条。我们也可以将角速度设为0,而线速度x与线速度y均采取变化来实现椭圆的轨迹。

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 = 0.1  # secondsself.timer = self.create_timer(timer_period, self.timer_callback)self.i = 0def timer_callback(self):vel = Twist()
#        vel.data = 'My Hello World: %d' % self.it = (self.i/180.0)*math.pia = 1b = 1.5c = a*math.cos(t)d = b*math.sin(t)vel.linear.x = 0.2*dvel.linear.y = cself.publisher_.publish(vel)self.get_logger().info('Publishing: 线速度x: %f 线速度y: %f' % (vel.linear.x,vel.angular.z))
#        self.get_logger().:('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()

结果如下:

联动魔幻轨迹



zhangrelay老师的国庆祝福

zhangrelay老师的魔幻轨迹传送门!!!

这里是对zhangrelay老师的轨迹题型的不及格作答:

import rclpy
import math
from rclpy.node import Node# from std_msgs.msg import String
from geometry_msgs.msg import Twistclass MinimalPublisher(Node):def __init__(self):super().__init__('my_pub')self.publisher_ = self.create_publisher(Twist, 'turtle1/cmd_vel', 10)timer_period = 1  # secondsself.timer = self.create_timer(timer_period, self.timer_callback)self.i = 0def timer_callback(self):vel = Twist()
#        vel.data = 'My Hello World: %d' % self.it = self.i/10a = 1.21111b = a * (2 * math.sin(t) + math.sin(2 * t))c = a * (2 * math.cos(t) + math.cos(2 * t))vel.linear.x =  0.2*bvel.angular.z =  0.5*cself.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 += 1def 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()

对ROS的学习其实是一个长期的过程,把官网上的教程简单的运行一遍,很难算真正入门。只有在理解、掌握并贯通一系列知识的基础上,才能真正地做到随心所欲。而非像本人在知识水平不达标的情况下的拙劣复刻。zhangrelay老师的博客里面还有很多经验的turtlesim轨迹案例,还有强力的辅助工具,在这里就不去引流了,请感兴趣的读者自行挖掘,如果有宝贵的建议或者妙趣横生的想法,欢迎私聊。

彩蛋

如何用turtlesim致敬IRON MAN???

ROS2入门:turtlesim的奇妙曲线轨迹相关推荐

  1. 高一信息技术课件python编程_教科版高中信息技术选修第一章第三节Python入门--奇妙曲线的绘制 课件(22张ppt) 教案 (2份打包)...

    ID:10986924 资源大小:11671KB 资料简介: 教学设计 [课程标准要求] 体验算法思想,了解算法和程序设计在解决问题过程中的地位及作用:能从简单的问题出发,设计解决问题的算法,并能初步 ...

  2. 借助CatGPT让turtlesim小乌龟画曲线

    注意这里是CatGPT,不等同OpenAI的ChatGPT,但是用起来十分方便,效果也还行. 详细说明ROS机器人turtlesim绘制曲线需要注意哪些 ROS机器人turtlesim绘制曲线需要注意 ...

  3. ROS2入门教程—理解话题(Topic)

    ROS2入门教程-理解话题(Topic) 1 启动小海龟仿真器 2 rqt_graph 3 ros2 topic list 4 ros2 topic echo 5 ros2 topic info 6 ...

  4. 8002.ros2入门概念

    2 ros2 入门基本概念 # 创客智造网站. https://www.ncnynl.com/archives/201801/2251.html 基本概念: ROS是一个用于在不同进程间匿名的发布.订 ...

  5. Double S 曲线轨迹规划——不同速度加速度条件下综合

    目前机械臂常用的轨迹曲线主要是S曲线,由于前后两端速度为抛物线形式,整体相对平滑,具有较好的过渡.程序涵盖了混合轨迹,加速轨迹和减速轨迹,通过设置flag和合理的速度加速度输入值获取双S曲线. 参数的 ...

  6. ROS2入门教程—创建ROS2功能包(C++版)

    ROS2入门教程-创建ROS2功能包(C++版) 1 ROS2中的功能包 2 创建功能包 3 编译功能包 4 设置环境变量 5 运行功能包 6 功能包中的内容 7 修改package.xml文件    ...

  7. 3阶以下贝塞尔曲线轨迹库和任意轨迹库

    20130521:任意轨迹库中添加19条轨迹.按屏幕矩形边界上有16个点,连接起点P_i和终点P_j的轨迹平均有3条计算,任意轨迹库最多约有240*3=720条轨迹. 20130522-2013052 ...

  8. ROS2入门教程—创建一个简单的订阅者和发布者(C++版)

    ROS2入门教程-创建一个简单的订阅者和发布者(C++版) 1 创建功能包 2 创建发布者节点 3 设置发布者节点依赖项 4 设置发布者节点编译规则 5 创建订阅者 6 编译并运行   节点是通过RO ...

  9. 看这一篇就够了!ROS2入门学习:安装、测试、多机通信以及与ROS1的切换、通信

    ROS2入门学习:安装.测试.多机通信以及与ros1的切换.通信 为什么要写这篇blog 1 ROS2优势 2 安装ROS2 Ardent 版本 2.1 UTF-8支持 2.2 安装依赖 2.3 密钥 ...

最新文章

  1. async spring 默认线程池_springboot-@Async默认线程池导致OOM问题
  2. 所长不会用计算机,梅州市公安局: 两派出所所长不会电脑被停职
  3. 推荐一款好用的redis客户端工具
  4. Linux第六周学习总结——进程额管理和进程的创建
  5. Java黑皮书课后题第8章:**8.36(拉丁方阵)拉丁方阵是一个n*n的数组,其中有n个不同的拉丁字母,并且每个拉丁字母恰好只在每行和每列中出现一次。编写一个程序,提示用户输入数字n和字符数组
  6. 关于ARM的22个常用概念
  7. 一个application多个 URL
  8. Python实现自动推本地github博客到远程仓库
  9. 设置网格_500ETF网格设置
  10. 多用继承 android,android 实战用继承实现点击“防抖动”多次点击现象
  11. jpa 实体到数据库
  12. reactnative资源
  13. 动态新增表字段_动态称重检测系统助力智慧治超
  14. oracle的监听服务详解
  15. WPS Office 2019 发布Linux 个人版
  16. java科学计算器代码_用JAVA编写的科学计算器源代码是什么?
  17. 突破HR的职业发展瓶颈:放弃“优秀”!
  18. 二级LOGO设计代表什么
  19. erdas裁剪影像_ERDAS软件应用(一)遥感影像数据裁剪
  20. 折腾Transmission实现固定IP服务器BT做种教程

热门文章

  1. mysql还原.bak文件
  2. 直播节目信息流对观众感知质量的影响
  3. Delegate.Combine
  4. python画松树_小白自学Python(二)
  5. 通过外扫二维码判断手机是否有某App
  6. 为何某些文章的阅读量这么高?
  7. 构建屏幕经济,比利时Thomas托马斯分布式存储系统开启新经济的无限可能!
  8. onbeforeunload设置用户关闭离开页面时提醒用户保存信息
  9. 登录页面设置cookie,用户登录后,创建cookie保存用户信息
  10. 新一代高性能USB转串口芯片CH342与CH343