一、实现效果

在这里插入图片描述

实际turtlesim本身有draw_square这个节点,直接命令打开就行,我这里自己写一个

二、实现过程

1.在工作空间下创建一个新的功能包my_turtle
catkin_create_pkg my_turtle roscpp rospy std_msgs
2.进入功能包创建并编辑新的cpp文件draw_rectangle.cpp
touch draw_rectangle.cpp(我用VS编辑的,代码附在下面)
3.设置为可执行文件,并CMake中配置编译规则
add_executable(draw_rectangle src/draw_rectangle.cpp)
target_link_libraries(draw_rectangle ${catkin_LIBRARIES})
4.编译
catkin_make
source devel/setup.bash
5.启动节点
roscore
rosrun turtlesim turtlesim_node
rosrun my_turtle draw_rectangle
(此时就可以看到小海龟在绘制矩形)

三、思考

写一个while循环嵌套if语句,海龟先沿x轴线速度1进行移动,当迭代到第5次,x轴线速度变为0,此时海龟停止,z轴角速度为1,绕z轴旋转90°,再继续向前行进,并循环执行。
线速度x是小海龟前后,y是左右,z是上下。角速度是沿轴转动速度。

在这里插入图片描述

小海龟的姿态信息

在这里插入图片描述

关于有几个自由度,我理解的是,只有1个,只向左转90度

四、代码

https://github.com/Grizi-ju/ros_program(个人github账号,有源代码)

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <stdlib.h>

#define PI 3.14159265358979323846

int main(int argc, char **argv)
{
    ros::init(argc, argv, "draw_rectangle");    //初始化ROS节点
    ros::NodeHandle nh;          //创建节点句柄,实例化一个对象
    ros::Publisher pub = nh.advertise<geometry_msgs::Twist>
                         ("turtle1/cmd_vel", 1000);       //创建一个发布者,消息类型、话题名称以及队列长度
    srand(time(0));
    ros::Rate rate(2);   //设置循环频率,与下面的rate.sleep();配合
    int iterator = 0;

    while(ros::ok())
    {
        geometry_msgs::Twist msg;      
        msg.linear.x = 1;
        iterator++;  //迭代器++

        if(iterator==5)
        {
            iterator = 0;
            msg.linear.x = 0;
            msg.angular.z = PI;
        }
        //海龟先以x轴以线速度1进行移动,迭代到5次时,x轴线速度为0,海龟绕z轴转动90度,并循环执行

        pub.publish(msg);

        //发布消息
        ROS_INFO_STREAM("Sending random velocity command: "
                        << "linear = " << msg.linear.x 
                        << " angular = " << msg.angular.z);
        //按照循环频率延时
        rate.sleep();
    }
}