ROS实操入门系列(二)小乌龟操控原理及代码控制小乌龟走圆形路线(Topic干货警告!!!)

Topic通讯概念

ros整个框架下,我们开发大量的节点,节点间需要有数据的交互,数据该如何交互,这个是ROS要解决的问题,也是核心问题。多个Node节点都需要到ROS Master进行注册。每个Node完成自己的功能逻辑。有的时候Node和Node间需要有数据的传递,这个时候ROS提供了Topic通讯机制。

Node间进行通讯,其中发送消息的一方,ROS将其定义为 Publisher(发布者) ,将接收消息的一方定义为 Subscriber(订阅者) 。考虑到消息需要广泛传播,ROS没有将其设计为点对点的单一传递,而是由 Publisher 将信息发布到 Topic(主题) 中,想要获得消息的任何一方都可以到这个 Topic 中去取数据。在这里插入图片描述

Publisher实现

  1. 创建发布者:publisher = rospy.Publisher(topic_name, String, queue_size=1000) 第一个参数为topic名称,第二个参数为发 布的消息类型,第三个参数为tipic中消息队列最多的数量。(ros编码环境参考上一章)
    在这里插入图片描述

  2. 通过rostopic工具进行调试发布者 (也可以通过rqt_topic进行调试)

		查看所有的主题  rostopic list
		打印主题所发布的信息 rostopic echo /my_topic

在这里插入图片描述

Subscriber实现

  1. 创建订阅者: rospy.Subscriber(topic_name, String, topic_callback), topic_callback实现订阅回调
    在这里插入图片描述

  2. 调试订阅者

    查询主题所需要的数据类型  rostopic type /my_topic
    打印出 std_msgs/String
    
    模拟发布数据
      rostopic pub topic名称 topic数据类型 topic数据 参数
      rostopic pub /my_topic std_msgs/String hello_aaa -r 1
    

    运行上面的Subscriber代码,打印出主题订阅到的信息在这里插入图片描述

  3. 同时运行Subscriber和Publisher,完成进行数据的发布和订阅

    rosrun hello_topic publisher.py
    rosrun hello_topic subscriber.py 
    

在这里插入图片描述

小乌龟介绍

  1. 启动小乌龟模拟器节点

    rosrun turtlesim turtlesim_node
    
  2. 启动小乌龟键盘输入节点 ,启动完成后,可以通过键盘输入操控小乌龟移动。键盘操控时,光标一定要在命令行上。

    rosrun turtlesim turtle_teleop_key
    

在这里插入图片描述

  1. 小乌龟操控原理

    (1) 小乌龟启动过程中,我们启动了两个节点:turtlesim_node和turtle_teleop_key 。可以通过命令查看当前的启动的节点:

    rosnode list
    

    (2) 通过rosnode命令可以查看小乌龟节点 /turtlesim节点的详情

    rosnode info /turtlesim
    ----------------------------------------------
    rosnode info命令可以查看当前节点的一些信息
    Publications:此节点上定义的发布者
    Subscriptions:此节点上定义的订阅者
    Services:此节点上定义的服务
    进程id,占用的网络端口
    Connections: 此节点和其他节点间的连接信息
    

在这里插入图片描述
(3) 同理,我们也可以通过rosnode info查询控制节点 /teleop_turtle节点的信息

	rosnode info /teleop_turtle 

在这里插入图片描述
(4) 现在我们大致可以搞清楚一些通讯的关系:

/teleop_turtle节点存在一个发布者,往/turtle1/cmd_vel主题中发布数据。
/turtlesim节点存在一个订阅者,去/turtle1/cmd_vel主题中获取数据

(5) 可视化工具查询节点关系(rqt_graph工具提供了可视化的工具方便我们查看这种节点间的关系)

	rosrun rqt_graph rqt_graph 
	----------------------------------------
	图像显示:/teleop_turtle通过主题/turtle1/cmd_vel给/turtlesim进行数据传递。
	/teleop_turtle为具备Publisher功能的节点。
	/turtlesim为具备Subscriber功能的节点。
	/turtle1/cmd_vel为publisher和subscriber通讯的主题。

在这里插入图片描述

调试工具操控小乌龟

  1. rqt_publisher模拟数据发送
    启动rqt_publisher工具: 	rosrun rqt_publisher rqt_publisher
    
    在这里插入图片描述

代码操控小乌龟

  1. 开启节点,调用窗口
    在这里插入图片描述
  2. 小乌龟操控类
    在这里插入图片描述
  3. 实现效果
    在这里插入图片描述

至此小乌龟操控就到这里了,有问题请多指正。互相学习、共同努力,期待我的下一篇文章

https://www.lanqiao.cn/courses/2947,提供准备好的云主机ros环境,进行实操,课程包括了 Topic 通讯, Service 通讯,ROS 自定义消息,URDF可视化,TF坐标转换等技术要点。每个技术点都会结合例子先把原理讲解清楚,为了达到学以致用的目的,我们会再进行知识拓展,针对每个技术点实现对应的生动有趣的需求,保证学完后会有很大的收获。

好的,以下是使用ROS和Turtlesim库编写的小乌龟正方形的代码: 1. 创建ROS工作空间 首先,需要创建一个ROS工作空间用于存储项目文件。可以执行以下命令来创建: ``` mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make ``` 2. 创建ROS包和节点 接下来,需要创建一个ROS包和一个节点来控制小乌龟移动。可以执行以下命令来创建: ``` cd ~/catkin_ws/src catkin_create_pkg turtle_square rospy turtlesim cd .. catkin_make source devel/setup.bash ``` 在上述命令中,我们创建了一个名为“turtle_square”的ROS包,并添加了两个依赖项“rospy”和“turtlesim”。随后,需要将ROS环境初始化并编译该包。 接下来,我们将在“turtle_square”包中创建一个名为“square_turtle.py”的Python脚本来控制小乌龟移动。 3. 编写Python脚本 在“square_turtle.py”中添加以下代码: ```python #!/usr/bin/env python import rospy from geometry_msgs.msg import Twist from turtlesim.msg import Pose def pose_callback(pose): # 获取小乌龟的当前位置 global x, y, theta x, y, theta = pose.x, pose.y, pose.theta def move_turtle(lin_speed, ang_speed): # 发布速度消息 vel_msg = Twist() vel_msg.linear.x = lin_speed vel_msg.angular.z = ang_speed pub.publish(vel_msg) if __name__ == '__main__': try: rospy.init_node('square_turtle', anonymous=True) # 创建话题发布器和订阅器 pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10) sub = rospy.Subscriber('/turtle1/pose', Pose, pose_callback) # 循环2次,每次旋转90度,直行2单位长度 for i in range(2): # 旋转90度 move_turtle(0, 1.5708) rospy.sleep(1.5) # 直行2个单位长度 move_turtle(2, 0) rospy.sleep(2) # 停止小乌龟运动 move_turtle(0, 0) except rospy.ROSInterruptException: pass ``` 在上述代码中,我们定义了一个回调函数“pose_callback”,它将获取小乌龟的当前位置。同时,我们还定义了一个“move_turtle”函数,用于发布速度消息以控制小乌龟的移动。最后,在主程序中,我们使用循环2次来控制小乌龟正方形。 4. 运行代码 保存“square_turtle.py”文件,并通过以下命令使其可执行: ``` chmod +x square_turtle.py ``` 接下来,启动turtlesim节点: ``` rosrun turtlesim turtlesim_node ``` 接着,在新的终端窗口中运行“square_turtle.py”脚本: ``` rosrun turtle_square square_turtle.py ``` 小乌龟将开始移动,完正方形后停止。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值