ROS 入门 —— 小海龟简单控制

ROS 入门 —— 小海龟简单控制

这里我们直接介绍命令使用方法,原理请查看我的另外几篇博客:

  1. ROS 命令行工具的使用

  2. ROS 创建工作空间与功能包

运行并控制小海龟

由于小海龟并不是 ROS 中自带的包,所以我们需要安装小海龟:

sudo apt update
sudo apt install ros-noetic-turtlesim

注意:这里要考虑自己 ROS 版本对应的小海龟的包

然后我们要运行小海龟:

首先要运行 ROS-Master,这里我们直接运行如下程序即可:

roscore

成功运行显示画面如下:

然后我们需要启用第二个终端运行如下程序:

rosrun turtlesim turtlesim_node

注意:这里我们每运行一个新的程序都需要启动一个新的终端窗口

这里我们就已经打开了 turtlesim,下面我们要学会如何控制他行动:

运行如下程序可以通过小键盘控制小海龟运动:

rosrun turtlesim turtle_teleop_key

这时我们就可以通过小键盘来控制小海龟

命令行控制小海龟转圈

这里我们前面在博客中已经介绍了如何通过发布话题控制小海龟,这里直接给出使小海龟转圈的命令

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 停下来

代码控制小海龟转圈

首先我们需要建立好一个新的功能包,这里我们的功能包名称为 learning_topic 我们需要进入到功能包的路径下,新建一个 scripts 文件夹用于存储 python 文件

然后我们在 src 中新建一个代码文件:

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})

在前面的博客中我们已经介绍过了,这两句是用来补全环境的,这里就不过多介绍了

然后我们返回到 catkin_ws 目录下,执行编译命令:

catkin_make

编译成功如下:

我们直接执行我们发布的话题就可以控制小海龟转圈了:


python 程序同样:

话题查看器查看消息传递

首先我们使用 rqt 来查看系统功能:

安装 rqt 命令如下:

sudo apt-get install ros-noetic-rqt
sudo apt-get install ros-noetic-rqt-common-plugins

直接启用就能看到系统的全貌:

rosrun rqt_graph rqt_graph

使用如下命令查看发布的所有话题:

rostopic list
posted @ 2023-03-04 16:38  ppqppl  阅读(921)  评论(0编辑  收藏  举报