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的上层,换个终端执行这句话
注意:
local_setup.bash
和setup.bash
的区别:local_setup.bash
只包含当前workspace里的packages,而setup.bash
包含了/opt/ros/foxy/setup.bash
和local_setup.bash
。- 执行过
source install/local_setup.bash
后不能在同一终端执行colcon build
,会出问题,因为colcon build
命令会修改local_setup.bash
,所以不建议把source install/local_setup.bash
写到.bashrc
里。
两个插件
- 设置快速索引colcon_cd:
echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> ~/.bashrc
echo "export _colcon_cd_root=~/ros2_ws/" >> ~/.bashrc
- 设置自动补全colcon-argcomplete:
echo "source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash" >> ~/.bashrc
创建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 # 换个终端执行这句话
创建node
包括publisher and subscriber
,server and client
,action server and client
,msg, srv and action interfaces (use cmake创建package; 这个package C++和Python通用)
,使用parameter
,创建component (C++ only)
- 创建node(示例代码都有,不赘述了)
C++:在ros2_ws/src/package_name/src下创建cpp文件,在文件里就可以创建node了。
Python:在ros2_ws/src/package_name/package_name下创建py文件,在文件里就可以创建node了。 - 添加依赖(看tutorial吧)
C++:修改package.xml和CMakeLists.txt
Python:修改package.xml和setup.py
(快捷方式:首先在用ros2 pkg create
创建package的时候加上--dependencies xxx1 xxx2 xxx3
;然后在CMakeLists.txt
或setup.py
里手动添加executable
)
问题:C++比Python运行速度快很多,不知道有没有办法能提高Python的运行速度?
resdep (依赖管理器)
- 下载并初始化:
sudo apt update
sudo apt install -y python3-rosdep
sudo rosdep init
rosdep update # 国内这一步会超时,用手机热点试试
- 在
colcon build
之前检查是否有依赖缺失:rosdep install -i --from-path src --rosdistro foxy -y
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流程
- 通过运用
static broadcaster或broadcaster
,把目标的位置信息 (x, y, z)和姿态信息 (qx, qy, qz, qw)发布到topic/tf_static或/tf
上 - 通过运用
listener
,获取topic/tf_static或/tf
上的信息,进行处理
tf2 static broadcast
和tf2 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例程步骤:
- 安装依赖库
sudo apt install ros-foxy-joint-state-publisher-gui ros-foxy-joint-state-publisher
sudo apt install ros-foxy-xacro
- 创建工作空间并下载源代码
mkdir -p ~/urdf_ws/src
git clone -b ros2 https://github.com/ros/urdf_tutorial.git ~/urdf_ws/src/urdf_tutorial
- 编译源代码
cd ~/urdf_ws
colcon build --packages-select urdf_tutorial
- 运行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
今天的文章ros2 tf_ros2教程[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/64856.html