ros启动turtlesim

实验现象

1.在操纵结点按下方向键,屏幕中的小海龟作出对应的移动。

2.编译写好的源文件,小海龟开始走圆圈。

键盘操纵小海龟

roscore

打开终端,输入roscore,并保持开启。

在这里插入图片描述

海龟图形界面

另开一个终端,输入指令:

rosrun turtlesim turtlesim_node

即可在新弹出的窗口中,看见一只海龟:

在这里插入图片描述

海龟按键操纵

另开一个终端,输入指令:

rosrun turtlesim turtle_teleop_key

即可在这个终端中,通过箭头按键控制小乌龟移动。

在这里插入图片描述

控制乌龟走圆圈

原理

其实turtlesim_node与turtle_teleop_key这两个都是ROS事先已经写好的文件,可以直接编译执行。从前面的实验可以看到,turtle_teleop_key可以发送键盘按键信息给turtlesim_node,使海龟出现移动。那么两个程序之间,是如何通信的呢?

在命令行输入

rosrun rqt_graph rqt_graph

可以看到这个图:

在这里插入图片描述

在ROS中,可执行文件被称作节点。turtle_teleop_key与turtlesim_node都被称作节点。

turtle_teleop_key与turtlesim_node这两个节点之间通过/strong/cmd_vel通信,这个/strong/cmd_vel被叫做话题。turtle_teleop_key将按键信息发布在这个话题上,turtlesim_node从这个话题接收信息控制小海龟移动。

因此,要使小海龟转圆圈,我们也可以写一个源文件,在源文件中向/strong/cmd_vel这个话题发送控制指令即可。

数据类型

现在知道了按键控制节点向话题发送数据,让小海龟结点接受数据。那么到时候我们编写文件的时候,要发送什么数据呢?是int型?还是float型?还是数组呢?

可以用命令行指令来查看。

rostopic type /turtle1/cmd_vel

这个指令用于查看某个话题上的数据类型(一个话题上的数据类型是一样的),/turtle1/cmd_vel这个话题的数据类型是:geometry_msgs/Twist

在这里插入图片描述

再看看geometry_msgs/Twist是什么样子的:

rosmsg show geometry_msgs/Twist

可以看到geometry_msgs/Twist的组成:

geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

linear表示线速度,angular表示角速度,xyz表示坐标(x表示前后,y表示左右,z表示上下)。线速度可以用来让小海龟移动,角速度用来控制转向。

要想小海龟转圆圈,就需要让它向前匀速移动,而且角速度保持一个非0的值即可。如果我们向/turtle1/cmd_vel这个话题不断发送以下数据:

geometry_msgs/Vector3 linear
  float64 1
  float64 0
  float64 0
geometry_msgs/Vector3 angular
  float64 0
  float64 0
  float64 2

那么小海龟就可以一直做曲线运动,由于线速度与角速度保持不变,小海龟的移动轨迹就是一个圆。

创建工作空间

可执行文件的编写与运行都是在软件包中执行的,而要制作软件包,又必须在工作空间中执行。因此,要先制作工作空间。

mkdir -p ~/workspace_name/src
cd ~/workspace_name/
catkin_make
source devel/setup.bash
创建软件包

首先进入工作空间的src目录

cd ~/workspace_name/src

然后执行指令创建软件包

catkin_create_pkg pkg_name roscpp rospy std_msgs geometry_msgs

pkg_name是自定义的软件包名称,后面跟着的是软件包要依赖的包。

编写源文件

到新建的软件包下的src目录中,新建cpp源文件,写入以下内容:

#include "ros/ros.h"
#include "geometry_msgs/Twist.h"

int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"control");
    ros::NodeHandle nh;
    ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1000);
    geometry_msgs::Twist msg;
    msg.linear.x = 1.0;
    msg.linear.y = 0.0;
    msg.linear.z = 0.0;
    msg.angular.x = 0.0;
    msg.angular.y = 0.0;
    msg.angular.z = 2.0;
    ros::Rate r(10);
    while (ros::ok())
    {
        pub.publish(msg);
        ros::spinOnce();
    }
    return 0;
}
修改配置文件

修改软件包下的CMakeList.txt文件,添加以下内容并保存:

catkin_package()
add_executable(步骤3的源文件名
  src/上一步的源文件名.cpp
)
target_link_libraries(上一步的源文件名
  ${catkin_LIBRARIES}
)
编译
cd 自定义空间名称
catkin_make
执行
source ./devel/setup.bash
rosrun 自定义的软件包名 自定义的源文件名

可以看到小海龟开始自己做圆周运动了。

在这里插入图片描述

总结

键盘操控小海龟可以使用ROS自带的两个节点来实现,实现原理是控制节点发送数据到话题,图形节点再从话题得到数据做出动作。

而控制海龟移动的话题是/turtle1/cmd_vel,而这个话题上的数据是geometry_msgs::Twist。创建软件包写好源文件来持续发送geometry_msgs::Twist类型的数据,海龟就可以做圆形运动。

参考资料

https://blog.csdn.net/weixin_41869763/article/details/113858698

http://wiki.ros.org/cn

http://www.autolabor.com.cn/book/ROSTutorials/

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个简单的 Python 代码示例,用于控制 ROS 机器人 turtlesim 直线行驶: ```python #!/usr/bin/env python import rospy from geometry_msgs.msg import Twist def move(): # 初始化 ROS 节点 rospy.init_node('move_turtlesim', anonymous=True) # 创建一个发布者,用于发布机器人的运动指令 pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10) # 创建一个 Twist 消息对象,用于控制机器人运动 move_cmd = Twist() move_cmd.linear.x = 1. # 设置机器人直线运动的线速度为 1. m/s # 发布机器人运动指令,使机器人直线行驶 rate = rospy.Rate(10) # 设置发布频率为 10 Hz while not rospy.is_shutdown(): pub.publish(move_cmd) rate.sleep() if __name__ == '__main__': try: move() except rospy.ROSInterruptException: pass ``` 这个代码示例可以让 ROS 机器人 turtlesim 直线行驶,其中 `move_cmd.linear.x = 1.` 表示机器人直线运动的线速度为 1. m/s。 ### 回答2: 以下是一个使用Python编写的简单示例代码,演示了如何在ROS机器人turtlesim上实现直线行走: ```python #!/usr/bin/env python # -*- coding: utf-8 -*- import rospy from geometry_msgs.msg import Twist def move_turtle(): # 初始化ROS节点 rospy.init_node('move_turtle', anonymous=True) # 创建一个发布者,用于发布运动指令给turtlesim pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10) # 创建一个Twist实例,用于控制运动 move_cmd = Twist() # 设置前进速度和旋转速度 move_cmd.linear.x = 1.0 # 前进速度为1.0 move_cmd.angular.z = 0.0 # 不进行旋转 # 设置运动执行的时间(这里为5秒) duration = rospy.Duration.from_sec(5.0) # 获取当前时间 start_time = rospy.Time.now() # 发布运动指令,并持续运动直到达到设定的时间 while rospy.Time.now() - start_time < duration: pub.publish(move_cmd) # 停止运动 move_cmd.linear.x = 0.0 pub.publish(move_cmd) if __name__ == '__main__': try: move_turtle() except rospy.ROSInterruptException: pass ``` 这段代码首先初始化了ROS节点,并创建了一个发布者,用于将运动指令发布到`turtlesim`机器人的`"/turtle1/cmd_vel"`主题上。然后,设置了前进速度为1.0,旋转速度为0.0,以及运动执行的时间为5秒。在发布运动指令后,通过判断运动时间是否超过设定时间来控制机器人行走。最后,停止运动,将前进速度设为0.0,发布停止运动指令。 要注意的是,该示例代码需要在具有`turtlesim`功能的ROS环境中运行,并安装了相应的Python库。 ### 回答3: 以下是一个使用Python编写的简单示例代码,用于在ROS机器人turtlesim中让乌龟机器人走直线: ```python #!/usr/bin/env python import rospy from geometry_msgs.msg import Twist def move_turtle(): # 初始化ROS节点 rospy.init_node('move_turtle', anonymous=True) # 创建一个发布器,用于发布控制乌龟移动的消息 pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10) rate = rospy.Rate(10) # 发布频率为10Hz # 创建一个Twist消息对象,并设置线速度和角速度来控制乌龟移动 move_cmd = Twist() move_cmd.linear.x = 1.0 # 设置线速度为1.0 move_cmd.angular.z = 0.0 # 设置角速度为0.0 # 持续发布控制乌龟移动的消息,直到节点被关闭 while not rospy.is_shutdown(): pub.publish(move_cmd) rate.sleep() if __name__ == '__main__': try: move_turtle() except rospy.ROSInterruptException: pass ``` 这个示例代码首先导入了必要的ROS库以及geometry_msgs.msg库中的Twist消息类型。然后,创建了一个名为"move_turtle"的ROS节点,并定义了一个发布器,用于将控制乌龟移动的消息发布到`turtle1/cmd_vel`主题上。同时,还创建了一个Twist消息对象,并设置了线速度和角速度,然后在一个循环中不断发布这个消息。最后,通过调用`move_turtle`函数来启动ROS节点,并在节点被关闭时退出程序。 这个示例代码可以让乌龟机器人在turtlesim中以1.0的线速度走直线。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值