Skip to content

Commit b0538c3

Browse files
committed
update README.md and add lidar
1 parent f2236b6 commit b0538c3

32 files changed

+2329
-54
lines changed

README.md

+94-53
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,19 @@
1212

1313
# 目录
1414

15-
- [1. 安装说明 ](#1-安装说明)
16-
- [2. 运行仿真](#2-运行仿真)
17-
- [3. 技术细节说明](#3-技术细节说明)
18-
- [4. 代码提交规范](#4-代码提交规范)
19-
- [5. 已知问题](#5-已知问题)
15+
[1. 安装说明 ](#1-安装说明)
16+
17+
[2. 运行仿真](#2-运行仿真)
18+
19+
[3. 技术细节说明](#3-技术细节说明)
20+
21+
[4. 代码提交规范](#4-代码提交规范)
22+
23+
[5. 已知问题](#5-已知问题)
2024

2125
# 1. 安装说明
2226

23-
在开始安装依赖前,请确保当前系统已经安装了 **ROS**。如果还未安装 **ROS**,请先安装 [ROS Melodic](http://wiki.ros.org/melodic/Installation/Ubuntu)[ROS Noetic](http://wiki.ros.org/noetic/Installation/Ubuntu)
27+
在开始安装依赖前,请确保当前系统已经安装了 **ROS**。如果还未安装 **ROS**,请先安装 [ROS Melodic(Ubuntu18.04)](http://wiki.ros.org/melodic/Installation/Ubuntu)[ROS Noetic(Ubuntu20.04)](http://wiki.ros.org/noetic/Installation/Ubuntu)
2428

2529
## 1.1 仿真器依赖安装
2630
对于 Ubuntu18.04:
@@ -76,14 +80,57 @@ cd CICRSIM/
7680
## 2.2 启动脚本功能说明
7781
|文件名称|功能描述|
7882
|:-|:-|
79-
|[keyboard_control.py](/cicr2023_simulator/uav_simulation/src/keyboard_control.py)|官方提供的接盘控制节点示例,参赛选手可参考其中控制无人机的方法,根据官方预留的控制接口发布相关话题来开发自己的无人机控制器|
80-
|[command_process.py](/cicr2023_simulator/uav_simulation/src/command_process.py)|控制器话题接收端,此文件不允许参赛选手进行改动|
83+
|[keyboard_control.py](/cicr2023_simulator/uav_simulation/src/keyboard_control.py)|键盘控制无人机节点|
84+
|[command_process.py](/cicr2023_simulator/uav_simulation/src/command_process.py)|控制器话题接收端|
8185
|[env_simulation.launch](/cicr2023_simulator/uav_simulation/launch/env_simulation.launch)|加载仿真环境,并刷新随机障碍物和二维码|
8286
|[uav_simulation.launch](/cicr2023_simulator//uav_simulation/launch/uav_simulation.launch)|加载仿真无人机|
83-
|[referee_system.launch](/cicr2023_simulator/uav_simulation/launch/referee_system.launch)|裁判系统,在参赛者触发比赛标志位后,无人机方能离开地面进行探索,系统开始倒计时并计算当前得分|
87+
|[referee_system.launch](/cicr2023_simulator/uav_simulation/launch/referee_system.launch)|裁判系统|
88+
89+
**注意**:参赛选手不允许修改启动脚本中的官方文件
8490

8591
# 3. 技术细节说明
86-
## 3.1 如何无人机控制接口控制无人机
92+
93+
## 3.1 相关话题说明
94+
仿真无人机上默认搭载了一个RealSense深度相机,参赛选手可获取相机的相关话题以及无人机的里程计、IMU等话题,具体说明如下:
95+
### 3.1.1 传感器话题
96+
|名称|类型|描述|
97+
|:-|:-|:-|
98+
|`/ardrone/ground_truth/odometry`|`nav_msgs/Odometry`|里程计数据,包括无人机的位置、姿态和速度信息|
99+
|`/ardrone/ground_truth/imu`|`sensor_msgs/Imu`|IMU传感器数据,包括无人机的姿态、速度和加速度信息,由IMU收集|
100+
|`/camera/color/camera_info`|`sensor_msgs/CameraInfo`|RGB相机内参信息|
101+
|`/camera/color/image_raw`|`sensor_msgs/Image`|RGB彩色图像数据,从深度相机中获取|
102+
|`/camera/depth/camera_info`|`sensor_msgs/CameraInfo`|深度相机信息|
103+
|`/camera/depth/image_raw`|`sensor_msgs/Image`|深度图像数据|
104+
|`/velodyne_points`|`sensor_msgs/PointCloud2`|雷达点云数据|
105+
106+
参赛选手可任意使用仿真相机或仿真激光雷达对环境进行感知,但不能更改除了安装位置以外的任何参数。
107+
108+
### 3.1.2 其他接口话题
109+
|名称|类型|描述|
110+
|:-|:-|:-|
111+
|`/position_control`|`nav_msgs/Odometry`|官方控制接口,可发布无人机的位置、姿态、速度信息来控制无人机|
112+
|`/start_flag`|`std_msgs/Bool`|裁判系统触发接口,发布对应的消息以开始计时与计算选手当前得分|
113+
|`/apriltag_detection`|`referee_msgs/Apriltag_info`|裁判系统二维码坐标接收接口|
114+
## 3.2 传感器话题获取
115+
下面给出一段示例代码,说明如何获取相机的深度数据:
116+
```
117+
#include <ros/ros.h>
118+
#include <sensor_msgs/Image.h>
119+
void depthImageCallback(const sensor_msgs::Image::ConstPtr& msg)
120+
{
121+
// 处理深度图像消息
122+
}
123+
int main(int argc, char** argv)
124+
{
125+
ros::init(argc, argv, "depth_image_subscriber");
126+
ros::NodeHandle nh;
127+
ros::Subscriber sub = nh.subscribe<sensor_msgs::Image>("/camera/depth/image_raw", 1, depthImageCallback);
128+
ros::spin();
129+
}
130+
```
131+
132+
## 3.3 无人机控制接口
133+
参赛选手应根据官方预留的控制接口发布相关话题来开发自己的无人机控制器,具体实现如下:
87134
```
88135
话题名称:/position_control
89136
数据类型:nav_msgs/Odometry
@@ -112,44 +159,31 @@ model_odom_pub.publish(odom)
112159
```
113160
**提示:** 可参考 [keyboard_control.py](/cicr2023_simulator/uav_simulation/src/keyboard_control.py) 中控制无人机的方法进行实现
114161

115-
## 3.2 相关话题说明
116-
仿真无人机上默认搭载了一个RealSense深度相机,参赛选手可获取相机的相关话题以及无人机的里程计、IMU等话题,具体说明如下:
117-
### 3.2.1 传感器话题
118-
|名称|类型|描述|
119-
|:-|:-|:-|
120-
|`/ardrone/ground_truth/odometry`|`nav_msgs/Odometry`|里程计数据,包括无人机的位置、姿态和速度信息|
121-
|`/ardrone/ground_truth/imu`|`sensor_msgs/Imu`|IMU传感器数据,包括无人机的姿态、速度和加速度信息,由IMU收集|
122-
|`/camera/color/camera_info`|`sensor_msgs/CameraInfo`|RGB相机内参信息|
123-
|`/camera/color/image_raw`|`sensor_msgs/Image`|RGB彩色图像数据,从深度相机中获取|
124-
|`/camera/depth/camera_info`|`sensor_msgs/CameraInfo`|深度相机信息|
125-
|`/camera/depth/image_raw`|`sensor_msgs/Image`|深度图像数据|
126-
127-
若需要修改深度相机相关话题,可在 [_d435.gazebo.xacro](/cicr2023_simulator/uav_gazebo/urdf/_d435.gazebo.xacro)中修改;若需要激光雷达等传感器,请参赛选手自行添加。
128-
129-
### 3.2.2 其他接口话题
130-
|名称|类型|描述|
131-
|:-|:-|:-|
132-
|`/position_control`|`nav_msgs/Odometry`|官方控制接口,可发布无人机的位置、姿态、速度信息来控制无人机|
133-
|`/start_flag`|`std_msgs/Bool.h`|裁判系统触发接口,发布对应的消息以开始计时与计算选手当前得分
134-
135-
### 3.2.3 传感器话题获取示例
136-
下面给出一段示例代码,说明如何获取相机的深度数据:
162+
## 3.4 二维码发布规范
163+
下面给出一段示例代码,说明如何发布二维码坐标:
137164
```
138165
#include <ros/ros.h>
139-
#include <sensor_msgs/Image.h>
140-
void depthImageCallback(const sensor_msgs::Image::ConstPtr& msg)
166+
#include <referee_msgs/Apriltag_info.h>
167+
ros::Publisher tag_pub;
168+
void tagPub()
141169
{
142-
// 处理深度图像消息
170+
referee_msgs::Apriltag_info msg;
171+
msg.tag_num = 0;
172+
msg.tag_pos_x = 5.05;
173+
msg.tag_pos_y = 1.85;
174+
msg.tag_pos_z = 1.2;
175+
tag_pub.publish(msg);
143176
}
144-
int main(int argc, char** argv)
177+
int main(int argc, char** argv)
145178
{
146-
ros::init(argc, argv, "depth_image_subscriber");
179+
ros::init(argc, argv, "tag_Publish");
147180
ros::NodeHandle nh;
148-
ros::Subscriber sub = nh.subscribe<sensor_msgs::Image>("/camera/depth/image_raw", 1, depthImageCallback);
149-
ros::spin();
181+
tag_pub = nh.advertise<referee_msgs::Apriltag_info>("/apriltag_detection",10);
182+
tagPub();
150183
}
151184
```
152-
## 3.3 裁判系统
185+
这段代码发布了 **0** 号二维码的坐标,请各位参赛选手参照这段示例代码进行二维码消息发布
186+
## 3.5 裁判系统
153187
比赛开始前,参赛选手需要先启动官方裁判系统,在裁判系统启动后,参赛选手的无人机才能获得允许离开地面。裁判系统的启动方式为参赛选手根据裁判系统触发接口发布对应的话题作为启动信号,具体实现示例如下:
154188
```
155189
#include <ros/ros.h>
@@ -174,22 +208,26 @@ int main(int argc, char** argv)
174208

175209
![referee_system](/files/referee_system.png)
176210

177-
# 4. 代码提交规范
211+
在倒计时结束或接收到参赛选手发布的所有二维码坐标后,裁判系统会自动关闭,比赛结束。
212+
213+
# 4. 代码及文件提交规范
178214
## 4.1 提交文件命名规范与功能说明
179215
在最终提交代码时,参赛选手需要提交的文件有:
180216

181217
|文件名称|文件属性|功能描述|
182218
|:-|:-|:-|
183-
|`sysu_planner`|文件夹|实现无人机自主探索的算法部分|
184-
|`sysu_controller`|文件夹|无人机控制器部分,通过官方提供的控制接口实现对无人机的控制|
185-
|`sysu_simulation.sh`|脚本文件|能够一键运行仿真和实现自主探索功能的脚本|
186-
|`sysu_report.pdf`|说明文档|说明提交代码的逻辑结构,是否需要配置其他环境等|
219+
|`planner`|ros package|实现无人机自主探索的算法部分|
220+
|`controller`|ros package|无人机控制器部分,通过官方提供的控制接口实现对无人机的控制|
221+
|`planner_dependency`|文件夹|存放除了 `planner` 以外的ros package|
222+
|`exploration.launch`|launch文件|启动所有自主探索相关的算法|
223+
|`report.pdf`|说明文档|说明提交代码的逻辑结构;比赛结束后,一张包含gazebo、rviz和裁判系统终端的截图;官方核实选手代码时需要知道的注意事项等|
224+
225+
请各位参赛选手将 `exploration.launch` 放在 `planner``launch` 目录下,具体路径为 `planner/launch`。此外,在最终提交压缩包时,请将上述文件依次放入压缩包并将压缩包命名为 **队名.zip**
187226

188-
其中,文件夹的命名规范为 **队名_planner/controller**,脚本文件的命名规范为 **队名_simulation.sh**,说明文档的命名规范为 **队名_report.pdf**
227+
**注意**:未按照规范提交代码及文件的参赛队伍将会被扣除一定分数
189228

190-
## 4.2 具体要求说明
191-
### 4.2.1 脚本文件
192-
参赛选手最终提交的脚本文件的编写方式请参考 [start_simulation.sh](/start_simulation.sh),示例如下:
229+
## 4.2 官方代码核实流程
230+
在各位参赛选手提交代码后,官方将下载本仓库的官方代码和选手提交的代码。官方代码和选手提交的代码会被放置在工作空间的 **src** 目录下,按照如下顺序进行代码测试:
193231
```
194232
#!/bin/bash
195233
gnome-terminal -t "roscore" -x bash -c "roscore;exec bash;"
@@ -202,13 +240,16 @@ gnome-terminal -t "uav_simulation" -x bash -c "source devel/setup.bash;roslaunch
202240
sleep 3s
203241
204242
gnome-terminal -t "uav_simulation" -x bash -c "source devel/setup.bash;roslaunch uav_simulation referee_system.launch;exec bash;"
205-
sleep 2s
243+
sleep 3s
206244
207245
gnome-terminal -t "uav_simulation" -x bash -c "source devel/setup.bash;roslaunch sysu_planner exploration.launch;exec bash;"
208-
sleep 2s
209246
```
210-
### 4.2.2 说明文档
211-
参赛选手最终提交的说明文档中需要说明提交代码的逻辑结构,技术创新点,是否需要配置其他环境等内容。
247+
清各位参赛选手在提交代码前按照该顺序进行代码测试。确保代码能够准确无误的运行。每位参赛选手的代码将会进行三次测试,最终的成绩取三次测试成绩的中位数。
248+
249+
下面给出官方测试平台的相关参数:
250+
| CPU | RAM | GPU |
251+
| :----------------------: | :----------------------: | :----------------------: |
252+
| i7-13700F | 32GB | RTX3060 |
212253

213254
# 5. 已知问题
214255

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
<?xml version="1.0"?>
2+
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="VLP-16">
3+
<xacro:property name="M_PI" value="3.1415926535897931" />
4+
<xacro:macro name="VLP-16"
5+
params="*origin namespace:=ardrone parent:=base_link name:=velodyne topic:=/velodyne_points organize_cloud:=false hz:=10 lasers:=16 samples:=1875 collision_range:=0.3 min_range:=0.9 max_range:=130.0 noise:=0.008 min_angle:=-${M_PI} max_angle:=${M_PI} gpu:=false support_height:=0.05">
6+
7+
<joint name="${namespace}/${name}_base_mount_joint" type="fixed">
8+
<xacro:insert_block name="origin" />
9+
<origin xyz="0 0 ${support_height/2}" rpy="0 0 0" />
10+
<parent link="${parent}" />
11+
<child link="${namespace}/${name}_base_link" />
12+
</joint>
13+
14+
<link name="${namespace}/${name}_base_link">
15+
<inertial>
16+
<mass value="0.83" />
17+
<origin xyz="0 0 0.03585" />
18+
<inertia ixx="${(0.83 * (3.0*0.0516*0.0516 + 0.0717*0.0717)) / 12.0}" ixy="0" ixz="0"
19+
iyy="${(0.83 * (3.0*0.0516*0.0516 + 0.0717*0.0717)) / 12.0}" iyz="0"
20+
izz="${0.5 * 0.83 * (0.0516*0.0516)}" />
21+
</inertial>
22+
<visual>
23+
<geometry>
24+
<mesh filename="$(find rotors_description)/meshes/VLP16_base_1.dae" />
25+
</geometry>
26+
</visual>
27+
<visual>
28+
<geometry>
29+
<mesh filename="$(find rotors_description)/meshes/VLP16_base_2.dae" />
30+
</geometry>
31+
</visual>
32+
<collision>
33+
<origin rpy="0 0 0" xyz="0 0 0.03585" />
34+
<geometry>
35+
<cylinder radius="0.0516" length="0.0717" />
36+
</geometry>
37+
</collision>
38+
</link>
39+
40+
<joint name="${namespace}/${name}_base_scan_joint" type="fixed">
41+
<origin xyz="0 0 0.0377" rpy="0 0 0" />
42+
<parent link="${namespace}/${name}_base_link" />
43+
<child link="${namespace}/${name}" />
44+
</joint>
45+
46+
<link name="${namespace}/${name}">
47+
<inertial>
48+
<mass value="0.01" />
49+
<origin xyz="0 0 0" />
50+
<inertia ixx="1e-7" ixy="0" ixz="0" iyy="1e-7" iyz="0" izz="1e-7" />
51+
</inertial>
52+
<visual>
53+
<origin xyz="0 0 -0.0377" />
54+
<geometry>
55+
<mesh filename="$(find rotors_description)/meshes/VLP16_scan.dae" />
56+
</geometry>
57+
</visual>
58+
</link>
59+
60+
<!-- Gazebo requires the velodyne_gazebo_plugins package -->
61+
<gazebo reference="${namespace}/${name}">
62+
<xacro:if value="${gpu}">
63+
<sensor type="gpu_ray" name="${name}-VLP16">
64+
<pose>0 0 0 0 0 0</pose>
65+
<visualize>false</visualize>
66+
<update_rate>${hz}</update_rate>
67+
<ray>
68+
<scan>
69+
<horizontal>
70+
<samples>${samples}</samples>
71+
<resolution>1</resolution>
72+
<min_angle>${min_angle}</min_angle>
73+
<max_angle>${max_angle}</max_angle>
74+
</horizontal>
75+
<vertical>
76+
<samples>${lasers}</samples>
77+
<resolution>1</resolution>
78+
<min_angle>-${15.0*M_PI/180.0}</min_angle>
79+
<max_angle> ${15.0*M_PI/180.0}</max_angle>
80+
</vertical>
81+
</scan>
82+
<range>
83+
<min>${collision_range}</min>
84+
<max>${max_range+1}</max>
85+
<resolution>0.001</resolution>
86+
</range>
87+
<noise>
88+
<type>gaussian</type>
89+
<mean>0.0</mean>
90+
<stddev>0.0</stddev>
91+
</noise>
92+
</ray>
93+
<plugin name="gazebo_ros_laser_controller" filename="libgazebo_ros_velodyne_gpu_laser.so">
94+
<!-- <robotNamespace>${namespace}</robotNamespace> -->
95+
<topicName>${topic}</topicName>
96+
<frameName>${name}</frameName>
97+
<organize_cloud>${organize_cloud}</organize_cloud>
98+
<min_range>${min_range}</min_range>
99+
<max_range>${max_range}</max_range>
100+
<gaussianNoise>${noise}</gaussianNoise>
101+
</plugin>
102+
</sensor>
103+
</xacro:if>
104+
<xacro:unless value="${gpu}">
105+
<sensor type="ray" name="${name}-VLP16">
106+
<pose>0 0 0 0 0 0</pose>
107+
<visualize>false</visualize>
108+
<update_rate>${hz}</update_rate>
109+
<ray>
110+
<scan>
111+
<horizontal>
112+
<samples>${samples}</samples>
113+
<resolution>1</resolution>
114+
<min_angle>${min_angle}</min_angle>
115+
<max_angle>${max_angle}</max_angle>
116+
</horizontal>
117+
<vertical>
118+
<samples>${lasers}</samples>
119+
<resolution>1</resolution>
120+
<min_angle>-${15.0*M_PI/180.0}</min_angle>
121+
<max_angle> ${15.0*M_PI/180.0}</max_angle>
122+
</vertical>
123+
</scan>
124+
<range>
125+
<min>${collision_range}</min>
126+
<max>${max_range+1}</max>
127+
<resolution>0.001</resolution>
128+
</range>
129+
<noise>
130+
<type>gaussian</type>
131+
<mean>0.0</mean>
132+
<stddev>0.0</stddev>
133+
</noise>
134+
</ray>
135+
<plugin name="gazebo_ros_laser_controller" filename="libgazebo_ros_velodyne_laser.so">
136+
<!-- <robotNamespace>${namespace}</robotNamespace> -->
137+
<topicName>${topic}</topicName>
138+
<frameName>${name}</frameName>
139+
<organize_cloud>${organize_cloud}</organize_cloud>
140+
<min_range>${min_range}</min_range>
141+
<max_range>${max_range}</max_range>
142+
<gaussianNoise>${noise}</gaussianNoise>
143+
</plugin>
144+
</sensor>
145+
</xacro:unless>
146+
</gazebo>
147+
148+
</xacro:macro>
149+
</robot>

rotors_simulator/rotors_description/urdf/ardrone.xacro

+28-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<xacro:property name="sqrt2" value="1.4142135623730951" />
2424
<xacro:property name="rotor_drag_coefficient" value="8.06428e-05" />
2525
<xacro:property name="rolling_moment_coefficient" value="0.000001" />
26-
26+
<xacro:property name="lidar_support_height" value="0.05" />
2727
<!-- Property Blocks -->
2828
<xacro:property name="body_inertia">
2929
<inertia ixx="0.0347563" ixy="0.0" ixz="0.0" iyy="0.0458929" iyz="0.0" izz="0.0977" /> <!-- [kg.m^2] [kg.m^2] [kg.m^2] [kg.m^2] [kg.m^2] [kg.m^2] -->
@@ -49,5 +49,32 @@
4949
<xacro:insert_block name="body_inertia" />
5050
</xacro:multirotor_base_macro>
5151

52+
<link name="${namespace}/base_lidar_support">
53+
<visual>
54+
<origin xyz="0 0 0.06" rpy="0 0 0" />
55+
<geometry>
56+
<cylinder radius="0.03" length="${lidar_support_height}" />
57+
</geometry>
58+
</visual>
59+
60+
<inertial>
61+
<mass value="1e-5" />
62+
<origin xyz="0 0 0" rpy="0 0 0" />
63+
<inertia ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6" />
64+
</inertial>
65+
</link>
66+
67+
<joint name="${namespace}/lidar_holder_joint" type="fixed">
68+
<origin xyz="0.0 0.0 ${body_height-lidar_support_height/2-0.1}" rpy="0 0 0" />
69+
<parent link="${namespace}/base_link" />
70+
<child link="${namespace}/base_lidar_support" />
71+
</joint>
72+
73+
<xacro:include filename="$(find rotors_description)/urdf/VLP-16.urdf.xacro" />
74+
<xacro:VLP-16 namespace="${namespace}" parent="${namespace}/base_lidar_support" name="velodyne"
75+
topic="/velodyne_points" hz="60" samples="1000" min_range="0.1" organize_cloud="true" gpu="true"
76+
support_height="${lidar_support_height}">
77+
<origin xyz="0 0 0" rpy="0 0 0" />
78+
</xacro:VLP-16>
5279

5380
</robot>

0 commit comments

Comments
 (0)