按照这个包的步骤来,最后启动1
ros2 launch gazebo_differential_drive_robot robot.launch.py
手动控制还是用cmd
按照这个包的步骤来,最后启动1
ros2 launch gazebo_differential_drive_robot robot.launch.py
手动控制还是用cmd
ubuntu 24.04安装jazzy后,对应的gazebo和以前不太一样了。我们需要安装的是 gazebo Harmonic
安装过程参考 Gazebo Harmonic 和 ROS2 jazzy 安装和测试
最后还要安装1
2
3
4
5
6
7
8
9
10sudo apt-get install -y ros-jazzy-ros-gz
sudo apt-get install -y ros-jazzy-ros-gz-sim-demos
sudo apt-get install -y ros-jazzy-ros-gz-bridge
sudo apt-get install -y ros-jazzy-ros-gz-image
sudo apt-get install -y ros-jazzy-ros-gz-interfaces
sudo apt-get install -y ros-jazzy-ros-gz-sim
sudo apt-get install -y ros-jazzy-joint-state-publisher
sudo apt-get install -y ros-jazzy-xacro
sudo apt-get install -y ros-jazzy-teleop-twist-keyboard
sudo apt-get install -y ros-jazzy-teleop-twist-joy
启动命令: gz sim
或者 gz sim -v 4
. -v
: 指定日志详细级别,4 表示最高详细程度。
可以使用-s
(仅服务器)或-g
(仅GUI)参数来分别运行服务器或GUI
插件的加载方式已被更改,需要在模型文件(SDF/URDF
)或 Gazebo 的配置中添加。
gz sim shapes.sdf
启动之后,有3个进程: gz sim
, gz sim server
, gz sim gui
ROS2的方式启动: ros2 launch ros_gz_sim gz_sim.launch.py gz_args:=empty.sdf
启动图像管道: ros2 launch ros_gz_sim_demos image_bridge.launch.py
重要的sdf文件: diff_drive_skid.sdf
, actor.sdf
从ROS 2 Jazzy开始,Gazebo通过vendor包的形式在ROS包仓库中可用。如果您的包直接依赖于Gazebo库,而不是仅依赖于ros_gz
,请参考相关文档学习如何使用Gazebo vendor包。
gazebo的相关命令从ROS2里独立出来了
gz topic -l 显示所有话题
gz topic -it /model/tugbot/pose
显示话题信息,结果如下
1 | Publishers [Address, Message Type]: |
-et
echo 话题-ft
显示话题频率-pt
发布话题gz topic -h
可显示其他命令
在新的架构中,Gazebo Sim 与ROS 2的集成通过ros_gz
桥接包实现。该桥接包允许 ROS 2 和 Gazebo Sim 之间的消息传递
docker里运行gazebo
报错: libGL error: MESA-LOADER: failed to retrieve device information ,这是本机的显卡没装好
ASan 是GCC 和Clang 编译器的一部分,所以无需单独安装.
AddressSanitizer与Valgrind相比
AddressSanitizer能检测的错误类型
CMake中的设置:1
2
3set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
比如这样的典型代码1
Test* t = new Test();
ASan的报错如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17=================================================================
==2816467==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 8 byte(s) in 1 object(s) allocated from:
#0 0x72cdcdefe548 in operator new(unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:95
#1 0x5cbc2c68d2c3 in main /home/zzp/qt_projects/untitled/main.cpp:10
#2 0x72cdcd62a1c9 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
#3 0x72cdcd62a28a in __libc_start_main_impl ../csu/libc-start.c:360
#4 0x5cbc2c68d1e4 in _start (/home/zzp/qt_projects/build-untitled-Desktop_Qt_5_9_9_GCC_64bit-Debug/untitled+0x21e4) (BuildId: 1061b9fe4580a7e3af28420ed615c3664d393550)
SUMMARY: AddressSanitizer: 8 byte(s) leaked in 1 allocation(s).
Create Subtree
创建子树后,无法恢复不是子树的状态。在左侧的树列表里,千万不要删除任何树,否则无法恢复SetBlackboard
设置黑板变量,有的人是在C++里设置,而平时看行为树逻辑一般都在groot里,会不知道C++里做了什么Please initalize new files on the disk before saving the project
。这个现象说明了groot这个软件设计非常失败,我从没见过有哪个软件新建一个文件后还不能直接保存的,更可笑的是初始化
的单词都是错的。这么低级的缺陷都有,还好意思对pro版本收费?需要到左侧的根节点,右键save
保存,以后才能用保存按钮。目前只有Groot2 Pro
版本可以使用
在版本4里,BT::PublisherZMQ
已经消失了。取而代之的是BT::Groot2Publisher
,可以这样用
1 | factory.registerBehaviorTreeFromFile("/home/user/test.xml"); |
打开groot之后,点击Connect
毫无反应,官方说明没有帮助,读源码发现构造函数里有默认端口号:Groot2Publisher(const BT::Tree& tree, unsigned server_port = 1667);
使用1667
后就成功了。Host
需要看情况作修改
行为树是由控制节点、装饰节点、行为节点组成的一棵树。中间节点一般为控制节点和装饰节,用于控制行为树的执行流程,它们相对固定,一旦确定几乎不会变化。叶子节点由Action节点或Condition节点组成,使用者的大部分工作都是设计树的逻辑和行为节点。
行为树的每个节点都有一个返回值,平常用的最多的是:
完整枚举值:1
2
3
4
5
6
7
8enum class NodeStatus
{
IDLE = 0,
RUNNING = 1,
SUCCESS = 2,
FAILURE = 3,
SKIPPED = 4,
};
节点调用status()
可以获得当期的运行状态,返回值是NodeStatus
。教程里说状态不能是IDLE
,但我的行为树节点里调用status()
常常发现状态就处在 IDLE
,不明白为什么。
控制节点一般为中间节点,用于控制行为树的执行流程,决定了其子节点是以顺序、并行、随机或其它方式执行。
常用:AsyncFallback, AsyncSequence, Fallback, IfThenElse, Parallel, ParallelAll, ReactiveFallback, ReactiveSequence, Sequence, SequencewithMemory, Switch, WhileDoElse
依次执行所有子节点,若当前子节点返回成功,则继续执行下一个子节点;若子当前节点返回失败,则中断后续子节点的执行,并把结果返回给父节点。节点1返回成功,继续执行节点2;节点2返回失败,则把结果返回给Sequences的父节点,节点3并不会执行。顺序节点相当于and
语义。
依次执行所有子节点,若当前子节点返回成功,则中断后续节点运行,并把结果返回给父节点。相当于or
语义
当有的行为节点对应的代码执行较长,例如:播放动画,此时,这个行为节点会向父节点返回running
,于是选择节点便不再执行后续节点,直接向父节点返回 running
依次执行所有子节点,无论失败与否,都会把所有子节点执行一遍。至于Parallel节点该返回什么值给父节点,这要看需求。比如:成功数 > 失败数返回成功,否则返回失败。
随机选择一个子节点来运行。机器人领域应该不会使用。在游戏设计里,AI角色每天会根据自己的心情选择是呆在家里、工作或是出门游玩,可以采用随机选择节点
使用很少。功能和顺序节点、选择节点类似,唯一不同是会保存当前执行进度(比如:保存当前子节点索引),下一帧继续执行当前节点,如果当前节点是中间节点,则会跳过前面的节点。
常用:Delay, ForceFailure, ForceSuccess, Inverter, KeepRunningUntilFailure, LoopDouble, LoopString, Precondition, Repeat, RetryUntilSuccessful, RunOnce, Timeout
修饰节点RunOnce
在调试时很有用,可以让某黑板变量赋值,然后让行为树开始运行,但又不会一直循环运行
动作节点通常实现服务客户端和动作客户端,也可以是一些简单的执行程序。action通常作为行为树中的叶子节点,负责具体行为和功能的实现。但这些具体的功能代码并没有在叶子节点中而是在对应的服务端。执行这种节点,可能只需要一帧就可以完成,也可能需要多帧才能完成。
它至少包含两个函数:
Init
:用于初始化节点,比如读取配置数据初始化当前节点,只会执行一次。OnTick
:每一帧都会执行,节点的主要逻辑都在此函数中实现或调用。常用: AlwaysSuccess, Script, SetBlackboard, sleep
这是条件控制节点。比如判断电池电量,某一开关信号等等。
依赖项1
2
3
4
5
6
7
8
9
10sudo apt install -y ros-jazzy-tf2*
rm ~/.config/ros.org/rqt_gui.ini
# 重启rqt,然后再rqt中plugin->visualization中可以看到到 tf tree
sudo apt-get install gazebo-ros-pkgs
sudo apt install -y ros-jazzy-navigation2
sudo apt install -y ros-jazzy-nav2-bringups
sudo apt install -y ros-jazzy-turtlebot3*
sudo apt install -y ros-jazzy-test-msgs ros-jazzy-geographic-msgs
下载jazzy分支的Navigation2
,一般能正常编译。
在Nav2存储库的根目录中运行doxygen
。它将生成一个包含文档的/doc/*
目录。文档的入口点在浏览器中是index.html。
使用 turtlebot3: ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
不需要设置 export GZ_SIM_RESOURCE_PATH
ros2 run turtlebot3_teleop teleop_keyboard
ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True
ros2 run nav2_map_server map_saver_cli -f test
ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True map:=maps/test.yaml
1 | /amcl |
速度输出是 /cmd_vel_smoothed
rqt_graph
能够可视化节点和主题之间的连接。这个命令和ROS1一样,也是ROS2为数不多的GUI可视界面
ros2doctor
可以检测大概的ros2整体配置,ros2doctor
并不是一个调错的工具,对你的代码调试没有帮助. 它一般查找你系统中警告部分,只有UserWarning: ERROR:
开头的可能是错误。另外可以检查发布者没有订阅者的问题。
运行 ros2 doctor
或者 ros2 doctor --report
ros2 run tf2_tools view_frames.py
ros2 run tf2_ros static_transform_publisher 1 2 3 0.5 0.1 -1.0 foo bar
ros2 run tf2_ros tf2_echo foo bar
运行结果:1
2
3
4
5
6
7
8
9
10At time 197.27000000
- Translation: [0.008, -0.000, 0.064]
- Rotation: in Quaternion [-0.000, -0.001, -0.010, 1.000]
- Rotation: in RPY (radian) [-0.000, -0.002, -0.020]
- Rotation: in RPY (degree) [-0.001, -0.092, -1.160]
- Matrix:
1.000 0.020 -0.002 0.008
-0.020 1.000 0.000 -0.000
0.002 -0.000 1.000 0.064
0.000 0.000 0.000 1.000