目录
- ros2 环境变量
- ros1 环境变量
- ros2 环境
- ROS_DOMAIN_ID
- ros2 daemon
- ros2 ws 系统目录
- c++ version
- python version
- opencv version
- pcl_version
- 版本支持情况
- RMW
- 什么是RMW
- 可支持的RMW有
- RTPS
- 参与者participant
- executor
- spin vs spin_some
- action 话题
- lifecycle
- command line arg
- Fast-CDR
- source
- cyclone_dds
- 术语
ros2 环境变量
ros1 环境变量
.rc setup
source /opt/ros/notiec/setup.bash
export ROS_MASTER_URI=http://localhost.com:11311
export ROS_IP=YOUR_HOST_IP
环境变量
env | grep ROS
ROS_VERSION=1
ROS_PYTHON_VERSION=3
ROS_PACKAGE_PATH=/opt/ros/noetic/share
ROSLISP_PACKAGE_DIRECTORIES=
ROS_ETC_DIR=/opt/ros/noetic/etc/ros
ROS_MASTER_URI=http://localhost:11311
ROS_ROOT=/opt/ros/noetic/share/ros
ROS_DISTRO=noetic
ros2 环境
.rc setup
source /opt/ros/foxy/setup.bash
source /usr/share/colcon_cd/function/colcon_cd.sh
export _colcon_cd_root=~/ros2_ws
#export _colcon_cd_root=/opt/ros/foxy
环境变量
env | grep ROS
ROS_VERSION=2
ROS_PYTHON_VERSION=3
ROS_LOCALHOST_ONLY=0
ROS_DISTRO=foxy
ROS_DOMAIN_ID
主要为了不同组开发不同机器人防止通信交叉的情况,这个整数必须介于0-232之间
ros2 daemon
ros2 的发现机制是通过中间件来实现的
默认ros2 daemon 是不启动的,即使启动了某些topic 也是没有在运行
ros2 daemon status
ros2 daemon start | stop
ros2 ws 系统目录
只有 install 目录和build, 减掉了devel
注意CmakeLists.txt 中的install 部分, 有两种写法
install(TARGETS
xxx
DESTINATION lib/${PROJECT_NAME}) # 会在lib下
###
install(TARGETS
action_client
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin) # 会在 install/../bin下
c++ version
ros1 os 依赖了boost
ros2 os 使用c++14, 去除了boost依赖
python version
3.8
opencv version
4.2.0
pcl_version
1.10 ?
libpcl-all-dev
版本支持情况
RMW
什么是RMW
为了支持多个DDS实现,通过RMW 抽象API细节, 定义了ros客户端库和任意DDS实现之间的API
ROS 2 foxy RMW 默认是 eProsima Fast RTPS。
在ros2 Eloquent 之前, ros2 binaries 只绑定了eProsima’s FAST RTPS
Eloquent 和 foxy, RMW 支持 FastRTPS 和 Cyclone DDS。默认只按照了FAST RTPS
如果ROS2 按照多个RMW实现,那么如果有Fast RTPS, 那么它就会被作为默认实现
如果没有Fast RTPS, 那就会按照RMW实现的ros包名字字母顺序选择默认的RMW实现,他们的名字分别是rmw_fastrtps_cpp, rmw_connext_cpp, rmw_cyclonedds_cpp。
可支持的RMW有
name | vendor | comments |
fast RTPS | eProsima | default |
Connext DDS | RTI | |
Cyclone DDS | Eclipse | |
OpenSplice | ADLINK | foxy 已经不再支持 |
RMW 声明环境变量, 默认运行ros2 节点,没有该变量生成。
#sudo apt install ros-foxy-rmw-cyclonedds-cpp
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
export RMW_IMPLEMENTATION=rmw_connext_cpp
RTPS
real-time publish and subscribe
是一种快速发布和订阅的协议
Fast-RTPS 是RTPS的c++ 实现
参与者participant
Fast-RTPS 实现参与者的创建和登入, 每个参与者通过发布者(publisher)和订阅者(subscriber)发布和订阅消息,实现参与者之间的交互
RTPS 定义了域(domain), 域定义 实现了独立的交流平面, 几个域可以同时独立存在;一个域中包含若干个参与者
executor
单线程和多线程
spin vs spin_some
spin: Create a default single-threaded executor and spin the specified node.
spin_some: Create a default single-threaded executor and execute any immediately available work.
spin_until_future_complete: while( future.no_done() ) { executor.spin_once() }
action 话题
每次建立一个.action 的server,都会有三个话题产生。但是ros2 topic list 却看不见, 是为什么呢?
ros2 topic list --include-hidden-topics
lifecycle
ros2 design - managed noderos2 design - lifecyclelifecycle-demo
rclcpp 和 excutor 都有使用到lifecycle 功能,他是ros2 系统 用来高级控制程序实例化, 重启或者关闭。这个功能需要在代码内部完成,和常规节点不一样的是, 该功能需要继承rclcpp_lifecycle::LifeCycleNode 而不是rclcpp::Node. 其内部有一个状态机, 所以我们需要指导有哪些状态state,有哪些转换transition, 有哪些时间event.
状态首字母大写
基本状态是稳定状态, 转换状态是中间临时状态
生命周期的控制,需要外面有一个监督节点进行控制, 怎么控制呢,继承类默认都会生成4个服务
状态类型 | 状态名 | 解释 | transion |
primary states | Unconfigured | 节点实例化后,就是该状态 | (configure->) Inactinve, (shutdown->)Finallized |
Inactive | 不会进行处理,主要是为了重新配置 | (activate->)Active, (clenup->)Unconfigured, (shutdown->Finalized) | |
Active | 主要状态,处理数据,相应服务请求,如果发生错误不能处理将转到ErrorProcessing | (shutdown->)Finalized, (deactive->)Inactive | |
Finalized | 节点终止,但是不会马上消除,可用于debug | (destroy->)deallocated | |
Transition State | Configuring | onConfigure() | 成功则跳到Inactive, 失败则需要用户自定义code |
CleaningUp | onCleanup() | 成功则Unconfigured, 失败则ErrorProcessing | |
Activating | onActivate() | ||
Deactivating | onDeactivate() | ||
ShuttingDown | onShutdown() | ||
ErrorProcessing |
转换transtion
- create
- configure
- cleanup
- activate
- deactivate
- shutdown
- destroy
事件event
每次状态变化,都有锁存话题发出, 话题名为/<node_name>/transtion_event [lifecycle_msgs/msg/TransitionEvent]
接口
Available Services:
/lc_talker/change_state
/lc_talker/describe_parameters
/lc_talker/get_available_states
/lc_talker/get_available_transitions
/lc_talker/get_parameter_types
/lc_talker/get_parameters
/lc_talker/get_state
/lc_talker/get_transition_graph
/lc_talker/list_parameters
/lc_talker/set_parameters
/lc_talker/set_parameters_atomically
created:
*/lc_talker/transition_event
command line arg
ros2 run my_package node_executable --ros-args ...
#使用选项 --ros-args
# 重命名 - name remmapping
# -r := 节点内的话题名或者服务名重命名
# -r __node:= 节点名重命名
# -r __ns:= 命名空间重命名, 必须用 / 开始.
# 例如: 原来talker节点的名字为 talker, 发布 chatter 的话题.
# 现在要换成 demo 命名空间, 节点名设置为
# my_takler, 产生my_topic话题, (话题列出为 /demo/my_topic)
ros2 run demo_nodes_cpp talker --ros-args
-r __ns:=/demo 命名空间
-r __node:=my_talker 节点名称重命名
-r chatter:=my_topic 话题重命名.
# 如果在一个进程中执行了多个node, 那么可以通过节点名的前缀指定. 例如
ros2 run composition manual_composition --ros-args
-r talker:__node:=my_talker
-r listener:__node:=my_listener
# 混合的一个例子. 说明节点名字重命名后, 如果要限定则要用新名字做限定.
ros2 run composition manual_composition --ros-args
-r talker:__node:=my_talker -r my_talker:chatter:=my_topic
-r listener:__node:=my_listener -r my_listener:chatter:=my_topic
---------------------------------------------------------------------------
设定日志级别
--log-level 命令项. DEBUG, INFO, WARN, ERROR, FATAL
ros2 run demo_nodes_cpp listener --ros-args --log-level DEBUG
# 当然也可卸载代码里边.
rcutils_logging_set_logger_level("logger_name", RCUTILS_LOG_SEVERITY_DEBUG);
PYTHON:
logger.set_level(rclpy.logging.LoggingSeverity.DEBUG)
rclpy.logging.set_logger_level('logger_name', rclpy.logging.LoggingSeverity.DEBUG)
#########################################################################
# 设置参数
--ros-args -p param_name:=param_value
# 例如
ros2 run demo_nodes_cpp parameter_blackboard
--ros-args
-p some_int:=42
-p "a_string:=Hello world"
-p "some_lists.some_integers:=[1, 2, 3, 4]"
-p "some_lists.some_doubles:=[3.14, 2.718]"
Fast-CDR
整体实现了对C++基本数据类型以及数组对象的序列化和反序列化操作。
source
cyclone_dds
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
#export CYCLONEDDS_URI='<CycloneDDS><Domain><General><NetworkInterfaceAddress>auto</NetworkInterfaceAddress></General></Domain></CycloneDDS>'
export CYCLONEDDS_URI=file:///eee/systemddd/sssyystem/cyclonedds.xml
[Unit]
Description="Robot Deamon"
[Service]
User=ubuntu
Type=idle
Environment="ROS_DOMAIN_ID=100"
Environment="ROS_VERSION=2"
Environment="ROS_PYTHON_VERSION=3"
Environment="ROS_DISTRO=foxy"
Environment="LD_LIBRARY_PATH=/opt/ros/foxy/lib"
Environment="PYTHONPATH=/opt/ros/foxy/lib/python3.8/site-packages"
Environment="AMENT_PREFIX_PATH=/opt/ros/foxy"
Environment="DISPLAY=:0"
Environment="RMW_IMPLEMENTATION=rmw_cyclonedds_cpp"
Environment="ROS_LOCALHOST_ONLY=1"
Environment="CYCLONEDDS_URI=file:///eee/systemddd/ssssyystem/cyclonedds.xml"
ExecStart=/opt/ros/foxy/bin/ros2 launch robot_bringup bringup_launch.py
Restart=on-failure
[Install]
WantedBy=multi-user.target
术语
缩写 | 全程 | |
RMW | ros middle-ware | ros 中间件, DDS 通信方式 |
DDS | data distribute service | 数据分发服务 |
RTI | remote technology i?? | 远程技术公司 |
RTPS | realtime publisher and subscriber | |
idl | interface define language | 接口定义语言 |
QoS | quality of service | 服务质量 |
TSC | Technical Steering Committee | 技术指导委员会 |
SPI | Service plugin Interface | 服务插件接口 |
rcl | ROS Client Library | 客户端库 |
cbg | callback-group | 与executor 有关 |