ROS中工作空间和功能包的创建以及发布者Publisher的实现

最近刚刚开始学习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

ROS中工作空间和功能包的创建以及发布者Publisher的实现_第1张图片

退回到catkin_ws文件夹。

$  cd ..

下面是编译命令;这个是catkin工具提供的编译器的指令,编译src功能包里面的源码,然后结果放到devel和build文件夹里面。

$  catkin_make

ROS中工作空间和功能包的创建以及发布者Publisher的实现_第2张图片

创建install文件夹,这个文件不会在工作空间初始化后自己生成,需要自己编译创建。

$  catkin_make install

ROS中工作空间和功能包的创建以及发布者Publisher的实现_第3张图片

目前在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

ROS中工作空间和功能包的创建以及发布者Publisher的实现_第4张图片

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 
#include 

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

ROS中工作空间和功能包的创建以及发布者Publisher的实现_第5张图片

随后需要设置环境变量:

$  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

ROS中工作空间和功能包的创建以及发布者Publisher的实现_第6张图片

不要关闭,Ctri+Atl+T再重新打开一个终端,输入以下命令:

$  rosrun turtlesim turtlesim_node

ROS中工作空间和功能包的创建以及发布者Publisher的实现_第7张图片

运行之后就会看到小乌龟的界面,小海龟的皮肤每次都是随机,每次都像开盲盒。然后Ctri+Atl+T再重新打开一个终端,输入以下命令:

$  rosrun learning_topic velocity_publisher

ROS中工作空间和功能包的创建以及发布者Publisher的实现_第8张图片
然后小乌龟就按照咱们C++程序中设定的,以一定的角速度旋转,咱们的整个功能也就实现了。

你可能感兴趣的