参考文章: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文件末尾做了添加