最近刚刚开始学习ROS,对于整个ROS的框架和功能正在一点点的了解,跟着B站古月居的《ROS入门21讲》课程,在安装好linux和ROS后,正式开始ROS的学习,动手实践敲代码,在这里先记录一下开始ROS项目的第一步,同时我安装的ROS版本为Noetic。
此次功能的实现是在ROS经典教程小乌龟运动上进行的。
创建工作空间和功能包
工作空间(worksspace)是一个存放工程开发相关文件的文件夹,咱们创建主文件夹catkin_ws,其中创建以下四个子文件夹:
- src:代码空间(Source Space)
- build:编译空间(Build Space)
- devel:开发空间(Develpment Space)
- install:安装空间(Install Space)
下面为实际操作:
1.创建工作空间
先在主目录里面创建catkin_ws文件夹,在主目录中打开终端。
$ mkdir catkin_ws
也可以是别的目录,后面要设置一个环境变量,会用到已创建的工作空间里面的一个文件,如果不用主目录,在写文件路径的时候会比较麻烦。同时这个文件夹的文件不一定必须要命名为catkin_ws。但是上面所说的工作空间里面的四个文件夹,文件命名不能修改!
进入catkin_ws文件,创建src文件夹,这个文件夹是咱们一开始创建的,跟普通文件夹性质一样。
$ cd catkin_ws
$ mkdir src
进入src文件夹。
$ cd src
把当前的文件夹初始化,把他从一个普通的文件夹变成ROS的一个工作空间。
$ catkin_init_workspace
退回到catkin_ws文件夹。
$ cd ..
下面是编译命令;这个是catkin工具提供的编译器的指令,编译src功能包里面的源码,然后结果放到devel和build文件夹里面。
$ catkin_make
创建install文件夹,这个文件不会在工作空间初始化后自己生成,需要自己编译创建。
$ catkin_make install
目前在catkin_ws里面有四个文件夹,各自的功能如下:
- src::放置功能包的源码,后面Publisher发布的话题内容文件夹就放置在这个文件夹里面。
- install:放置最终编译生成的可执行文件。
- devel:放置可执行文件和库,作用和install类似。
- build:放置编译的中间文件,二进制文件,基本上用不到。
2.创建功能包
进入src文件夹。
$ cd ~/catkin_ws/src
创建功能包,名字为learning_topic,后面五个是依赖的五个工具包,可以用C++或者Python语言来写话题内容。
$ catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim
3.创建发布者代码
然后在catkin_ws/src/learning_topic/src里面创建velocity_publisher.cpp文件,可以使用下面的命令:
$ touch velocity_publisher.cpp
然后使用vim命令,打开这个文件夹。
$ vim velocity_publisher.cpp
把下面的代码复制粘贴上去,如果复制粘贴不上去,请看一下回头看一下linux命令,文件管理和编辑。或者直接右键:用文本编辑器打开。
下面的代码这次就不详细讲解了,只说一下大致的功能。大部分都有注释,代码在《古月ROS21讲》视频配套的文件里有,去古月居公众号找一下。另外这是C++语言的,因为在创建功能包的时候,咱们不光加入了C++的依赖也加入了Python的依赖,所以也可以使用Python编写,Python编写的整体风格要比C++简约的多。
在下面的代码中,实现了几个效果:
- 初始化ROS节点;
- 向ROS Master 注册节点信息,包括发布的话题名和话题中的消息类型;
- 创建消息数据;
- 按照一定频率循环发布消息。
/**
* 该例程将发布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_publisher");
// 创建节点句柄
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("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]",
vel_msg.linear.x, vel_msg.angular.z);
// 按照循环频率延时
loop_rate.sleep();
}
return 0;
}
4.配置发布者代码编译规则
在catkin_ws/src/learning_topic/CMakeLists.txt中加入以下代码,位置是在CMakeLists.txt中的install标题上面。
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
add_executable这个函数是把velocity_publisher.cpp文件编译成可执行文件velocity_publisher。
target_link_libraries函数把上面生成的可执行文件velocity_publisher和ROS相关的库作链接,像是C++、Python库
5.编译并运行发布者
咱们再回到catkin_ws文件夹:
$ cd ~/catkin_ws
进行编译:
$ catkin_make
随后需要设置环境变量:
$ source devel/setup.bash
如果不想每次执行这个文件,配置环境变量 ,在主目录下按快捷键Ctrl+H,显示出隐藏的文件,在.bashrc文件里面的最后加上
echo "source /home/yzxie/catkin_ws/devel/setup.bash">> ~/.bashrc
或者
source /home/yzxie/catkin_ws/devel/setup.bash
这里注意第二行代码中,/home意思是在主目录里面,如果你一开始catkin_ws文件不是创建在主目录下,这里就要盖面路径,/yzxie/是你linux系统的用户名。
随后重新打开终端,输入一下命令;
$ roscore
不要关闭,Ctri+Atl+T再重新打开一个终端,输入以下命令:
$ rosrun turtlesim turtlesim_node
运行之后就会看到小乌龟的界面,小海龟的皮肤每次都是随机,每次都像开盲盒。然后Ctri+Atl+T再重新打开一个终端,输入以下命令:
$ rosrun learning_topic velocity_publisher
然后小乌龟就按照咱们C++程序中设定的,以一定的角速度旋转,咱们的整个功能也就实现了。