目录

  • 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

ros2 物联网 ros2入门_重命名

opencv version

4.2.0

pcl_version

1.10 ?
libpcl-all-dev

版本支持情况

platform version

ros2 物联网 ros2入门_ros2 物联网_02

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

tihuan qinghua 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 有关