当前位置:   article > 正文

ROS2_foxy教程总结(自用)_ros2 foxy

ros2 foxy

ROS2_foxy教程总结(自用)

https://docs.ros.org/en/foxy/Tutorials.html的归纳总结

ROS_DOMAIN_ID

不同的ID代表不同的领域,只有相同领域内的ROS 2 nodes可以互相通信,默认ID为0。安全的ID范围为0-101 and 215-232,除了101和232之外,每个ID最多可以跑120个nodes,每个node会占用两个系统进程。特殊情况:其实每个ID上的nodes可以超过120个,但这会占用下一个ID的空间。

设置ID的方法:
export ROS_DOMAIN_ID=<your_domain_id>
或者:
echo "export ROS_DOMAIN_ID=<your_domain_id>" >> ~/.bashrc

rqt

就是一个图形化工具。rqt_graph会用到。rqt_console会用到。

ros2的七个基本概念(package, executable, node, topic, service, parameter, action)

一. 查看这些概念的方法:

查看某个package里的所有executables:ros2 pkg executables <package_name>
查看正在运行的node:ros2 node list
查看正在运行的topic(加-t查看message type):ros2 topic list -t
查看正在运行的service(加-t查看service type):ros2 service list -t
查看正在运行的action(加-t查看action type):ros2 action list -t
查看正在运行的node里的parameter:ros2 param list

二. 启动node的两个方法:

1. ros2 run <package_name> <executable_name>
2. ros2 launch <package_name> <launch_file>
注意:一个package里面可以有多个executable,每个executable里可以有一个或多个node。

三. node

查看某个node的具体信息(使用的topics, services, actions):ros2 node info <node_name>

四. topic (publisher-subscriber model)

用于传递消息,可以一对一,一对多,多对一,多对多。
查看某个topic发布的data:ros2 topic echo <topic_name>
查看某个topic的具体信息:ros2 topic info <topic_name>
查看某个message的结构:ros2 interface show <msg_type>
向某个topic发布data:ros2 topic pub <topic_name> <msg_type> '<args>'
查看某个topic发布data的速率(Hz):ros2 topic hz <topic_name>

五. service (call-and-response model)

用于传递消息,对于一个service,可以有多个clients,但是只能有一个server。和topic不同的点在于service是需要client调用的。
查看某个service使用的type:ros2 service type <service_name>
(这里的type和topic里的message类似,就是数据类型)
查看使用某个type的所有service:ros2 service find <type_name>
查看某个type的结构:ros2 interface show <type_name>.srv
直接调用一个service:ros2 service call <service_name> <service_type> <arguments>

六. parameter

这个概念有点像node的配置参数。修改配置不需要重启node,即刻生效,很方便!
每个node都有一个参数叫use_sim_time默认是false,这个参数控制node是否使用仿真时间。
获取某个参数的value:ros2 param get <node_name> <parameter_name>(前提:node已启动)
设置某个参数的value:ros2 param set <node_name> <parameter_name> <value>(前提:node已启动)
保存当前参数设置到.yaml文件:ros2 param dump <node_name>(前提:node已启动)
加载.yaml文件:ros2 param load <node_name> <parameter_file>(前提:node已启动)
在node启动时就加载.yaml文件:ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>

七. action (client-server model)


action其实是topic和service的结合。action有goal, feedback, and result三要素。client抛给server一个goal,然后就可以做其他事情(不会像service一样阻塞);然后server会执行任务,周期性地向client发送feedback,一直延续到任务完成,然后发送result。(action支持在任务中途停止运行)
查看某个action的具体信息:ros2 action info <action_name>
查看某个action的type的结构:ros2 interface show <type_name>
(这里的type和topic里的message类似,就是数据类型)
直接在命令行发送一个goal(每个goal有唯一的ID):ros2 action send_goal <action_name> <action_type> <values> [--feedback]

ros2 bag (数据记录与回放)

这是一个用来记录和重演topic发布的data的工具。
记录一个或多个topic发布的data:ros2 bag record <topic_name1> <topic_name2>
(自定义bag_file文件名加-o <自定义文件名>;记录所有topic发布的data加-a
查看bag_file的具体信息:ros2 bag info <bag_file_name>

注意:bag_file的文件类型是.db3,需要用sqlite3打开
下载sqlite3:sudo apt-get install sqlite3
下载sqlite3的图形化工具sqlitebrowser (推荐):sudo apt-get install sqlitebrowser

重演bag_file文件里的数据:ros2 bag play <bag_file_name>

创建workplace

使用到的工具(类似catkin):colcon;下载:sudo apt install python3-colcon-common-extensions

创建步骤
source /opt/ros/foxy/setup.bash
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build # 编译,可以加--symlink-install,加了这个支持python热部署,不需要重新编译(c++不支持)
# 可以加--packages-select <package_name>,加了这个就只build这一个package,节省时间
source install/local_setup.bash # 成为/opt/ros/foxy/setup.bash的上层,换个终端执行这句话
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

注意:

  1. local_setup.bashsetup.bash的区别:local_setup.bash只包含当前workspace里的packages,而setup.bash包含了/opt/ros/foxy/setup.bashlocal_setup.bash
  2. 执行过source install/local_setup.bash后不能在同一终端执行colcon build,会出问题,因为colcon build命令会修改local_setup.bash,所以不建议把source install/local_setup.bash写到.bashrc里。
两个插件
  1. 设置快速索引colcon_cd:
echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> ~/.bashrc
echo "export _colcon_cd_root=~/ros2_ws/" >> ~/.bashrc
  • 1
  • 2
  1. 设置自动补全colcon-argcomplete:
echo "source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash" >> ~/.bashrc
  • 1

创建package

创建步骤
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python [--node-name <node_name>] <package_name> # for python
ros2 pkg create --build-type ament_cmake [--node-name <node_name>] <package_name> # for C++
cd ~/ros2_ws
colcon build # 注意在这句话之前不能执行source install/local_setup.bash,不然会出错
source install/local_setup.bash # 换个终端执行这句话
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

创建node

包括publisher and subscriberserver and clientaction server and clientmsg, srv and action interfaces (use cmake创建package; 这个package C++和Python通用)使用parameter创建component (C++ only)

  1. 创建node(示例代码都有,不赘述了)
    C++:在ros2_ws/src/package_name/src下创建cpp文件,在文件里就可以创建node了。
    Python:在ros2_ws/src/package_name/package_name下创建py文件,在文件里就可以创建node了。
  2. 添加依赖(看tutorial吧)
    C++:修改package.xml和CMakeLists.txt
    Python:修改package.xml和setup.py
    (快捷方式:首先在用ros2 pkg create创建package的时候加上--dependencies xxx1 xxx2 xxx3;然后在CMakeLists.txtsetup.py里手动添加executable)

问题:C++比Python运行速度快很多,不知道有没有办法能提高Python的运行速度?

resdep (依赖管理器)

  1. 下载并初始化:
sudo apt update
sudo apt install -y python3-rosdep
sudo rosdep init
rosdep update # 国内这一步会超时,用手机热点试试
  • 1
  • 2
  • 3
  • 4
  1. colcon build之前检查是否有依赖缺失:rosdep install -i --from-path src --rosdistro foxy -y
  2. resdep会检查package.xml里的一些标签,包括test_depend, build_depend, build_export_depend, exec_depend, depend(遇事不决用depend,因为它包含了前面所有标签的功能)。标签里的内容叫做rosdep keys。对于ros package,key = package_name;对于non-ros package, 得去rosdep/base.yaml (包含apt dependencies)rosdep/python.yaml (包含pip dependencies)里面找相应的key。这俩文件在这里找:https://github.com/ros/rosdistro

ament_cmake_python (一种build-type)

就是用cmake编译python代码,如果一个package里又有C++代码,又有Python代码,就要用ament_cmake_python,尽量避免这种情况。

ros2doctor (issues检查工具)

ros2doctor会对ros2做全方位的检查。
命令(加--report获取更详细的信息):ros2 doctor --report

plugins (C++)

这其实就是定义全局类,每个plugin就是一个全局的类。把这些类写成plugins之后调用起来非常方便,这也提高了代码复用性。需要用到pluginlib这个依赖。另外一个特点是多态,每一个全局类都可以继承一个基类。

components (components are special plugins!!!)

一个component就是一个全局的node类(继承rclcpp::Node)
作用:可以把多个node运行在一个terminal里。
查看所有components:ros2 component types
查看所有运行的components:ros2 component list
打开装载component的容器:ros2 run rclcpp_components component_container
挂载component:ros2 component load /ComponentManager composition composition::Talker(例)
其中,/ComponentManager是容器名,composition是存放components的包名,composition::Talker是命名空间::创建node的类
卸载component:ros2 component unload /ComponentManager <component_ID1> <component_ID2>
注意:使用components的方法有很多种(包括上面提到这种装载法、使用ROS services、使用dlopen、使用launch文件),个人推荐:使用launch文件(官方教程有示例)
注意:目前components只支持C++

tf2 (坐标变换)

基于四元数。本质是topic。

四元数:一种旋转的表示方法(对比欧拉旋转、矩阵旋转)

四元数(x,y,z,w)是复数的扩展,可以表示为xi + yj + zk + w (三个虚部,一个实部)。
四元数从理解上可以看作从四维空间去看三维子空间
四元数存在约束条件w²+x²+y²+z²=1,因此其自由度只有3;从几何意义上来看,四元数代表四维空间中超球面上的点。

tf2流程
  1. 通过运用static broadcaster或broadcaster ,把目标的位置信息 (x, y, z)和姿态信息 (qx, qy, qz, qw)发布到topic/tf_static或/tf
  2. 通过运用listener,获取topic/tf_static或/tf上的信息,进行处理
tf2 static broadcasttf2 broadcast的区别

区别

tf2 tree的含义 (父子frame之间的联系)

tf2 tree描述了所有frames的对应关系。child frame的坐标系是建立在parent frame的基础上的,即对于child frame来说,parent frame的位置就是原点。因此每个child frame只能有一个parent frame,而每个parent frame可以有多个child frame。
问题:不理解PointStamped的作用是什么,和TransformStamped有什么区别?

运行urdf_tutorial例程(robot models)

URDF:统一机器人描述格式,是一种特殊的xml格式,用来描述一个机器人。

运行urdf_tutorial例程步骤:
  1. 安装依赖库
sudo apt install ros-foxy-joint-state-publisher-gui ros-foxy-joint-state-publisher
sudo apt install ros-foxy-xacro
  • 1
  • 2
  1. 创建工作空间并下载源代码
mkdir -p ~/urdf_ws/src
git clone -b ros2 https://github.com/ros/urdf_tutorial.git ~/urdf_ws/src/urdf_tutorial
  • 1
  • 2
  1. 编译源代码
cd ~/urdf_ws
colcon build --packages-select urdf_tutorial
  • 1
  • 2
  1. 运行urdf_tutorial功能包例程
cd ~/urdf_ws
source install/local_setup.bash
cd ~/urdf_ws/src/urdf_tutorial
ros2 launch urdf_tutorial display.launch.py model:=urdf/01-myfirst.urdf
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/665907
推荐阅读
相关标签
  

闽ICP备14008679号