当前位置: 首页 > news >正文

Jetson Orin NX 开发指南(7): EGO-Swarm 的编译与运行

一、前言

EGO-Planner 浙江大学 FAST-LAB 实验室的开源轨迹规划算法是,受到 IEEE Spectrum 等知名科技媒体的报道,其理论技术较为前沿,是一种不依赖于ESDF,基于B样条的规划算法,并且规划成功率、算法消耗时间、代价数值等性能方面都要高于其他几种知名算法。

而 EGO-Swarm 是基于 EGO-Planner 拓展的去中心化的无人机集群算法,有助于智能小车或自主无人机集群的规划的学习与开发

由于 EGO-Planner 是 EGO-Swarm 的一部分,并且他们的安装其实差别不大,因此本文主要介绍 EGO-Swarm 的编译与运行,参考

https://github.com/ZJU-FAST-Lab/ego-planner-swarm

https://github.com/ZJU-FAST-Lab/ego-planner

GitHub - ZJU-FAST-Lab/Fast-Drone-250: hardware and software design of the 250mm autonomous drone

由于 Jetson 系列开发板常用于当作机载电脑,因此本文介绍如何在 Jetson Orin NX 开发板上编译和运行 EGO-Swarm,当然本文对 EGO-Planner 同样适用。

二、编译 EGO-Swarm

首先安装依赖

sudo apt-get install libarmadillo-dev

然后创建并进入工作空间

mkdir -p ~/catkin_ws/src/
cd ~/catkin_ws/src/

从 GitHub 上下载 EGO-Swarm 源码

git clone https://github.com/ZJU-FAST-Lab/ego-planner-swarm.git

进入 EGO-Swarm 工作空间并编译

cd ~/catkin_ws/src/ego-planner-swarm
catkin_make

编译完成显示如下结果

三、运行 EGO-Swarm

接下来我们运行 EGO-Swarm,主要分为仿真和实验两个部分

3.1 EGO-Swarm 仿真

首先通过快捷键 ctrl + alt + A 打开超级终端,如果没有安装则参考下文安装

Jetson Orin NX 开发指南(2): 基本环境配置_想要个小姑娘的博客-CSDN博客

将超级终端划分为两个终端,全选后 source 一下工作空间,终端输入

source ~/catkin_ws/src/ego-planner-swarm/devel/setup.bash

在第一个终端输入

roslaunch ego_planner rviz.launch

在第二个终端输入

roslaunch ego_planner swarm.launch

如下所示

依次执行可以得到如下结果

至此,EGO-Swarm 的仿真运行就实现了!

3.2 EGO-Swarm 实验

由于条件有限,我么在此仅仅只是将 EGO-Swarm 与 VINS-Fusion 进行连接,并且这里只涉及单个无人机(在这种情况下 EGO-Swarm 与 EGO-Planner 是等价的),其中 EGO-Swarm 单个无人机通过 VINS-Fusion 来获取里程计信息,同时通过深度相机数据来获取周围环境的情况。

3.2.1 创建文件配置

首先需要配置实验用的一些参数,对应于仿真中的 advanced_param.xml 文件,

其次需要配置调用 VINS-Fusion 里程计信息和 Realsense 深度相机信息的 launch 启动文件,对应于仿真中的 single_run_in_sim.launch 文件,

此外还需要用于可视化的 rviz 文件,对应于仿真中的 default.rviz 文件,

具体的配置可以参考 FAST-LAB 实验室的 fast-drone-250 中采用的 xml 和 launch 文件:

GitHub - ZJU-FAST-Lab/Fast-Drone-250: hardware and software design of the 250mm autonomous drone

主要是如下三个文件

但是由于 VINS-Fusion 中里程计发布的话题是 /vins_estimator/imu_propagate,而上面订阅的话题是 /vins_fusion/imu_propagate,这是因为在 fast-drone-250 中,vins_estimator 节点被重命名为了 vins_fusion,从而产生了差异,只需修改以下订阅的话题即可,其余的可以不做修改,(当然如果标定了相机内外参以及 imu 的噪声,则可以将之后的数据修改上去,VINS-Fusion 或者 EGO-Swarm 上都要修改),具体操作如下

在 ~/catkin_ws/src/ego-planner-swarm/src/planner/plan_manage/launch/ 路径下创建四个文件

(1)advanced_param_exp.xml,其内容如下

<launch><arg name="map_size_x_"/><arg name="map_size_y_"/><arg name="map_size_z_"/><arg name="odometry_topic"/><arg name="camera_pose_topic"/><arg name="depth_topic"/><arg name="cloud_topic"/><arg name="cx"/><arg name="cy"/><arg name="fx"/><arg name="fy"/><arg name="max_vel"/><arg name="max_acc"/><arg name="planning_horizon"/><arg name="point_num"/><arg name="point0_x"/><arg name="point0_y"/><arg name="point0_z"/><arg name="point1_x"/><arg name="point1_y"/><arg name="point1_z"/><arg name="point2_x"/><arg name="point2_y"/><arg name="point2_z"/><arg name="point3_x"/><arg name="point3_y"/><arg name="point3_z"/><arg name="point4_x"/><arg name="point4_y"/><arg name="point4_z"/><arg name="flight_type"/><arg name="use_distinctive_trajs"/><arg name="obj_num_set"/><arg name="drone_id"/><!-- main node --><!-- <node pkg="ego_planner" name="ego_planner_node" type="ego_planner_node" output="screen" launch-prefix="valgrind"> --><node pkg="ego_planner" name="drone_$(arg drone_id)_ego_planner_node" type="ego_planner_node" output="screen"><remap from="~odom_world" to="$(arg odometry_topic)"/><remap from="~planning/bspline" to = "/drone_$(arg drone_id)_planning/bspline"/><remap from="~planning/data_display" to = "/drone_$(arg drone_id)_planning/data_display"/><remap from="~planning/broadcast_bspline_from_planner" to = "/broadcast_bspline"/><remap from="~planning/broadcast_bspline_to_planner" to = "/broadcast_bspline"/><remap from="~grid_map/odom" to="$(arg odometry_topic)"/><remap from="~grid_map/cloud" to="$(arg cloud_topic)"/><remap from="~grid_map/pose"   to = "$(arg camera_pose_topic)"/> <remap from="~grid_map/depth" to = "$(arg depth_topic)"/><!-- planning fsm --><param name="fsm/flight_type" value="$(arg flight_type)" type="int"/><param name="fsm/thresh_replan_time" value="1.0" type="double"/><param name="fsm/thresh_no_replan_meter" value="1.0" type="double"/><param name="fsm/planning_horizon" value="$(arg planning_horizon)" type="double"/> <!--always set to 1.5 times grater than sensing horizen--><param name="fsm/planning_horizen_time" value="3" type="double"/><param name="fsm/emergency_time" value="1.0" type="double"/><param name="fsm/realworld_experiment" value="true"/><param name="fsm/fail_safe" value="true"/><param name="fsm/waypoint_num" value="$(arg point_num)" type="int"/><param name="fsm/waypoint0_x" value="$(arg point0_x)" type="double"/><param name="fsm/waypoint0_y" value="$(arg point0_y)" type="double"/><param name="fsm/waypoint0_z" value="$(arg point0_z)" type="double"/><param name="fsm/waypoint1_x" value="$(arg point1_x)" type="double"/><param name="fsm/waypoint1_y" value="$(arg point1_y)" type="double"/><param name="fsm/waypoint1_z" value="$(arg point1_z)" type="double"/><param name="fsm/waypoint2_x" value="$(arg point2_x)" type="double"/><param name="fsm/waypoint2_y" value="$(arg point2_y)" type="double"/><param name="fsm/waypoint2_z" value="$(arg point2_z)" type="double"/><param name="fsm/waypoint3_x" value="$(arg point3_x)" type="double"/><param name="fsm/waypoint3_y" value="$(arg point3_y)" type="double"/><param name="fsm/waypoint3_z" value="$(arg point3_z)" type="double"/><param name="fsm/waypoint4_x" value="$(arg point4_x)" type="double"/><param name="fsm/waypoint4_y" value="$(arg point4_y)" type="double"/><param name="fsm/waypoint4_z" value="$(arg point4_z)" type="double"/><param name="grid_map/resolution"      value="0.15" /> <param name="grid_map/map_size_x"   value="$(arg map_size_x_)" /> <param name="grid_map/map_size_y"   value="$(arg map_size_y_)" /> <param name="grid_map/map_size_z"   value="$(arg map_size_z_)" /> <param name="grid_map/local_update_range_x"  value="5.5" /> <param name="grid_map/local_update_range_y"  value="5.5" /> <param name="grid_map/local_update_range_z"  value="4.5" /> <param name="grid_map/obstacles_inflation"     value="0.299" /> <param name="grid_map/local_map_margin" value="10"/><param name="grid_map/ground_height"        value="-0.01"/><!-- camera parameter --><param name="grid_map/cx" value="$(arg cx)"/><param name="grid_map/cy" value="$(arg cy)"/><param name="grid_map/fx" value="$(arg fx)"/><param name="grid_map/fy" value="$(arg fy)"/><!-- depth filter --><param name="grid_map/use_depth_filter" value="true"/><param name="grid_map/depth_filter_tolerance" value="0.15"/><param name="grid_map/depth_filter_maxdist"   value="5.0"/><param name="grid_map/depth_filter_mindist"   value="0.2"/><param name="grid_map/depth_filter_margin"    value="2"/><param name="grid_map/k_depth_scaling_factor" value="1000.0"/><param name="grid_map/skip_pixel" value="2"/><!-- local fusion --><param name="grid_map/p_hit"  value="0.65"/><param name="grid_map/p_miss" value="0.35"/><param name="grid_map/p_min"  value="0.12"/><param name="grid_map/p_max"  value="0.90"/><param name="grid_map/p_occ"  value="0.80"/><param name="grid_map/min_ray_length" value="0.3"/><param name="grid_map/max_ray_length" value="5.0"/><param name="grid_map/visualization_truncate_height"   value="1.8"/><param name="grid_map/show_occ_time"  value="false"/><param name="grid_map/pose_type"     value="2"/>  <param name="grid_map/frame_id"      value="world"/><!-- planner manager --><param name="manager/max_vel" value="$(arg max_vel)" type="double"/><param name="manager/max_acc" value="$(arg max_acc)" type="double"/><param name="manager/max_jerk" value="4" type="double"/><param name="manager/control_points_distance" value="0.4" type="double"/><param name="manager/feasibility_tolerance" value="0.05" type="double"/><param name="manager/planning_horizon" value="$(arg planning_horizon)" type="double"/><param name="manager/use_distinctive_trajs" value="$(arg use_distinctive_trajs)" type="bool"/><param name="manager/drone_id" value="$(arg drone_id)"/><!-- trajectory optimization --><param name="optimization/lambda_smooth" value="1.0" type="double"/><param name="optimization/lambda_collision" value="0.5" type="double"/><param name="optimization/lambda_feasibility" value="0.1" type="double"/><param name="optimization/lambda_fitness" value="1.0" type="double"/><param name="optimization/dist0" value="0.5" type="double"/><param name="optimization/swarm_clearance" value="0.5" type="double"/><param name="optimization/max_vel" value="$(arg max_vel)" type="double"/><param name="optimization/max_acc" value="$(arg max_acc)" type="double"/><param name="bspline/limit_vel" value="$(arg max_vel)" type="double"/><param name="bspline/limit_acc" value="$(arg max_acc)" type="double"/><param name="bspline/limit_ratio" value="1.1" type="double"/><!-- objects prediction --><param name="prediction/obj_num" value="$(arg obj_num_set)" type="int"/><param name="prediction/lambda" value="1.0" type="double"/><param name="prediction/predict_rate" value="1.0" type="double"/></node></launch>

(2)single_run_in_exp.launch,其内容如下

<launch><!-- number of moving objects --><arg name="obj_num" value="10" /><arg name="drone_id" value="0"/><arg name="map_size_x" value="100"/><arg name="map_size_y" value="50"/><arg name="map_size_z" value="3.0"/><arg name="odom_topic" value="/vins_estimator/imu_propagate"/><!-- main algorithm params --><include file="$(find ego_planner)/launch/advanced_param_exp.xml"><arg name="drone_id" value="$(arg drone_id)"/><arg name="map_size_x_" value="$(arg map_size_x)"/><arg name="map_size_y_" value="$(arg map_size_y)"/><arg name="map_size_z_" value="$(arg map_size_z)"/><arg name="odometry_topic" value="$(arg odom_topic)"/><arg name="obj_num_set" value="$(arg obj_num)" /><!-- camera pose: transform of camera frame in the world frame --><!-- depth topic: depth image, 640x480 by default --><!-- don't set cloud_topic if you already set these ones! --><arg name="camera_pose_topic" value="nouse1"/><arg name="depth_topic" value="/camera/depth/image_rect_raw"/><!-- topic of point cloud measurement, such as from LIDAR  --><!-- don't set camera pose and depth, if you already set this one! --><arg name="cloud_topic" value="nouse2"/><!-- intrinsic params of the depth camera --><arg name="cx" value="323.3316345214844"/><arg name="cy" value="234.95498657226562"/><arg name="fx" value="384.39654541015625"/><arg name="fy" value="384.39654541015625"/><!-- maximum velocity and acceleration the drone will reach --><arg name="max_vel" value="0.5" /><arg name="max_acc" value="6.0" /><!--always set to 1.5 times grater than sensing horizen--><arg name="planning_horizon" value="6" /><arg name="use_distinctive_trajs" value="false" /><!-- 1: use 2D Nav Goal to select goal  --><!-- 2: use global waypoints below  --><arg name="flight_type" value="1" /><!-- global waypoints --><!-- It generates a piecewise min-snap traj passing all waypoints --><arg name="point_num" value="1" /><arg name="point0_x" value="15" /><arg name="point0_y" value="0" /><arg name="point0_z" value="1" /><arg name="point1_x" value="0.0" /><arg name="point1_y" value="0.0" /><arg name="point1_z" value="1.0" /><arg name="point2_x" value="15.0" /><arg name="point2_y" value="0.0" /><arg name="point2_z" value="1.0" /><arg name="point3_x" value="0.0" /><arg name="point3_y" value="0.0" /><arg name="point3_z" value="1.0" /><arg name="point4_x" value="15.0" /><arg name="point4_y" value="0.0" /><arg name="point4_z" value="1.0" /></include><!-- trajectory server --><node pkg="ego_planner" name="drone_$(arg drone_id)_traj_server" type="traj_server" output="screen"><!-- <remap from="position_cmd" to="/setpoints_cmd"/> --><remap from="~planning/bspline" to="drone_$(arg drone_id)_planning/bspline"/><param name="traj_server/time_forward" value="1.0" type="double"/></node>
</launch>

(3)rviz_exp.launch 文件,其内容如下

<launch><node name="rviz" pkg="rviz" type="rviz" args="-d $(find ego_planner)/launch/default_exp.rviz" required="true" />
</launch>

(4)default_exp.rviz 文件,其内容如下

Panels:- Class: rviz/DisplaysHelp Height: 0Name: DisplaysProperty Tree Widget:Expanded:- /Global Options1- /Status1- /drone01/Planning1- /drone01/Planning1/drone_path1/Offset1- /drone01/Mapping1/map inflate1- /Odometry1/Shape1Splitter Ratio: 0.43611112236976624Tree Height: 517- Class: rviz/SelectionName: Selection- Class: rviz/Tool PropertiesExpanded:- /2D Pose Estimate1- /2D Nav Goal1- /Publish Point1Name: Tool PropertiesSplitter Ratio: 0.5886790156364441- Class: rviz/ViewsExpanded:- /Current View1Name: ViewsSplitter Ratio: 0.5- Class: rviz/TimeName: TimeSyncMode: 0SyncSource: map inflate
Preferences:PromptSaveOnExit: true
Toolbars:toolButtonStyle: 2
Visualization Manager:Class: ""Displays:- Alpha: 1Class: rviz/AxesEnabled: trueLength: 1Name: AxesRadius: 0.10000000149011612Reference Frame: <Fixed Frame>Show Trail: falseValue: true- Alpha: 0.5Cell Size: 1Class: rviz/GridColor: 160; 160; 164Enabled: trueLine Style:Line Width: 0.029999999329447746Value: LinesName: GridNormal Cell Count: 0Offset:X: 0Y: 0Z: 0Plane: XYPlane Cell Count: 1000Reference Frame: <Fixed Frame>Value: true- Class: rviz/GroupDisplays:- Class: rviz/GroupDisplays:- Class: rviz/MarkerEnabled: trueMarker Topic: /drone_0_ego_planner_node/goal_pointName: goal_pointNamespaces:{}Queue Size: 100Value: true- Class: rviz/MarkerEnabled: trueMarker Topic: /ego_planner_node/global_listName: global_pathNamespaces:{}Queue Size: 100Value: true- Class: rviz/MarkerEnabled: trueMarker Topic: /drone_0_ego_planner_node/optimal_listName: optimal_trajNamespaces:{}Queue Size: 100Value: true- Class: rviz/MarkerEnabled: falseMarker Topic: /ego_planner_node/a_star_listName: AStarNamespaces:{}Queue Size: 100Value: false- Class: rviz/MarkerEnabled: trueMarker Topic: /drone_0_ego_planner_node/init_listName: InitTrajNamespaces:{}Queue Size: 100Value: true- Alpha: 1Buffer Length: 1Class: rviz/PathColor: 29; 108; 212Enabled: trueHead Diameter: 0.30000001192092896Head Length: 0.20000000298023224Length: 0.30000001192092896Line Style: BillboardsLine Width: 0.10000000149011612Name: drone_pathOffset:X: 0Y: 0Z: 0Pose Color: 255; 85; 255Pose Style: NoneQueue Size: 10Radius: 0.029999999329447746Shaft Diameter: 0.10000000149011612Shaft Length: 0.10000000149011612Topic: /drone_0_odom_visualization/pathUnreliable: falseValue: trueEnabled: trueName: Planning- Class: rviz/GroupDisplays:- Alpha: 1Autocompute Intensity Bounds: trueAutocompute Value Bounds:Max Value: 1.565000057220459Min Value: 0.06499999761581421Value: trueAxis: ZChannel Name: intensityClass: rviz/PointCloud2Color: 29; 108; 212Color Transformer: AxisColorDecay Time: 0Enabled: trueInvert Rainbow: falseMax Color: 255; 255; 255Min Color: 0; 0; 0Name: map inflatePosition Transformer: XYZQueue Size: 10Selectable: trueSize (Pixels): 3Size (m): 0.15000000596046448Style: BoxesTopic: /drone_0_ego_planner_node/grid_map/occupancy_inflateUnreliable: falseUse Fixed Frame: trueUse rainbow: trueValue: trueEnabled: trueName: Mapping- Class: rviz/GroupDisplays:- Class: rviz/MarkerEnabled: trueMarker Topic: /drone_0_odom_visualization/robotName: robotNamespaces:{}Queue Size: 100Value: true- Class: rviz/ImageEnabled: falseImage Topic: /drone_0_pcl_render_node/depthMax Value: 1Median window: 5Min Value: 0Name: depthNormalize Range: trueQueue Size: 2Transport Hint: rawUnreliable: falseValue: falseEnabled: trueName: SimulationEnabled: trueName: drone0- Class: rviz/ImageEnabled: falseImage Topic: /camera/depth/image_rect_rawMax Value: 1Median window: 5Min Value: 0Name: ImageNormalize Range: trueQueue Size: 2Transport Hint: rawUnreliable: falseValue: false- Alpha: 1Buffer Length: 1Class: rviz/PathColor: 25; 255; 0Enabled: trueHead Diameter: 0.30000001192092896Head Length: 0.20000000298023224Length: 0.30000001192092896Line Style: LinesLine Width: 0.029999999329447746Name: PathOffset:X: 0Y: 0Z: 0Pose Color: 255; 85; 255Pose Style: NoneQueue Size: 10Radius: 0.029999999329447746Shaft Diameter: 0.10000000149011612Shaft Length: 0.10000000149011612Topic: /vins_estimator/pathUnreliable: falseValue: true- Angle Tolerance: 0.10000000149011612Class: rviz/OdometryCovariance:Orientation:Alpha: 0.5Color: 255; 255; 127Color Style: UniqueFrame: LocalOffset: 1Scale: 1Value: truePosition:Alpha: 0.30000001192092896Color: 204; 51; 204Scale: 1Value: trueValue: trueEnabled: trueKeep: 1Name: OdometryPosition Tolerance: 0.10000000149011612Queue Size: 10Shape:Alpha: 1Axes Length: 0.5Axes Radius: 0.20000000298023224Color: 255; 25; 0Head Length: 0.30000001192092896Head Radius: 0.10000000149011612Shaft Length: 1Shaft Radius: 0.05000000074505806Value: AxesTopic: /vins_estimator/odometryUnreliable: falseValue: trueEnabled: trueGlobal Options:Background Color: 255; 255; 255Default Light: trueFixed Frame: worldFrame Rate: 30Name: rootTools:- Class: rviz/InteractHide Inactive Objects: true- Class: rviz/Select- Class: rviz/FocusCamera- Class: rviz/Measure- Class: rviz/SetInitialPoseTheta std deviation: 0.2617993950843811Topic: /initialposeX std deviation: 0.5Y std deviation: 0.5- Class: rviz/SetGoalTopic: /move_base_simple/goal- Class: rviz/PublishPointSingle click: trueTopic: /clicked_pointValue: trueViews:Current:Class: rviz/ThirdPersonFollowerDistance: 14.900397300720215Enable Stereo Rendering:Stereo Eye Separation: 0.05999999865889549Stereo Focal Distance: 1Swap Stereo Eyes: falseValue: falseField of View: 0.7853981852531433Focal Point:X: -1.706774115562439Y: -2.435426712036133Z: 5.149927346792538e-06Focal Shape Fixed Size: trueFocal Shape Size: 0.05000000074505806Invert Z Axis: falseName: Current ViewNear Clip Distance: 0.009999999776482582Pitch: 1.0197973251342773Target Frame: <Fixed Frame>Yaw: 3.5065858364105225Saved:- Class: rviz/FPSEnable Stereo Rendering:Stereo Eye Separation: 0.05999999865889549Stereo Focal Distance: 1Swap Stereo Eyes: falseValue: falseInvert Z Axis: falseName: FPSNear Clip Distance: 0.009999999776482582Pitch: 0.4000000059604645Position:X: -11Y: 0Z: 8Roll: 0Target Frame: my_viewYaw: 0- Class: rviz/FPSEnable Stereo Rendering:Stereo Eye Separation: 0.05999999865889549Stereo Focal Distance: 1Swap Stereo Eyes: falseValue: falseInvert Z Axis: falseName: FPSNear Clip Distance: 0.009999999776482582Pitch: 0.5Position:X: -10Y: 0Z: 10Roll: 0Target Frame: my_viewYaw: 0- Class: rviz/FPSEnable Stereo Rendering:Stereo Eye Separation: 0.05999999865889549Stereo Focal Distance: 1Swap Stereo Eyes: falseValue: falseInvert Z Axis: falseName: FPSNear Clip Distance: 0.009999999776482582Pitch: 0.6000000238418579Position:X: -10Y: 0Z: 10Roll: 0Target Frame: my_viewYaw: 0
Window Geometry:Displays:collapsed: falseHeight: 668Hide Left Dock: falseHide Right Dock: falseImage:collapsed: falseQMainWindow State: 000000ff00000000fd00000004000000000000017b00000242fc0200000024fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073000000003d00000242000000c900fffffffb0000000a0049006d006100670065000000015d000001220000001600fffffffb0000000a0056006900650077007300000001ee000000ad000000a400fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000c00430061006d00650072006100000001d1000000b50000000000000000fb0000000a00640065007000740068000000031d000002310000001600fffffffb0000000a0049006d0061006700650100000415000000f80000000000000000fb0000000a0049006d00610067006501000003f4000001190000000000000000fb0000000a0064006500700074006800000004a2000000ac0000000000000000fb0000000a0064006500700074006800000003b4000001b60000000000000000fb0000000a0064006500700074006800000004b9000000950000000000000000fb0000000a006400650070007400680000000481000000cd0000000000000000fb0000000a006400650070007400680000000429000001250000000000000000fb0000000a0064006500700074006800000003b7000000af0000000000000000fb0000000a0064006500700074006800000003d5000000b50000000000000000fb0000000a006400650070007400680000000444000001260000000000000000fb0000000a00640065007000740068000000041f0000014b0000000000000000fb0000000a0064006500700074006800000001b8000000160000000000000000fb0000000a0064006500700074006800000001c1000000160000000000000000fb0000000a0064006500700074006800000004b1000000550000000000000000fb0000000a006400650070007400680000000505000000650000000000000000fb0000000a006400650070007400680000000502000000680000000000000000fb0000000a0064006500700074006800000004f9000000710000000000000000fb0000000a0064006500700074006800000004e9000000810000000000000000fb0000000a0064006500700074006800000004de0000008c0000000000000000fb0000000a0064006500700074006800000004cc0000009e0000000000000000fb0000000a0064006500700074006800000004bb000000af0000000000000000fb0000000a0064006500700074006800000004aa000000c00000000000000000fb0000000a006400650070007400680000000498000000d20000000000000000fb0000000a0049006d00610067006500000003fa000001540000000000000000000000010000010f00000385fc0200000002fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000006100000003bfc0100000002fb0000000800540069006d00650000000000000006100000041800fffffffb0000000800540069006d00650100000000000004500000000000000000000002600000024200000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000Selection:collapsed: falseTime:collapsed: falseTool Properties:collapsed: falseViews:collapsed: falseWidth: 608X: 1265Y: 60depth:collapsed: false

修改完成后保存即可!

3.2.2 VINS-Fusion-gpu + EGO-Swarm 实验

接下来我们先运行 Realsense 和 VINS-Fusion-gpu,如果没有安装 Realsense 和 VINS-Fusion-gpu,参考以下两篇文章

Jetson Orin NX 开发指南(4): 安装 CUDA 和 Realsense_想要个小姑娘的博客-CSDN博客

Jetson Orin NX 开发指南(6): VINS-Fusion-gpu 的编译和运行_想要个小姑娘的博客-CSDN博客

首先打开超级终端,划分为四个终端,

然后在第一个终端输入

roslaunch realsense2_camera rs_camera.launch

在第二个终端输入

source ~/catkin_ws/src/vins-fusion-gpu/devel/setup.bash
roslaunch vins realsense_d435i.launch

第三个终端输入

source ~/catkin_ws/src/ego-planner-swarm/devel/setup.bash
roslaunch ego_planner single_run_in_exp.launch

第四个终端输入

source ~/catkin_ws/src/ego-planner-swarm/devel/setup.bash
roslaunch ego_planner rviz_exp.launch

如下所示

依次运行后显示如下结果

相关文章:

Jetson Orin NX 开发指南(7): EGO-Swarm 的编译与运行

一、前言 EGO-Planner 浙江大学 FAST-LAB 实验室的开源轨迹规划算法是&#xff0c;受到 IEEE Spectrum 等知名科技媒体的报道&#xff0c;其理论技术较为前沿&#xff0c;是一种不依赖于ESDF&#xff0c;基于B样条的规划算法&#xff0c;并且规划成功率、算法消耗时间、代价数…...

nginx的重定向

nginx重定向--rewrite重写功能介绍 rewrite 的功能介绍 rewrite功能就是&#xff0c;使用nginx提供的全局变量或自己设置的变量&#xff0c;结合正则表达式和标记位实现URL重写以及重定向。 比如&#xff1a;更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需…...

理解Go中的数组(Array)和切片(Slice)

引言 在Go中&#xff0c;数组和切片是由有序的元素序列组成的数据结构。当需要处理许多相关值时&#xff0c;这些数据集非常适合使用。它们使你能够将本应放在一起的数据放在一起&#xff0c;压缩代码&#xff0c;并一次性对多个值执行相同的方法和操作。 尽管Go中的数组和切…...

计算机毕业设计选什么题目好?springboot 高校学生综合测评管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…...

在liunx下读取串口的数据

1. 设置串口参数 首先是通过stty工具设置串口参数&#xff1a; sudo stty -F /dev/ttyUSB0 比特率 cs8 -cstopb如&#xff1a;sudo stty -F /dev/ttyUSB0 115200 cs8 -cstopb. 注意&#xff1a; 需要注意的是这里需要sudo权限&#xff1b; 2. 读取串口数据 然后读取串口的…...

Python中使用IDLE调试程序

在IDLE中&#xff0c;使用菜单栏中的“Debug”对IDLE打开的python程序进行调试。 1 打开调试开关 选择IDLE菜单栏的“Debug->Debugger”&#xff0c;如图1①所示&#xff1b;此时在IDLE中会显示“[DEBUG ON]”&#xff0c;即“调试模式已打开”&#xff0c;如图1②所示&am…...

发个地区和对应的价格方案

在当今数字化的世界中&#xff0c;网络工程师面临着各种挑战&#xff0c;从跨界电商到爬虫&#xff0c;从出海业务到网络安全&#xff0c;再到游戏领域。为了应对这些挑战&#xff0c;网络工程师需要了解并利用各种技术&#xff0c;其中Socks5代理和代理IP技术成为了他们的得力…...

启动Java应用的黑魔法:初始化性能解密@PostConstrut,InitialzingBean,init-method,BeanPostProcessor

我们在项目中经常会遇到启动时做一些逻辑的处理&#xff0c;比如配置信息的预加载&#xff0c;缓存信息的预加载等等&#xff0c;那都有哪些方法了&#xff0c;我们一起来探讨一下&#xff1a; 1. 方式 1. 构造方法初始化&#xff1a; 使用构造方法进行对象的基本属性初始化。…...

STM32-C语言结构体地址

定义2个结构体 typedef struct _demo_node_{ //结构体本身的地址struct _demo_node_* pprenode; //实际地址开始的位置&#xff0c;最下面的输出结果可以看出struct _demo_node_* pnextnode;unsigned long member_num;unsigned short age;char addr[0]; …...

Go HTTP 调用(下)

今天分享的内容是 Go HTTP 调用。如果本文对你有帮助&#xff0c;不妨点个赞&#xff0c;如果你是 Go 语言初学者&#xff0c;不妨点个关注&#xff0c;一起成长一起进步&#xff0c;如果本文有错误的地方&#xff0c;欢迎指出&#xff01; 前言 上篇文章 Go HTTP 调用&#…...

mysql5.7获取json数组中的某个对象

前言 表中的一个字段类型是字符串&#xff0c;存的是一个对象数据。 现在要根据对象中的某个属性&#xff0c;获取到整个对象信息。 如果是mysql8&#xff0c;则可以使用JSON_TABLE。 示例&#xff1a;https://blog.csdn.net/weixin_44071721/article/details/123347229 sele…...

PTE考试解析

Pte 考试题目 注入漏洞 空格被过滤 用/**/代替空格&#xff0c;发现#被过滤 对&#xff03;进行url编码为%23 输入构造好的payload http://172.16.12.100:81/vulnerabilities/fu1.php?id1%27)/**/and/**/11%23 http://172.16.12.100:81/vulnerabilities/fu1.php?id1%27)/*…...

UE4和C++ 开发-UE4怎么删除C++类

1 关闭visual stdio&#xff0c;关闭UE4引擎。 2 打开你的项目文件夹。找到你要删除的.h,.cpp文件删除。 3、删除Binaries文件夹。 4 右击.uproiect文件&#xff0c;点击Generate Visual Studio project files. 5 双击.uproiect文件,忽略警告打开就看到已经删除了想要删除的C类…...

基于图像识别的迁移学习之一

案例分析 加载数据部分同上一个案例&#xff0c;只需把数据输入到预训练的VGG-16或者ResNet50中。VGG-16的网络结构为右侧图绿色栏所示&#xff0c;其中block1中有2个包含64个卷积核的卷积层&#xff0c;block2包含2个128个卷积核的卷积层&#xff0c;block3有3个包含256个卷积…...

k8s使用

一、Kubernetes好处 ​ kubernetes&#xff0c;是一个全新的基于容器技术的分布式架构领先方案&#xff0c;是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本&#xff0c;于2014年9月发布第一个版本&#xff0c;2015年7月发布第一个正式版本。 ​ kubernetes的本质…...

HTML图片标签(2) HTML5+CSS3+移动web 前端开发入门笔记(三)

图片标签 HTML中&#xff0c;可以使用标签来插入图片。具体的语法为&#xff1a; <img src"图片路径" alt"替代文本">其中&#xff0c;src属性用于指定图片的路径&#xff0c;可以是相对路径或绝对路径。常见的有相对当前HTML文件的路径&#xff0…...

jwttoken+redis+springsecurity

思路 jwttoken不设置过期时间 redis管理过期时间&#xff0c;并且续签 redis中key"login:"userId, valuejwtUser 再次访问时&#xff0c;解析token中userId&#xff0c;并且根据过期时间自动续签JWT 实现登录认证 Token 自动续期方案 pom文件配置 <!--Redis--&…...

asp.net会议预约管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 会议预约管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 asp.net 会议预约管理系统 二、…...

十六、【橡皮擦工具组】

文章目录 橡皮擦背景橡皮擦1. 一次取样2. 连续取样3. 取样背景色板 魔术橡皮擦 橡皮擦 橡皮擦跟我们平常生活中所用的橡皮擦是一样&#xff0c;它是将图层的内容擦除,只剩下空白部分。另外当我们按住Alt的键去擦除空白部分的时候&#xff0c;也可以将背景的部分显示出来。 另…...

BAT学习——计算当前路径下指定格式文件的MD5值,将文件名与MD5值写入文本

将以下内容粘贴到bat脚本中&#xff0c;双击运行&#xff0c;生成MD5.txt文件&#xff0c;需要其他格式&#xff0c;修改循环中的.rar 多个格式使用or分开 *.rar or *.bat脚本内容 echo off setlocal enabledelayedexpansionrem 设置输出文件名 set "outputFileMD5.txt&…...

排序算法(stable_sort(), sort())

sort函数我相信大家都不陌生&#xff0c;今天介绍一个新的排序算法stable_sort stable_sort&#xff1a;稳定排序算法&#xff0c;维持相等元素的原有顺序。 stable_sort 假如我们定义一个字符串数组 vector<string> words; //fox jumps over quick red slow the turtl…...

【atoi函数详解】

文章目录 一. 什么是atoi函数二. 模拟实现函数atoi三. 总结atoi 一. 什么是atoi函数 atoi函数是将常量字符串转化为整数 int atoi(const char str);* 注意&#xff1a;该函数的返回值为int&#xff0c;所以不能超过int范围&#xff0c;如果数字很大超过就会截断&#xff0c;返…...

字符串左旋 与 字符串旋转结果

字符串左旋 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 方法1 三步翻转法 要求:abcdef 左旋两个 整体逆序:fedcba左边逆序:cdef ba右边逆序:cdef ab #include<stdio.h> #include<…...

真人现在猫鼠躲猫猫游戏搭建流程:专业思考与深度思考

真人现在猫鼠躲猫猫游戏是种充满乐趣和挑战的团队竞技游戏。本文将从游戏规则设计、场地布置、技术实现和用户体验等方面&#xff0c;深入探讨人现在猫鼠躲猫猫游戏的搭建流程&#xff0c;并结合专业思考与深度思考&#xff0c;为游戏搭建提供全面指导。 一、游戏规则设计&…...

计算机导论实验——Linux基础入门

使用Xshell登录 Linux 主机 linux命令&#xff1a; cd&#xff1a;去哪里 pwd&#xff1a;在哪里 ls&#xff1a;查看当前有什么文件 mkdir&#xff1a;创建新目录 cp&#xff1a;复制 cat&#xff1a;连接或显示文件 rm&#xff1a;删除 mv&#xff1a;用于移动或重命名文件…...

服务运营 |摘要:学术+业界-近期前沿运筹医疗合作精选

推文作者&#xff1a;李舒湉 编者按 本文归纳整理了近期INFORMS Journal on Applied Analytics中的相关业界合作研究。 这些研究成果体现了运筹学在医疗健康领域实践的效果。文中的学术业界合作使用了不同的研究工具。第一篇文章使用仿真模型帮助诊所进行不同拥挤程度下诊所使用…...

基于Dockerfile创建镜像

基于现有镜像创建 1.首先启动一个镜像&#xff0c;在容器里做修改 docker create -it centos:7 /bin/bash #常用选项&#xff1a; -m 说明信息&#xff1b; -a 作者信息&#xff1b; -p 生成过程中停止容器的运行。 2.然后将修改后的容器提交为新的镜像&#xff0c;需要使用…...

架构实战关键知识点

1.维基百科的“系统”定义&#xff1a;https://zh.wikipedia.org/wiki/%E7%B3%BB%E7%B5%B1 2.维基百科的“软件模块”定义&#xff1a;https://zh.wikipedia.org/wiki/%E8%BB%9F%E9%AB%9 4%E6%A8%A1%E7%B5%84 3.维基百科的“软件组件”定义&#xff1a;https://zh.wikipedia.or…...

M1Mac开启x86_64命令行archlinux虚拟机的最佳实践(qemu)

categories: [Tips] tags: Linux MacOS 写在前面 UTM 虚拟机可以卸载了, 命令行才是永远滴神, M1 MacBook Air 又能再战了! 之前一直用 UTM 的虚拟化开启 x86_64 的 Linux 虚拟机的, 但是我发现 UTM 好像不是必须的, 只要有qemu 就可以了, 下面就看看如何不通过图形界面前端…...

深度神经网络压缩与加速技术

// 深度神经网络是深度学习的一种框架&#xff0c;它是一种具备至少一个隐层的神经网络。与浅层神经网络类似&#xff0c;深度神经网络也能够为复杂非线性系统提供建模&#xff0c;但多出的层次为模型提供了更高的抽象层次&#xff0c;因而提高了模型的能力。深度神经网络是一…...