ros2安装

  1. 更新:sudo apt update

  2. 下载一个工具:wget http://fishros.com/install -O fishros

  3. 运行工具:. fishros

  4. 测试:ros2

  5. 海龟模拟:ros2 run turtlesim turtlesim_node

  6. 键盘节点:ros2 run turtlesim turtle_teleop_key

  7. 新终端输入:rqt

    • 工具栏选择Plugins/Introspection/Node Graph,即可查看到当前运行的节点关系


linux相关指令

  1. 查看文件路径:whereis 文件名

  2. 查看当前终端的路径:pwd

  3. 创建文件夹命令:mkdir 文件夹名字

    • 例如:mkdir chapt1

    • 即可创建一个名字为 chapt1 的文件夹

  4. 创建文件:touch 名字

    • 例如:touch hello_world.txt

    • 即可创建一个名字为 hello_world 的 txt 文件

  5. 删除文件:rm

    • 强制删除文件夹:rm -r 文件夹名

    • 强制删除文件:rm -f 文件名

  6. 编辑文件:nano 名字

    • 例如:nano hello_world.txt

    • 即可在终端编辑文件

    • contro+o 保存

    • contro+x 退出

  7. 查看文件内容:cat 文件名字

    • 例如:cat hello_world.txt

    • 即可在终端输出文件中的内容

  8. 安装deb格式文件:sudo dpkg -i ./文件名字

    • 例如:sudo dpkg -i ./code_1.77.0-1680085573_amd64.deb

    • -i表示install 安装

    • ./表示当前目录

  9. 给文件增加可执行权限:chmod a+x 文件名

    • 例如:chmod a+x hello_world.py

  10. 改文件名字:mv

    • 例如:mv CMakeLists.txt CMakeLists.txt.back

  11. linux之间传输文件或者文件夹:scp指令,例子如下

    • 传输文件夹:scp -r chapt2/ wros@192.168.1.31:/home/wros/

    • 传输文件:scp -r test_argc.cpp wros@192.168.1.31:/home/wros/

  12. ldd命令:例如ldd cpp_node,可以查看cpp_node文件依赖哪些库,并且这些库有没有正确链接上。

  13. find命令:查找文件的位置,格式:find <指定目录> <指定条件> <指定动作>

    • 例如 find / -name whitelist.json

  14. 压缩与解压rar文件

(1)安装工具

sudo apt-get install rar
sudo apt-get install unrar

(2)执行解压

unrar x test.rar


C++相关内容

1. CMakeLists:

  1. 直接新建文件名字为:CMakeLists.txt

  2. 输入代码如下:

cmake_minimum_required(VERSION 3.8)
project(helloworld)
add_executable(learn_cmake hello_world.cpp)

cmake需要最小的版本:cmake_minimum_required(VERSION 3.8)

工程配置(名字):project(helloworld)

添加可执行文件add_executable(learn_cmake hello_world.cpp)

  1. cmake .

    • 当前文件夹进行cmake,生成make指令

  2. make

    • 编译文件

  3. ./learn_cmake

    • 执行

2. c++新特性

auto node = std::make_shared<PersonNode>("cpp_node")

以上一段代码中有两个新特性:如下

(1)自动类型推导(auto)

auto 变量名

(2)共享指针

举例如下:

 auto p1 = std::make_shared<std::string>("This is a str.");

(3)Lambda表达式

换个语法写的函数,其结构如下:

[capture list](paramenters) -> return_type{function body}

其中:

capture list 是捕获列表,用于指定 Lambda表达式可以访问的外部变量,以及是按值还是按引用的方式访问。捕获列表可以为空,表示不访问任何外部变量,也可以使用默认捕获模式 & 或 = 来表示按引用或按值捕获所有外部变量,还可以混合使用具体的变量名和默认捕获模式来指定不同的捕获方式。

parameter list 是参数列表,用于表示 Lambda表达式的参数,可以为空,表示没有参数,也可以和普通函数一样指定参数的类型和名称,还可以在 c++14 中使用 auto 关键字来实现泛型参数。

return type 是返回值类型,用于指定 Lambda表达式的返回值类型,可以省略,表示由编译器根据函数体推导,也可以使用 -> 符号显式指定,还可以在 c++14 中使用 auto 关键字来实现泛型返回值。

function body是函数体,用于表示 Lambda表达式的具体逻辑,可以是一条语句,也可以是多条语句,还可以在 c++14 中使用 constexpr 来实现编译期计算。

参考链接:https://blog.csdn.net/m0_60134435/article/details/136151698

(4)函数包装器

函数有三种:自由函数、成员函数、lambda函数,函数包装器就是为了统一这几种函数的调用的。

#include<iostream>
#include<functional>

//自由函数
void save_with_free_fun(const std::string& file_name)
{
    std::cout << "自由函数:" << file_name << std::endl;
}

//成员函数
class FileSave
{
private:

public:
    FileSave()=default;
    ~FileSave()=default;
    void save_with_member_fun(const std::string& file_name)
    {
        std::cout << "成员函数:" << file_name << std::endl;
    };    
};

int main() 
{
    FileSave file_save;

    //Lambda函数
    auto save_with_lambda_fun = [](const std::string& file_name) -> void
    {
        std::cout << "Lambda函数:" << file_name << std::endl;
    };

    // save_with_free_fun("file.txt");
    // file_save.save_with_member_fun("file.txt");
    // save_with_lambda_fun("file.txt");

    std::function<void(const std::string&)> save1 = save_with_free_fun;
    std::function<void(const std::string&)> save2 = save_with_lambda_fun;
    //成员函数,放入包装器
    std::function<void(const std::string&)> save3 = std::bind(&FileSave::save_with_member_fun, &file_save, std::placeholders::_1);

    //统一的调用方法
    save1("file.txt");
    save2("file.txt");
    save3("file.txt");
    return 0;
}


linux环境变量

  • echo:输出打印指令

    • 例如:echo hello_wolrd

    • echo ROS_VERSION

  • printenv:输出所有的环境变量

  • printenv | grep AMENT:输出有关AMENT的环境变量

  • export AMENT_PREFIX_PATH=/opt/ros/:修改环境变量的值

    • 原来的值为:/opt/ros/humble

    • 改变的环境变量只在当前终端生效,新开的终端将还是原来的值

    • 此处涉及到终端启动的一个默认脚本的相关内容,只要打开终端就会运行.bashrc这个脚本

      • ls -a:显示出当前目录下的全部文件(包含隐含文件)

      • cat ~/.bashrc:打开.bashrc文件

      • 最后有一行:source /opt/ros/humble/setup.bash

        • 这就是用来设置ros环境变量的,如果注释掉ros将无法运行


ros节点

  1. 修改环境变量来修改终端输出日志:export RCUTILS_CONSOLE_OUTPUT_FORMAT=[{function_name}:{line_number}]:{message}

    1. 输出将会从[时间戳]变为[文件名字:行数]

  2. 展示节点列表:ros2 node list

  3. 查看节点具体信息:ros2 node info 节点名字

    1. 例如:ros2 node info /cpp_node

1. 创建python功能包:

  1. 输入ros2,输出一些与ros2有关的子命令,有一个pkg

  2. 输入ros2 pkg ,输出一些关于pkg的指令

  3. 输入ros2 pkg create --help

  4. 创建功能包:ros2 pkg create --build-type ament_python --license Apache-2.0 demo_python_pkg

--构建类型 --协议 功能包名字

  1. setup.pyentry_points处添加代码'python_node = demo_python_pkg.python_node:main',成为如下:

    entry_points={
        'console_scripts': [
            'python_node = demo_python_pkg.python_node:main'
        ],
    },
  1. 在功能包清单文件package.xml中添加依赖rclpy,成为如下:

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>demo_python_pkg</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="wros@todo.todo">wros</maintainer>
  <license>Apache-2.0</license>

  <depend>rclpy</depend>
  <test_depend>ament_copyright</test_depend>
  <test_depend>ament_flake8</test_depend>
  <test_depend>ament_pep257</test_depend>
  <test_depend>python3-pytest</test_depend>

  <export>
    <build_type>ament_python</build_type>
  </export>
</package>
  1. 构建功能包:colcon build

扫描当前文件夹下的功能包,并且进行构建

  1. 更新环境变量:source install/setup.bash

  2. 运行功能包:ros2 run demo_python_pkg python_node

2. 创建c++功能包:

  1. 创建功能包:ros2 pkg create --build-type ament_cmake --license Apache-2.0 demo_cpp_pkg

  2. 编写代码:在src文件夹下添加文件cpp_node.cpp,再添加代码

  3. 编辑CMakeLists,添加如下代码:(修改可执行文件名字:改为cpp_node)

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)   #直接查找对应的头文件和库文件
# uncomment the following section in order to fill in
# further dependencies manually. 
# find_package(<dependency> REQUIRED)

add_executable(cpp_node src/cpp_node.cpp)

# message(STATUS ${rclcpp_INCLUDE_DIRS})  #打印出头文件及rclcpp依赖的头文件
# message(STATUS ${rclcpp_LIBRARIES}) #打印出库文件及rclcpp依赖的库文件

# target_include_directories(cpp_node PUBLIC ${rclcpp_INCLUDE_DIRS}) #头文件包含
# target_link_libraries(cpp_node ${rclcpp_LIBRARIES})    #库文件链接 
ament_target_dependencies(cpp_node rclcpp)
  1. 为了拷贝文件到install文件夹下,在CMakeList.txt中再次添加如下指令

install(TARGETS cpp_node
    DESTINATION lib/${PROJECT_NAME}
)
  1. 进行编译,输入colcon build指令

  2. 更新环境变量,输入source install/setup.bash

  3. 运行,输入ros2 run demo_cpp_pkg cpp_node,成功运行

  4. 注:最好在package.xml中声明使用的rclcpp包,加入代码: rclcpp

3. 多功能包的构建

  1. 创建一个文件夹,mkdie -p chapt2_ws/src

  2. 移动包:mv demo_cpp_pkg/ chapt2_ws/src/ , mv demo_python_pkg/ chapt2_ws/src/

  1. 移除文件:rm -rf build/ install/ log/

  2. 进入工作空间:cd chapt2_ws/

  3. 构建:colcon build

    1. 可以选择指定文件构建:colcon build --packages-select demo_cpp_pkg

    2. 更改构建顺序:将cpp的包添加为python的依赖

    3. 注:构建是在构建命令运行的文件夹下

4. 多线程与回调函数

(1)py版本

(2)C++版本