1.ubuntu与windows复制粘贴:
sudo apt-get autoremove open-vm-tools
sudo apt-get install open-vm-tools-desktop
reboot
2.1键安装ros2与vscode:
wget http://fishros.com/install -O fishros && . fishros
1.vscode 安装插件 :
chinese
C/C++ IntelliSense
python
Makefile Tools
CMake
CMake Highlight
CMake Tools
vscode-icons
ROS
Msg Language Support
XML
URDF
IntelliCode
Markdown
Markdown All in One
3.安装cmake:
sudo apt install cmake
4.安装git:
sudo apt install git
5.测试安装
启动倾听者:ros2 run demo_nodes_py listener
启动说话者:ros2 run demo_nodes_py listener
涂鸦乌龟:
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
1.ros2简介:
要说ROS2替代ROS,ROS就是机器人操作系统,英文全称(Robot Operating System),但ROS本身并不是一个操作系统,而是可以安装在现在已有的操作系统上(Linux、Windows、Mac)上的软件库和工具集。
ROS出生于2007年,ROS的出现解决了机器人各个组件之间的通信问题,同时基于ROS的完善的通信机制,越来越多的优秀的机器人算法集成到了ROS中来。
现在的ROS功能已经变得非常的丰富和强大。但随着对ROS功能上要求越来越多,一些原始的架构和设计不能够满足目前的使用需求,这也是ROS2出现的原因。
ROS2继承了ROS原有的优秀之处,同时又带来了很多新的功能,ROS2相对于ROS更加的强大。
2.ros2底层是dds,ros对dds进行了一些封装,封装的库为rclcpp(给C++使用),rclpy(给python3使用)。
3.ROS2中每一个节点也是只负责一个单独的模块化的功能(比如一个节点负责控制车轮转动,一个节点负责从激光雷达获取数据、一个节点负责处理激光雷达的数据、一个节点负责定位等等)。
4.节点之间通讯方式:
话题-topics
服务-services
动作-Action
参数-parameters
5.ROS2工作空间
ros2 run 包名字 可执行文件名字
那你有没有想过,我们想找到一个节点(可执行文件),就必须要先知道它在哪个包,那问题就来了,想要找到某个包,该去哪里找?
答案就是:工作空间
注意:一个工作空间下可以有多个功能包,一个功能包可以有多个节点存在。
6.功能包是什么
功能包可以理解为存放节点的地方,ROS2中功能包根据编译方式的不同分为三种类型。
ament_python,适用于python程序
cmake,适用于C++
ament_cmake,适用于C++程序,是cmake的增强版
7.功能包获取的两种方式
1.安装获取
sudo apt install ros-
安装获取会自动放置到系统目录,不用再次手动source。
2. 手动编译获取
什么时候需要手动编译呢?一般我们能安装的功能包都是作者编译好程序将可执行文件上传到仓库 中,然后我们才能够通过apt进行安装,如果作者还没来得及测试上传,或者忘记了测试上传,就会找不到对应的包,这时候就需要手动编译安装了。
另外一种就是我们需要对包的源码进行修改,这个时候也需要自己编译修改。
8.与功能包相关的指令 ros2 pkg
create Create a new ROS2 package
executables Output a list of package specific executables
list Output a list of available packages
prefix Output the prefix path of a package
xml Output the XML of the package manifest or a specific tag
1.创建功能包
ros2 pkg create
2.列出所有可执行文件
ros2 pkg executables
3.列出特定功能包的可执行文件(例如 turtlesim)
ros2 pkg executables turtlesim
4.列出所有的包
ros2 pkg list
5.输出某个包所在路径的前缀
ros2 pkg prefix
6.列出包的清单描述文件
每一个功能包都有一个标配的manifest.xml文件,用于记录这个包的名字,构建工具,编译信息,拥有者,干啥用的等信息。
通过这个信息,就可以自动为该功能包安装依赖,构建时确定编译顺序等
查看小乌龟模拟器功能包的信息。
ros2 pkg xml turtlesim
9.colcon编译工具
colcon其实是一个功能包构建工具,这个工具用来做什么的呢?
简单点说就是用来编译代码的,上几节跟大家讲了如何进行ROS2工作空间的创建,但没有说如何进行编译,其实就是用colcon。ROS2默认是没有安装colcon的。
1.安装colcon
如果使用一键安装ROS2,会帮你安装好这个工具,以防万一我们再装一次,打开终端复制粘贴进去即可。
sudo apt-get install python3-colcon-common-extensions
2. 只编译一个包
colcon build --packages-select YOUR_PKG_NAME
3. 不编译测试单元
colcon build --packages-select YOUR_PKG_NAME --cmake-args -DBUILD_TESTING=0
4.编译所有包
colcon build
5.运行编译的包的测试
colcon test
6.允许通过更改src下的部分文件来改变install(重要)
每次调整 python 脚本时都不必重新build了
colcon build --symlink-install
9.ros2程序编写
ros2的程序与运行需要在cli(命令行)里面输入:
ros2 run pkg_name node_name #如果不知到包里面的节点名字,可以使用 ros2 pkg executables pkg_name 显示出来包里面能运行的所有的节点名字。
所以ros2的每个程序可以比为一个包,而节点可以当作程序(包)的输入参数。 已经存在的apt管理的包可以直接通过apt命令安装,自己编译包需要使用ros2包创建。
ros2的程序包使用命令创建:
ros2 pkg create pkg_name --build-type ament_cmake --dependencies rclcpp #rclcpp是ros2程序的依赖项。
创建后的目录树如:
└── pkg_name
├── CMakeLists.txt
├── include
│ └── pkg_name
├── package.xml
└── src
编写的程序C++文件需要放置在src目录,然后在CMakeLists.txt里面末尾添加:
add_executable(node_name src/main.cpp)
ament_target_dependencies(node_name rclcpp)
install(TARGETS
node_name
DESTINATION lib/${PROJECT_NAME}
)
#注意:node_name对应自己想生成的节点名字,main.cpp对应自己的C++文件。
在src文件里面放置编写好的文件,使用colcon工具进行编译,编译完成之后source ./install/setup.bash 环境变量,运行生成的节点:
colcon build #编译生成install等文件夹,以及执行文件和中间文件放置在各个目录里面。
source ./install/setup.bash #在命令行里面添加环境变量。
ros2 run pkg_name node_name #执行生成的节点。
编译后文件夹里面内容如下:
klppc@klppc-Vostro-3449:~/ws/ros2learn/test/pkg_name$ colcon build
Starting >>> pkg_name
Finished <<< pkg_name [6.16s]
Summary: 1 package finished [8.63s]
klppc@klppc-Vostro-3449:~/ws/ros2learn/test/pkg_name$ ls
build CMakeLists.txt include install log package.xml src
klppc@klppc-Vostro-3449:~/ws/ros2learn/test/pkg_name$ tree .
.
├── build
│ ├── COLCON_IGNORE
│ └── pkg_name
│ ├── ament_cmake_core
│ │ ├── package.cmake
│ │ ├── pkg_nameConfig.cmake
│ │ ├── pkg_nameConfig-version.cmake
│ │ └── stamps
│ │ ├── ament_prefix_path.sh.stamp
│ │ ├── nameConfig.cmake.in.stamp
│ │ ├── nameConfig-version.cmake.in.stamp
│ │ ├── package_xml_2_cmake.py.stamp
│ │ ├── package.xml.stamp
│ │ ├── path.sh.stamp
│ │ └── templates_2_cmake.py.stamp
│ ├── ament_cmake_environment_hooks
│ │ ├── ament_prefix_path.dsv
│ │ ├── local_setup.bash
│ │ ├── local_setup.dsv
│ │ ├── local_setup.sh
│ │ ├── local_setup.zsh
│ │ ├── package.dsv
│ │ └── path.dsv
│ ├── ament_cmake_index
│ │ └── share
│ │ └── ament_index
│ │ └── resource_index
│ │ ├── package_run_dependencies
│ │ │ └── pkg_name
│ │ ├── packages
│ │ │ └── pkg_name
│ │ └── parent_prefix_path
│ │ └── pkg_name
│ ├── ament_cmake_package_templates
│ │ └── templates.cmake
│ ├── ament_cmake_uninstall_target
│ │ └── ament_cmake_uninstall_target.cmake
│ ├── ament_cppcheck
│ ├── ament_lint_cmake
│ ├── ament_uncrustify
│ ├── ament_xmllint
│ ├── cmake_args.last
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ │ ├── 3.22.1
│ │ │ ├── CMakeCCompiler.cmake
│ │ │ ├── CMakeCXXCompiler.cmake
│ │ │ ├── CMakeDetermineCompilerABI_C.bin
│ │ │ ├── CMakeDetermineCompilerABI_CXX.bin
│ │ │ ├── CMakeSystem.cmake
│ │ │ ├── CompilerIdC
│ │ │ │ ├── a.out
│ │ │ │ ├── CMakeCCompilerId.c
│ │ │ │ └── tmp
│ │ │ └── CompilerIdCXX
│ │ │ ├── a.out
│ │ │ ├── CMakeCXXCompilerId.cpp
│ │ │ └── tmp
│ │ ├── cmake.check_cache
│ │ ├── CMakeDirectoryInformation.cmake
│ │ ├── CMakeOutput.log
│ │ ├── CMakeRuleHashes.txt
│ │ ├── CMakeTmp
│ │ ├── Makefile2
│ │ ├── Makefile.cmake
│ │ ├── pkg_name_uninstall.dir
│ │ │ ├── build.make
│ │ │ ├── cmake_clean.cmake
│ │ │ ├── compiler_depend.make
│ │ │ ├── compiler_depend.ts
│ │ │ ├── DependInfo.cmake
│ │ │ └── progress.make
│ │ ├── progress.marks
│ │ ├── TargetDirectories.txt
│ │ └── uninstall.dir
│ │ ├── build.make
│ │ ├── cmake_clean.cmake
│ │ ├── compiler_depend.make
│ │ ├── compiler_depend.ts
│ │ ├── DependInfo.cmake
│ │ └── progress.make
│ ├── cmake_install.cmake
│ ├── colcon_build.rc
│ ├── colcon_command_prefix_build.sh
│ ├── colcon_command_prefix_build.sh.env
│ ├── CTestConfiguration.ini
│ ├── CTestCustom.cmake
│ ├── CTestTestfile.cmake
│ ├── install_manifest.txt
│ └── Makefile
├── CMakeLists.txt
├── include
│ └── pkg_name
├── install
│ ├── COLCON_IGNORE
│ ├── local_setup.bash
│ ├── local_setup.ps1
│ ├── local_setup.sh
│ ├── _local_setup_util_ps1.py
│ ├── _local_setup_util_sh.py
│ ├── local_setup.zsh
│ ├── pkg_name
│ │ └── share
│ │ ├── ament_index
│ │ │ └── resource_index
│ │ │ ├── package_run_dependencies
│ │ │ │ └── pkg_name
│ │ │ ├── packages
│ │ │ │ └── pkg_name
│ │ │ └── parent_prefix_path
│ │ │ └── pkg_name
│ │ ├── colcon-core
│ │ │ └── packages
│ │ │ └── pkg_name
│ │ └── pkg_name
│ │ ├── cmake
│ │ │ ├── pkg_nameConfig.cmake
│ │ │ └── pkg_nameConfig-version.cmake
│ │ ├── environment
│ │ │ ├── ament_prefix_path.dsv
│ │ │ ├── ament_prefix_path.sh
│ │ │ ├── path.dsv
│ │ │ └── path.sh
│ │ ├── hook
│ │ │ ├── cmake_prefix_path.dsv
│ │ │ ├── cmake_prefix_path.ps1
│ │ │ └── cmake_prefix_path.sh
│ │ ├── local_setup.bash
│ │ ├── local_setup.dsv
│ │ ├── local_setup.sh
│ │ ├── local_setup.zsh
│ │ ├── package.bash
│ │ ├── package.dsv
│ │ ├── package.ps1
│ │ ├── package.sh
│ │ ├── package.xml
│ │ └── package.zsh
│ ├── setup.bash
│ ├── setup.ps1
│ ├── setup.sh
│ └── setup.zsh
├── log
│ ├── build_2023-10-15_18-34-40
│ │ ├── events.log
│ │ ├── logger_all.log
│ │ └── pkg_name
│ │ ├── command.log
│ │ ├── stderr.log
│ │ ├── stdout.log
│ │ ├── stdout_stderr.log
│ │ └── streams.log
│ ├── COLCON_IGNORE
│ ├── latest -> latest_build
│ └── latest_build -> build_2023-10-15_18-34-40
├── package.xml
└── src
└── main.cpp
49 directories, 108 files