使用PX4,gazebo,mavros为旋翼添加下视的相机(仿真采集openrealm数据集-第一步)
目录
一.方法一(没成功)
1.运行PX4
2.运行mavros通讯
3.启动仿真世界和无人机
(1)单独测试相机
(2)make px4_sitl gazebo启动四旋翼iris无人机
二.方法二(成功)
1.通过 roslaunch 启动
2.运行rostopic list和rosnode list有gazebo节点和相关话题
3.如何修改iris.sdf,我应该在iris的哪里添加相机呢?
一、添加相机的位置
在哪里添加?
二、修改后的 iris.sdf
三、代码说明
四、总结
4.检查相机是否符合要求
三.解释和分析上述 iris.sdf 文件的内容,包括其结构、语法和每个部分的含义
一、SDF 文件总体结构与语法
1. 文件头
2. 模型定义
二、主要组成部分分析
1.
- 物理部件
示例:base_link(主体)
示例:rotor_0(旋翼)
示例:camera_link(相机)
示例:rotor_0_joint
示例:camera_joint
示例:motor_model(电机)
示例:mavlink_interface(MAVLink 接口)
三、语法规则
四、整体功能分析
五、总结
四.sdf模型坐标系是什么,gazebo仿真世界坐标系是什么
一、SDF 模型坐标系
定义
在 iris.sdf 中的体现
特点
二、Gazebo 仿真世界坐标系
定义
在仿真中的体现
特点
三、两者的关系
四、示例分析(基于 iris.sdf)
模型坐标系
世界坐标系
验证
五、语法与配置要点
五.如何知道世界坐标系的原点和xyz方向,如何知道模型坐标系的原点和xyz方向
一、确定 Gazebo 世界坐标系的原点和 XYZ 方向
1. 世界坐标系的定义
2. 如何确认原点和方向
方法 1:检查世界文件
方法 2:通过 Gazebo GUI 可视化
方法 3:检查 /gazebo/model_states
二、确定 SDF 模型坐标系的原点和 XYZ 方向
1. 模型坐标系的定义
2. 如何确认原点和方向
方法 1:分析 SDF 文件
方法 2:Gazebo GUI 可视化
方法 3:检查传感器数据
三、两者的关系与验证
四、总结
世界坐标系
模型坐标系
实用建议
六.依然是坐标系问题
一、解释 /gazebo/model_states 输出
命令与输出
输出内容
分析
总结
二、Gazebo GUI 中坐标轴颜色对应
操作
颜色与 XYZ 的对应
三、rotor_0 在右前方,模型坐标系的 XYZ 方向
rotor_0 的位置
模型坐标系的 XYZ 方向
验证
四、综合分析
五、建议
一.方法一(没成功)
1.运行PX4
make px4_sitl gazebo
默认启动的是iris四旋翼模型
2.运行mavros通讯
roslaunch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557"
“Gazebo ROS 插件未初始化”意味着 Gazebo 仿真器无法正确与 ROS(Robot Operating System)通信,导致 ROS 插件(如 libgazebo_ros_camera.so)无法加载或发布话题。这种情况通常会表现为你在 rostopic list 中看不到预期的传感器话题(如 /downward_camera/image_raw),或者 rosnode list 中缺少 /gazebo 节点。以下是问题的原因分析、排查步骤和解决方法。
3.启动仿真世界和无人机
(1)单独测试相机
~/test_camera/test_camera.sdf代码为:
<sdf version="1.6"><world name="test_world"><model name="camera_test"><link name="camera_link"><pose>0 0 0 0 0 0</pose><inertial><mass>0.01</mass><inertia><ixx>1e-05</ixx><ixy>0</ixy><ixz>0</ixz><iyy>1e-05</iyy><iyz>0</iyz><izz>1e-05</izz></inertia></inertial><sensor name="test_camera" type="camera"><always_on>true</always_on><update_rate>10.0</update_rate><camera><horizontal_fov>1.047</horizontal_fov><image><width>640</width><height>480</height><format>R8G8B8</format></image><clip><near>0.1</near><far>1000</far></clip></camera><plugin name="camera_plugin" filename="libgazebo_ros_camera.so"><ros><namespace>/test_camera</namespace></ros><frame_name>camera_link</frame_name><cameraName>test_camera</cameraName></plugin></sensor></link></model></world>
</sdf>
不要直接用 gazebo 命令,而是通过 ROS 启动:
rosrun gazebo_ros gazebo ~/test_camera/test_camera.sdf
-
rosrun gazebo_ros gazebo
= 启动 Gazebo + 启用 ROS 接口。
即可成功出现gazebo节点和相关话题
中间的某一步export
leaf@LAPTOP-NI05EP5K:~$ find /usr/lib /opt/ros -name "libCameraPlugin.so" /usr/lib/x86_64-linux-gnu/gazebo-11/plugins/libCameraPlugin.so leaf@LAPTOP-NI05EP5K:~$ ldd /opt/ros/noetic/lib/libgazebo_ros_camera.so | grep libCameraPluginlibCameraPlugin.so => not found leaf@LAPTOP-NI05EP5K:~$ export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/gazebo-11/plugins:$LD_LIBRARY_PATH leaf@LAPTOP-NI05EP5K:~$ ldd /opt/ros/noetic/lib/libgazebo_ros_camera.so | grep libCameraPluginlibCameraPlugin.so => /usr/lib/x86_64-linux-gnu/gazebo-11/plugins/libCameraPlugin.so (0x00007fe3b6f25000) leaf@LAPTOP-NI05EP5K:~$ cat gazebo_log.txt WARNING: Package name "MSTC_Star_update" does not follow the naming conventions. It should start with a lower case letter and only contain lower case letters, digits, underscores, and dashes. WARNING: Package name "MSTC_Star_update" does not follow the naming conventions. It should start with a lower case letter and only contain lower case letters, digits, underscores, and dashes. WARNING: Package name "MSTC_Star_update" does not follow the naming conventions. It should start with a lower case letter and only contain lower case letters, digits, underscores, and dashes. leaf@LAPTOP-NI05EP5K:~$ ldd /opt/ros/noetic/lib/libgazebo_ros_camera.so | grep libCameraPluginlibCameraPlugin.so => /usr/lib/x86_64-linux-gnu/gazebo-11/plugins/libCameraPlugin.so (0x00007f77cf450000)
清理所有节点进程
killall -9 gzserver gzclient roslaunch rosmaster
leaf@LAPTOP-NI05EP5K:~/test_camera$ killall -9 gzserver gzclient roslaunch rosmaster gzserver: no process found gzclient: no process found roslaunch: no process found
(2)make px4_sitl gazebo启动四旋翼iris无人机
从你的反馈来看,问题已经非常清晰:rosrun gazebo_ros gazebo 可以成功启动 Gazebo 并与 ROS 集成,而 make px4_sitl gazebo 虽然启动了 Gazebo 和 PX4 仿真,但未能正确与 ROS 集成,导致 /gazebo 节点和话题未出现。以下是分析和最终解决方案。
二.方法二(成功)
1.通过 roslaunch
启动
PX4 提供了集成 ROS 的启动文件,可同时启动 Gazebo、PX4 SITL 和 MAVROS:
roslaunch px4 mavros_posix_sitl.launch
效果:
-
自动加载 Gazebo-ROS 插件,发布
/gazebo
话题。 -
启动 MAVROS,连接 PX4 和 ROS。
2.运行rostopic list和rosnode list有gazebo节点和相关话题
leaf@LAPTOP-NI05EP5K:~$ rostopic list
/clock
/diagnostics
/gazebo/link_states
/gazebo/model_states
/gazebo/parameter_descriptions
/gazebo/parameter_updates
/gazebo/performance_metrics
/gazebo/set_link_state
/gazebo/set_model_state
/mavlink/from
/mavlink/gcs_ip
/mavlink/to
/mavros/actuator_control
/mavros/adsb/send
/mavros/adsb/vehicle
/mavros/altitude
/mavros/battery
/mavros/cam_imu_sync/cam_imu_stamp
/mavros/camera/image_captured
/mavros/cellular_status/status
/mavros/companion_process/status
/mavros/debug_value/debug
/mavros/debug_value/debug_float_array
/mavros/debug_value/debug_vector
/mavros/debug_value/named_value_float
/mavros/debug_value/named_value_int
/mavros/debug_value/send
/mavros/esc_info
/mavros/esc_status
/mavros/esc_telemetry
/mavros/estimator_status
/mavros/extended_state
/mavros/fake_gps/mocap/tf
/mavros/geofence/waypoints
/mavros/global_position/compass_hdg
/mavros/global_position/global
/mavros/global_position/gp_lp_offset
/mavros/global_position/gp_origin
/mavros/global_position/local
/mavros/global_position/raw/fix
/mavros/global_position/raw/gps_vel
/mavros/global_position/raw/satellites
/mavros/global_position/rel_alt
/mavros/global_position/set_gp_origin
/mavros/gps_input/gps_input
/mavros/gps_rtk/rtk_baseline
/mavros/gps_rtk/send_rtcm
/mavros/gpsstatus/gps1/raw
/mavros/gpsstatus/gps1/rtk
/mavros/gpsstatus/gps2/raw
/mavros/gpsstatus/gps2/rtk
/mavros/hil/actuator_controls
/mavros/hil/controls
/mavros/hil/gps
/mavros/hil/imu_ned
/mavros/hil/optical_flow
/mavros/hil/rc_inputs
/mavros/hil/state
/mavros/home_position/home
/mavros/home_position/set
/mavros/imu/data
/mavros/imu/data_raw
/mavros/imu/diff_pressure
/mavros/imu/mag
/mavros/imu/static_pressure
/mavros/imu/temperature_baro
/mavros/imu/temperature_imu
/mavros/landing_target/lt_marker
/mavros/landing_target/pose
/mavros/landing_target/pose_in
/mavros/local_position/accel
/mavros/local_position/odom
/mavros/local_position/pose
/mavros/local_position/pose_cov
/mavros/local_position/velocity_body
/mavros/local_position/velocity_body_cov
/mavros/local_position/velocity_local
/mavros/log_transfer/raw/log_data
/mavros/log_transfer/raw/log_entry
/mavros/mag_calibration/report
/mavros/mag_calibration/status
/mavros/manual_control/control
/mavros/manual_control/send
/mavros/mission/reached
/mavros/mission/waypoints
/mavros/mocap/pose
/mavros/mount_control/command
/mavros/mount_control/orientation
/mavros/mount_control/status
/mavros/nav_controller_output
/mavros/obstacle/send
/mavros/odometry/in
/mavros/odometry/out
/mavros/onboard_computer/status
/mavros/param/param_value
/mavros/play_tune
/mavros/px4flow/ground_distance
/mavros/px4flow/raw/optical_flow_rad
/mavros/px4flow/raw/send
/mavros/px4flow/temperature
/mavros/radio_status
/mavros/rallypoint/waypoints
/mavros/rc/in
/mavros/rc/out
/mavros/rc/override
/mavros/setpoint_accel/accel
/mavros/setpoint_attitude/cmd_vel
/mavros/setpoint_attitude/thrust
/mavros/setpoint_position/global
/mavros/setpoint_position/global_to_local
/mavros/setpoint_position/local
/mavros/setpoint_raw/attitude
/mavros/setpoint_raw/global
/mavros/setpoint_raw/local
/mavros/setpoint_raw/target_attitude
/mavros/setpoint_raw/target_global
/mavros/setpoint_raw/target_local
/mavros/setpoint_trajectory/desired
/mavros/setpoint_trajectory/local
/mavros/setpoint_velocity/cmd_vel
/mavros/setpoint_velocity/cmd_vel_unstamped
/mavros/state
/mavros/statustext/recv
/mavros/statustext/send
/mavros/sys_status
/mavros/target_actuator_control
/mavros/terrain/report
/mavros/time_reference
/mavros/timesync_status
/mavros/trajectory/desired
/mavros/trajectory/generated
/mavros/trajectory/path
/mavros/tunnel/in
/mavros/tunnel/out
/mavros/vfr_hud
/mavros/vision_pose/pose
/mavros/vision_pose/pose_cov
/mavros/vision_speed/speed_twist_cov
/mavros/wind_estimation
/move_base_simple/goal
/rosout
/rosout_agg
/test_camera/camera_info
/test_camera/image_raw
/test_camera/image_raw/compressed
/test_camera/image_raw/compressed/parameter_descriptions
/test_camera/image_raw/compressed/parameter_updates
/test_camera/image_raw/compressedDepth
/test_camera/image_raw/compressedDepth/parameter_descriptions
/test_camera/image_raw/compressedDepth/parameter_updates
/test_camera/image_raw/theora
/test_camera/image_raw/theora/parameter_descriptions
/test_camera/image_raw/theora/parameter_updates
/test_camera/parameter_descriptions
/test_camera/parameter_updates
/tf
/tf_static
leaf@LAPTOP-NI05EP5K:~$ rosnode list
/gazebo
/gazebo_gui
/mavros
/rosout
- 结论:
- 该命令正确启动了 Gazebo、PX4 SITL 和 MAVROS,并完成了 ROS 集成。
优点
- 官方支持:mavros_posix_sitl.launch 是 PX4 提供的标准 launch 文件,集成了 Gazebo、PX4 SITL 和 MAVROS。
- 自动化:自动处理环境变量、符号链接和模型加载,无需手动配置。
- 稳定性:避免了手动启动可能出现的路径或参数错误。
与之前方法的对比
- 之前的手动方法和脚本需要手动管理 roscore、Gazebo 和 PX4 的启动顺序,而 roslaunch px4 mavros_posix_sitl.launch 一次性完成所有步骤。
3.如何修改iris.sdf,我应该在iris的哪里添加相机呢?
在 iris.sdf 中添加相机需要将其作为一个新的 <link> 和 <sensor>,并通过 <joint> 将其固定到 iris 的主体(通常是 base_link)。你的目标是添加一个下视相机,因此我们需要选择合适的位置和朝向。
以下是如何在 iris.sdf 中添加相机的详细步骤和代码:
一、添加相机的位置
- 目标:下视相机,通常安装在机身底部。
- 坐标系:
- base_link 是 iris 的主体坐标系,位于机身中心。
- X 轴向前,Y 轴向右,Z 轴向上。
- 下视相机应放在 base_link 下方(Z 负方向),朝下(绕 Y 轴旋转 90°,即俯仰角 -90°)。
- 建议位置:
- <pose>0 0 -0.1 0 1.5708 0</pose> 表示相机位于机身下方 0.1 米,朝下。
在哪里添加?
- 在 <model name='iris'> 内,添加新的 <link> 和 <joint>,通常放在现有 <link>(如 rotor_* 或 gps0)之后,但在 <plugin> 之前。
二、修改后的 iris.sdf
以下是将相机添加到你的 iris.sdf 的完整代码(在原始文件基础上添加相机部分):
<!-- DO NOT EDIT: Generated from iris.sdf.jinja -->
<sdf version='1.6'><model name='iris'><link name='base_link'><pose>0 0 0 0 0 0</pose><inertial><pose>0 0 0 0 0 0</pose><mass>1.5</mass><inertia><ixx>0.029125</ixx><ixy>0</ixy><ixz>0</ixz><iyy>0.029125</iyy><iyz>0</iyz><izz>0.055225</izz></inertia></inertial><collision name='base_link_inertia_collision'><pose>0 0 0 0 0 0</pose><geometry><box><size>0.47 0.47 0.11</size></box></geometry><surface><contact><ode><min_depth>0.001</min_depth><max_vel>0</max_vel></ode></contact><friction><ode/></friction></surface></collision><visual name='base_link_inertia_visual'><pose>0 0 0 0 0 0</pose><geometry><mesh><scale>1 1 1</scale><uri>model://iris/meshes/iris.stl</uri></mesh></geometry><material><script><name>Gazebo/DarkGrey</name><uri>file://media/materials/scripts/gazebo.material</uri></script></material></visual><gravity>1</gravity><velocity_decay/></link><!-- 其他现有 link 和 joint(如 imu_link, rotor_0 等)保持不变 --><link name='/imu_link'><!-- 原有内容 --></link><joint name='/imu_joint' type='revolute'><!-- 原有内容 --></joint><link name='rotor_0'><!-- 原有内容 --></link><joint name='rotor_0_joint' type='revolute'><!-- 原有内容 --></joint><!-- rotor_1, rotor_2, rotor_3 等保持不变 --><!-- 添加相机 link --><link name="camera_link"><pose>0 0 -0.1 0 1.5708 0</pose> <!-- 下方 0.1 米,朝下 (绕 Y 轴旋转 90°) --><inertial><pose>0 0 0 0 0 0</pose><mass>0.01</mass> <!-- 相机质量,通常很小 --><inertia><ixx>1e-05</ixx><ixy>0</ixy><ixz>0</ixz><iyy>1e-05</iyy><iyz>0</iyz><izz>1e-05</izz></inertia></inertial><!-- 可选:添加可视化几何体 --><visual name="camera_visual"><pose>0 0 0 0 0 0</pose><geometry><box><size>0.02 0.02 0.02</size> <!-- 小盒子表示相机 --></box></geometry><material><script><name>Gazebo/Red</name><uri>file://media/materials/scripts/gazebo.material</uri></script></material></visual><!-- 相机传感器 --><sensor name="test_camera" type="camera"><always_on>true</always_on><update_rate>10.0</update_rate> <!-- 每秒 10 帧 --><camera><horizontal_fov>1.047</horizontal_fov> <!-- 视场角约 60° --><image><width>640</width><height>480</height><format>R8G8B8</format> <!-- RGB 格式 --></image><clip><near>0.1</near><far>1000</far></clip></camera><plugin name="camera_plugin" filename="libgazebo_ros_camera.so"><ros><namespace>/test_camera</namespace></ros><frame_name>camera_link</frame_name><cameraName>test_camera</cameraName></plugin></sensor></link><!-- 将相机固定到 base_link --><joint name="camera_joint" type="fixed"><parent>base_link</parent><child>camera_link</child></joint><!-- 以下是原有插件部分,保持不变 --><plugin name='rosbag' filename='libgazebo_multirotor_base_plugin.so'><!-- 原有内容 --></plugin><!-- 其他插件如 motor_model, gps, groundtruth 等保持不变 --></model>
</sdf>
三、代码说明
- 相机位置:
- <pose>0 0 -0.1 0 1.5708 0</pose>:
- 0 0 -0.1:相机位于 base_link 下方 0.1 米。
- 0 1.5708 0:绕 Y 轴旋转 90°(1.5708 弧度),使相机朝下。
- <pose>0 0 -0.1 0 1.5708 0</pose>:
- 惯性参数:
- <mass>0.01</mass> 和 <inertia>:相机质量和惯性矩阵,值较小以模拟轻型相机。
- 可视化(可选):
- 添加了一个红色小盒子作为相机模型,便于在 Gazebo 中看到。
- 传感器:
- <sensor name="test_camera" type="camera"> 定义相机参数。
- <plugin name="camera_plugin" filename="libgazebo_ros_camera.so"> 使用 ROS 插件发布图像到 /test_camera/image_raw。
- 关节:
- <joint name="camera_joint" type="fixed"> 将相机固定到 base_link。
四、总结
- 添加位置:在 <model name='iris'> 内,rotor_* 和 gps0 之后,<plugin> 之前。
- 效果:相机固定在 base_link 下方,朝下拍摄,图像通过 ROS 话题发布。
4.检查相机是否符合要求
话题列表:
- /test_camera/image_raw:原始图像数据。
- /test_camera/camera_info:相机内参和畸变参数。
- /test_camera/image_raw/compressed 等:压缩格式图像(由插件自动生成)。
运行仿真:
roslaunch px4 mavros_posix_sitl.launch
检查相机话题:
rostopic list | grep test_camera
查看图像:
rosrun image_view image_view image:=/test_camera/image_raw
检查发布频率:
rostopic hz /test_camera/image_raw
- 输出话题的平均发布频率(单位:Hz)。
- 预期:你在 iris.sdf 中设置了 <update_rate>10.0</update_rate>,应接近 10 Hz。
- 调整:如果需要更高帧率,修改 iris.sdf 中的 <update_rate>(如 30.0),保存后重启仿真:
查看图像信息:
rostopic echo /test_camera/image_raw -n 1
使用 camera_info:
rostopic echo /test_camera/camera_info -n 1
三.解释和分析上述 iris.sdf 文件的内容,包括其结构、语法和每个部分的含义
我将详细解释和分析上述 iris.sdf 文件的内容,包括其结构、语法和每个部分的含义。SDF(Simulation Description Format)是 Gazebo 仿真器使用的 XML 格式文件,用于定义机器人模型的物理属性、可视化、传感器和插件等。
一、SDF 文件总体结构与语法
1. 文件头
<sdf version='1.6'>
- 含义:声明 SDF 文件的版本为 1.6,表明使用的语法和功能符合 SDF 1.6 规范。
- 语法:<sdf> 是根标签,所有内容必须包裹在此标签内,version 属性指定版本号。
2. 模型定义
<model name='iris'>
- 含义:定义一个名为 iris 的模型(四旋翼无人机)。
- 语法:<model> 标签表示一个独立的物理实体,name 属性是模型的唯一标识符。
- 嵌套内容:包含 <link>(物理部件)、<joint>(关节)和 <plugin>(插件)等。
二、主要组成部分分析
1. <link> - 物理部件
<link> 定义模型的刚体部件,每个部件有位置、质量、惯性、碰撞体和可视化属性。
示例:base_link(主体)
<link name='base_link'><pose>0 0 0 0 0 0</pose><inertial><pose>0 0 0 0 0 0</pose><mass>1.5</mass><inertia><ixx>0.029125</ixx><ixy>0</ixy><ixz>0</ixz><iyy>0.029125</iyy><iyz>0</iyz><izz>0.055225</izz></inertia></inertial><collision name='base_link_inertia_collision'><pose>0 0 0 0 0 0</pose><geometry><box><size>0.47 0.47 0.11</size></box></geometry><surface><contact><ode><min_depth>0.001</min_depth><max_vel>0</max_vel></ode></contact><friction><ode/></friction></surface></collision><visual name='base_link_inertia_visual'><pose>0 0 0 0 0 0</pose><geometry><mesh><scale>1 1 1</scale><uri>model://iris/meshes/iris.stl</uri></mesh></geometry><material><script><name>Gazebo/DarkGrey</name><uri>file://media/materials/scripts/gazebo.material</uri></script></material></visual><gravity>1</gravity><velocity_decay/>
</link>
- <pose>:x y z roll pitch yaw(单位:米和弧度),表示相对于模型坐标系的位置和姿态。
- 0 0 0 0 0 0:位于原点,无旋转。
- <inertial>:定义物理属性。
- <mass>:1.5 kg,主体质量。
- <inertia>:惯性张量(对角矩阵),描述质量分布,单位 kg·m²。
- ixx, iyy, izz:主轴惯性,ixy, ixz, iyz:交叉项(这里为 0,表示对称)。
- <collision>:碰撞体,用于物理计算。
- <geometry><box><size>:0.47x0.47x0.11 m 的盒子。
- <surface>:接触和摩擦属性,ode 表示使用 ODE 物理引擎。
- <min_depth>:最小穿透深度。
- <max_vel>:最大接触速度。
- <visual>:可视化外观。
- <geometry><mesh>:加载 iris.stl 网格文件。
- <material>:颜色为深灰(Gazebo/DarkGrey)。
- <gravity>:1,表示受重力影响。
- <velocity_decay>:速度衰减(默认空值,无阻尼)。
示例:rotor_0(旋翼)
<link name='rotor_0'><pose>0.13 -0.22 0.023 0 0 0</pose><inertial><mass>0.005</mass><inertia><ixx>9.75e-07</ixx><iyy>0.000273104</iyy><izz>0.000274004</izz></inertia></inertial><collision name='rotor_0_collision'><geometry><cylinder><length>0.005</length><radius>0.128</radius></cylinder></geometry></collision><visual name='rotor_0_visual'><geometry><mesh><uri>model://iris/meshes/iris_prop_ccw.dae</uri></mesh></geometry><material><script><name>Gazebo/Blue</name></script></material></visual><gravity>1</gravity>
</link>
- <pose>:旋翼位置 (0.13, -0.22, 0.023),相对于 base_link。
- <inertial>:质量 0.005 kg,惯性较小。
- <collision>:圆柱体(半径 0.128 m,厚度 0.005 m)。
- <visual>:加载逆时针螺旋桨模型,颜色为蓝色。
示例:camera_link(相机)
<link name="camera_link"><pose>0 0 -0.1 0 1.5708 0</pose><inertial><mass>0.01</mass><inertia><ixx>1e-05</ixx><iyy>1e-05</iyy><izz>1e-05</izz></inertia></inertial><visual name="camera_visual"><geometry><box><size>0.02 0.02 0.02</size></box></geometry><material><script><name>Gazebo/Red</name></script></material></visual><sensor name="test_camera" type="camera"><always_on>true</always_on><update_rate>10.0</update_rate><camera><horizontal_fov>1.047</horizontal_fov><image><width>640</width><height>480</height><format>R8G8B8</format></image><clip><near>0.1</near><far>1000</far></clip></camera><plugin name="camera_plugin" filename="libgazebo_ros_camera.so"><ros><namespace>/test_camera</namespace></ros><frame_name>camera_link</frame_name><cameraName>test_camera</cameraName></plugin></sensor>
</link>
- <pose>:下方 0.1 m,绕 Y 轴旋转 90°(朝下)。
- <inertial>:质量 0.01 kg,惯性小。
- <visual>:红色小盒子表示相机。
- <sensor>:相机传感器。
- <update_rate>:10 Hz。
- <horizontal_fov>:约 60°。
- <image>:分辨率 640x480,RGB 格式。
- <clip>:近裁剪面 0.1 m,远裁剪面 1000 m。
- <plugin>:libgazebo_ros_camera.so 将图像发布到 ROS 话题 /test_camera/image_raw。
2. <joint> - 关节
<joint> 定义部件之间的连接。
示例:rotor_0_joint
<joint name='rotor_0_joint' type='revolute'><child>rotor_0</child><parent>base_link</parent><axis><xyz>0 0 1</xyz><limit><lower>-1e+16</lower><upper>1e+16</upper></limit><dynamics><spring_reference>0</spring_reference><spring_stiffness>0</spring_stiffness></dynamics><use_parent_model_frame>1</use_parent_model_frame></axis>
</joint>
- <type>:revolute(旋转关节)。
- <child> 和 <parent>:连接 rotor_0 和 base_link。
- <axis>:旋转轴。
- <xyz>:Z 轴 (0 0 1)。
- <limit>:旋转范围(几乎无限制)。
- <dynamics>:无弹簧效应。
示例:camera_joint
<joint name="camera_joint" type="fixed"><parent>base_link</parent><child>camera_link</child>
</joint>
- <type>:fixed(固定关节),相机不可动。
- 连接:将 camera_link 固定到 base_link。
3. <plugin> - 插件
<plugin> 添加仿真功能,如动力学或传感器数据发布。
示例:motor_model(电机)
<plugin name='front_right_motor_model' filename='libgazebo_motor_model.so'><jointName>rotor_0_joint</jointName><linkName>rotor_0</linkName><turningDirection>ccw</turningDirection><maxRotVelocity>1100</maxRotVelocity><motorConstant>5.84e-06</motorConstant><commandSubTopic>/gazebo/command/motor_speed</commandSubTopic><motorNumber>0</motorNumber>
</plugin>
- <filename>:加载 libgazebo_motor_model.so。
- 参数:
- <jointName>:控制 rotor_0_joint。
- <turningDirection>:逆时针旋转。
- <maxRotVelocity>:最大转速 1100 rad/s。
- <commandSubTopic>:订阅电机速度指令。
示例:mavlink_interface(MAVLink 接口)
<plugin name='mavlink_interface' filename='libgazebo_mavlink_interface.so'><imuSubTopic>/imu</imuSubTopic><mavlink_tcp_port>4560</mavlink_tcp_port><enable_lockstep>1</enable_lockstep>
</plugin>
- 功能:连接 Gazebo 和 PX4,通过 MAVLink 协议通信。
- 参数:
- <imuSubTopic>:订阅 IMU 数据。
- <mavlink_tcp_port>:TCP 端口 4560。
- <enable_lockstep>:同步仿真和 PX4 时间。
4. <include> - 外部模型
<include><uri>model://gps</uri><pose>0.1 0 0 0 0 0</pose><name>gps0</name>
</include>
- 含义:引入外部 GPS 模型,位置在前方 0.1 m。
三、语法规则
- XML 格式:层级结构,标签必须闭合。
- 单位:
- 长度:米 (m)。
- 角度:弧度 (rad)。
- 质量:千克 (kg)。
- 坐标系:
- 模型坐标系:base_link 为原点。
- <pose>:x y z roll pitch yaw。
- 命名:name 属性必须唯一。
四、整体功能分析
- 模型:iris 是一个四旋翼无人机。
- 部件:
- base_link:机身。
- rotor_*:四个旋翼。
- imu_link:IMU 传感器。
- camera_link:下视相机。
- 关节:旋翼可旋转,IMU 和相机固定。
- 插件:实现电机控制、传感器数据发布和 PX4 集成。
五、总结
这个 iris.sdf 文件定义了一个功能完整的四旋翼模型,包含物理属性、可视化、传感器(相机、IMU、GPS 等)和 PX4 仿真接口。语法符合 SDF 1.6 规范,结构清晰,便于扩展(如添加更多传感器)。如果有具体部分需要深入分析,请告诉我!
四.sdf模型坐标系是什么,gazebo仿真世界坐标系是什么
在 Gazebo 中,SDF(Simulation Description Format)模型坐标系和 Gazebo 仿真世界坐标系是两个相关但不同的概念。理解它们的定义和关系对于正确配置机器人模型(如 iris.sdf)以及在仿真中定位和控制非常重要。以下是详细解释。
一、SDF 模型坐标系
定义
- SDF 模型坐标系 是指一个 SDF 文件中定义的模型(例如 iris)自身的局部坐标系。
- 原点:由 <model> 标签内的第一个 <link>(通常是主体部件,如 base_link)的 <pose> 定义。如果未指定,默认位于模型的几何中心。
- 方向:
- X 轴:向前(正方向)。
- Y 轴:向右(正方向)。
- Z 轴:向上(正方向)。
- 单位:米(长度),弧度(角度)。
在 iris.sdf 中的体现
<model name='iris'><link name='base_link'><pose>0 0 0 0 0 0</pose>...</link><link name='rotor_0'><pose>0.13 -0.22 0.023 0 0 0</pose>...</link><link name="camera_link"><pose>0 0 -0.1 0 1.5708 0</pose>...</link>
</model>
- 原点:base_link 的 <pose>0 0 0 0 0 0</pose> 定义了模型坐标系的原点(位于机身中心)。
- 相对位置:
- rotor_0 位于 (0.13, -0.22, 0.023),即相对于 base_link 前方 0.13 m,左侧 0.22 m,上方 0.023 m。
- camera_link 位于 (0, 0, -0.1),下方 0.1 m,绕 Y 轴旋转 1.5708 弧度(90°,朝下)。
- 特性:所有 <link> 和 <joint> 的 <pose> 都是相对于模型坐标系的局部偏移。
特点
- 独立性:模型坐标系是模型内部的参考系,与外部世界无关。
- 移动性:当模型在仿真中移动时,整个模型坐标系随模型一起移动。
二、Gazebo 仿真世界坐标系
定义
- Gazebo 仿真世界坐标系 是 Gazebo 仿真环境的全局参考系,固定不变。
- 原点:通常位于仿真世界的 (0, 0, 0),对应于 Gazebo 窗口的中心地面。
- 方向:
- X 轴:向东(正方向)。
- Y 轴:向北(正方向)。
- Z 轴:向上(正方向,与重力相反)。
- 单位:与 SDF 一致,米和弧度。
在仿真中的体现
- 模型放置:当你通过 roslaunch px4 mavros_posix_sitl.launch 启动仿真时,iris 模型会被放置到世界坐标系中的某个位置。
- 默认位置通常由 launch 文件或 Gazebo 的世界文件(.world)指定,例如 (0, 0, 0)。
- 话题数据:
- /gazebo/model_states 话题提供所有模型相对于世界坐标系的位置和姿态。
- 示例:若 iris 的 base_link 在世界坐标系中位于 (1, 2, 0.5),则其模型坐标系原点也在此点。
特点
- 固定性:世界坐标系是全局的,不随模型移动。
- 参考性:所有模型、传感器数据和物理计算都以世界坐标系为基准。
三、两者的关系
- 层次关系:
- 模型坐标系是局部坐标系,嵌套在世界坐标系内。
- 模型坐标系的原点位置和姿态由模型在世界坐标系中的 <pose> 决定。
- 变换:
- 从模型坐标系到世界坐标系需要应用模型的全局位姿(位置和旋转)。
- 例如,若 iris 在世界坐标系中位于 (1, 0, 0),则 camera_link 的世界坐标为 (1, 0, -0.1)。
- 实际应用:
- 在 SDF 中配置时,使用模型坐标系(相对 base_link)。
- 在仿真运行时,传感器数据(如相机图像的 frame_id)和运动控制基于世界坐标系。
四、示例分析(基于 iris.sdf)
模型坐标系
- 原点:base_link 位于 (0, 0, 0)。
- 旋翼:rotor_0 在 (0.13, -0.22, 0.023),表示相对于机身中心的偏移。
- 相机:camera_link 在 (0, 0, -0.1),下方 0.1 m,朝下。
世界坐标系
- 假设:iris 被放置在世界坐标系的 (0, 0, 1)(起飞高度 1 m)。
- 计算:
- base_link 世界坐标:(0, 0, 1)。
- rotor_0 世界坐标:(0.13, -0.22, 1.023)。
- camera_link 世界坐标:(0, 0, 0.9)。
验证
- 运行仿真:
roslaunch px4 mavros_posix_sitl.launch
检查模型位置:
rostopic echo /gazebo/model_states -n 1
-
- 查找 iris 的 pose,确认其在世界坐标系中的位置。
五、语法与配置要点
- SDF 中的 <pose>:
- 格式:x y z roll pitch yaw。
- 在 <link> 中定义相对于模型坐标系的位置。
- 世界坐标系的指定:
- 通过 Gazebo 的 .world 文件或 ROS launch 文件(如 mavros_posix_sitl.launch)设置模型初始位置。
- 示例(在 .world 文件中):
<include><uri>model://iris</uri>
五.如何知道世界坐标系的原点和xyz方向,如何知道模型坐标系的原点和xyz方向
在 Gazebo 中,确定世界坐标系和模型坐标系的原点及其 X、Y、Z 方向需要结合文件配置、仿真环境和可视化工具进行观察和验证。以下是详细的步骤和方法,帮助你明确这两者的原点和方向。
一、确定 Gazebo 世界坐标系的原点和 XYZ 方向
1. 世界坐标系的定义
- 原点:默认情况下,Gazebo 世界坐标系的原点位于仿真环境的 (0, 0, 0),通常对应于地面中心。
- 方向:
- X 轴:向东(正方向)。
- Y 轴:向北(正方向)。
- Z 轴:向上(正方向,与重力相反)。
2. 如何确认原点和方向
方法 1:检查世界文件
- Gazebo 的世界坐标系由 .world 文件定义。
- 示例:在你的 PX4 SITL 仿真中,可能是 ~/PX4_Firmware/Tools/sitl_gazebo/worlds/empty.world。
- 查看文件:
cat ~/PX4_Firmware/Tools/sitl_gazebo/worlds/empty.world
查找 <pose> 或 <origin>:
<world name="empty"><scene><ambient>0.4 0.4 0.4 1</ambient><background>0.7 0.7 0.7 1</background></scene><physics type="ode">...</physics><model name="ground_plane"><pose>0 0 0 0 0 0</pose>...</model>
</world>
-
- 分析:
- ground_plane 的 <pose>0 0 0 0 0 0</pose> 表示地面位于世界坐标系原点。
- 原点默认在地面中心,Z=0 为地面高度。
- 分析:
方法 2:通过 Gazebo GUI 可视化
- 启动仿真:
roslaunch px4 mavros_posix_sitl.launch
- 观察:
- Gazebo 窗口中,地面是一个灰色平面,其中心通常是世界坐标系原点 (0, 0, 0)。
- XYZ 方向:
- 在 Gazebo 中,右键点击空白处,选择 “View -> Wireframe” 或 “View -> Orbit”,观察坐标轴方向。
- 默认情况下,X 轴向右(东),Y 轴向前(北),Z 轴向上。
- 添加坐标轴(可选):
- 在 .world 文件中手动添加一个坐标轴模型:
<include><uri>model://coordinate_frame</uri><pose>0 0 0 0 0 0</pose>
</include>
-
- 重启仿真后,坐标轴模型会显示红(X)、绿(Y)、蓝(Z),直观确认方向。
方法 3:检查 /gazebo/model_states
- 运行命令:
rostopic echo /gazebo/model_states -n 1
输出示例:
name: ['ground_plane', 'iris']
pose:-position:x: 0.0y: 0.0z: 0.0orientation:x: 0.0y: 0.0z: 0.0w: 1.0-position:x: 0.0y: 0.0z: 0.5orientation:x: 0.0y: 0.0z: 0.0w: 1.0
- 分析:
- ground_plane 在 (0, 0, 0),确认世界原点在地面。
- iris 在 (0, 0, 0.5),表示模型初始位于 Z=0.5 m。
- 方向由四元数 orientation 表示,(0, 0, 0, 1) 表示无旋转,与世界坐标系对齐。
二、确定 SDF 模型坐标系的原点和 XYZ 方向
1. 模型坐标系的定义
- 原点:由 <model> 内第一个 <link>(通常是 base_link)的 <pose> 定义,默认情况下是 (0, 0, 0)。
- 方向:
- X 轴:向前(正方向)。
- Y 轴:向右(正方向)。
- Z 轴:向上(正方向)。
- 局部性:所有其他 <link> 和 <joint> 的 <pose> 是相对于模型坐标系的偏移。
2. 如何确认原点和方向
方法 1:分析 SDF 文件
- 查看 iris.sdf:
<model name='iris'><link name='base_link'><pose>0 0 0 0 0 0</pose>...</link><link name='rotor_0'><pose>0.13 -0.22 0.023 0 0 0</pose>...</link><link name="camera_link"><pose>0 0 -0.1 0 1.5708 0</pose>...</link>
</model>
- 分析:
- 原点:base_link 的 <pose>0 0 0 0 0 0</pose> 定义模型坐标系原点。
- 方向:
- rotor_0 在 (0.13, -0.22, 0.023):
- X 正方向(0.13):向前。
- Y 负方向(-0.22):向左(相对于右为正)。
- Z 正方向(0.023):向上。
- camera_link 在 (0, 0, -0.1),Z 负方向为下方,pitch=1.5708(90°)使相机朝下。
- rotor_0 在 (0.13, -0.22, 0.023):
- 结论:模型坐标系的 X 向前,Y 向右,Z 向上,与惯例一致。
方法 2:Gazebo GUI 可视化
- 启动仿真:
roslaunch px4 mavros_posix_sitl.launch
- 观察模型:
- 在 Gazebo 中选中 iris,右键选择 “View -> Transparent” 或 “Wireframe”,查看部件布局。
- base_link 是机身中心,旋翼位置(如 rotor_0 在左前方)可确认方向:
- X 轴:机头方向。
- Y 轴:右侧方向。
- Z 轴:顶部方向。
- 添加坐标轴:
- 修改 iris.sdf,在 base_link 中添加可视化坐标轴:
<visual name="base_link_axes"><pose>0 0 0 0 0 0</pose><geometry><mesh><uri>model://coordinate_frame/meshes/axes.dae</uri><scale>0.1 0.1 0.1</scale></mesh></geometry>
</visual>
-
- 重启仿真后,机身中心会显示坐标轴(红 X,绿 Y,蓝 Z)。
方法 3:检查传感器数据
- 相机朝向:
rosrun image_view image_view image:=/test_camera/image_raw
-
- camera_link 的 <pose>0 0 -0.1 0 1.5708 0</pose> 表示朝下,图像应显示地面,确认 Z 负方向。
- IMU 数据:
rostopic echo /imu -n 1
-
- IMU 的 <pose> 与 base_link 对齐,检查加速度(Z 轴应接近 -9.81 m/s²,表示向上为正)。
三、两者的关系与验证
- 模型坐标系到世界坐标系:
- 模型坐标系的原点和方向由 iris 在世界坐标系中的位姿决定。
- 示例:若 iris 在世界坐标系的 (1, 0, 0),无旋转,则 rotor_0 的世界坐标为 (1.13, -0.22, 0.023)。
- 验证方法:
- 在 Gazebo 中移动 iris(通过 GUI 或 /gazebo/set_model_state),观察模型坐标系如何随世界坐标系变化。
- 示例命令:
rostopic pub /gazebo/set_model_state gazebo_msgs/ModelState "model_name: 'iris'
pose:position:x: 2.0y: 0.0z: 1.0orientation:x: 0.0y: 0.0z: 0.0w: 1.0"
四、总结
世界坐标系
- 原点:地面中心 (0, 0, 0),由 .world 文件或默认设置确定。
- 方向:X 东,Y 北,Z 上,通过 GUI 或 /gazebo/model_states 验证。
模型坐标系
- 原点:base_link 的 <pose>((0, 0, 0)),即机身中心。
- 方向:X 前,Y 右,Z 上,通过 SDF 配置和可视化(如旋翼、相机位置)确认。
实用建议
- 调试:在 Gazebo 中添加坐标轴模型,或用 ROS 话题检查位姿。
- 可视化:用 rviz 订阅 /test_camera/image_raw 和 /tf,直观显示坐标系关系。
六.依然是坐标系问题
解释一下下面的输出:
leaf@LAPTOP-NI05EP5K:~$ rostopic echo /gazebo/model_states -n 1
name:- ground_plane- asphalt_plane- iris
pose:-position:x: 0.0y: 0.0z: 0.0orientation:x: 0.0y: 0.0z: 0.0w: 1.0-position:x: 0.0y: 0.0z: 0.0orientation:x: 0.0y: 0.0z: 0.0w: 1.0-position:x: -0.03940256735964742y: 0.014403233290510268z: 0.10448983608463772orientation:x: 2.0178038215501333e-05y: 0.0010289933143760208z: -0.016112123443332602w: 0.9998696616278306
twist:-linear:x: 0.0y: 0.0z: 0.0angular:x: 0.0y: 0.0z: 0.0-linear:x: 0.0y: 0.0z: 0.0angular:x: 0.0y: 0.0z: 0.0-linear:x: -4.174362083928031e-06y: -3.40546941860435e-06z: -1.8908038290643137e-06angular:x: 6.162506394544502e-05y: -7.602476140973817e-05z: -5.77627563001367e-08
---
在 Gazebo 中,右键点击空白处,选择 “View -> Wireframe” 或 “View -> Orbit”,观察坐标轴,红绿蓝三条线分别对应的是xyz中的什么?
rotor_0 在机身的右前方,模型坐标系的 XYZ 方向是什么
我将逐一解释你的问题,包括 /gazebo/model_states 的输出、Gazebo GUI 中坐标轴的颜色对应,以及 rotor_0 位置与模型坐标系方向的关系。
一、解释 /gazebo/model_states 输出
命令与输出
leaf@LAPTOP-NI05EP5K:~$ rostopic echo /gazebo/model_states -n 1
- 话题:/gazebo/model_states 是 Gazebo 发布的消息,类型为 gazebo_msgs/ModelStates,包含仿真中所有模型的状态(位置、姿态、速度)。
- -n 1:仅显示一条消息。
输出内容
name:- ground_plane- asphalt_plane- iris
pose:-position: {x: 0.0, y: 0.0, z: 0.0}orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}-position: {x: 0.0, y: 0.0, z: 0.0}orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}-position: {x: -0.03940256735964742, y: 0.014403233290510268, z: 0.10448983608463772}orientation: {x: 2.0178038215501333e-05, y: 0.0010289933143760208, z: -0.016112123443332602, w: 0.9998696616278306}
twist:-linear: {x: 0.0, y: 0.0, z: 0.0}angular: {x: 0.0, y: 0.0, z: 0.0}-linear: {x: 0.0, y: 0.0, z: 0.0}angular: {x: 0.0, y: 0.0, z: 0.0}-linear: {x: -4.174362083928031e-06, y: -3.40546941860435e-06, z: -1.8908038290643137e-06}angular: {x: 6.162506394544502e-05, y: -7.602476140973817e-05, z: -5.77627563001367e-08}
分析
- name:
- ground_plane:地面模型。
- asphalt_plane:可能是额外的地面或跑道模型。
- iris:你的四旋翼无人机模型。
- 顺序:与后续 pose 和 twist 的列表对应。
- pose(位置和姿态,相对于世界坐标系):
- ground_plane:
- position: (0.0, 0.0, 0.0):位于世界坐标系原点。
- orientation: (0, 0, 0, 1):四元数表示无旋转,与世界坐标系对齐。
- asphalt_plane:
- position: (0.0, 0.0, 0.0):同样位于原点,可能与 ground_plane 重叠。
- orientation: (0, 0, 0, 1):无旋转。
- iris:
- position: (-0.0394, 0.0144, 0.1045):
- X: -0.0394 m(略向西)。
- Y: 0.0144 m(略向北)。
- Z: 0.1045 m(上方约 10.45 cm)。
- orientation: (2.018e-05, 0.001029, -0.01611, 0.99987):
- 四元数表示微小旋转。
- 转换为欧拉角(近似):偏航约 -1.84°(绕 Z 轴),俯仰和滚转几乎为 0。
- 结论:iris 略微偏离原点,姿态接近水平。
- position: (-0.0394, 0.0144, 0.1045):
- ground_plane:
- twist(线速度和角速度,相对于世界坐标系):
- ground_plane 和 asphalt_plane:
- linear: (0, 0, 0):无线性速度(固定)。
- angular: (0, 0, 0):无角速度。
- iris:
- linear: (-4.17e-06, -3.41e-06, -1.89e-06):
- 速度极小(微米/秒级别),几乎静止。
- angular: (6.16e-05, -7.60e-05, -5.78e-08):
- 角速度也很小(弧度/秒),表明几乎无旋转。
- 结论:iris 当前处于稳定状态(可能是刚起飞或悬停)。
- linear: (-4.17e-06, -3.41e-06, -1.89e-06):
- ground_plane 和 asphalt_plane:
总结
- 世界坐标系:ground_plane 和 asphalt_plane 在 (0, 0, 0),确认原点在地面中心。
- iris 位置:位于世界坐标系的 (-0.0394, 0.0144, 0.1045),略微偏离原点,高度 10.45 cm,微小偏航。
二、Gazebo GUI 中坐标轴颜色对应
操作
- 在 Gazebo 中,右键空白处,选择 “View -> Wireframe” 或 “View -> Orbit”。
- 如果添加了坐标轴模型(例如通过 <include><uri>model://coordinate_frame</uri></include>),会显示红、绿、蓝三条线。
颜色与 XYZ 的对应
- 红色:X 轴。
- 世界坐标系:向东。
- 绿色:Y 轴。
- 世界坐标系:向北。
- 蓝色:Z 轴。
- 世界坐标系:向上。
- 验证:
- 在 Gazebo 中,地面平面(X-Y 平面)为灰色,Z 轴(蓝色)垂直向上。
- 若添加坐标轴模型到 iris,红线指向机头(X),绿线指向右侧(Y),蓝线指向顶部(Z)。
三、rotor_0 在右前方,模型坐标系的 XYZ 方向
rotor_0 的位置
- 在 iris.sdf 中:
<link name='rotor_0'><pose>0.13 -0.22 0.023 0 0 0</pose>...
</link>
- 解析:
- x: 0.13:向前 0.13 m。
- y: -0.22:向左 0.22 m(Y 负方向)。
- z: 0.023:向上 0.023 m。
- 结论:相对于 base_link(模型坐标系原点),rotor_0 在 前方且偏左上方。
- 你提到“右前方”,可能是与实际定义不符,需澄清。
模型坐标系的 XYZ 方向
- 原点:base_link 的 <pose>0 0 0 0 0 0</pose>,即机身中心。
- 方向:
- X 轴:向前(正方向)。
- rotor_0 的 x: 0.13 表示 X 正方向是机头方向。
- Y 轴:向右(正方向)。
- rotor_0 的 y: -0.22 表示向左(Y 负方向),因此 Y 正方向是右侧。
- Z 轴:向上(正方向)。
- rotor_0 的 z: 0.023 表示 Z 正方向是顶部。
- X 轴:向前(正方向)。
- 澄清“右前方”:
- 根据 SDF,rotor_0 在左前方(x: 0.13, y: -0.22)。
- 若你认为它是“右前方”,可能是误解或参照了其他旋翼(如 rotor_2:<pose>0.13 0.22 0.023 0 0 0</pose>,右前方)。
验证
- SDF 检查:
- rotor_0: (0.13, -0.22, 0.023) → 左前方。
- rotor_2: (0.13, 0.22, 0.023) → 右前方。
- Gazebo GUI:
- 启动仿真,查看 iris 模型,确认旋翼位置。
- 若添加坐标轴模型,红线(X)向前,绿线(Y)向右,蓝线(Z)向上。
四、综合分析
- 世界坐标系:
- 原点:(0, 0, 0)(地面中心)。
- 方向:X 东,Y 北,Z 上(红绿蓝对应)。
- iris 当前位置:(-0.0394, 0.0144, 0.1045)。
- 模型坐标系:
- 原点:base_link(机身中心)。
- 方向:X 前,Y 右,Z 上。
- rotor_0 在左前方(若你指“右前方”,可能是 rotor_2)。
- 关系:
- iris 的模型坐标系原点在世界坐标系的 (-0.0394, 0.0144, 0.1045)。
- rotor_0 世界坐标:(-0.0394 + 0.13, 0.0144 - 0.22, 0.1045 + 0.023) = (0.0906, -0.2056, 0.1275)。
五、建议
- 确认“右前方”:检查 iris.sdf 中四个旋翼的 <pose>,明确哪个是右前方(应为 rotor_2)。
- 可视化验证:
roslaunch px4 mavros_posix_sitl.launch
-
- 在 Gazebo 中观察 iris 的旋翼布局。
- 进一步调试:若需更直观显示坐标系,添加坐标轴模型到 base_link。
相关文章:
使用PX4,gazebo,mavros为旋翼添加下视的相机(仿真采集openrealm数据集-第一步)
目录 一.方法一(没成功) 1.运行PX4 2.运行mavros通讯 3.启动仿真世界和无人机 (1)单独测试相机 (2)make px4_sitl gazebo启动四旋翼iris无人机 二.方法二(成功) 1.通过 rosl…...
ATEngin开发记录_4_使用Premake5 自动化构建跨平台项目文件
该系列只做记录 不做教程 所以文章简洁直接 会列出碰到的问题和解决方案 只适合C萌新 文章目录 Permake5为什么使用 Premake? 项目实战总结一下:详细代码: Permake5 Premake5 是一个跨平台的构建配置工具,它允许开发者通过使用一个简单的脚…...
equals() 和 hashCode()
作为 Java 开发者,我们经常会用到 equals() 和 hashCode() 这两个方法。 它们是 Object 类中定义的基础方法,看似简单,但如果理解不透彻,很容易在实际开发中踩坑。 本文将深入探讨这两个方法的作用、区别、以及如何正确地重写它们…...
臭氧除菌柜市场报告:2031年全球臭氧除菌柜市场销售额预计将达到9.4亿元
一、市场概述 (一)定义与分类 臭氧除菌柜,作为新一代绿色消毒设备,主要利用臭氧(O₃)的强氧化性来实现无化学残留的消毒净化。根据产品类型,可分为单门型和双门型。单门型设计紧凑,…...
解决python manage.py shell ModuleNotFoundError: No module named xxx
报错如下: python manage.py shellTraceback (most recent call last):File "/Users/z/Documents/project/c/manage.py", line 10, in <module>execute_from_command_line(sys.argv)File "/Users/z/.virtualenvs/c/lib/python3.12/site-packa…...
通用接口函数注册模块设计与实现
文章目录 通用接口函数注册模块设计与实现1. 模块概述2. 核心功能2.1 数据结构函数注册项结构体注册函数宏 2.2 核心函数实现函数:sl_register_interface_functions 3. 使用示例3.1 基础使用示例 - 设备驱动接口定义接口结构体实现具体函数创建注册表注册接口 3.2 高…...
C,C++,C#
C、C 和 C# 是三种不同的编程语言,虽然它们名称相似,但在设计目标、语法特性、运行环境和应用场景上有显著区别。以下是它们的核心区别: 1. 设计目标和历史 语言诞生时间设计目标特点C1972(贝尔实验室)面向过程&#…...
scala-集合3
集合计算高级函数 过滤:遍历一个集合并从中获取满足指定条件的元素组成一个新的集合 (筛选出满足条件的元素组成新集合。) 转换或映射(map):将原始集合中的元素映射到某个函数。 扁平化:取消…...
Spring MVC 重定向(Redirect)详解
Spring MVC 重定向(Redirect)详解 1. 核心概念与作用 重定向(Redirect) 是 Spring MVC 中一种客户端重定向机制,通过 HTTP 302 状态码(默认)将用户浏览器重定向到指定 URL。 主要用途…...
Scala的集合(二)
1. 集合计算高集函数 任务要求 1)过滤:遍历一个集合并从中获取满足指定条件的元素组成一个新的集合 2)转化/映射(map):将集合中的每一个元素映射到某一个函数 3)扁平化 4)扁平化映射 注:flatMap 相当于先进行 map 操作&#…...
GZ036区块链卷三 EtherGame合约漏洞详解
题目 pragma solidity ^0.8.3; contract EtherGame {uint public targetAmount 7 ether;address public winner;function deposit() public payable {require(msg.value 1 ether, "You can only send 1 Ether");uint balance address(this).balance;require(bala…...
BGP路由协议之路由通告/传递
BGP 的路由宣告 BGP 自身并不会发现并计算产生路由,只会将 IGP 路由表中的路由引入到 BGP 路由表中,并通过 Update 报文传递给 BGP 对等体(邻居) Network 宣告,前提是路由表中存在该条路由 import-route 引…...
Python合并多个pdf
场景: 现在要解决批量合并PDF的问题。 有很多PDF文件需要合并成一个,比如报告、发票或者多个章节的文档。 对于Windows用户,Adobe Acrobat是专业的选择,但需要付费。但是我不想花钱,所以推荐免费软件,比…...
聊一聊接口测试时遇到上下游依赖时该如何测试
目录 一、手工测试时的处理方法 1.1沟通协调法 1.2模拟数据法 二、自动化测试时的处理方法 2.1 数据关联法(变量提取) 2.2 Mock数据法 2.3自动化框架中的依赖管理 三、实施示例(以订单接口测试为例) 3.1Mock依赖接口&…...
pdf转latex
Doc2X(https://doc2x.noedgeai.com/) Doc2X 是一个由 NoEdgeAI 提供的在线工具,主要用于将 PDF 文件(尤其是学术论文、报告等文档)转换为 LaTeX 格式。LaTeX 是一种高质量排版系统,广泛应用于学术界和出版…...
剖析 Docker Swarm 操作对原有容器端口影响
剖析 Docker Swarm 操作对容器端口影响 一、背景阐述 在使用 Docker Swarm 构建集群环境过程中,于 ts3 节点出现了原有的容器端口全部失效,手动重启后才恢复的情况。期间涉及 docker swarm init --advertise-addr172.16.10.110 以及 docker swarm join…...
QML面试笔记--UI设计篇02布局控件
1. QML 中常用的布局控件 1.1. Row1.2. Column1.3. Grid1.4. RowLayout1.5. ColumnLayout1.6. GridLayout1.7. 总结 1. QML 中常用的布局控件 1.1. Row 背景知识:Row 布局用于将子元素水平排列,适合简单的线性布局,如工具栏按钮或表单输入…...
Java全栈项目--校园快递管理与配送系统(4)
源代码续 /*** 通知工具类*/// 通知类型常量 export const NotificationType {SYSTEM: 1,EXPRESS: 2,ACTIVITY: 3 }// 通知类型名称映射 export const NotificationTypeNames {[NotificationType.SYSTEM]: 系统通知,[NotificationType.EXPRESS]: 快递通知,[NotificationType…...
c语言练习一
1、统计二进制数中1的个数 #include <stdio.h>int main(void) {int count 0; //统计1出现次数 int x 0b1011;while(x){count ;//x 0b1011 > x-1 0b1010 x-1,将x从右往左数遇到第一个1变成0,左边全部变为1,右边不变 //x&x-1 1010 …...
Scala安装
Spark安装 Spark的Local模式仅需要单个虚拟机节点即可,无需启动hadoop集群。实验步骤如下: 将spark的安装包上传到虚拟机node01中(建议路径:/opt/software/spark)并解压缩文件。将解压文件夹重命名为spark-local 解…...
爱普生RTC模块RA8804CE在ADAS域控制器的应用
在汽车智能化、自动化飞速发展的时代,ADAS(高级驾驶辅助系统)的多传感器融合与实时决策高度依赖精准的时间基准。毫秒级的时间偏差可能导致传感器数据错位,直接影响行车安全。爱普生RA8804CE实时时钟模块凭借其内置的32.768 kHz晶…...
开箱即用!推荐一款Python开源项目:DashGo,支持定制改造为测试平台!
大家好,我是狂师。 市面上的开源后台管理系统项目层出不穷,对应所使用到的技术栈也不尽相同。 今天给大家推荐一款开源后台管理系统: DashGo,不仅部署起来非常的简单,而且它是基于Python技术栈实现的,使得基于它进行…...
C++使用WebView2控件,通过IPC通信与Javascript交互
引言 在现代桌面应用程序开发中,Web技术与原生应用的融合变得越来越普遍。Microsoft的WebView2控件为C开发者提供了一个强大的工具,使他们能够在桌面应用中嵌入基于Chromium的Web浏览器引擎。本文将详细介绍如何在C应用程序中使用WebView2控件ÿ…...
算法中Hash备胎——LRU的设计与实现
核心内容1.理解LRU的原理2.理解LRU是如何实现的3.能够通过代码实现LRU 缓存是应用软件的必备功能之一,在操作系统、Java里的Spring、mybatis、redis、mysql等软件中都有自己的内部缓存模块,而缓存是如何实现的? 在操作系统教科书里我们知道…...
Profinet邂逅ModbusRTU:印刷厂有网关“一键打通”通信链路
Profinet邂逅ModbusRTU:印刷厂有网关“一键打通”通信链路 在现代化印刷厂的生产线上,高效稳定的设备通信是保障印刷质量和生产效率的关键。某印刷厂的印刷机控制系统采用了西门子PLC进行自动化控制,同时还有众多基于ModbusRTU协议的传感器和…...
Spring中使用Kafka的详细配置,以及如何集成 KRaft 模式的 Kafka
在 Spring 中使用 Apache Kafka 的配置主要涉及 Spring Boot Starter for Kafka,而开启 KRaft 模式(Kafka 的元数据管理新模式,替代 ZooKeeper)需要特定的 Kafka Broker 配置。以下是详细步骤: 一、Spring 中集成 …...
C++之继承
本节我们将要学习C作为面向对象语言的三大特性之一的继承。 前言 一、继承的概念 二、继承的定义 2.1 定义格式 2.2 继承基类成员访问方式的变化 2.3 继承类模板 三、基类和派生类之间的转换 四、继承中的作用域 五、派生类的默认成员函数 六、实现一个不能被继承的类 七、继承…...
服务器申请 SSL 证书注意事项
一、确认证书类型 基础域名型(DV):这类证书验证速度最快,通常只需验证域名所有权,几分钟到几小时即可颁发。适用于个人博客、小型企业展示网站等对安全性要求不是顶级严苛,且急需启用 HTTPS 的场景。但它仅…...
【资料分享】全志T536(异构多核ARMCortex-A55+玄铁E907 RISC-V)工业核心板说明书
核心板简介 创龙科技SOM-TLT536是一款基于全志科技T536MX-CEN2/T536MX-CXX四核ARM Cortex-A55 +...
博途 TIA Portal之1200做从站与调试助手的TCP通讯
其实,1200做从站与调试助手做TCP通讯很简单,只需要在组态时把“主动建立连接”放在对侧即可。但是我们还是要从头讲起,以方便没有基础的朋友能直接上手操作。 1、硬件准备 1200PLC一台,带调试助手的PC机一台,调试助手…...
移动端六大语言速记:第9部分 - 并发与多线程
移动端六大语言速记:第9部分 - 并发与多线程 本文将对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言在并发与多线程方面的特性,帮助开发者理解和掌握各语言的并发编程机制。 9. 并发与多线程 9.1 线程与进程 各语言线程与进程的创建和管理方…...
基于大模型的ALS预测与手术优化系统技术方案
目录 技术方案文档:基于大模型的ALS预测与手术优化系统1. 数据预处理与特征工程模块流程图伪代码2. 多模态融合预测模型模型架构图伪代码3. 术中实时监测与动态干预系统系统流程图伪代码4. 统计验证与可解释性模块验证流程图伪代码示例(SHAP分析)5. 健康教育与交互系统系统架…...
【Vue3知识】组件间通信的方式
组件间通信的方式 概述**1. 父子组件通信****父组件向子组件传递数据(Props)****子组件向父组件发送事件(自定义事件)** **2. 兄弟组件通信****通过父组件中转****使用全局状态管理(如 Pinia 或 Vuex)** **…...
【数据挖掘】岭回归(Ridge Regression)和线性回归(Linear Regression)对比实验
这是一个非常实用的 岭回归(Ridge Regression)和线性回归(Linear Regression)对比实验,使用了 scikit-learn 中的 California Housing 数据集 来预测房价。 📦 第一步:导入必要的库 import num…...
RuntimeError: Error(s) in loading state_dict for ChartParser
一 bug错误 最近使用千问大模型有一个bug,报错信息如下 raise RuntimeError(Error(s) in loading state_dict for {}:\n\t{}.format( RuntimeError: Error(s) in loading state_dict for ChartParser:Unexpected key(s) in state_dict: "pretrained_model.em…...
汽车无钥匙启动125KHz低频发射天线工作原理
汽车智能钥匙低频天线是无钥匙进入(PE)及无钥匙启动(PS)系统的一部分,主要负责发送低频信号,探测智能钥匙与各低频天线间的相对位置,判断车内是否存在智能钥匙。 支持PEPS系统实现便捷操作 无…...
【Docker基础-镜像】--查阅笔记2
目录 Docker镜像概述base镜像镜像的分层结构镜像的理解镜像的构建docker commit 制作镜像DockerfileDockerfile 指令FROMLABELRUNARGENVADDCOPYWORKDIRUSERVOLUMEEXPOSECMD 和 ENTRYPOINT Docker镜像概述 镜像是Docker容器的基石,容器是镜像的运行实例,…...
LeetCode 第47题:旋转数组
LeetCode 第47题:旋转数组 题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例1: 输入…...
数据库管理工具实战:IDEA 与 DBeaver 连接 TDengine(二)
五、DBeaver 连接 TDengine 实战 5.1 安装 DBeaver 下载安装包:访问 DBeaver 官方网站(https://dbeaver.io/download/ ),根据你的操作系统选择合适的安装包。如果是 Windows 系统,下载.exe 格式的安装文件࿱…...
4S店汽车维修保养管理系统 (源码+lw+部署文档+讲解),源码可白嫖!
摘要 二十一世纪我们的社会进入了信息时代,信息管理系统的建立,大大提高了人们信息化水平。传统的管理方式已经与当今4S店汽车维修保养管理系统的业务需求不相适应,也与4S店汽车维修保养管理系统化建设的发展趋势不相适应。本文针对这一需求设计并实现了…...
【Mysql】主从复制部署(保姆级)
本次部署用到三台Ubuntu虚拟机(一主两从): Master服务器:192.168.166.107 Slave1服务器:192.168.166.101 Slave2服务器:192.168.166.103 一、部署思路 首先我们要先捋清主从复制的部署思路…...
华为AR1200密码忘记
1、通过Console口连接设备并重启设备。在设备启动过程中,看到提示信息“Press CtrlB to break auto startup...”时,在三秒内按下CtrlB,输入BootLoader密码后,默认密码:Adminhuawei ,进入BootLoader主菜单…...
高级java每日一道面试题-2025年3月26日-微服务篇[Nacos篇]-在Spring Cloud项目中如何集成Nacos?
如果有遗漏,评论区告诉我进行补充 面试官: 在Spring Cloud项目中如何集成Nacos? 我回答: 在Spring Cloud项目中集成Nacos,可以充分利用Nacos作为服务注册与发现中心以及配置管理中心的功能。以下是详细的步骤和说明,帮助你完成这一集成过程…...
YOLO-LLTS:低光照实时交通标志检测算法详解
论文地址:https://arxiv.org/pdf/2503.13883 目录 一、论文概述 1.1 研究背景 1.2 论文结构 二、核心创新点 2.1 CNTSSS数据集 2.2 HRFM-TOD模块 2.3 MFIA模块 2.4 PGFE模块 三、实验与结果 3.1 实验设置 3.2 性能对比 编辑3.3 消融实验 四、代码复现建议 4.…...
golang 性能优化分析工具 pprof
pprof简介 pprof 是 Go 语言标准库提供的一个强大的性能分析工具,它能帮助开发者深入了解程序的运行时行为,找出性能瓶颈,进而对代码进行优化。下面从多个方面对 pprof 进行详细介绍: 主要功能 CPU 性能分析:能够记…...
机器学习 Day09 线性回归
1.线性回归简介 线性回归知识讲解 定义与公式 定义:线性回归是利用回归方程(函数)对自变量(特征值)和因变量(目标值)之间关系进行建模的分析方式 。自变量只有一个时是单变量回归,…...
2025高频面试算法总结篇【字符串】
文章目录 直接刷题链接直达如何找出一个字符串中的最大不重复子串给定一个数,删除K位得到最大值字符串的排列至少有K个重复字符的最长子串 直接刷题链接直达 如何找出一个字符串中的最大不重复子串 滑动窗口 --> 滑动窗口直到最后一个元素,每当碰到重…...
JavaScript性能优化(上)
1. 减少 DOM 操作 减少 DOM 操作是优化 JavaScript 性能的重要方法,因为频繁的 DOM 操作会导致浏览器重绘和重排,从而影响性能。以下是一些具体的策略和技术,可以帮助有效减少 DOM 操作: 1.1. 批量更新 DOM 亲切与母体ÿ…...
数据结构与算法——链表OJ题详解(1)
文章目录 一、前言二、OJ题分享2.1移除链表元素——非val尾插法2.2反转链表2.2.1头插法2.2.2三指针法 2.3链表的中间结点——快慢指针法2.4合并两个有序链表2.4.1空链表法2.4.2非空链表法 2.5链表的回文结构2.5.1投机取巧数组法2.5.2反转链表法 三、总结 一、前言 前几天博主已…...
sedex认证2025年变化重点
近日,SEDEX突然宣布:2025年7月1日起,全通知审核正式退出历史舞台,取而代之的是至少3周窗口期的半通知突击审核。这场被业内称为“供应链透明化革命”的调整,或将重塑全球工厂合规生态。 三大变化划重点: 1…...