ROS2开发快速入门:从ROS1到ROS2实战指南

ROS2开发快速入门:从ROS1到ROS2实战指南
适合有ROS1基础的宝宝们参考文献第1章 ROS2概述与环境搭建 · GitBook、鱼香ROS《ROS2机器人开发入门与实践》写在前面ROS2中通信机制跟ROS1还是差不多的话题/服务/动作通信通信的数据载体称为接口msg、srv、action文件ROS2中没有master主节点概念同时将基于TCP/UDP的通信协议替换成DDSROS2分布式通讯中需要设置相同的DOMAIN_ID ,DDS以及允许跨机通信在ROS2中大部分封装采用面向对象特征需要稍微复习一下面向对象ROS1 AND ROS21.安装ROS21.1 鱼香ROS一键安装wget http://fishros.com/install -O fishros . fishros小鱼的一键安装系列 | 鱼香ROShttps://fishros.org.cn/forum/topic/20/%E5%B0%8F%E9%B1%BC%E7%9A%84%E4%B8%80%E9%94%AE%E5%AE%89%E8%A3%85%E7%B3%BB%E5%88%971.2 构建系统与构建工具两者的区分点在于针对的对象不同构建系统只针对一个单独的包进行构建而构建工具重点在于按照依赖关系依次调用构建系统完成一系列功能包的构建。ROS中用到的构建系统CMake, ament_cmake, catkin, Python setuptools.ROS中用到的构建工具colcon、catkin_make、catkin_make_isolated、catkin_tools。colcon作为构建工具通过调用CMake, Python setuptools完成构建。构建过程中colcon会按照依赖关系按顺序对功能包进行编译安装所有依赖都是从环境变量或本地路径进行查找不允许路径中出现两个同名的功能包。若在构建过程中没有找到相应的功能包colcon不会报错而会继续构建。1.3 构建工具Colcon安装sudo apt install python3-colcon-common-extensions1.4 工作空间及编译流程mkdir -p ws_alina/src #创建工作空间以及子级目录 src工作空间名称可以自定义 cd ws_alina #进入工作空间 colcon build #编译工作空间目录结构WorkSpace --- 自定义的工作空间。 |--- build存储中间文件的目录该目录下会为每一个功能包创建一个单独子目录。 |--- install安装目录该目录下会为每一个功能包创建一个单独子目录。 |--- log日志目录用于存储日志文件。 |--- src用于存储功能包源码的目录。 |-- C功能包 |-- package.xml包信息比如:包名、版本、作者、依赖项。 |-- CMakeLists.txt配置编译规则比如源文件、依赖项、目标文件。 |-- srcC源文件目录。 |-- include头文件目录。 |-- msg消息接口文件目录。 |-- srv服务接口文件目录。 |-- action动作接口文件目录。 |-- Python功能包 |-- package.xml包信息比如:包名、版本、作者、依赖项。 |-- setup.py与C功能包的CMakeLists.txt类似。 |-- setup.cfg功能包基本配置文件。 |-- resource资源目录。 |-- test存储测试相关文件。 |-- 功能包同名目录Python源文件目录。相比catkincolcon少了devel目录bulid存储中间文件的目录该目录下会为每一个功能包创建一个单独子目录。install安装目录该目录下会为每一个功能包创建一个单独子目录。log日志目录用于存储日志文件。colcon build 参数[可选参数]参数作用可选值--symlink-install使用符号链接代替复制文件。开发中比较常用无--cmake-args向基于CMake的包传递参数。-DCMAKE_BUILD_TYPEDebug / Release--packages-select pkg1 pkg2 #仅生成单个包或选定的包 --packages-ignore pkg1 pkg2 #忽略构建选定的包 --packages-up-to my_pkg #构建选定的包包括其依赖项 --packages-above #整个工作区然后对其中一个包进行了更改。此指令将重构此包,以及递归地重构依赖于此包的所有包colcon构建工具 - sgqmax - 博客园https://www.cnblogs.com/sgqmax/p/185211441.5 功能包创建cd ~/ros2_ws/src ros2 pkg create [可选参数] 功能包名称 # 创建C包 ros2 pkg create --build-type ament_cmake package_name # 或创建Python包 ros2 pkg create --build-type ament_python package_name #示例 ros2 pkg create cpp_demo --build-type ament_cmake --dependencies rclcpp std_msgs --license Apache-2.0[可选参数]参数作用可选值--build-type指定构建系统类型ament_cmakeC、ament_pythonPython、cmake传统CMake--dependencies声明依赖的ROS2包空格分隔多个依赖如rclcpp、rclpy、std_msgs等--license指定开源许可证Apache-2.0、MIT、BSD等--help显示该命令的所有参数说明及使用方法无1.6 常用命令这些命令往往可以结合grep来查找分类命令说明示例节点ros2 node list列出所有运行中的节点ros2 node listros2 node info node_name查看节点的详细信息订阅/发布的话题、服务等ros2 node info /turtlesim话题ros2 topic list列出所有活动的话题ros2 topic list -t同时显示类型ros2 topic echo topic_name实时打印话题上的消息ros2 topic echo /turtle1/cmd_velros2 topic info topic_name查看话题的类型、发布者/订阅者数量ros2 topic info /turtle1/poseros2 topic info topic_name--verbose查看话题的类型、发布者/订阅者详细信息ros2 topic info /turtle1/pose--verboseros2 topic pub topic_name msg_type data手动发布消息到话题ros2 topic pub /turtle1/cmd_vel geometry_msgs/Twist {linear: {x: 1.0}}ros2 topic hz topic_name统计话题的发布频率ros2 topic hz /turtle1/poseros2 topic bw topic_name估算话题的带宽ros2 topic bw /camera/image_rawros2 topic find msg_type按消息类型查找话题ros2 topic find geometry_msgs/Twistros2 topic delay topic_name测量消息端到端延迟需含时间戳ros2 topic delay /scan服务ros2 service list列出所有活动的服务ros2 service list -t同时显示类型ros2 service type service_name查看服务的类型ros2 service type /spawnros2 service find srv_type按服务类型查找服务ros2 service find std_srvs/Emptyros2 service call service_name srv_type request手动调用服务ros2 service call /clear std_srvs/Emptyros2 service info service_name查看服务的客户端/服务器信息ros2 service info /spawn参数ros2 param list列出所有节点的参数ros2 param listros2 param get node_name param_name获取指定参数的当前值ros2 param get /turtlesim background_gros2 param set node_name param_name value动态设置参数临时ros2 param set /turtlesim background_g 100ros2 param dump node_name将节点的参数保存为 YAML 文件ros2 param dump /turtlesimros2 param load node_name param_file从 YAML 文件加载参数ros2 param load /turtlesim ./turtlesim.yamlros2 param delete node_name param_name删除参数ros2 param delete /my_node unused_param接口ros2 interface list列出所有可用的接口msg/srv/actionros2 interface listros2 interface show interface_type查看接口的详细定义ros2 interface show geometry_msgs/Twistros2 interface package package_name列出指定包内的所有接口ros2 interface package sensor_msgsros2 interface proto interface_type查看接口的原型含默认值ros2 interface proto turtlesim/Spawn动作ros2 action list列出所有活动的动作ros2 action list -t同时显示类型ros2 action info action_name查看动作的客户端/服务器信息ros2 action info /turtle1/rotate_absoluteros2 action send_goal action_name action_type goal手动发送动作目标ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute {theta: 1.57}启动ros2 launch pkg launch_file使用 launch 文件启动多个节点ros2 launch turtlesim multisim.launch.py运行ros2 run pkg executable运行单个节点ros2 run turtlesim turtlesim_node包ros2 pkg list列出所有已安装的功能包ros2 pkg listros2 pkg executable pkg列出包中的所有可执行文件ros2 pkg executable turtlesim2.通信机制2.1.1 支持的数据类型IDL 类型C 类型Python 类型说明boolboolbool布尔值true 或 falsebyteuint8_tint单个字节charcharstr(长度为1)单个字符int8,uint8int8_t,uint8_tint8位有/无符号整数int16,uint16int16_t,uint16_tint16位有/无符号整数int32,uint32int32_t,uint32_tint32位有/无符号整数int64,uint64int64_t,uint64_tint64位有/无符号整数float32floatfloat32位单精度浮点数float64doublefloat64位双精度浮点数stringstd::stringstrUTF-8 编码的字符串wstringstd::u16stringstr16位宽字符字符串2.1话题通信发布/订阅模型通过定义接口message 作为数据载体在节点间传输数据一个节点可以有多个PublisherSubscriber,也就是说同一份消息可以发给不同的节点甚至是多个发送来源发送者单向通道pub-sub2.2 服务通信请求/响应 的应答机制模型自定义Service作为消息载体由客户端节点发送请求再由服务端节点返回响应。2.2.1在.srv中引用.msg本质上srv就是两个消息请求Request)、请求Request)所以引用msg相当于把一个定义完整的消息嵌入进来作为相应或者请求的一部分。编写srv文件# 请求部分引用了自定义消息 my_interfaces/msg/MyMsg my_interfaces/MyMsg request_data int32 request_id --- # 响应部分 bool success string message配置package.xml你需要在package.xml中声明两件事声明这是一个接口包添加以下内容告诉构建系统这个包需要生成接口代码。buildtool_dependrosidl_default_generators/buildtool_depend exec_dependrosidl_default_runtime/exec_depend #主要是下面这个来声明该功能包是个消息接口 export member_of_grouprosidl_interface_packages/member_of_group /export声明对消息包的依赖因为你引用了my_interfaces包中的消息所以必须声明对其的构建依赖。xmlbuild_dependmy_interfaces/build_depend exec_dependmy_interfaces/exec_depend查找依赖包在CMakeLists.txt中使用find_package查找所有依赖。find_package(rosidl_default_generators REQUIRED) find_package(my_interfaces REQUIRED) # 查找你引用的消息包生成接口代码调用rosidl_generate_interfaces函数在DEPENDENCIES中列出所有被引用的消息包。rosidl_generate_interfaces(${PROJECT_NAME} srv/MyService.srv DEPENDENCIES my_interfaces # 这里声明了依赖是关键 )2.1.1 自定义message在功能包中新建msg文件夹创建并编辑.msg文件编辑配置文件CMakeLists.txtfind_package(geometry_msgs REQUIRED) find_package(rosidl_default_generators REQUIRED) rosidl_generate_interfaces(${PROJECT_NAME} msg/message_name.msg DEPENDENCIES geometry_msgs # Add packages that above messages depend on, in this case geometry_msgs for Sphere.msg )package.xml!-- 同时声明构建依赖和运行依赖 -- dependgeometry_msgs/depend !--声明构建工具依赖-- buildtool_dependrosidl_default_generators/buildtool_depend !--声明运行时依赖-- exec_dependrosidl_default_runtime/exec_depend !--声明当前包关联依赖组-- member_of_grouprosidl_interface_packages/member_of_group测试source install/setup.bash ros2 interface show tutorial_interfaces/msg/message_name