文章目录
前言
ROS在Ubuntu的基础上实现了一套机器人操作系统框架。ROS并非是像Linux那样的操作系统,它只是连接了操作系统和你开发的ROS应用程序,所以它也算是一个中间件,基于ROS的应用程序之间建立起了沟通的桥梁,所以也是运行在Linux上的运行时环境,在这个环境上,机器人的感知、决策、控制算法可以更好的组织和运行。
一、认识ROS提供的命令行工具
启动一个节点,ros中一个节点就是一个可执行文件
ros2 run <package_name> <executable_name>
nodes
实际就是一个进程
ros2 node list
ros2 node info <node_name> # 查看节点的通讯方式pub-sub, cli-serv, action, 及其数据类型
topics
DDS中的topic
每种topic都有ROS内置的topic_type,这里(https://docs.ros.org/en/humble/Concepts/Basic/About-Interfaces.html)说明了如何定义ROS支持的数据类型。
ros2 topic list
ros2 topic list -t # 查看所有topic及其类型
ros2 topic echo <topic_name> # 打印topic数据
ros2 topic info <topic_name> # 显示topic的type,pub num and sub num
ros2 interface show <msg_type> # 显示接口信息
ros2 topic pub <topic_name> <msg_type> '<args>'
ros2 topic hz <topic_name> # 频率
services
ROS2 的 client-serve 通讯模式,类似HTTP/TCP/IP一样
ros2 service list
ros2 service list -t
ros2 service type <service_name> # node info <node_name>看的更全
ros2 service find <type_name> # 查看使用该type的name
ros2 interface show <type_name> # 显示接口信息
ros2 service call <service_name> <service_type> <arguments> # 向某个服务发送请求
parameters
节点配置信息,可以是环境变量
ros2 param list
ros2 param get <node_name> <parameter_name>
ros2 param set <node_name> <parameter_name> <value>
ros2 param dump <node_name> # 转存节点配置文件
ros2 param load <node_name> <parameter_file> # 加载配置文件
ros2 run <package_name> <executable_name> --ros-args --params-file <file_name> #启动时加载指定的配置文件(inclue read-only)
actions
Actions是ROS2中的通讯类型之一,用于长时间运行的任务。它们由三部分组成:目标、反馈和结果。
Actions建立在topics和services之上。它们的功能与服务类似,只是可以取消操作。它们还提供稳定的反馈,而不是返回单个相应的服务。
Actions使用client-server模型,“action client”节点将目标发送到“action serve”节点,该节点确认目标并返回反馈流和结果。
【客户端的第二次请求似乎有些多余?示例代码看上去像是:client发送请求,serv返回相应,serv返回feedback,最后serv返回result】
ros2 action list
rso2 action list -t
ros2 action info <action_name>
ros2 interface show <action_type>
ros2 action send_goal <action_name> <action_type> <values>
ros2 action send_goal /turtle1/rotate_absolute trutlesim/action/RotateAbsolute "{theta: -1.5}" --feedback
rqt_console, rqt_graph
rqt_console可看日志
rqt_graph可看所有topic
批量启动多个节点
ros2 launch turtlesim multisim.launch.py
recorde and play
rosbag录制与回放
ros2 bag record <topic_name>
ros2 bag record -o <user_dir> <topic1> [topic2 topic3]
ros2 bag record -a # 记录所有topic
ros2 bag info <bag_file_name>
ros2 bag play <bag_file_name>
c++基础pub-sub
- 利用ros提供的工具在~/ros2_ws目录下创建package
cd ~/ro2_ws/src && ros2 pkg create --build-type ament_cmake --license Apache-2.0 cpp_pub_sub --dependencies rclcpp [example_interfaces] - 在生成的src目录下添加源文件publisher.cpp和subscriber.cpp
https://raw.githubusercontent.com/ros2/examples/humble/rclcpp/topics/minimal_publisher/member_function.cpp
https://raw.githubusercontent.com/ros2/examples/humble/rclcpp/topics/minimal_subscriber/member_function.cpp - 修改CMakeLists.txt文件和package.xml文件
由于在第1步指明了rclcpp依赖所以cma和xml文件应该已经有了该依赖,只需将其他的依赖添加进去即可find_package(std_msgs REQUIRED) add_executable(publisher src/publisher.cpp) ament_target_dependencies(publisher rclcpp std_msgs) add_executable(subscriber src/subscriber.cpp) ament_target_dependencies(subscriber rclcpp std_msgs) install(TARGETS subscriber publisher DESTINATION lib/${PROJECT_NAME})
<depend>std_msgs</depend>
- colcon编译,安装,运行
cd ~/ro2_ws colcon build source install/setup.bash ros2 run cpp_pub_sub subscriber & ros2 run cpp_pub_sub publisher
1.5 ROS2和fastdds
https://fast-dds.docs.eprosima.com/en/stable/fastdds/ros2/ros2.html
ros2与Fast-DDS之间的接口:https://github.com/ros2/rmw_fastrtps。 ROS 2只允许配置部分QoS策略,而rmw_fastrtps提供了扩展的配置功能,以充分利用Fast DDS中的功能。
设置环境变量
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
1 改变订阅模式
ROS2 的rmw_fastrtps默认使用异步发布方式。通过环境变量RMW_FASTRTPS_PUBLICATION_MODE
改变模式
- ASYNCHRONOUS: 异步发布模式。当发布者调用write操作时,数据先拷贝到队列,后台线程(异步线程)收到队列添加通知。并且在实际发送数据之前将线程的控制权返回给用户。后台线程负责使用队列并将数据发送给每个匹配的读取器。
- SYNCHRONOUS:同步订阅模式,数据由用户线程直接发送,这意味着在写操作期间发生的任何阻塞调用都会阻塞用户线程,从而阻止应用程序继续其操作。值得注意的是,这种模式通常会在较低的延迟下产生更高的吞吐率,因为线程之间既没有通知也没有上下文切换。
- AUTO: 让Fast DDS选择发布模式。这意味着使用XML文件中设置的发布模式,或者使用Fast DDS中设置的默认值(FastDDS默认为SYNCHRONOUS)
除了ROS 2的QOS策略外,rmw_fastrtps还提供了两个额外的配置项:
rmw_fastrtps提供的额外配置参数 | 描述 | ROS2 中的默认值 |
---|---|---|
MemoryManagementPolicy | Fast DDS为发布者和订阅者的历史记录预分配的内存。当这些历史记录填满时,会进行重新分配以保留更多内存 | PREALLOCATED_WITH_REALLOC_MEMORY_MODE |
PublishModeQosPolicy | 数据是异步发送还是同步发送 | ASYNCHRONOUS_PUBLISH_MODE |
2 xml配置
在ROS2应用中使用FastDDS的某种特性,XML配置文件能够提供广泛的QOS策略配置支持。
- 如果rmw_QoS_profile_t(c++ object)中的任何QoS设置为*_SYSTEM_DEFAULT(c++value)以外的值,则XML中的相应值将被忽略。
- 默认情况下,rmw_fastrtps会覆盖MemoryManagementPolicy和PublishModeQosPolicy的值。这意味着XML中为这两个参数配置的值将被忽略。这两个值会默认重写为:PREALLOCATED_WITH_READLLOC_MEMORY_MODE和ASYNCRONOS_PUBLISH_MODE。
- 通过将环境变量RMW_FASTPS_USE_QOS_FROM_XML设置为1(其默认值为0),可以避免重写MemoryManagementPolicy和PublishModeQosPolicy。这将使rmw_fastrtps使用XML中为MemoryManagementPolicy和PublishModeQosPolicy定义的值。请记住,在XML中设置此环境变量而不设置这些策略会导致使用Fast DDS中的默认值。这些值与前面提到的rmw_fastrtps默认值不同(请参阅MemoryManagementPolicy和PublishModeQosPolicy)。
- 设置RMW_FASTRTPS_USE_QOS_FROM_XML(环境变量)生效会覆盖任何对RMW_FASTRTPS_PUBLICATION_MODE的任何配置,使用xml的配置,如果xml每配置该项,则使用fastDDS的默认值
- fastdds默认值
- rmw_fastrtps默认值
- 环境变量
- xml
- RMW_FASTRTPS_USE_QOS_FROM_XML=<0/1>
真的乱
3 指定xml位置
使用环境变量
export FASTRTPS_DEFAULT_PROFILES_FILE=<path_to_xml_file>
export RMW_FASTRTPS_USE_QOS_FROM_XML=1
ros2 run <package> <application>
可替代的方法:将 XML 文件放在运行的应用程序目录下,并命名为 DEFAULT_FASTRTPS_PROFILES.xml。
4 talker/listener通过发现服务器发送topic
如果过安装了ros2或者fastrtps会有一个Python脚本:fastdds
该工具可用于启动 fastdds的发现服务器
# 查看帮助
fastdds discovery -h
让ros node通过发现服务器通讯需要设置环境变量
export ROS_DISCOVERY_SERVER=127.0.0.1:11811
5 ros2 检视
如果设置了ROS_DISCOVERY_SERVER,ros2 topic list -t 命令不会打印出相应的topic,需要以SUPER_CLIENT
模式连接到发现服务器
下面的xml配置使得每个新的participant都作为SUPER_CLIENT
super_client_configuration_file.xml
<?xml version="1.0" encoding="UTF-8" ?>
<dds>
<profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
<participant profile_name="super_client_profile" is_default_profile="true">
<rtps>
<builtin>
<discovery_config>
<discoveryProtocol>SUPER_CLIENT</discoveryProtocol>
<discoveryServersList>
<RemoteServer prefix="44.53.00.5f.45.50.52.4f.53.49.4d.41">
<metatrafficUnicastLocatorList>
<locator>
<udpv4>
<address>192.168.31.18</address>
<port>60001</port>
</udpv4>
</locator>
</metatrafficUnicastLocatorList>
</RemoteServer>
</discoveryServersList>
</discovery_config>
</builtin>
</rtps>
</participant>
</profiles>
</dds>
6 远程fastdds程序与ros节点通讯
Fast-DDS & ros2 ros与fastdds通讯
二、安装
一个完整的 ROS 镜像,包含了 ROS 桌面完整版,其中包括了许多常用的工具、库和软件包。
docker pull osrf/ros:humble-desktop-full
ros官方:
Open Source Robotics Foundation:
三、catkin编译系统
catkin工作空间
tree参看5.
四、colcon构建系统
Linux version 6.5.0-27-generic (x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
Docker version 24.0.2, build cb74dfc
osrf/ros humble-desktop-full imageid:26438fe1f0c9
git clone https://github.com/ros2/examples src/examples -b humble
colcon build --symlink-install 在以上环境下,运行该命令系统死机
目录结构:
current_workspace:
build
install
log
src
package1
package2
…
colcon build # 构建当前目录current_workspace下的所有package
colcon test
source install/setup.bash # 构建好的包添加进环境变量
colcon_cd <some_ros_pacakge> # 切换到某个包的目录
- cd ~/ros2_ws/src
- ros2 pkg create --build-type ament_cmake --license Apache-2.0 <pacakge_name> # 创建包的标准流程
- ros2 pkg create --build-type ament_cmake --license Apache-2.0 --node-name my_node <pacakge_name>
- colcon build --packages-select <my_package>
- rosdep install -i --from-path src --rosdistro humble -y # 检查依赖
- ros2 pkg create --build-type ament_cmake --license Apache-2.0 <pacakge_name> --dependencies rclcpp example_interfaces
五、c++发布ROS包
-
创建ROS工作空间
首先,创建一个ROS工作空间,用于存放ROS包和节点mkdir -p ~/catkin_ws/src # 在~/catkin_ws/src目录下创建一个CMakeLists软连接 # 后面调用catkin编译的时候用? cd ~/catkin_ws/src catkin_init_workspace
-
创建ROS包:
在刚刚创建的src目录下创建一个ROS包cd ~/catkin_ws/src catkin_create_pkg my_package roscpp std_msgs
这将创建一个名为"my_package"的包,并添加了roscpp和std_msgs作为依赖项。可以根据需要添加其他依赖项。
~/catkin_ws/src目录下的内容,用户代码应该放入src目录下,白色的CMakeLists.txt是需要调整的内容 -
在上图中显示的src目录下添加源代码文件
#include "ros/ros.h" #include "std_msgs/String.h" int main(int argc, char**argv) { ros::init(argc, argv, "talker"); ros::NodeHandle n; ros::Publisher chat = n.advertise<std_msgs::String>("this_is_topic", 1000); ros::Rate loop_rate(10); // taking into account the calcu time, better than only sleep int count = 0; while(ros::ok()) { std_msgs::String msg; msg.data.insert(0, "agc", 3); for (int i = 0; i < msg.data.size(); ++i) { ROS_INFO("%d", msg.data[i]); } chat.publish(msg); // send data ros::spinOnce(); loop_rate.sleep(); ++count; } return 0; }
-
修改白色的CMakeLists.txt
修改
#############
## Install ##
#############
后的内容,使项目能正常编译
注意target_link_libraries和add_executable -
构建和运行节点
在~/catkin_ws(工作空间根目录)下运行
catkin_make
构建成功后运行:(首先要启动roscore服务)
source devel/setup.bash
rosrun my_package 可执行文件名称
- 参数
- 源码编译安装需要的ros humble的模块 [从ament_cmake开始]
1. Python ament_package 模块安装
项目地址:https://github.com/ament/ament_package
项目简介:
包含一个单一的ament Python包,提供了查找和解析package.xml文件的API。
该项目为Python ament_package模块源码,其中包含setup.py文件。
python3 setup.py --help # 查看帮助
python3 setup.py install
# or
python3 setup.py build # 将模块安装到build目录下,然后再添加
将特定目录(安装的Python模块)添加到 Python 搜索路径的方法:
1.
import sys
sys.path.append("/path/to/acllite")
2.
export PYTHONPATH="$PYTHONPATH:/path/to/lib"
https://blog.csdn.net/Johnor/article/details/135206782
2. ament_cmake安装
https://github.com/ament/ament_cmake/tree/humble
项目简介:
Ament CMake 是一个用于构建 ROS 2 软件包的工具,它基于 CMake 构建系统,提供了一系列 CMake 宏和函数用于声明依赖项、安装目标文件等,简化了 ROS 2 软件包的构建过程。
依赖:
- cmake
- python3
- pip (用于安装Python模块)
- python的catkin_pkg模块
- Python的ament_package模块(地址:https://github.com/ament/ament_package, 步骤1中安装)
相关参考:
https://blog.csdn.net/amuro_ray027/article/details/120201983
https://blog.csdn.net/weixin_34024034/article/details/91800653
- cmake ament_cmake_core
为ament提供所有内置的核心概念,例如环境钩子、资源索引、符号链接安装等
运行cmake [path/cmakelists.txt]
后会生成cmake_install.cmake文件,该文件用于安装cmake的package
接着运行make install
, 将cmake package复制到/usr/local/share/ament_index/ 和/usr/local/share/ament_cmake_core - ament_cmake_export_dependencies
cmake [cmakelists.txt]; make install
- ament_cmake
cmake .. ; make install
根据需要进行安装
如我想安装rosbag2模块,首先需要找到仓库位置https://github.com/ros2/rosbag2,然后切换对应分支。阅读CMakeLists.txt查看该模块需要那些依赖。依次安装依赖
- find_package(ament_cmake REQUIRED)
- find_package(ament_index_cpp REQUIRED)
https://github.com/ament/ament_index/ - find_package(pluginlib REQUIRED)
- find_package(rclcpp REQUIRED)
- find_package(rcpputils REQUIRED)
- find_package(rcutils REQUIRED)
- find_package(rmw REQUIRED)
- find_package(rmw_implementation REQUIRED)
- find_package(rosbag2_storage REQUIRED)
- find_package(rosidl_runtime_c REQUIRED)
- find_package(rosidl_runtime_cpp REQUIRED)
- find_package(rosidl_typesupport_cpp REQUIRED)
- find_package(rosidl_typesupport_introspection_cpp REQUIRED)
Ubuntu系统源码安装ros:
http://fishros.org/doc/ros2/humble/Installation/Alternatives/Ubuntu-Development-Setup.html
# rosdep init just fetches that file and writes it into /etc/ros/rosdep/sources.list.d/20-default.list
sudo rosdep init # https://github.com/ros/rosdistro/issues/9721
参考
https://docs.ros.org/en/humble/index.html
https://docs.ros2.org/bouncy/api/rclcpp/index.html
http://fishros.org/doc/ros2/humble/index.html
ros2依赖
https://raw.githubusercontent.com/ros2/ros2/release-latest/ros2.repos
ros2bag
https://github.com/ros2/rosbag2