实验环境
ubuntu18.04
ros-melodic
VMware Workstation
一、ROS话题
turtlesim_node节点和turtle_teleop_key节点之间是通过一个ROS话题来相互通信的。turtle_teleop_key在话题上发布键盘按下的消息,turtlesim则订阅该话题以接收消息。让我们使用rqt_graph来显示当前运行的节点和话题。
注意:如果你使用的是ROS electric或早期版本,那么rqt是不可用的,请使用rxgraph代替。
- 使用rqt_graph
rqt_graph用动态的图显示了系统中正在发生的事情。rqt_graph是rqt程序包中的一部分。如果你发现没有安装,请:
sudo apt-get install ros-<distro>-rqt
sudo apt-get install ros-<distro>-rqt-common-plugins
将替换成你安装的ROS发行版简称(比如kinetic或noetic等)。
打开一个新终端:
rosrun rqt_graph rqt_graph
你会看到一个窗口:
如果把鼠标放在/turtle1/command_velocity上方,相应的ROS节点(这里是蓝色和绿色)和话题(这里是红色)就会高亮显示。可以看到turtlesim_node和turtle_teleop_key节点正通过一个名为/turtle1/command_velocity的话题来相互通信。
- 使用rostopic echo
rostopic echo可以显示在某个话题上发布的数据。
rostopic echo [topic]
让我们看看由turtle_teleop_key节点发布的“指令、速度”数据。
在ROS Hydro及更新版本中,这些数据发布在/turtle1/cmd_vel话题上。打开一个新终端:
rostopic echo /turtle1/cmd_vel
使用键盘控制小海龟移动,可以看到以下内容:
现在让我们再看一下rqt_graph。先按下左上角的刷新按钮以显示新节点。正如你所看到的,rostopic echo(这里以红色显示)现在也订阅turtle1/command_velocity话题。
二、ROS消息
话题的通信是通过节点间发送ROS消息实现的。为了使发布者(turtle_teleop_key)和订阅者(turtulesim_node)进行通信,发布者和订阅者必须发送和接收相同类型的消息。这意味着话题的类型是由发布在它上面消息的类型决定的。使用rostopic type命令可以查看发布在话题上的消息的类型。
rostopic type命令用来查看所发布话题的消息类型。
rostopic type [topic]
运行下列命令:
rostopic type /turtle1/cmd_vel
使用rosmsg查看消息的详细信息:
rosmsg show geometry_msgs/Twist
三、C++编码实现小海龟圆周运动
- 创建ROS工作空间
①创建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
②编译工作空间
cd ~/catkin_ws
catkin_make
source devel/setup.bash
③检查环境变量
echo $ROS_PACKAGE_PATH
- 创建ROS功能包
①创建功能包
cd ~/catkin_ws/src
catkin_create_pkg learning_topic std_msgs rospy roscpp geometry_msgs
②编译功能包
cd ~/catkin_ws
catkin_make
source devel/setup.bash
- C++代码
①创建publisher.cpp文件
在位置~/catkin_ws/src/learning_topic/src/下创建publisher.cpp文件.
②话题发布逻辑
1.初始化ROS节点
2.向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型
3.创建消息数据
4.按照一定频率循环发布消息
③C++代码:
#include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "geometry_msgs/Twist.h"
int main(int argc, char **argv)
{
//初始化节点
ros::init(argc, argv, "publisher");
//创建节点句柄
ros::NodeHandle n;
//创建publisher,发布话题[/turtle1/cmd_vel],消息类型[geometry_msgs::Twist]
ros::Publisher chatter_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 1000);
//设置循环频率
ros::Rate loop_rate(100);
while (ros::ok())
{
//定义发布的数据
geometry_msgs::Twist msg;
//定义linear数据
geometry_msgs::Vector3 linear;
linear.x=1;
linear.y=0;
linear.z=0;
//定义angular数据
geometry_msgs::Vector3 angular;
angular.x=0;
angular.y=0;
angular.z=1;
msg.linear=linear;
msg.angular=angular;
//发布msg数据
chatter_pub.publish(msg);
//循环等待回调函数
ros::spinOnce();
//按照循环频率延时
loop_rate.sleep();
}
return 0;
}
- 添加编译选项
Python在ubuntu是可以直接执行的脚本语言,而C++是编译语言,在执行之前需要经过编译过程,因此在编译工作空间之前需要配置文件。
cd ~/catkin_ws/src/learning_topic
gedit CMakeLists.txt
在文件末尾加上:
add_executable(publisher src/publisher.cpp)
target_link_libraries(publisher ${catkin_LIBRARIES})
保存退出,再进行编译命令:
cd ~/catkin_ws
catkin_make
如果显示100%就说明编译成功,接下来就可以实现小海龟圆周运动
- 启动小海龟程序,控制其做圆周运动
roscore
#打开新终端
rosrun turtlesim turtlesim_node
#打开新终端
cd ~/catkin_ws
#下面这一步是为了保证rosrun命令能够找到相应的功能包,有可以省去这一步骤的方法,各位可以自行查找
source ~/catkin_ws/devel/setup.bash
rosrun learning_topic publisher
四、实验总结
这次实验是继用键盘控制小海龟移动后的进一步实验步骤,熟悉了ROS的消息和话题的收发机制.直观上也了解了小海龟的运动机制最后我们实现了编程方式控制小海龟圆周运动,对ROS也有了更进一步的了解。