add wall environment
This commit is contained in:
parent
b8725720da
commit
8b087d00f4
@ -19,12 +19,12 @@ expand_x_times: 0 # x方向复制次数(cuda版不使用)
|
|||||||
expand_y_times: 0 # y方向复制次数(cuda版不使用)
|
expand_y_times: 0 # y方向复制次数(cuda版不使用)
|
||||||
occupy_threshold: 0 # 大于多少个点才认为占据(cpu版不使用)
|
occupy_threshold: 0 # 大于多少个点才认为占据(cpu版不使用)
|
||||||
|
|
||||||
# 2.2 随机地图
|
# 2.2 随机地图 ======
|
||||||
seed: 3
|
seed: 3
|
||||||
x_length: 60 # 真正随机范围(XY更大范围处为其镜像)
|
x_length: 60 # 真正随机范围(XY更大范围处为其镜像)
|
||||||
y_length: 60
|
y_length: 60
|
||||||
z_length: 15
|
z_length: 15
|
||||||
maze_type: 5 # 1: 溶洞 2: 柱子 3:迷宫 5:森林 6:房间 (当前策略支持1,2,5)
|
maze_type: 5 # 1: 溶洞 2: 柱子 3:迷宫 5:森林 6:房间 7:墙面 (当前策略支持1,2,5,7)
|
||||||
# 溶洞
|
# 溶洞
|
||||||
complexity: 0.02 # 复杂度 0.0-0.5
|
complexity: 0.02 # 复杂度 0.0-0.5
|
||||||
fill: 0.1 # 填充率 0.0-0.4
|
fill: 0.1 # 填充率 0.0-0.4
|
||||||
@ -47,6 +47,12 @@ max_windows: 2 # 每面墙最多窗口数
|
|||||||
window_size_min: 2.0
|
window_size_min: 2.0
|
||||||
window_size_max: 2.8
|
window_size_max: 2.8
|
||||||
add_ceiling: 0 # 是否添加天花板
|
add_ceiling: 0 # 是否添加天花板
|
||||||
|
# 墙面
|
||||||
|
wall_width_min: 0.5
|
||||||
|
wall_width_max: 8.0
|
||||||
|
wall_thick: 0.5
|
||||||
|
wall_number: 100 # 墙面数量
|
||||||
|
wall_ceiling: 1 # 是否添加天花板
|
||||||
|
|
||||||
# 3. 传感器参数 ==============================================================
|
# 3. 传感器参数 ==============================================================
|
||||||
camera:
|
camera:
|
||||||
|
|||||||
@ -56,6 +56,11 @@ private:
|
|||||||
int max_windows;
|
int max_windows;
|
||||||
int add_ceiling;
|
int add_ceiling;
|
||||||
double window_size_min, window_size_max;
|
double window_size_min, window_size_max;
|
||||||
|
// wall
|
||||||
|
double _wall_w_l, _wall_w_h;
|
||||||
|
double _wall_thick;
|
||||||
|
int _wall_num;
|
||||||
|
int _wall_ceiling;
|
||||||
|
|
||||||
std::uniform_real_distribution<double> dis_window_x, dis_window_z, dis_window_size;
|
std::uniform_real_distribution<double> dis_window_x, dis_window_z, dis_window_size;
|
||||||
std::default_random_engine window_eng;
|
std::default_random_engine window_eng;
|
||||||
@ -64,6 +69,7 @@ private:
|
|||||||
void maze2D();
|
void maze2D();
|
||||||
void randomMapGenerate();
|
void randomMapGenerate();
|
||||||
void Maze3DGen();
|
void Maze3DGen();
|
||||||
|
void wall();
|
||||||
void recursiveDivision(int xl, int xh, int yl, int yh, Eigen::MatrixXi &maze);
|
void recursiveDivision(int xl, int xh, int yl, int yh, Eigen::MatrixXi &maze);
|
||||||
void recursizeDivisionMaze(Eigen::MatrixXi &maze);
|
void recursizeDivisionMaze(Eigen::MatrixXi &maze);
|
||||||
void optimizeMap();
|
void optimizeMap();
|
||||||
|
|||||||
@ -74,6 +74,91 @@ Maps::randomMapGenerate()
|
|||||||
info.cloud->is_dense = true;
|
info.cloud->is_dense = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Maps::wall()
|
||||||
|
{
|
||||||
|
std::default_random_engine eng(info.seed);
|
||||||
|
|
||||||
|
double _resolution = 1 / info.scale;
|
||||||
|
|
||||||
|
double _x_l = -info.sizeX / (2 * info.scale);
|
||||||
|
double _x_h = info.sizeX / (2 * info.scale);
|
||||||
|
double _y_l = -info.sizeY / (2 * info.scale);
|
||||||
|
double _y_h = info.sizeY / (2 * info.scale);
|
||||||
|
double _h_l = 0.3 * info.sizeZ / info.scale;
|
||||||
|
double _h_h = info.sizeZ / info.scale;
|
||||||
|
|
||||||
|
std::uniform_real_distribution<double> rand_x(_x_l, _x_h);
|
||||||
|
std::uniform_real_distribution<double> rand_y(_y_l, _y_h);
|
||||||
|
std::uniform_real_distribution<double> rand_w(_wall_w_l, _wall_w_h);
|
||||||
|
std::uniform_real_distribution<double> rand_h(_h_l, _h_h);
|
||||||
|
std::uniform_real_distribution<float> rand_yaw(-M_PI, M_PI);
|
||||||
|
std::uniform_real_distribution<float> rand_pitch(-M_PI / 10, M_PI / 10);
|
||||||
|
|
||||||
|
pcl::PointXYZ pt_random;
|
||||||
|
for (int i = 0; i < _wall_num; ++i)
|
||||||
|
{
|
||||||
|
float cx = rand_x(eng);
|
||||||
|
float cy = rand_y(eng);
|
||||||
|
float cz = 0.0f;
|
||||||
|
float yaw = rand_yaw(eng);
|
||||||
|
float pitch = rand_pitch(eng);
|
||||||
|
float width = rand_w(eng);
|
||||||
|
float height = rand_h(eng);
|
||||||
|
float thick = _wall_thick;
|
||||||
|
|
||||||
|
int w_steps = std::ceil(width / _resolution);
|
||||||
|
int h_steps = std::ceil(height / _resolution);
|
||||||
|
int t_steps = std::ceil(thick / _resolution);
|
||||||
|
|
||||||
|
float w0 = -width / 2.0f;
|
||||||
|
float h0 = 0.0f;
|
||||||
|
float t0 = -thick / 2.0f;
|
||||||
|
|
||||||
|
float cosy = std::cos(yaw), siny = std::sin(yaw);
|
||||||
|
float cosp = std::cos(pitch), sinp = std::sin(pitch);
|
||||||
|
|
||||||
|
for (int i = 0; i < w_steps; ++i)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < h_steps; ++j)
|
||||||
|
{
|
||||||
|
for (int k = 0; k < t_steps; ++k)
|
||||||
|
{
|
||||||
|
float x_local = w0 + i * _resolution;
|
||||||
|
float y_local = t0 + k * _resolution;
|
||||||
|
float z_local = h0 + j * _resolution;
|
||||||
|
|
||||||
|
float x1 = cosy * x_local - siny * y_local;
|
||||||
|
float y1 = siny * x_local + cosy * y_local;
|
||||||
|
float z1 = z_local;
|
||||||
|
|
||||||
|
float y2 = cosp * y1 - sinp * z1;
|
||||||
|
float z2 = sinp * y1 + cosp * z1;
|
||||||
|
float x2 = x1;
|
||||||
|
|
||||||
|
pcl::PointXYZ pt;
|
||||||
|
pt.x = cx + x2;
|
||||||
|
pt.y = cy + y2;
|
||||||
|
pt.z = cz + z2;
|
||||||
|
|
||||||
|
info.cloud->points.push_back(pt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pcl::PointCloud<pcl::PointXYZ>::Ptr ground_cloud = generateGround(info.cloud, _resolution);
|
||||||
|
*info.cloud += *ground_cloud;
|
||||||
|
|
||||||
|
if (_wall_ceiling){
|
||||||
|
pcl::PointCloud<pcl::PointXYZ>::Ptr ceiling_cloud = generateGround(info.cloud, _resolution, _h_h);
|
||||||
|
*info.cloud += *ceiling_cloud;
|
||||||
|
}
|
||||||
|
|
||||||
|
info.cloud->width = info.cloud->points.size();
|
||||||
|
info.cloud->height = 1;
|
||||||
|
info.cloud->is_dense = true;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Maps::perlin3D()
|
Maps::perlin3D()
|
||||||
{
|
{
|
||||||
@ -674,6 +759,12 @@ Maps::setParam(const YAML::Node& config)
|
|||||||
add_ceiling = config["add_ceiling"].as<int>();
|
add_ceiling = config["add_ceiling"].as<int>();
|
||||||
window_size_min = config["window_size_min"].as<double>();
|
window_size_min = config["window_size_min"].as<double>();
|
||||||
window_size_max = config["window_size_max"].as<double>();
|
window_size_max = config["window_size_max"].as<double>();
|
||||||
|
// wall
|
||||||
|
_wall_w_l = config["wall_width_min"].as<double>();
|
||||||
|
_wall_w_h = config["wall_width_max"].as<double>();
|
||||||
|
_wall_thick = config["wall_thick"].as<double>();
|
||||||
|
_wall_num = config["wall_number"].as<int>();
|
||||||
|
_wall_ceiling = config["wall_ceiling"].as<int>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -703,6 +794,9 @@ Maps::generate(int type)
|
|||||||
case 6:
|
case 6:
|
||||||
room();
|
room();
|
||||||
break;
|
break;
|
||||||
|
case 7:
|
||||||
|
wall();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -3,12 +3,12 @@
|
|||||||
namespace raycast
|
namespace raycast
|
||||||
{
|
{
|
||||||
GridMap::GridMap(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, float resolution, int occupy_threshold = 1){
|
GridMap::GridMap(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, float resolution, int occupy_threshold = 1){
|
||||||
|
const float epsilon = 0.001f; // 避免数值误差导致 (1)建图空行 (2)边缘点被忽略
|
||||||
Eigen::Vector4f min_pt, max_pt;
|
Eigen::Vector4f min_pt, max_pt;
|
||||||
pcl::getMinMax3D(*cloud, min_pt, max_pt);
|
pcl::getMinMax3D(*cloud, min_pt, max_pt);
|
||||||
float length = max_pt(0) - min_pt(0); // X方向的长度
|
float length = max_pt(0) - min_pt(0) + 2 * epsilon; // 保证各个边界最大值能被取到
|
||||||
float width = max_pt(1) - min_pt(1); // Y方向的宽度
|
float width = max_pt(1) - min_pt(1) + 2 * epsilon;
|
||||||
float height = max_pt(2) - min_pt(2); // Z方向的高度
|
float height = max_pt(2) - min_pt(2) + 2 * epsilon;
|
||||||
Vector3f origin(min_pt(0), min_pt(1), min_pt(2));
|
Vector3f origin(min_pt(0), min_pt(1), min_pt(2));
|
||||||
Vector3f map_size(length, width, height);
|
Vector3f map_size(length, width, height);
|
||||||
origin_x_ = origin.x;
|
origin_x_ = origin.x;
|
||||||
@ -30,9 +30,9 @@ namespace raycast
|
|||||||
raycast_step_ = resolution;
|
raycast_step_ = resolution;
|
||||||
|
|
||||||
std::vector<int> h_map(grid_total_size, 0);
|
std::vector<int> h_map(grid_total_size, 0);
|
||||||
// 有时候会有全空的行,加个很小的偏移
|
// 点云全位于体素边界,有时候会有全空的行,加个很小的偏移
|
||||||
for (size_t i = 0; i < cloud->points.size(); i++) {
|
for (size_t i = 0; i < cloud->points.size(); i++) {
|
||||||
Vector3f point(cloud->points[i].x + 0.001, cloud->points[i].y + 0.001, cloud->points[i].z + 0.001);
|
Vector3f point(cloud->points[i].x + epsilon, cloud->points[i].y + epsilon, cloud->points[i].z + epsilon);
|
||||||
int idx = Vox2Idx(Pos2Vox(point));
|
int idx = Vox2Idx(Pos2Vox(point));
|
||||||
if (idx < grid_total_size) {
|
if (idx < grid_total_size) {
|
||||||
h_map[idx]++;
|
h_map[idx]++;
|
||||||
|
|||||||
@ -1,13 +1,13 @@
|
|||||||
Panels:
|
Panels:
|
||||||
- Class: rviz/Displays
|
- Class: rviz/Displays
|
||||||
Help Height: 138
|
Help Height: 0
|
||||||
Name: Displays
|
Name: Displays
|
||||||
Property Tree Widget:
|
Property Tree Widget:
|
||||||
Expanded:
|
Expanded:
|
||||||
- /Map1/Autocompute Value Bounds1
|
- /Map1/Autocompute Value Bounds1
|
||||||
- /Trajectory1
|
- /Trajectory1
|
||||||
Splitter Ratio: 0.6625221967697144
|
Splitter Ratio: 0.6625221967697144
|
||||||
Tree Height: 476
|
Tree Height: 387
|
||||||
- Class: rviz/Selection
|
- Class: rviz/Selection
|
||||||
Name: Selection
|
Name: Selection
|
||||||
- Class: rviz/Tool Properties
|
- Class: rviz/Tool Properties
|
||||||
@ -25,7 +25,7 @@ Panels:
|
|||||||
- Class: rviz/Time
|
- Class: rviz/Time
|
||||||
Name: Time
|
Name: Time
|
||||||
SyncMode: 0
|
SyncMode: 0
|
||||||
SyncSource: Depth
|
SyncSource: Map
|
||||||
Preferences:
|
Preferences:
|
||||||
PromptSaveOnExit: true
|
PromptSaveOnExit: true
|
||||||
Toolbars:
|
Toolbars:
|
||||||
@ -74,7 +74,7 @@ Visualization Manager:
|
|||||||
Class: rviz/PointCloud2
|
Class: rviz/PointCloud2
|
||||||
Color: 255; 255; 255
|
Color: 255; 255; 255
|
||||||
Color Transformer: AxisColor
|
Color Transformer: AxisColor
|
||||||
Decay Time: 60
|
Decay Time: 10
|
||||||
Enabled: true
|
Enabled: true
|
||||||
Invert Rainbow: false
|
Invert Rainbow: false
|
||||||
Max Color: 255; 255; 255
|
Max Color: 255; 255; 255
|
||||||
@ -240,10 +240,10 @@ Window Geometry:
|
|||||||
collapsed: false
|
collapsed: false
|
||||||
Displays:
|
Displays:
|
||||||
collapsed: false
|
collapsed: false
|
||||||
Height: 1600
|
Height: 1016
|
||||||
Hide Left Dock: false
|
Hide Left Dock: false
|
||||||
Hide Right Dock: true
|
Hide Right Dock: true
|
||||||
QMainWindow State: 000000ff00000000fd0000000400000000000003310000053afc0200000009fb0000001200530065006c0065006300740069006f006e00000001e10000009b000000b000fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000b0fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000006e000002d40000018200fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000a00440065007000740068010000034e0000025a0000002600ffffff00000001000001b90000035afc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073000000003d0000035a0000013200fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e1000001970000000300000b700000005efc0100000002fb0000000800540069006d0065010000000000000b70000006dc00fffffffb0000000800540069006d00650100000000000004500000000000000000000008330000053a00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
|
QMainWindow State: 000000ff00000000fd0000000400000000000002700000033afc0200000009fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000b0fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d000001c0000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000a004400650070007400680100000203000001740000001600ffffff00000001000001b90000035afc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073000000003d0000035a000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000007380000005efc0100000002fb0000000800540069006d0065010000000000000738000003bc00fffffffb0000000800540069006d00650100000000000004500000000000000000000004c20000033a00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
|
||||||
Selection:
|
Selection:
|
||||||
collapsed: false
|
collapsed: false
|
||||||
Time:
|
Time:
|
||||||
@ -252,6 +252,6 @@ Window Geometry:
|
|||||||
collapsed: false
|
collapsed: false
|
||||||
Views:
|
Views:
|
||||||
collapsed: true
|
collapsed: true
|
||||||
Width: 2928
|
Width: 1848
|
||||||
X: 144
|
X: 72
|
||||||
Y: 54
|
Y: 27
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user