一、小海龟的命令行操作
1. 节点创建与命名重映射
-
新建终端,启动master:
roscore
;注意此终端与master共存,即窗口不可关闭,否则会终止master -
启动海龟节点:
rosrun turtlesim turtlesim_node
;小海龟出现 -
查看当前节点:
rosnode list
此时我们可以看到结果如图所示:
我们可以看到第二个:/turtlesim,即小海龟进程对应的节点名称 -
命名重映射:
rosrun turtlesim turtlesim_node __name:=my_turtle
此时我们再次查看节点清单可以得到:
出现了新的节点my_turtle,说明命名重映射成功,但是turtlesim仍然存在,即假死节点仍存在; -
清楚假死节点:
rosnode cleanup
,发现假死节点后会提示是否继续,此时按Y并回车,再次查看就会消失。
2. 话题通讯
-
前提:ROS master已启动,海龟节点已启动;
-
启动键盘控制节点:
rosrun turtlesim turtle_teleop_key
在开启此节点后,就可以将光标置于终端内,通过方向键控制海龟运动; -
观察节点通讯关系:
rosrun rqt_graph rqt_graph
,界面如下:
此图的含义:/teleop_turtle这个节点将方向键的信息发布到/turtle1/cmd_vel这个话题,/turtlesim节点订阅了同样的话题,完成了一种异步通讯。
-
查看话题类型:
rostopic type /turtle1/cmd_vel
结果如图所示:
ROS自带的标准消息类型:gemetry_msgs/Twist,作用类似于C语言的结构体,该类型的具体形式可以通过如下命令查看:rosmsg show geometry_msgs/Twist
-
从图片中我们可以得出该消息类型内容有三个平动向量、三个转动向量
-
命令行发送消息:重新启动roscore和海龟节点,新建终端输入命令如下:
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 2.0"
命令令z轴转动操作变化,故小海龟原地进行旋转,如果想要令海龟保持运动,则需要按照固定频率发送消息,命令如下:
rostopic pub -r 1 /turtle1/cmd_vel geometry_msgs/Twist "linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 2.0"
同样,我们也可以使用rqt工具箱进行图形化操作,首先输入命令rosrun rqt_publisher rqt_publisher
,进入界面后:
选择话题和消息类型,设置频率,通过加号增加指令,并修改具体内容,消息就开始按照指定频率发送,满足要求。
3. 服务通讯
- 服务通讯机制的核心在于同步性,通讯的两方中,一方作为客户端,向服务端发送请求,而另一方的服务端收到请求后,就会进行数据处理,然后发送回应给客户端。
- 简单实例:创建第二只小海龟,命令如下:
rosservice call /spawn "x: 1.0
y: 0.0
theta: 0.0
name: ''"
name: "turtle2"
此时在原屏幕的右下角就会出现新的一只小海龟
4. Launch文件
- 关键:在对于海龟操作的学习过程中,我们能够发现,每次在启动时需要打开大量的终端,在进行复杂操作时,这样是完全不现实的,故我们可以通过roslaunch启动节点,来集成化操作;
- 进入功能包文件夹,创建launch文件夹:
mkdir launch
cd launch
- 创建launch文件:
touch turtle_ctrl.launch
- 编写对应文件:
<launch> <node pkg="turtlesim" type="turtlesim_node" name="turtle1"/> <node pkg="turtlesim" type="turtle_teleop_key" name="key_ctrl"/> </launch>
- 新建终端,输入:
roslaunch beginner_tutorials turtle_ctrl.launch
,此时我们就直接创建了海龟,并且可以通过方向键完成控制,故大大简化了操作。
二、基本编程操作
1. VSCode配置
- 在先前的博客中我们已经讲述了如何安装VSCode,在本节内容主要将会介绍一些编译配置,借鉴了Winter大佬的博客ROS教程,原文地址奉上。
- 在工作空间目录下启动vscode:
vscode .
- 修改配置文件:
- 打开编译选项:快捷键Ctrl + shift + B,选择catkin_make:build点击右侧齿轮进入调整配置文件:
- 将tasks.json内容修改为如下内容(默认编译选项):
{ // 有关 tasks.json 格式的文档,请参见 // https://go.microsoft.com/fwlink/?LinkId=733558 "version": "2.0.0", "tasks": [ { "label": "catkin_make:debug", //代表提示的描述性信息 "type": "shell", //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行 "command": "catkin_make",//这个是我们需要运行的命令 "args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2” "group": {"kind":"build","isDefault":true}, "presentation": { "reveal": "always"//可选always或者silence,代表是否输出信息 }, "problemMatcher": "$msCompile" } ] }
- 修改c_cpp_properties.json(主要与头文件、库文件有关):
在includePath中添加:
"/usr/include/**", "/usr/lib/**", "/usr/local/include", "${workspaceFolder}/**"
在name后添加:
"defines": [], "compilerPath": "/usr/bin/g++", "cStandard": "gnu17", "cppStandard": "c++17", "intelliSenseMode": "linux-gcc-x64"
2. 测试代码与CMake文件
- 在先前创建的功能包对应src下创建cpp文件:
#include "ros/ros.h"
# 只有一个hellowworld的输出功能
int main(int argc, char *argv[])
{
ros::init(argc, argv, "helloWorld");
ROS_INFO("hello ROS world");
return 0;
}
- 对应修改CMakelist.txt文件:(在##install##前添加如下命令)
# 设置需要编译的代码和生成的可执行文件,前面是目标名称,后面是文件位置
add_executable(helloworld src/test.cpp)
# 设置链接库
target_link_libraries(helloworld
${catkin_LIBRARIES}
)
- 编译:
- 使用vscode:Ctrl + shift + B,编译文件
- 命令行:切换到catkin_ws目录:catkin_make编译(二者效果相同)
- 命令操作:
首先打开roscore,紧接着输入rosrun pkg_ts helloworld
,即可完成控制,效果如下:
总结
本文主要对于小海龟的基本命令行操作进行了实战演示,更加深刻的体会了各命令以及通讯机制的作用,通过细致的图示完成对于ROS操作的学习,并在最后完成了使用VSCode进行代码编程以及编译的流程,为之后的C++和python代码编辑奠定了基础。
文章出处登录后可见!