ROS turtlesim小乌龟的使用与分析

本文详细介绍了ROS系统的启动过程,包括rosmaster的激活、turtlesim节点的使用及键盘控制。深入探讨了计算图、节点和topic的概念,并展示了如何通过rqt_graph和rosnode命令进行系统监控。此外,还解析了turtlesim功能包的结构及其内部节点的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备

在之前的文章中完成了ROS的安装并且启用了小乌龟。链接如下:

https://blog.csdn.net/sf9898/article/details/105290198

这次同样先启用小乌龟,先roscore启用ros master,之后再开一个terminal输入rosrun turtlesim turtlesim_node启用小乌龟,再开一个terminal输入rosrun turtlesim turtle_teleop_key启用键盘控制。

格式
rosrun 功能包 节点
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key

效果如图

在这里插入图片描述

分析

关于roscore

通过上面的代码,可以启用turtlesim里面的两个节点。首先先看下roscore 的terminal,之前仅是启用ros master但是没有去分析terminal里面的信息的含义。打印的信息基本上是版本信息。其中有比较重要的信息,如图,有个http,由于ROS是分布式的,因此ros master可能存在于任一主机中,因此需要标记下。ROS分布式的优点就是可以使得不同的功能模块在不同的主机上面运行,可以节省计算资源,提高效率等。

在这里插入图片描述

关于计算图和节点

用rqt_graph查看一下计算图,可以看到有两个节点。图中两种输入方式皆可。

在这里插入图片描述
找一个terminal输入以下信息(此时已经把计算图关掉了)

rosnode list
rostopic list

在这里插入图片描述
跟之前的计算图对比,可以注意到两个椭圆内的是节点,箭头上的是topic名称。
重新打开计算图,如果在rqt_graph里面把debug的√取消,那么效果如下,可以发现多出了点奇怪的东西。
此时上图terminal打印出的/rosout就出现了。其实这几个多出来的也不需要关注。/rosout是必然存在的一个节点,从名字可以看出这节点关乎输出,是一个管理日志信息的节点,每个节点都可以通过/rosout的话题将信息传到/rosout节点。

在这里插入图片描述

另一个gui的节点是因为rqt_graph的存在,打开一个新的terminal验证,输入rosnode list,结果如下

在这里插入图片描述
可以用以下命令查看节点信息

rosnode info 节点名

在这里插入图片描述

关于turtlesim

再看乌龟,这个turtlesim 对应的文件是在哪?里面的节点有哪些?之前安装完ROS的时候说过它的位置。点:计算机-opt-ros。

在这里插入图片描述
进去之后可以看到很多文件夹和脚本,注意到有setup.bash,之前安装和配置的时候有用到。

在这里插入图片描述

其中后面三个文件夹是最重要的,include类似于C语言里面的include,里面存的头文件,lib存一些包,里面有节点(可执行文件)和Python文件等,比如这里的turtlesim,运行节点就可以启用相应的功能包里面的功能。

在这里插入图片描述
在这里插入图片描述
这里就可以看到有之前调用的turtlesim_node 和 turtle_teleop_key,同理,可以验证下其他的节点,比如draw_square。(另一个不了解,有兴趣的可以研究)

rosrun turtlesim draw_square

在这里插入图片描述

share里面可以看到很多的功能包,打开一看是有cmake 的配置文件和msg,srv的定义等等

在这里插入图片描述

打开images文件夹,可以看到好多的小乌龟logo,这就解释了为什么每次调用乌龟节点出现的乌龟长得不一定一样了。

在这里插入图片描述

关于turtle控制信息

通过以下命令实现监听,打印出的信息是乌龟的运动信息,键盘控制时会有相应的数值变化

rostopic echo /turtle1/cmd_vel

在这里插入图片描述

其他

发布话题、新增turtle的操作可以参考

https://www.cnblogs.com/chendeqiang/p/10190821.html

小海龟的坐标变换和RVIZ可视化可以参考

https://blog.csdn.net/sf9898/article/details/105350138
### 使用 ROS Turtlesim 绘制最大正方形 为了实现这一目标,在 C 语言中操作 ROS 需要依赖于 `roscpp` 库而不是标准的 Python 接口。下面是一个完整的解决方案来让 Turtlesim 中的小乌龟绘制尽可能大的正方形。 #### 初始化节点并发布消息 首先,创建一个新的 ROS 节点用于控制海龟模拟器中的移动命令: ```cpp #include "ros/ros.h" #include "geometry_msgs/Twist.h" int main(int argc, char **argv) { ros::init(argc, argv, "draw_square_node"); ros::NodeHandle nh; // 创建一个向/cmd_vel话题发布的publisher对象 ros::Publisher velocity_publisher = nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10); geometry_msgs::Twist vel_msg; } ``` #### 定义运动函数 定义两个辅助函数分别负责直线前进和转弯动作: ```cpp void moveStraight(double speed, double distance){ double t0 = ros::Time::now().toSec(); double current_distance = 0.0; geometry_msgs::Twist vel_msg; vel_msg.linear.x = abs(speed); while(current_distance < distance){ velocity_publisher.publish(vel_msg); double t1 = ros::Time::now().toSec(); current_distance = speed * (t1-t0); ros::spinOnce(); } } void rotate(double angular_speed, double angle){ double relative_angle = angle*PI/180; double t0 = ros::Time::now().toSec(); double current_angle = 0.0; geometry_msgs::Twist vel_msg; vel_msg.angular.z = abs(angular_speed); while(current_angle < relative_angle){ velocity_publisher.publish(vel_msg); double t1 = ros::Time::now().toSec(); current_angle = angular_speed*(t1-t0); ros::spinOnce(); } vel_msg.angular.z = 0; velocity_publisher.publish(vel_msg); } ``` #### 主循环逻辑 最后设置主程序部分完成四个边角的动作序列: ```cpp if(__name__ == "__main__"){ try{ // 设置线速度角度参数 double speed = 2.0; // 单位:m/s double goal_distance = 4.0; // 边长设定为屏幕内可容纳的最大长度 double angular_speed = 1.57; // PI/2 radian per second double goal_angle = 90; // Turn by 90 degrees after each side for(int i=0;i<4;++i){ // Repeat four times to form a square moveStraight(speed,goal_distance); rotate(angular_speed,goal_angle); } ros::shutdown(); } catch(const std::exception& e){ ROS_ERROR("Exception caught: %s",e.what()); } } ``` 此代码片段展示了如何利用 ROS 的 C++ API 来指挥 Turtlesim 中的对象按照指定路径行动[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值