.png)
ROS基础
ros2安装
更新:
sudo apt update
下载一个工具:
wget http://fishros.com/install -O fishros
运行工具:
. fishros
测试:
ros2
海龟模拟:
ros2 run turtlesim turtlesim_node
键盘节点:
ros2 run turtlesim turtle_teleop_key
新终端输入:
rqt
工具栏选择Plugins/Introspection/Node Graph,即可查看到当前运行的节点关系
linux相关指令
查看文件路径:whereis 文件名
查看当前终端的路径:pwd
创建文件夹命令:mkdir 文件夹名字
例如:
mkdir chapt1
即可创建一个名字为 chapt1 的文件夹
创建文件:touch 名字
例如:
touch hello_world.txt
即可创建一个名字为 hello_world 的 txt 文件
删除文件:rm
强制删除文件夹:rm -r 文件夹名
强制删除文件:rm -f 文件名
编辑文件:nano 名字
例如:
nano hello_world.txt
即可在终端编辑文件
contro+o 保存
contro+x 退出
查看文件内容:cat 文件名字
例如:
cat hello_world.txt
即可在终端输出文件中的内容
安装deb格式文件:sudo dpkg -i ./文件名字
例如:
sudo dpkg -i ./code_1.77.0-1680085573_amd64.deb
-i表示install 安装
./表示当前目录
给文件增加可执行权限:chmod a+x 文件名
例如:
chmod a+x hello_world.py
改文件名字:mv
例如:
mv CMakeLists.txt CMakeLists.txt.back
linux之间传输文件或者文件夹:scp指令,例子如下
传输文件夹:
scp -r chapt2/ wros@192.168.1.31:/home/wros/
传输文件:
scp -r test_argc.cpp wros@192.168.1.31:/home/wros/
ldd命令:例如
ldd cpp_node
,可以查看cpp_node文件依赖哪些库,并且这些库有没有正确链接上。find命令:查找文件的位置,格式:find <指定目录> <指定条件> <指定动作>
例如
find / -name whitelist.json
压缩与解压rar文件
(1)安装工具
sudo apt-get install rar
sudo apt-get install unrar
(2)执行解压
unrar x test.rar
C++相关内容
1. CMakeLists:
直接新建文件名字为:CMakeLists.txt
输入代码如下:
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)
cmake .
当前文件夹进行cmake,生成make指令
make
编译文件
./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节点
修改环境变量来修改终端输出日志:
export RCUTILS_CONSOLE_OUTPUT_FORMAT=[{function_name}:{line_number}]:{message}
输出将会从[时间戳]变为[文件名字:行数]
展示节点列表:
ros2 node list
查看节点具体信息:ros2 node info 节点名字
例如:
ros2 node info /cpp_node
1. 创建python功能包:
输入ros2,输出一些与ros2有关的子命令,有一个pkg
输入ros2 pkg ,输出一些关于pkg的指令
输入
ros2 pkg create --help
创建功能包:
ros2 pkg create --build-type ament_python --license Apache-2.0 demo_python_pkg
--构建类型 --协议 功能包名字
在
setup.py
下entry_points
处添加代码'python_node = demo_python_pkg.python_node:main'
,成为如下:
entry_points={
'console_scripts': [
'python_node = demo_python_pkg.python_node:main'
],
},
在功能包清单文件
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>
构建功能包:
colcon build
扫描当前文件夹下的功能包,并且进行构建
更新环境变量:
source install/setup.bash
运行功能包:
ros2 run demo_python_pkg python_node
2. 创建c++功能包:
创建功能包:
ros2 pkg create --build-type ament_cmake --license Apache-2.0 demo_cpp_pkg
编写代码:在src文件夹下添加文件cpp_node.cpp,再添加代码
编辑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)
为了拷贝文件到install文件夹下,在CMakeList.txt中再次添加如下指令
install(TARGETS cpp_node
DESTINATION lib/${PROJECT_NAME}
)
进行编译,输入
colcon build
指令更新环境变量,输入
source install/setup.bash
运行,输入
ros2 run demo_cpp_pkg cpp_node
,成功运行注:最好在package.xml中声明使用的rclcpp包,加入代码:
rclcpp
3. 多功能包的构建
创建一个文件夹,
mkdie -p chapt2_ws/src
移动包:
mv demo_cpp_pkg/ chapt2_ws/src/
,mv demo_python_pkg/ chapt2_ws/src/
移除文件:
rm -rf build/ install/ log/
进入工作空间:
cd chapt2_ws/
构建:
colcon build
可以选择指定文件构建:
colcon build --packages-select demo_cpp_pkg
更改构建顺序:将cpp的包添加为python的依赖
注:构建是在构建命令运行的文件夹下
4. 多线程与回调函数
(1)py版本
(2)C++版本
- 感谢你赐予我前进的力量