PX4在GAZEBO仿真中加载iris模型问题
作者:互联网
目录
1. PX4启动仿真的launch系列文件
1.1 单个launch文件解读
打开每个文件的开头,都有对它功能的描述。
px4.launch
Posix SITL PX4 launch script
Launches Only PX4 SITL. This can be used by external projects
加载px4_sitl仿真的节点
posix_sitl.launch
Posix SITL environment launch script
launches PX4 SITL, Gazebo environment, and spawns vehicle
在px4.launch
基础上,打开GAZEBO环境并使用spawn_model加载sdf
格式的飞机模型
mavros_posix_sitl.launch
在
posix_sitl.launch
基础上,加入mavros package
里的px4.launch
(注意不是px4下的px4.launch
)。
即开启了sitl仿真后,飞机信息通过mavros
来传递交互。那么交互的端口号fcu_url
即飞机端udp端口由<arg name="fcu_url" default="udp://:14540@localhost:14557"/>
确定。这个参数主要是为传入mavros
使用。
single_vehicle_spawn.launch
Posix SITL environment launch script
launchs PX4 SITL and spawns vehicle
打开sitl节点,以及使用xacro加载urdf格式的飞机模型。注意加载模型有urdf
和上述sdf
两种方式。后文会对两种方式详细比较。
multi_uav_mavros_sitl.launch
是由前面几个launch文件中的部分内容拼接并且改编的。
- 模型的生成方式,调用了
single_vehicle_spawn.launch
,并传入不同的mavlink_udp_port
和mavlink_tcp_port
用于不同飞机mavlink连接。- 每架飞机的
mavros
传入不同的fcu_url
和tgt_system
参数,便于启动不同的mavros
- 补充:
gcs_url
是指地面站端口,而我们在仿真中一般用不到地面站。- 关于udp端口的含义可以参照PX4官网,也可以参照这篇博客PX4仿真中的UDP端口匹配
- 提示:使用
group ns
的方式可以为包含的节点创建前缀名,用来区分每架飞机的节点和话题。
- 新版本的PX4-Autopilot还增加了一些launch文件,主要是区分了
urdf
和sdf
两种模型生成方式 single_vehicle_spawn_sdf.launch
指明了用后缀名.sdf
模型生成。single_vehicle_spawn_xacro.launch
指明了用后缀名.xacro
模型生成。
在v1.12.3版本中
PX4-Autopilot/Tools/sitl_gazebo/models/
下的模型中,凡是model.sdf
文件都多了model.sdf.jinja
,model.sdf.last_generated
文件。
而之前采用URDF
文件生成,一般都是调用PX4-Autopilot/Tools/sitl_gazebo/models/rotors_descirption
下iris_base.xacro
。目前v1.12.3版本已经没有这个rotors_descirption
文件夹了,也就是说px4开始全面转向sdf
格式的模型。
【注】经过ubuntu18.04+gazebo9对sdf
文件生成模型测试,会出现gazebo无法加载的情况,目前可用于仿真仍然是xacro
格式的模型。该问题待更新
1.2 对iris模型添加相机
由上文所述,目前通过改xacro
文件可以加载模型,不要通过简单地修改<arg name="vehicle" value="iris_fpv_cam">
来试图给iris
添加相机。因为最终它会调用rotors_descirption
中iris_base.xacro
来加载解析。而当vehicle = iris_fpv_cam
时,他会去寻找iris_fpv_cam_base.xacro
,然而这个文件是没有的。
最粗暴的方式是直接修改iris_base.xacro
文件,为它添加相机组件。参照博客gazebo中为Px4安装单目相机
如果直接想使用现成的模型,建议typhoon h480(六旋翼飞机带云台相机)
1.3 ~/.bashrc环境变量问题
如果不能运行,可能是环境变量的问题,
参照之前我的博客Ubuntu18.04安装PX4并与ROS联合实验 这一部分
这是我的~/.bashrc,请根据自己的系统路径修改:
2. 一些Bug
2.1 我的台式机无法加载模型
2.1.1 若使用v1.9.2版本
总会出现
[INFO] [1633444976.357504, 0.000000]: Loading model XML from file /home/wzy/src/PX4-Autopilot/Tools/sitl_gazebo/models/iris/iris.sdf
[INFO] [1633444976.362299, 0.000000]: Waiting for service /gazebo/spawn_sdf_model
[ INFO] [1633444977.225659845]: waitForService: Service [/gazebo/set_physics_properties] is now available.
[ INFO] [1633444977.249643142, 0.020000000]: Physics dynamic reconfigure ready.
[INFO] [1633444977.266593, 0.000000]: Calling service /gazebo/spawn_sdf_model
[INFO] [1633444977.463774, 0.204000]: Spawn status: SpawnModel: Successfully spawned entity
gzserver: symbol lookup error: /home/wzy/src/PX4-Autopilot/build/px4_sitl_default/build_gazebo/libgazebo_multirotor_base_plugin.so: undefined symbol: _ZN8mav_msgs4msgs10MotorSpeedC1Ev
曾经花了很多努力,也以失败告终
2.1.2 若使用v1.12.3版本
[tcsetpgrp failed in terminal_inferior: Inappropriate ioctl for device]
[INFO] [1633502837.816712, 0.010000]: Spawn status: SpawnModel: Successfully spawned entity
[tcsetpgrp failed in terminal_inferior: Inappropriate ioctl for device]
[libprotobuf ERROR …/…/src/google/protobuf/descriptor_database.cc:57] File already exists in database: Imu.proto
[libprotobuf FATAL …/…/src/google/protobuf/descriptor.cc:1164] CHECK failed: generated_database_->Add(encoded_file_descriptor, size):
terminate called after throwing an instance of ‘google::protobuf::FatalException’
what(): CHECK failed: generated_database_->Add(encoded_file_descriptor, size):
经问题排查,是protobuf
不能链接静态库(或者动态库)导致的。由于ros-melodic-gazebo-ros
依赖于libgazebo9-dev
,而安装sudo apt-get install libgazebo9-dev
会自动安装依赖libprotobuf-dev
,所以不可避免地要安装二进制版本libprotobuf-dev
。想通过源码编译解决protobuf
的问题不太可能。
2.2 gazebo无法打开
若遇到终端输入 gazebo
没有反应,gazebo --verbose
可以看到详细的输出,一般是端口占用问题。
通过改变端口号 export GAZEBO_MASTER_URI=http://localhost:11348
可以解决。
标签:iris,sitl,launch,GAZEBO,PX4,sdf,gazebo 来源: https://blog.csdn.net/boyhoodme/article/details/120621078