创建ROS功能包--小乌龟画圆和矩形

参考文章:https://blog.csdn.net/IMBA_09/article/details/84950696

cd ~/catkin_ws/src
catkin_create_pkg my_turtle_package std_msgs rospy roscpp

std_msgs,rospy,roscpp 为依赖包
一个catkin的包主要有以下几个部分组成:
(1)必须包括一个package.xml文件;
(2)必须包括一个CMakeList.txt文件;
(3)在每一个文件夹下只能有一个包,且包不允许嵌套;

cd ~/catkin_ws/src/my_turtle_package/src
gedit draw_circle.cpp

粘贴以下程序

#include "ros/ros.h"
#include<geometry_msgs/Twist.h> //运动速度结构体类型  geometry_msgs::Twist的定义文件
 
int main(int argc, char *argv[])
{
    ros::init(argc, argv, "vel_ctrl");  //对该节点进行初始化操作
    ros::NodeHandle n;         //申明一个NodeHandle对象n,并用n生成一个广播对象vel_pub
    ros::Publisher vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
    //vel_pub会在主题"/turtle1/cmd_vel"(机器人速度控制主题)里广播geometry_msgs::Twist类型的数据
    //ros::Rate loopRate(2);
    ROS_INFO("draw_circle start...");//输出显示信息
    while(ros::ok())
    {
        geometry_msgs::Twist vel_cmd; //声明一个geometry_msgs::Twist 类型的对象vel_cmd,并将速度的值赋值到这个对象里面

        vel_cmd.linear.x = 2.0;//前后(+-) m/s
        vel_cmd.linear.y = 0.0;  //左右(+-) m/s
        vel_cmd.linear.z = 0.0;
 
        vel_cmd.angular.x = 0;
        vel_cmd.angular.y = 0;
        vel_cmd.angular.z = 1.8; //机器人的自转速度,+左转,-右转,单位是rad/s
        vel_pub.publish(vel_cmd); //赋值完毕后,发送到主题"/turtle1/cmd_vel"。机器人的核心节点会从这个主题接受发送过去的速度值,并转发到硬件体上去执行
 
        ros::spinOnce();//调用此函数给其他回调函数得以执行(比例程未使用回调函数)
       //loopRate.sleep();
    }
    return 0;
}

原作者此处的topic发布成了/cmd_vel导致乌龟没有反应
在CMakeList.txt文件末尾加入几句语句

include_directories(include ${catkin_INCLUDE_DIRS})

add_executable(draw_circle src/draw_circle.cpp)
target_link_libraries(draw_circle ${catkin_LIBRARIES})

创建让小乌龟画矩形的代码:

cd ~/catkin_ws/src/my_turtle_package/src
gedit draw_rectangle.cpp

代码:

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#define PI 3.14159265358979323846
 
int main(int argc, char **argv){
  ros::init(argc, argv, "draw_rectangle");   //"draw_rectangle"必须是nodename
  std::string topic = "/turtle1/cmd_vel"; //topic name
  ros::NodeHandle n;
  ros::Publisher cmdVelPub = n.advertise<geometry_msgs::Twist>(topic, 1);
  //第一个参数也可以写成"/turtle1/cmd_vel"这样的topic name
  //第二个参数是发布的缓冲区大小,<geometry_msgs::Twist>是消息类型
  ros::Rate loopRate(2);
  //与Rate::sleep();配合指定自循环频率
  ROS_INFO("draw_retangle start...");//输出显示信息
  geometry_msgs::Twist speed; // 控制信号载体 Twist message
//声明一个geometry_msgs::Twist 类型的对象speed,并将速度的值赋值到这个对象里面
  int count = 0;
  while (ros::ok()){
    speed.linear.x = 1; // 设置线速度为1m/s,正为前进,负为后退
    speed.linear.y = 0;
    speed.linear.z = 0;
    speed.angular.x = 0;
    speed.angular.y = 0;
    speed.angular.z = 0; 
    count++;
    while(count == 5)
    {
        count=0;
        speed.angular.z = PI; //转90°
    }
    cmdVelPub.publish(speed); // 将刚才设置的指令发送给机器人
    ros::spinOnce();//调用此函数给其他回调函数得以执行
    loopRate.sleep();//按loopRate(2)设置的2HZ将程序挂起
  }
  return 0;
}

继续在CMakeList.txt文件末尾加入几句语句

add_executable(draw_rectangle src/draw_rectangle.cpp)
target_link_libraries(draw_rectangle ${catkin_LIBRARIES})

实验测试
测试命令:

$:roscore 
$:rosrun turtlesim turtlesim_node
$:rosrun my_turtle_package draw_circle      #让小乌龟作圆周运动
$:rosrun my_turtle_package draw_rectangle   #让小乌龟作矩形运动

如果出现找不到my_turtle_package包,尝试刷新下环境变量,
本实验没有改动package.xml文件,只对CMakeList.txt文件末尾做了添加

猜你喜欢

转载自blog.csdn.net/qq_43176116/article/details/87926083