二、ROS集成开发环境
1.安装terminator
sudo apt install terminator
快捷键
Ctrl+Alt+T:启动终端
Ctrl+Shift+O:水平分割终端
Ctrl+Shift+E:垂直分割终端
Ctrl+Shift+C:复制选中的内容到剪贴板
Ctrl+Shift+V:粘贴剪贴板的内容到此处
Ctrl+Shift+W:关闭当前终端
2.安装VScode
下载VScode:.deb
sudo dpkg -i xxx.deb
安装插件:ROS、Cmake Tools、C/C++、Python、Chinese
修改VScode字体:
- 文件 ---- 首选项 ---- 设置 ---- 常用设置
- Font Size设置成:18
- Font Family设置成:
monospace,'Droid Sans Mono', 'monospace','Droid Sans Fallback'
- 设置ctrl+滚轮实现代码字体大小缩放:在设置中搜索zoom,然后给Editor: Mouse Wheel Zoom打钩
3.在VScode中使用ROS
3.1 创建工作空间
cd ~/My_Ros_WorkSpace
mkdir test2_workspace
cd test2_workspace
mkdir src
cd src
catkin_init_workspace
cd ..
catkin_make
catkin_make install
3.2 启动VScode
在工作空间下面,键入code .
code .
3.3 配置VScode
配置编译相关的命令和参数(Ctrl + Shift + b)
选择要运行的生成任务:点catkin_make:build后面的小齿轮,修改.vscode/tasks.json 文件
复制下面的内容到.vscode/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"
}
]
}
不要忘记,每次改完都要Ctrl + s保存一下
这样改完tasks.json 文件,以后写完代码需要编译,直接快捷键(Ctrl + Shift + b)就会默认编译整个工作空间!
3.4 创建功能包
选中src,右键Create Catkin Package
录入功能包名字"hello_pkg",回车
录入依赖"roscpp rospy std_msgs",再回车
避免依赖名字可能写错了,也可以(Ctrl + Shift + b)编译一下,看看有没有问题!
3.5 编写C++文件
在功能包"hello_pkg"里面的src里面新建一个hello.cpp(最里面的src)
#include "ros/ros.h"
int main(int argc, char *argv[])
{
//节点初始化:节点名为hello2333(节点名中不能有空格)
ros::init(argc,argv,"hello2333");
//输出日志
ROS_INFO("哈哈哈哈哈哈哈哈哈哈");
return 0;
}
如果有报错或者没有代码补全的提示:
修改 .vscode/c_cpp_properties.json,设置 "cppStandard"为 “c++17”,保存一下
3.6 配置CMakeLists.txt
修改与package.xml平级的CMakeLists.txt(别搞错了,不是上一级的CMakeLists.txt)
//add_executable(可执行文件名称 src/C++源文件名.cpp)
//target_link_libraries(可执行文件名称 ${catkin_LIBRARIES})
//为了方便,一般会令可执行文件的名称与C++源文件名称相同
add_executable(hello src/hello.cpp)
target_link_libraries(hello ${catkin_LIBRARIES})
#############
## Install ##
#############
一般会令,可执行文件名称=src/C++源文件名,这里都叫hello
节点名=hello2333
功能包名=hello_pkg
3.7 运行节点
(Ctrl + Shift + B)编译一下工作空间
然后在VScode里面新建一个终端:
roscore
然后在VScode里面再新建一个终端:
source devel/setup.bash
rosrun <功能包名> <可执行文件名>
输出中文乱码的问题
在hello.cpp程序中加入以下任意一句
setlocale(LC_CTYPE, "zh_CN.utf8");
setlocale(LC_ALL, "");
#include "ros/ros.h"
int main(int argc, char *argv[])
{
//setlocale(LC_CTYPE, "zh_CN.utf8"); //设置编码,防止中文乱码
setlocale(LC_ALL, "");
//节点初始化:节点名为hello2333(节点名中不能有空格)
ros::init(argc,argv,"hello2333");
//输出日志
ROS_INFO("哈哈哈哈哈哈哈哈哈哈");
return 0;
}
重新编译和运行(记得先终止前面打开的两个终端)
以后建立新的工作空间,好像得把上面的配置重新走一步,或者复制一个工作空间过来直接改
3.8 使用launch文件一次启动多个节点
进入工作空间的根目录,鼠标右键在终端中打开,并启动VScode
code .
然后在功能包"hello_pkg"下面,新建一个名为"launch"的文件夹
然后在名为"launch"的文件夹里面继续新建一个后缀为.launch的文件,名字随便起
我这里是"start_turtle.launch",主要是为了启动小乌龟节点
编写"start_turtle.launch"文件
<launch>
<!--添加被执行的节点-->
</launch>
先不添加节点,Ctrl + s先保存文件,然后并按Ctrl + ~ 准备执行launch
在出现的终端中,先设置环境变量
source devel/setup.bash
然后执行launch文件:roslaunch <功能包名> <launch文件>
roslaunch hello_pkg start_turtle.launch
可以看到执行成功,并且只要在launch文件中写了< launch >根标签,就能自动打开roscore
确保启动launch文件没有问题了以后,就可以开始启动一些节点了
<launch>
<!--添加被执行的节点-->
<!-- <node pkg="功能包名" type="src/C++源文件名=可执行文件名" name="为节点简单的命名一下,这个name可以随便取" output="设置日志的输出目标" /> -->
<!--启动乌龟GUI-->
<node pkg="turtlesim" type="turtlesim_node" name="seu_turtle2333"/>
<!--启动键盘控制乌龟-->
<node pkg="turtlesim" type="turtle_teleop_key" name="seu_turtlekey2333"/>
</launch>
Ctrl + s 保存一下,然后再Ctrl + ~执行launch
光标移动到终端,就可以↑↓←→控制小乌龟了
到这里为止应该可以用launch文件启动小乌龟了
将上面写的hello节点也添加到launch文件试一试,能不能在终端输出"哈哈哈哈哈哈"
<launch>
<!--添加被执行的节点-->
<!-- <node pkg="功能包名" type="src/C++源文件名=可执行文件名" name="为节点简单的命名一下,这个name可以随便取" output="设置日志的输出目标" /> -->
<!--启动乌龟GUI-->
<node pkg="turtlesim" type="turtlesim_node" name="seu_turtle2333"/>
<!--启动键盘控制乌龟-->
<node pkg="turtlesim" type="turtle_teleop_key" name="seu_turtlekey2333"/>
<!--启动哈哈节点-->
<node pkg="hello_pkg" type="hello" name="seu_hello2333" />
</launch>
可以看到虽然启动了hello节点,但是终端里头没有输出"哈哈哈哈哈哈"
这是因为,如果节点中含有日志输出并想让日志显示在终端,就必须在launch文件中再设置一个属性output=“设置日志的输出目标”
这里为了将日志输出到终端,就要写成output=“screen”
<launch>
<!--添加被执行的节点-->
<!-- <node pkg="功能包名" type="src/C++源文件名=可执行文件名" name="为节点简单的命名一下,这个name可以随便取" output="设置日志的输出目标" /> -->
<!--启动乌龟GUI-->
<node pkg="turtlesim" type="turtlesim_node" name="seu_turtle2333"/>
<!--启动键盘控制乌龟-->
<node pkg="turtlesim" type="turtle_teleop_key" name="seu_turtlekey2333"/>
<!--启动哈哈节点-->
<node pkg="hello_pkg" type="hello" name="seu_hello2333" output="screen"/>
</launch>
3.8 使用计算图看节点之间的关系
再新建一个终端
rqt_graph
报错
解决方法:
打开报错中指出的文件缺失的目录/opt/ros/melodic/share/rqt_virtual_joy/
新建文件plugin.xml
打开plugin.xml,复制粘贴下面的代码,保存退出即可
Ctrl + Alt + T打开终端
cd /opt/ros/melodic/share/rqt_virtual_joy
sudo touch plugin.xml
sudo gedit plugin.xml
<library path="src">
<class name="My Plugin" type="rqt_virtual_joy.virtual_joy_module.MyPlugin" base_class_type="rqt_gui_py::Plugin">
<description>
An example Python GUI plugin to create a great user interface.
</description>
<qtgui>
<group>
<label>Robot Tools</label>
</group>
<!-- <group>
<label>Subgroup</label>
</group> -->
<label>Virtual Joystick</label>
<icon type="file">resource/input-gaming.png</icon>
<statustip>Great user interface to provide real value.</statustip>
</qtgui>
</class>
</library>
如果显示的是一个完全空白的窗口,就试一下这条指令
rqt_graph --clear-config