转载自:https://blog.csdn.net/weixin_41469272/article/details/117919845?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.essearch_pc_relevant&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.essearch_pc_relevant

realsense D435i gazebo slam(px4)仿真

Nie_Xun 2021-06-15 11:27:31

306

收藏 1

版权

文章目录

  • realsense D435i gazebo slam仿真
    • 下载realsense 仿真模型
    • 运行D435仿真环境测试
      • D435
      • D435i
  • slam仿真示例
    • UAV模型启动
    • slam启动
    • 其他
      • mavros px4 坐标转换

realsense D435i gazebo slam仿真

包含realsense T265 D435i的urdf和sdf文件、realsense_gazebo_plugin包及realsense 模型文件使用示例。

下载realsense 仿真模型

[catkin_ws]表示自定义的工作目录

mkdir -p [catkin_ws]/src
cd [catkin_ws]/src
git clone https://gitee.com/nie_xun/realsense_ros_gazebo.git
cd [catkin_ws]
catkin_make
source devel/setup.sh

运行D435仿真环境测试

D435

roslaunch realsense_ros_gazebo simulation_sdf.launch
运行结果:

D435i

相比D435多一个camera/imu topic
roslaunch realsense_ros_gazebo simulation_D435i_sdf.launch

slam仿真示例

UAV模型启动

本示例使用px4的iris 无人机模型作为示例,本文使用的Firmware为v1.8版本。
在realsense_ros_gazebo的sdf文件夹下已存放携带D435i的iris sdf文件。
以下[px4]为px4 对应的Firmware的根路径

  1. 在[px4]/launch下生成文件iris_realsense_camera_px4_mavros_vo.launch,内容如下:
<?xml version="1.0"?>
<launch><arg name="x" default="0"/><arg name="y" default="0"/><arg name="z" default="0"/><arg name="R" default="0"/><arg name="P" default="0"/><arg name="Y" default="0"/><!-- vehicle model and world --><arg name="est" default="ekf2"/><arg name="vehicle" default="iris"/><arg name="world" default="$(find px4)/Tools/sitl_gazebo/worlds/empty.world"/><arg name="sdf" default="$(find px4)/Tools/sitl_gazebo/models/iris_realsense_camera/iris_realsense_camera.sdf"/><arg name="rcS" default="$(find px4)/posix-configs/SITL/init/$(arg est)/$(arg vehicle)_vo"/><!-- gazebo configs --><arg name="gui" default="true"/><arg name="debug" default="false"/><arg name="verbose" default="false"/><arg name="paused" default="false"/><arg name="respawn_gazebo" default="false"/><!-- MAVROS configs --><arg name="fcu_url" default="udp://:14540@localhost:14557"/><arg name="respawn_mavros" default="false"/><!-- PX4 configs --><arg name="interactive" default="true"/><!-- PX4 SITL and Gazebo --><include file="$(find px4)/launch/posix_sitl.launch"><arg name="x" value="$(arg x)"/><arg name="y" value="$(arg y)"/><arg name="z" value="$(arg z)"/><arg name="R" value="$(arg R)"/><arg name="P" value="$(arg P)"/><arg name="Y" value="$(arg Y)"/><arg name="world" value="$(arg world)"/><arg name="vehicle" value="$(arg vehicle)"/><arg name="sdf" value="$(arg sdf)"/><arg name="rcS" value="$(arg rcS)"/><arg name="gui" value="$(arg gui)"/><arg name="interactive" value="$(arg interactive)"/><arg name="debug" value="$(arg debug)"/><arg name="verbose" value="$(arg verbose)"/><arg name="paused" value="$(arg paused)"/><arg name="respawn_gazebo" value="$(arg respawn_gazebo)"/></include><!-- MAVROS --><include file="$(find mavros)/launch/px4.launch"><arg name="gcs_url" value=""/><arg name="fcu_url" value="$(arg fcu_url)"/><arg name="respawn_mavros" value="$(arg respawn_mavros)"/></include>
</launch>
  1. 在[px4]//posix-configs/SITL/init/ekf2下生成iris_vo,操作如下:
cd [px4]//posix-configs/SITL/init/ekf2
cp iris iris_vo

将EKF2_AID_MASK和EKF2_HGT_MODE对应项改成:

param set EKF2_AID_MASK 24
param set EKF2_HGT_MODE 3

  1. 拷贝模型文件到px4
cp realsense_ros_gazebo/sdf/* [px4]/Tools/sitl_gazebo/models/ -r
  1. 启动
roscd px4/launch
roslaunch iris_realsense_camera_px4_mavros_vo.launch

slam启动

  1. 需要将slam的odom输出remap到/mavros/vision_pose/pose
    1)如果slam输出使用的odom消息类型为geometry_msgs::PoseStamped,且坐标系为(NWU: x:前;y:左;z:上)则直接在slam的launch文件中发布odom消息的node下加入以下内容:
<remap from="/camera/odom" to="/mavros/vision_pose/pose" />

2)本文使用的slam坐标系为WUN,发布的odom消息类型为/camera/odometry
使用的转换代码文件如下:
nav_msg_to_mavros.cpp

#include <iostream>
#include <ros/ros.h>
#include <geometry_msgs/Pose.h>
#include <geometry_msgs/PoseStamped.h>
#include <nav_msgs/Odometry.h>ros::Publisher camera_pose_publisher;int data_source;
enum {GAZEBO_GT = 0,CAMERA_VO = 1
};void vision_cb(const nav_msgs::Odometry::ConstPtr &msg)
{geometry_msgs::PoseStamped msg_body_pose;if (data_source == GAZEBO_GT) {// 0 means use gazebo grougtruthmsg_body_pose.header.stamp = msg->header.stamp;msg_body_pose.header.frame_id = "world";msg_body_pose.pose.position.x = msg->pose.pose.position.x;msg_body_pose.pose.position.y = msg->pose.pose.position.y;msg_body_pose.pose.position.z = msg->pose.pose.position.z;msg_body_pose.pose.orientation.x = msg->pose.pose.orientation.x;msg_body_pose.pose.orientation.y = msg->pose.pose.orientation.y;msg_body_pose.pose.orientation.z = msg->pose.pose.orientation.z;msg_body_pose.pose.orientation.w = msg->pose.pose.orientation.w;} else if (data_source == CAMERA_VO) {// 1 means use camera vo// Create PoseStamped message to be sentmsg_body_pose.header.stamp = msg->header.stamp;msg_body_pose.header.frame_id = "world";msg_body_pose.pose.position.x = msg->pose.pose.position.z;msg_body_pose.pose.position.y = msg->pose.pose.position.x;msg_body_pose.pose.position.z = msg->pose.pose.position.y;msg_body_pose.pose.orientation.x = msg->pose.pose.orientation.z;msg_body_pose.pose.orientation.y = msg->pose.pose.orientation.x;msg_body_pose.pose.orientation.z = msg->pose.pose.orientation.y;msg_body_pose.pose.orientation.w = msg->pose.pose.orientation.w;}   // Publish pose of body frame in world framecamera_pose_publisher.publish(msg_body_pose);
}int main(int argc, char **argv)
{ros::init(argc, argv, "vision_to_mavros");ros::NodeHandle nh("~");nh.param<int>("data_source", data_source, 0);ros::Subscriber gazebo_sub = nh.subscribe<nav_msgs::Odometry>("/camera/odometry", 50, vision_cb);camera_pose_publisher = nh.advertise<geometry_msgs::PoseStamped>("/mavros/vision_pose/pose", 50);ros::spin();}

2.启动想使用的slam

结果示例:

其他

mavros px4 坐标转换

mavros:enu
px4:ned

在外部传感器定位,非GPS自身定位,世界坐标系由外部传感器定义。
如optirack,使用自身的定义的原点坐标系,由定义原点时,使用的定位杆长短轴及motive软件的Y/Z up综合定义。

Y up: 前(Z+), 左(X+), 上(Y+) 。
Z up: 在Y up的坐标系基础上绕x轴旋转-90度。Z up即使用的enu的坐标系。

坐标系的定位也有相对之分,比如optirack相对于GPS坐标系就是相对坐标系,GPS作为地球坐标系(更大的坐标系)则作为绝对坐标系,当使用相机定位做对比实验,则又能将optirack看做绝对坐标系,相机坐标系作为相对坐标系。

f:first l:left b:back u:up

因此像enu end这种坐标系更多的是说明xyz三轴的相对关系,比如(flu, lbu)都是一种enu坐标系,更多的是说明机体坐标系来用的。如下图所示:通过旋转后的坐标系,满足三轴规则,还是enu坐标系。

当optirack vo等相对局部的坐标系只要满足xyz的右手关系,即,食指指向x,对应中指就指向y, 大拇指就是z方向。则就满足enu坐标系。

无人机以固件启动时作为原点,偏航初始化为0,当无人机以外部传感器作为定位及yaw的输入时(roll pitch由无人机自身imu获得),需要对准机头方向,使外部传感器得到的偏航和机体得到的偏航一致。

例子1:外部定位使用optirack,Zup(enu), 将初始化时将机头于optirack的x轴对齐,则直接将/vrpn_client_node/<rigid_body_name>/poseremap到mavros/vision_pose/pose即可。
使用mavros/vision_pose发送,mavros采用的enu坐标系,mavros会自动两enu转换到ned坐标系,则初始化时将机头于optirack的x轴对齐,从而能够使px4初始化时,px4解算偏航与optirack解算的机体偏航一致,约为0。或者不对齐时,需减去optirack的偏航测量值再赋值给mavros/vision_pose

例子2:外部定位使用vo,相机前向与无人机绑定,坐标系为(LUF),将vo输出转换到ENU坐标系赋值给mavros/vision_pose/pose,则对应的转换:类似将(LUF->FLU)

poseX = voZ
poseY = voX
poseZ = voY

此时,直接将机头与mavros的enu的初始化x轴对齐了,即将相机的前向(机头方向)作为mavros的x轴。

总结:无论是vo还是optitrack,要保证的是初始化时,机头要对准赋值给mavros/vision_pose的x。mavros/vision_pose在ENU坐标系下。

realsense D435i gazebo slam(px4)仿真(转载)相关推荐

  1. Ubuntu18.04配置搭建基于Gazebo的虚拟仿真平台(Px4):无人机(UAV)、无人车等模拟实验平台

    这篇我觉得是写得比较详细完整的 摘自:https://dgzc.ganahe.top/ganahe/2021/uavgazebomoni.html Ubuntu18.04配置搭建基于Gazebo的虚拟 ...

  2. ros订阅相机深度信息_基于深度相机 RealSense D435i 的 ORB SLAM 2

    相比于上一篇文章,这里我们将官方给的 rosbag 数据包替换为来自深度相机的实时数据.之所以选择 Intel RealSense 这款深度相机,仅仅是因为它是最容易买到的...在京东上搜" ...

  3. 在配置Intel realsense (D435i)时遇到的问题(转载)

    转载自:https://blog.csdn.net/AnChenliang_1002/article/details/109473329 在配置Intel realsense (D435i)时遇到的问 ...

  4. 从零开始使用Realsense D435i运行VINS-Mono

    从零开始使用Realsense D435i运行VINS-Mono 从零开始使用Realsense D435i运行VINS-Mono (1)安装测试librealsense SDK 2.0 (2)安装测 ...

  5. PROBOT_G603双臂GAZEBO+MoveIt!仿真中配置手眼相机和夹爪

    PROBOT_G603双臂GAZEBO+MoveIt!仿真中配置手眼相机和夹爪 问题描述 安装双臂模型 修改urdf文件 Gripper文件修改 Gripper添加到机械臂上 配置MoveIt! 配置 ...

  6. 3D激光SLAM:ALOAM---gazebo仿真测试场景搭建

    3D激光SLAM:ALOAM---gazebo仿真测试场景搭建 gazebo世界场景 AGV模型 Velodyne 激光雷达 测试 gazebo世界场景 在launch文件中加入 gazebo世界场景 ...

  7. 安装ROS、gazebo、PX4基础细节及offboard控制

    新手参考教程安装ROS.gazebo.PX4基础细节及offboard控制 1.安装ROS 参考教程 2.安装PX4 参考教程 注: 1.在编译px4_Firmware前会经过安装步骤,安装需要去gi ...

  8. 深度相机使用对比:Gemini Pro与RealSense D435i

    文章目录 前言 一.参数对比 二.环境配置 三 .实际使用效果 图像读取 视觉slam效果对比 总结 前言 为了开展视觉slam相关项目,最近找了几款不同的深度相机进行测试,本次主要讲一下奥比中光的G ...

  9. VINS on RealSense D435i

    关于Realsense D435i运行VINS系列 前言 在SLAM中,主要是以激光SLAM和视觉SLAM为主,激光雷达直接可以获取三维点云坐标信息,所以激光SLAM会比视觉SLAM稳定许多,但是由于 ...

最新文章

  1. Windows 服务器操作系统安全设置加固方法
  2. java之java.sql.SQLException: ResultSet is from UPDATE. No Data.
  3. python自带的shell、其性能优于ipython吗_Python自带的shell,其性能优于IPython
  4. matlab文件序号超出511,求教一段matlab的代码 - 数学 - 小木虫 - 学术 科研 互动社区...
  5. 【MySQL5.7版本单节点大数据量迁移到PXC8.0版本集群全记】
  6. Google被骂成筛子
  7. 什么是云存储技术与云存储服务?
  8. sql CAST用法
  9. 南京邮电大学高级语言程序设计实验二(选择与循环结构编程)
  10. leaflet 加载百度离线瓦片
  11. ubuntu安装utorrent,以闪电的速度在六维空间下载东西!
  12. Flutter时间轴
  13. 【无人机】【2014.08】无人机国家的诞生:自1917年以来的美国无人机发展
  14. android 圆圈扩大动画,Android实现3个圆圈的动画
  15. RK3588 烧写固件
  16. 线性筛——约数的个数
  17. dataframe python,使用pandas dataframe python创建实时更新图
  18. manjaro安装QQ,TIM
  19. 5.21非常虚伪的集训总结
  20. Adblock Plus插件安装

热门文章

  1. 工厂生产管理ERP系统 用友U8+ 用友ERP代理商 上海杰然软件
  2. SpringBoot自动跳转首页
  3. office32位和64位有什么区别吗
  4. 那些能帮我愉快Coding的Webstorm插件
  5. 牛客练习Java之--树根
  6. 有源低通滤波器 vs. 有源带通滤波器 vs. LC滤波器
  7. MYSQL8.0中关于load data infile命令
  8. 首战 之 Flutter 1.0 久违了(Mac)
  9. 英文RouterOS秒变中文版
  10. LPC54114双核使用指南翻译 - 使用MCUXPresso进行双核调试