ROS 入门教程 —— 小海龟简单控制
这里我们直接介绍命令使用方法,原理请查看我的另外几篇博客:
运行并控制小海龟
由于小海龟并不是 ROS 中自带的包,所以我们需要安装小海龟:
sudo apt update
sudo apt install ros-noetic-turtlesim
注意:这里要考虑自己 ROS 版本对应的小海龟的包
然后我们要运行小海龟:
首先要运行 ROS-Master,这里我们直接运行如下程序即可:
roscore
成功运行显示画面如下:
![](https://i-blog.csdnimg.cn/blog_migrate/0976d583f230d512c4b36a4822ba947a.png)
然后我们需要启用第二个终端运行如下程序:
rosrun turtlesim turtlesim_node
![](https://i-blog.csdnimg.cn/blog_migrate/dccba925e83294f02ea7a96130d935f6.png)
注意:这里我们每运行一个新的程序都需要启动一个新的终端窗口
这里我们就已经打开了 turtlesim,下面我们要学会如何控制他行动:
运行如下程序可以通过小键盘控制小海龟运动:
rosrun turtlesim turtle_teleop_key
![](https://i-blog.csdnimg.cn/blog_migrate/c65f11758f435723d044702f6d07f7de.png)
这时我们就可以通过小键盘来控制小海龟
命令行控制小海龟转圈
这里我们前面在博客中已经介绍了如何通过发布话题控制小海龟,这里直接给出使小海龟转圈的命令
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist
"linear:
x: 0.5
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.5"
# 这里表示循环运行 1s 运行 10 次,我们这里运行的是小海龟示例,撞墙会有提示
#这里的 linear 表示线速度, angular 表示角速度
这样我们就能通过命令来控制小海龟转圈
这里循环执行我们可以用 ctrl+c 停下来
![](https://i-blog.csdnimg.cn/blog_migrate/386834ce8be15f3b2cdf26de03f8ada5.gif)
代码控制小海龟转圈
首先我们需要建立好一个新的功能包,这里我们的功能包名称为 learning_topic 我们需要进入到功能包的路径下,新建一个 scripts 文件夹用于存储 python 文件
![](https://i-blog.csdnimg.cn/blog_migrate/a13fd4877b6dead92af839ba16e9a9cc.png)
然后我们在 src 中新建一个代码文件:
![](https://i-blog.csdnimg.cn/blog_migrate/12ea44340f95c815095f4ffa49a4156c.png)
c++ 控制代码如下:
/*
该例程将发布 turtle1/cmd_vel 话题,消息类型 geometry msgs::Twist
*/
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
int main(int argc, char **argv){
// ROS 节点初始化
ros::init(argc, argv, "velocity_pulisher");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个 Publisher,发布名为 /turtle1/cmd_vel 的 topic,消息类型为 geometry_msgs::Twist,队列长度 10
ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
// 设置循环频率
ros::Rate loop_rate(10);
int count = 0;
while(ros::ok())
{
// 初始化 geometry_msgs::Twist 类型的消息
geometry_msgs::Twist vel_msg;
vel_msg.linear.x = 0.5;
vel_msg.angular.z = 0.2;
// 发布消息
turtle_vel_pub.publish(vel_msg);
ROS_INFO("Publish turtle velocity command[%0.2f m/s, %0.2f rad/s]",
vel_msg.linear.x, vel_msg.angular.z);
// 按照循环频率延时
loop_rate.sleep();
}
return 0;
}
python 程序原理相同,程序如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import rospy
from geometry_msgs.msg import Twist
def velocity_publisher():
# ROS 节点初始化
rospy.init_node('velocity_publisher', anonymous=True)
# 创建一个 publisher,发布名为 /turtle1/cmd_vel 的 topic.消息类型为 geometry_msgs::Twist, 队列长度 10
turtle_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)
# 设置循环频率
rate = rospy.Rate(10)
while not rospy.is_shutdown():
# 初始化 geomety_msgs::Twist 类型消息
vel_msg = Twist()
vel_msg.linear.x = 1.5
vel_msg.angular.z = 0.2
# 发布消息
turtle_vel_pub.publish(vel_msg)
rospy.loginfo("Publish turtle velocity command[%0.2f m/s, %0.2f rad/s]",
vel_msg.linear.x, vel_msg.angular.z)
# 按照循环频率延时
rate.sleep()
if __name__ == "__main__":
try:
velocity_publisher()
except rospy.ROSInterruptException:
pass
注意:python程序中第一行一定要加上 #!/usr/bin/env python3
才能识别 python 运行,这里我们还需要给 python 文件运行权限,直接执行如下命令即可:
chmod +x velocity_publisher.python
然后我们需要在上级路径中的 CMakeLists.txt 中 Install 前添加如下两行:
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
![](https://i-blog.csdnimg.cn/blog_migrate/f5635dd5d9d02e5e2318c868e28f11ed.png)
在前面的博客中我们已经介绍过了,这两句是用来补全环境的,这里就不过多介绍了
然后我们返回到 catkin_ws 目录下,执行编译命令:
catkin_make
编译成功如下:
![](https://i-blog.csdnimg.cn/blog_migrate/d3c7310bc125c43177b636d792081441.png)
我们直接执行我们发布的话题就可以控制小海龟转圈了:
![](https://i-blog.csdnimg.cn/blog_migrate/0e67b758d83ec46334413c070790cde7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/52c80d777287b0ed05db4e4769dae687.gif)
python 程序同样:
![](https://i-blog.csdnimg.cn/blog_migrate/37cb253efbb1d5955e7ce02df42605d2.png)
话题查看器查看消息传递
首先我们使用 rqt 来查看系统功能:
安装 rqt 命令如下:
sudo apt-get install ros-noetic-rqt
sudo apt-get install ros-noetic-rqt-common-plugins
直接启用就能看到系统的全貌:
rosrun rqt_graph rqt_graph
![](https://i-blog.csdnimg.cn/blog_migrate/7e6c9c9de4c2aa0b298f4f4752d52dd2.png)
使用如下命令查看发布的所有话题:
rostopic list
![](https://i-blog.csdnimg.cn/blog_migrate/ff597c00834c92cc37be05d8fb536ea8.png)