第 2 节

入门操作

简介

终端环境搭建

如果在上方安装ROS2的时候,已经将该语句添加到~/.bashrc了,则不必再跟着这步操作了。

source /opt/ros/humble/setup.bash  #将ROS2环境变量配置到当前位置
echo " source /opt/ros/humble/setup.bash" >> ~/.bashrc    #每次启动终端都会运行该句

ros2 run demo_nodes_cpp talker

用ctrl+c来进行取消程序运行

ros2 run demo_nodes_py listener

ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

命令行操作

mkdir -p 新建文件夹

rm -R 递归删除(删掉文件夹及里面包含的文件夹及文件)

touch 新建文件

rm 删除文件

cd ..退回上级目录(cd 点点)


会弹提示信息,告诉我们后面要跟的参数

ros2 node list会把当前ROS2正在运行的节点列出来

ros2 node info + /节点名 可以查看目标节点的详细情况

会弹提示信息,告诉我们后面要跟的参数

可以通过话题来显示机器人运动的状态

ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"

ros2 bag record /turtle1/cmd_vel
ros2 bag play rosbag2_2022_04_11-17_35_40/rosbag2_2022_04_11-17_35_40_0.db3

ros2 bag record + 话题

按Ctrl+C结束,然后录制的数据在当前终端的目录下

如何去复现呢?

ros2 bag play + 文件夹名称

ROS2 HelloWorld(C++)

1.创建功能包

指令就是创建ros2的功能包

ros2 pkg create + 功能包名 + --build-type(构建类型) + ament_cmake / ament_python + --dependencies(依赖) + rclcpp(ROS2的CPP客户端) + --node-name(节点名) + 节点名

ros2 pkg create pkg01_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld

源文件自动生成了,文件名和我们指定的node name是一致的。

这是自动生成的内容,但是和ROS2没有任何关系。

如果依赖的库不止这一个,则再回车,

xxx

再添加下一个

10行是查找包

12行是添加可执行的

add_executable 的第一个参数是 可执行文件的名字(默认和节点名一致,默认和源文件名一致) 第二个参数是源文件的名字

17行是为我们的可执行程序添加依赖 我们的可执行程序依赖于RCLCPP这个库

22行是要为我们的可执行程序设立一个安装目录,创建在了当前功能包下的lib目录,也就是 工作空间名/install/功能包名/lib

编辑配置文件之后编译,用cd..返回ws目录

图标为绿色,是没有警告也没有错误

是黄色的则有警告

是红色的则有致命错误

可执行二进制文件的路径

source install/setup.bash #刷新环境变量

ros2 run pkg01_helloworld_cpp helloworld

ros2 run 功能包名称 可执行文件名(默认和节点名一致)

编辑ROS2 C++源文件:

#include "rclcpp/rclcpp.hpp"

int main(int argc, char ** argv)
{
  rclcpp::init(argc,argv);

  auto node = rclcpp::Node::make_shared("helloworld_node");

  RCLCPP_INFO(node->get_logger(),"hello world!");

  rclcpp::shutdown();

  return 0;
}

ROS2 HelloWorld(Python)

ros2 pkg create pkg02_helloworld_py --build-type ament_python --dependencies rclpy --node-name helloworld

ros2 pkg create + 功能包名 + --build-type(构建类型) + ament_cmake / ament_python + --dependencies(依赖) + rclpy(ROS2的Python客户端) + --node-name(节点名) + 节点名

与node name和可执行二进制文件同名

默认这里面已经有代码,但是和ROS2无关,这是标准的python代码

二进制可执行文件 映射到 源文件的main函数

如何编译呢?

先返回上一级,来到ws目录

有个黄色警告,但是不影响我们使用。

source ./install/setup.bash

刷新环境变量

ros2 run pkg02_helloworld_py helloworld


import rclpy

def main():
    rclpy.init()
    node = rclpy.create_node("helloworld_py_node")
    node.get_logger().info("hello world by python!")
    rclpy.shutdown()

if name == '__main__':
    main()

运行优化(bash终端环境)

要使用绝对路径

尽量不要这么干,ROS2有一个bug,就是不同工作空间的功能包可能会调用混乱,所以先不要搞全局的运行优化。

VScode环境搭建

看C/C++,Python,CMake,XML,YAML文件就可以代码高亮显示

在写一些ROS2消息的代码可以提供代码补齐等操作

编写机器人模型所要用的插件,也可以进行代码补齐

ROS2经常生成PDF文件,可以通过这个插件来查看

ROS2插件建议等成熟之后再进行安装

这个官方插件可以尝试安装

人工智能代码补全

MarkDown高亮


虽然报错,但是程序是可以正常运行的。(主要是vscode找不到头文件)

            "includePath": [
                "${default}",
                "${workspaceFolder}/**",
                "/opt/ros/humble/include/**"
            ],

/**代表要包含该文件夹下的所有的子集


按Ctrl + `(ESC底下的按键)把VSCODE终端打开

--node-name也是可选参数,如果不配置,则不会有源文件,也不会有可执行文件到源文件的映射

不需要修改,已经默认生成好了

再返回WS目录进行编译(但是此时编译是编译整个WS目录下的所有功能包)

刷新环境变量并运行



如何在一个功能包里添加多个源文件呢?

新建一个新文件,比如hellovscode2.cpp

但是此时该文件是一个孤零零的文件,他没有做任何的配置,对应的,编译完之后也不会被执行。

我们想编译执行该文件,必须配置相关的配置文件。

选中的这些用不着,可以删掉

运行优化(colcon build)

平常会全编译WS目录下的文件

colcon build --packages-select xxx xxx xxx #可以指向多个包

VScode环境进阶

clangd插件代码提示(可选,但是建议)

https://colcon.readthedocs.io/en/released/index.html

由于C/C++插件在大项目里的表现简直拉胯的一批,所以我们选择使用llvm里的clangd插件来进行代码提示。

但clangd依赖于cmake生成一个编译信息文件,我们需要一些步骤来生成该文件。

由于ROS2没有像ROS1那样的一个总的规范的CMakeLists,所以配置起来没有ROS1那么方便。

  1. 配置colcon build参数
    1. 方法一:(不建议) 每次 编译要用该命令:
    colcon build --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
    

      等同于在cmake文件里写上(一般不建议改cmakelists)
    set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
    
    1. 方法二:全局参数(更加推荐)
mkdir ~/.colcon

vim ~/.colcon/defaults.yaml

按下insert(插入)按键

输入下方内容

build:
  cmake-args:
    - -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

按下ESC,并按下:wq,然后按下Enter(回车)即可成功保存。

在编译的时候正常用colcon build就可以自动启用CMAKE_EXPORT_COMPILE_COMMANDS=ON参数了。

  1. 然后再来配置clangd插件
    1. 先下载clangd插件
    2. 下载clangd文件

      按住Ctrl shift P打开搜索框
      输入clangd 找到下载语言服务器这一项目,点击安装clangd(请保持良好的网络状况)
    1. 接着配置clangd:

禁用C/C++的代码提示功能

如果没有上图的弹窗,可以进行手动关闭,依然是ctrl shift P,输入settings然后找到如下图的选项

找到下图这个选项,改成disabled即可。

"C_Cpp.intelliSenseEngine": "disabled"

  1. 重启clangd

然后ctrl shift P搜索clangd找到如下图的选项(重启clangd语言服务器前,要先colcon build)

代码提示就正常啦

安装其他工具

安装terminator(建议装,选装,因人而异)

sudo apt install terminator

快捷键功能记忆方法
Ctrl + Shift + E垂直分屏,左右分E = East,往东边开一个窗口,也就是左右分
Ctrl + Shift + O水平分屏,上下分O = Over / Under,上下叠放
Ctrl + Shift + S隐藏/显示滚动条S = Scrollbar,滚动条
F11全屏/退出全屏F = Fullscreen,F11 本来就是很多软件的全屏键
Ctrl + Tab在不同 pane 之间切换跟浏览器切 Tab 类似,循环切换
Ctrl + L清屏L = clear 里的 L,也可以理解成“拉到新页面”
Ctrl + Shift + W关闭当前 paneW = Window,关当前小窗口
Ctrl + Shift + Q退出整个 TerminatorQ = Quit,退出程序

因为他本身的字体非常暗,所以要设置一下.

cp ~/.config/terminator/config ~/.config/terminator/config.bak
vim ~/.config/terminator/config

按一下ggdG,注意大小写. 然后按下insert按键, 然后让文件内容为:

[global_config]
  title_transmit_bg_color = "#31363b"
  title_transmit_fg_color = "#fcfcfc"
  title_receive_bg_color = "#232629"
  title_receive_fg_color = "#fcfcfc"
  title_inactive_bg_color = "#232629"
  title_inactive_fg_color = "#bdc3c7"

[keybindings]

[profiles]
  [[default]]
    use_theme_colors = False
    use_system_font = False
    font = Noto Sans Mono 11

    background_type = solid
    background_color = "#232629"
    foreground_color = "#fcfcfc"
    cursor_color = "#fcfcfc"

    palette = "#232629:#ed1515:#11d116:#f67400:#1d99f3:#9b59b6:#1abc9c:#fcfcfc:#7f8c8d:#ff5555:#50fa7b:#fdbc4b:#3daee9:#ff79c6:#8be9fd:#ffffff"

    scrollback_infinite = True

[layouts]
  [[default]]
    [[[window0]]]
      type = Window
      parent = ""
    [[[child1]]]
      type = Terminal
      parent = window0

[plugins]

最后,按下ESC,输入:wq保存并退出.

然后完全关闭 Terminator,再重新打开。 这个配置会做几件事:

  1. 背景:接近 Konsole Breeze 的深灰,不是死黑
  2. 字体:接近纯白,比以前亮很多
  3. 蓝色:换成更亮的 KDE 蓝
  4. 绿色/黄色/青色:也整体提亮
  5. 顶部红色标题条:改成灰色,不再那么刺眼

咱们的Git入门教程:Vinci机器人队Git入门教程

ROS2体系框架

Client Library就是ROS2的客户端,比如rclcpp,rclpy。

Abstract DDS Layer是DDS抽象层,这样DDS可以实现可插拔,可以随便替换DDS模块。

Intra-process API是进程内通讯API,可以提高通信效率的一类API。