feat: chapt6
This commit is contained in:
32
chapt6/chapt6_ws/src/fishbot_description/CMakeLists.txt
Normal file
32
chapt6/chapt6_ws/src/fishbot_description/CMakeLists.txt
Normal file
@@ -0,0 +1,32 @@
|
||||
cmake_minimum_required(VERSION 3.8)
|
||||
project(fishbot_description)
|
||||
|
||||
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
add_compile_options(-Wall -Wextra -Wpedantic)
|
||||
endif()
|
||||
|
||||
# find dependencies
|
||||
find_package(ament_cmake REQUIRED)
|
||||
# uncomment the following section in order to fill in
|
||||
# further dependencies manually.
|
||||
# find_package(<dependency> REQUIRED)
|
||||
|
||||
if(BUILD_TESTING)
|
||||
find_package(ament_lint_auto REQUIRED)
|
||||
# the following line skips the linter which checks for copyrights
|
||||
# comment the line when a copyright and license is added to all source files
|
||||
set(ament_cmake_copyright_FOUND TRUE)
|
||||
# the following line skips cpplint (only works in a git repo)
|
||||
# comment the line when this package is in a git repo and when
|
||||
# a copyright and license is added to all source files
|
||||
set(ament_cmake_cpplint_FOUND TRUE)
|
||||
ament_lint_auto_find_test_dependencies()
|
||||
endif()
|
||||
|
||||
|
||||
install(DIRECTORY launch urdf config world
|
||||
DESTINATION share/${PROJECT_NAME}
|
||||
)
|
||||
|
||||
|
||||
ament_package()
|
||||
202
chapt6/chapt6_ws/src/fishbot_description/LICENSE
Normal file
202
chapt6/chapt6_ws/src/fishbot_description/LICENSE
Normal file
@@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
@@ -0,0 +1,7 @@
|
||||
controller_manager:
|
||||
ros__parameters:
|
||||
update_rate: 100 # Hz
|
||||
use_sim_time: true
|
||||
fishbot_joint_state_broadcaster:
|
||||
type: joint_state_broadcaster/JointStateBroadcaster
|
||||
use_sim_time: true
|
||||
@@ -0,0 +1,170 @@
|
||||
Panels:
|
||||
- Class: rviz_common/Displays
|
||||
Help Height: 78
|
||||
Name: Displays
|
||||
Property Tree Widget:
|
||||
Expanded:
|
||||
- /Global Options1
|
||||
- /Status1
|
||||
- /RobotModel1
|
||||
Splitter Ratio: 0.5
|
||||
Tree Height: 480
|
||||
- Class: rviz_common/Selection
|
||||
Name: Selection
|
||||
- Class: rviz_common/Tool Properties
|
||||
Expanded:
|
||||
- /2D Goal Pose1
|
||||
- /Publish Point1
|
||||
Name: Tool Properties
|
||||
Splitter Ratio: 0.5886790156364441
|
||||
- Class: rviz_common/Views
|
||||
Expanded:
|
||||
- /Current View1
|
||||
Name: Views
|
||||
Splitter Ratio: 0.5
|
||||
- Class: rviz_common/Time
|
||||
Experimental: false
|
||||
Name: Time
|
||||
SyncMode: 0
|
||||
SyncSource: ""
|
||||
Visualization Manager:
|
||||
Class: ""
|
||||
Displays:
|
||||
- Alpha: 0.5
|
||||
Cell Size: 1
|
||||
Class: rviz_default_plugins/Grid
|
||||
Color: 160; 160; 164
|
||||
Enabled: true
|
||||
Line Style:
|
||||
Line Width: 0.029999999329447746
|
||||
Value: Lines
|
||||
Name: Grid
|
||||
Normal Cell Count: 0
|
||||
Offset:
|
||||
X: 0
|
||||
Y: 0
|
||||
Z: 0
|
||||
Plane: XY
|
||||
Plane Cell Count: 10
|
||||
Reference Frame: <Fixed Frame>
|
||||
Value: true
|
||||
- Alpha: 1
|
||||
Class: rviz_default_plugins/RobotModel
|
||||
Collision Enabled: false
|
||||
Description File: ""
|
||||
Description Source: Topic
|
||||
Description Topic:
|
||||
Depth: 5
|
||||
Durability Policy: Volatile
|
||||
History Policy: Keep Last
|
||||
Reliability Policy: Reliable
|
||||
Value: /robot_description
|
||||
Enabled: true
|
||||
Links:
|
||||
All Links Enabled: true
|
||||
Expand Joint Details: false
|
||||
Expand Link Details: false
|
||||
Expand Tree: false
|
||||
Link Tree Style: Links in Alphabetic Order
|
||||
base_link:
|
||||
Alpha: 1
|
||||
Show Axes: false
|
||||
Show Trail: false
|
||||
Value: true
|
||||
imu_link:
|
||||
Alpha: 1
|
||||
Show Axes: false
|
||||
Show Trail: false
|
||||
Value: true
|
||||
Mass Properties:
|
||||
Inertia: false
|
||||
Mass: false
|
||||
Name: RobotModel
|
||||
TF Prefix: ""
|
||||
Update Interval: 0
|
||||
Value: true
|
||||
Visual Enabled: true
|
||||
Enabled: true
|
||||
Global Options:
|
||||
Background Color: 48; 48; 48
|
||||
Fixed Frame: base_link
|
||||
Frame Rate: 30
|
||||
Name: root
|
||||
Tools:
|
||||
- Class: rviz_default_plugins/Interact
|
||||
Hide Inactive Objects: true
|
||||
- Class: rviz_default_plugins/MoveCamera
|
||||
- Class: rviz_default_plugins/Select
|
||||
- Class: rviz_default_plugins/FocusCamera
|
||||
- Class: rviz_default_plugins/Measure
|
||||
Line color: 128; 128; 0
|
||||
- Class: rviz_default_plugins/SetInitialPose
|
||||
Covariance x: 0.25
|
||||
Covariance y: 0.25
|
||||
Covariance yaw: 0.06853891909122467
|
||||
Topic:
|
||||
Depth: 5
|
||||
Durability Policy: Volatile
|
||||
History Policy: Keep Last
|
||||
Reliability Policy: Reliable
|
||||
Value: /initialpose
|
||||
- Class: rviz_default_plugins/SetGoal
|
||||
Topic:
|
||||
Depth: 5
|
||||
Durability Policy: Volatile
|
||||
History Policy: Keep Last
|
||||
Reliability Policy: Reliable
|
||||
Value: /goal_pose
|
||||
- Class: rviz_default_plugins/PublishPoint
|
||||
Single click: true
|
||||
Topic:
|
||||
Depth: 5
|
||||
Durability Policy: Volatile
|
||||
History Policy: Keep Last
|
||||
Reliability Policy: Reliable
|
||||
Value: /clicked_point
|
||||
Transformation:
|
||||
Current:
|
||||
Class: rviz_default_plugins/TF
|
||||
Value: true
|
||||
Views:
|
||||
Current:
|
||||
Class: rviz_default_plugins/Orbit
|
||||
Distance: 0.4101419746875763
|
||||
Enable Stereo Rendering:
|
||||
Stereo Eye Separation: 0.05999999865889549
|
||||
Stereo Focal Distance: 1
|
||||
Swap Stereo Eyes: false
|
||||
Value: false
|
||||
Focal Point:
|
||||
X: 0
|
||||
Y: 0
|
||||
Z: 0
|
||||
Focal Shape Fixed Size: true
|
||||
Focal Shape Size: 0.05000000074505806
|
||||
Invert Z Axis: false
|
||||
Name: Current View
|
||||
Near Clip Distance: 0.009999999776482582
|
||||
Pitch: 0.785398006439209
|
||||
Target Frame: <Fixed Frame>
|
||||
Value: Orbit (rviz)
|
||||
Yaw: 0.785398006439209
|
||||
Saved: ~
|
||||
Window Geometry:
|
||||
Displays:
|
||||
collapsed: false
|
||||
Height: 777
|
||||
Hide Left Dock: false
|
||||
Hide Right Dock: false
|
||||
QMainWindow State: 000000ff00000000fd0000000400000000000001560000026bfc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d0000026b000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f0000026bfc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000003d0000026b000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e100000197000000030000054a0000003efc0100000002fb0000000800540069006d006501000000000000054a000002fb00fffffffb0000000800540069006d00650100000000000004500000000000000000000002d90000026b00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
|
||||
Selection:
|
||||
collapsed: false
|
||||
Time:
|
||||
collapsed: false
|
||||
Tool Properties:
|
||||
collapsed: false
|
||||
Views:
|
||||
collapsed: false
|
||||
Width: 1354
|
||||
X: 70
|
||||
Y: 27
|
||||
@@ -0,0 +1,42 @@
|
||||
import launch
|
||||
import launch_ros
|
||||
from ament_index_python.packages import get_package_share_directory
|
||||
|
||||
|
||||
def generate_launch_description():
|
||||
# 获取默认路径
|
||||
urdf_tutorial_path = get_package_share_directory('fishbot_description')
|
||||
default_model_path = urdf_tutorial_path + '/urdf/first_robot.urdf'
|
||||
default_rviz_config_path = urdf_tutorial_path + '/config/rviz/display_model.rviz'
|
||||
# 为 Launch 声明参数
|
||||
action_declare_arg_mode_path = launch.actions.DeclareLaunchArgument(
|
||||
name='model', default_value=str(default_model_path),
|
||||
description='URDF 的绝对路径')
|
||||
# 获取文件内容生成新的参数
|
||||
robot_description = launch_ros.parameter_descriptions.ParameterValue(
|
||||
launch.substitutions.Command(
|
||||
['xacro ', launch.substitutions.LaunchConfiguration('model')]),
|
||||
value_type=str)
|
||||
# 状态发布节点
|
||||
robot_state_publisher_node = launch_ros.actions.Node(
|
||||
package='robot_state_publisher',
|
||||
executable='robot_state_publisher',
|
||||
parameters=[{'robot_description': robot_description}]
|
||||
)
|
||||
# 关节状态发布节点
|
||||
joint_state_publisher_node = launch_ros.actions.Node(
|
||||
package='joint_state_publisher',
|
||||
executable='joint_state_publisher',
|
||||
)
|
||||
# RViz 节点
|
||||
rviz_node = launch_ros.actions.Node(
|
||||
package='rviz2',
|
||||
executable='rviz2',
|
||||
arguments=['-d', default_rviz_config_path]
|
||||
)
|
||||
return launch.LaunchDescription([
|
||||
action_declare_arg_mode_path,
|
||||
joint_state_publisher_node,
|
||||
robot_state_publisher_node,
|
||||
rviz_node
|
||||
])
|
||||
@@ -0,0 +1,47 @@
|
||||
import launch
|
||||
import launch_ros
|
||||
from ament_index_python.packages import get_package_share_directory
|
||||
from launch.launch_description_sources import PythonLaunchDescriptionSource
|
||||
|
||||
def generate_launch_description():
|
||||
# 获取默认路径
|
||||
robot_name_in_model = "fishbot"
|
||||
urdf_tutorial_path = get_package_share_directory('fishbot_description')
|
||||
default_model_path = urdf_tutorial_path + '/urdf/fishbot/fishbot.urdf.xacro'
|
||||
default_world_path = urdf_tutorial_path + '/world/custom_room.world'
|
||||
# 为 Launch 声明参数
|
||||
action_declare_arg_mode_path = launch.actions.DeclareLaunchArgument(
|
||||
name='model', default_value=str(default_model_path),
|
||||
description='URDF 的绝对路径')
|
||||
# 获取文件内容生成新的参数
|
||||
robot_description = launch_ros.parameter_descriptions.ParameterValue(
|
||||
launch.substitutions.Command(
|
||||
['xacro ', launch.substitutions.LaunchConfiguration('model')]),
|
||||
value_type=str)
|
||||
|
||||
robot_state_publisher_node = launch_ros.actions.Node(
|
||||
package='robot_state_publisher',
|
||||
executable='robot_state_publisher',
|
||||
parameters=[{'robot_description': robot_description}]
|
||||
)
|
||||
|
||||
# 通过 IncludeLaunchDescription 包含另外一个 launch 文件
|
||||
launch_gazebo = launch.actions.IncludeLaunchDescription(
|
||||
PythonLaunchDescriptionSource([get_package_share_directory(
|
||||
'gazebo_ros'), '/launch', '/gazebo.launch.py']),
|
||||
# 传递参数
|
||||
launch_arguments=[('world', default_world_path),('verbose','true')]
|
||||
)
|
||||
# 请求 Gazebo 加载机器人
|
||||
spawn_entity_node = launch_ros.actions.Node(
|
||||
package='gazebo_ros',
|
||||
executable='spawn_entity.py',
|
||||
arguments=['-topic', '/robot_description',
|
||||
'-entity', robot_name_in_model, ])
|
||||
|
||||
return launch.LaunchDescription([
|
||||
action_declare_arg_mode_path,
|
||||
robot_state_publisher_node,
|
||||
launch_gazebo,
|
||||
spawn_entity_node
|
||||
])
|
||||
18
chapt6/chapt6_ws/src/fishbot_description/package.xml
Normal file
18
chapt6/chapt6_ws/src/fishbot_description/package.xml
Normal file
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0"?>
|
||||
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
|
||||
<package format="3">
|
||||
<name>fishbot_description</name>
|
||||
<version>0.0.0</version>
|
||||
<description>TODO: Package description</description>
|
||||
<maintainer email="mzebra@foxmail.com">mzebra</maintainer>
|
||||
<license>Apache-2.0</license>
|
||||
|
||||
<buildtool_depend>ament_cmake</buildtool_depend>
|
||||
|
||||
<test_depend>ament_lint_auto</test_depend>
|
||||
<test_depend>ament_lint_common</test_depend>
|
||||
|
||||
<export>
|
||||
<build_type>ament_cmake</build_type>
|
||||
</export>
|
||||
</package>
|
||||
@@ -0,0 +1,8 @@
|
||||
digraph G {
|
||||
node [shape=box];
|
||||
"base_link" [label="base_link"];
|
||||
"imu_link" [label="imu_link"];
|
||||
node [shape=ellipse, color=blue, fontcolor=blue];
|
||||
"base_link" -> "imu_joint" [label="xyz: 0 0 0.03 \nrpy: 0 -0 0"]
|
||||
"imu_joint" -> "imu_link"
|
||||
}
|
||||
BIN
chapt6/chapt6_ws/src/fishbot_description/urdf/first_robot.pdf
Normal file
BIN
chapt6/chapt6_ws/src/fishbot_description/urdf/first_robot.pdf
Normal file
Binary file not shown.
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0"?>
|
||||
<robot name="first_robot">
|
||||
<!-- 机器人身体部分 -->
|
||||
<link name="base_link">
|
||||
<!-- 部件外观描述 -->
|
||||
<visual>
|
||||
<!-- 沿自己几何中心的偏移与旋转量 -->
|
||||
<origin xyz="0 0 0" rpy="0 0 0" />
|
||||
<!-- 几何形状 -->
|
||||
<geometry>
|
||||
<!-- 圆柱体,半径0.1m,高度 0.12m -->
|
||||
<cylinder length="0.12" radius="0.10" />
|
||||
</geometry>
|
||||
<!-- 材质子标签-蓝色 -->
|
||||
<material name="blue">
|
||||
<color rgba="0.1 0.1 1.0 0.5" />
|
||||
</material>
|
||||
</visual>
|
||||
</link>
|
||||
|
||||
<!-- 机器人IMU部件 -->
|
||||
<link name="imu_link">
|
||||
<visual>
|
||||
<origin xyz="0 0 0" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<box size="0.02 0.02 0.02" />
|
||||
</geometry>
|
||||
</visual>
|
||||
<material name="black">
|
||||
<color rgba="0 0 0 0.5" />
|
||||
</material>
|
||||
</link>
|
||||
|
||||
<!-- 机器人关节 -->
|
||||
<joint name="imu_joint" type="fixed">
|
||||
<!-- 父部件 -->
|
||||
<parent link="base_link" />
|
||||
<!-- 子部件 -->
|
||||
<child link="imu_link" />
|
||||
<!-- 子部件相对父部件的平移和旋转 -->
|
||||
<origin xyz="0 0 0.03" rpy="0 0 0" />
|
||||
</joint>
|
||||
|
||||
</robot>
|
||||
@@ -0,0 +1,42 @@
|
||||
<?xml version="1.0"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="first_robot">
|
||||
<!-- 声明 base 模块 -->
|
||||
<xacro:macro name="base_link" params="length radius">
|
||||
<link name="base_link">
|
||||
<visual>
|
||||
<origin xyz="0 0 0" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<cylinder length="${length}" radius="${length}" />
|
||||
</geometry>
|
||||
<material name="blue">
|
||||
<color rgba="0.1 0.1 1.0 0.5" />
|
||||
</material>
|
||||
</visual>
|
||||
</link>
|
||||
</xacro:macro>
|
||||
<!-- 声明 IMU 模块 -->
|
||||
<xacro:macro name="imu_link" params="imu_name xyz">
|
||||
<link name="${imu_name}_link">
|
||||
<visual>
|
||||
<origin xyz="0 0 0" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<box size="0.02 0.02 0.02" />
|
||||
</geometry>
|
||||
</visual>
|
||||
<material name="black">
|
||||
<color rgba="0 0 0 0.5" />
|
||||
</material>
|
||||
</link>
|
||||
<joint name="${imu_name}_joint" type="fixed">
|
||||
<parent link="base_link" />
|
||||
<child link="${imu_name}_link" />
|
||||
<origin xyz="${xyz}" />
|
||||
</joint>
|
||||
</xacro:macro>
|
||||
<!-- 传递参数调用 base_link 模块 -->
|
||||
<xacro:base_link length="0.12" radius="0.1" />
|
||||
<!-- 传递参数调用 imu 模块 -->
|
||||
<xacro:imu_link imu_name="imu_up" xyz="0 0 0.02" />
|
||||
<xacro:imu_link imu_name="imu_down" xyz="0 0 -0.02" />
|
||||
|
||||
</robot>
|
||||
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
|
||||
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/common_inertia.xacro" />
|
||||
<xacro:macro name="caster_xacro" params="caster_name xyz">
|
||||
<link name="${caster_name}_caster_link">
|
||||
<visual>
|
||||
<origin xyz="0 0 0" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<sphere radius="0.016" />
|
||||
</geometry>
|
||||
<material name="black">
|
||||
<color rgba="0.0 0.0 0.0 0.8"/>
|
||||
</material>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin xyz="0 0 0" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<sphere radius="0.016" />
|
||||
</geometry>
|
||||
<material name="black">
|
||||
<color rgba="0.0 0.0 0.0 0.8"/>
|
||||
</material>
|
||||
</collision>
|
||||
<xacro:sphere_inertia m="0.01" r="0.016" />
|
||||
</link>
|
||||
<gazebo reference="${caster_name}_caster_link">
|
||||
<mu1 value="0.0" />
|
||||
<mu2 value="0.0" />
|
||||
<kp value="1000000000.0" />
|
||||
<kd value="1.0" />
|
||||
</gazebo>
|
||||
|
||||
<joint name="${caster_name}_caster_joint" type="fixed">
|
||||
<parent link="base_link" />
|
||||
<child link="${caster_name}_caster_link" />
|
||||
<origin xyz="${xyz}" />
|
||||
<axis xyz="0 0 0" />
|
||||
</joint>
|
||||
|
||||
</xacro:macro>
|
||||
</robot>
|
||||
@@ -0,0 +1,40 @@
|
||||
<?xml version="1.0"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
|
||||
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/common_inertia.xacro" />
|
||||
<xacro:macro name="wheel_xacro" params="wheel_name xyz">
|
||||
<link name="${wheel_name}_wheel_link">
|
||||
<visual>
|
||||
<origin xyz="0 0 0" rpy="1.57079 0 0" />
|
||||
<geometry>
|
||||
<cylinder length="0.04" radius="0.032" />
|
||||
</geometry>
|
||||
<material name="black">
|
||||
<color rgba="0.0 0.0 0.0 0.8"/>
|
||||
</material>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin xyz="0 0 0" rpy="1.57079 0 0" />
|
||||
<geometry>
|
||||
<cylinder length="0.04" radius="0.032" />
|
||||
</geometry>
|
||||
<material name="black">
|
||||
<color rgba="0.0 0.0 0.0 0.8"/>
|
||||
</material>
|
||||
</collision>
|
||||
<xacro:cylinder_inertia m="0.1" h="0.04" r="0.032"/>
|
||||
</link>
|
||||
<gazebo reference="${wheel_name}_wheel_link">
|
||||
<mu1 value="20.0" />
|
||||
<mu2 value="20.0" />
|
||||
<kp value="1000000000.0" />
|
||||
<kd value="1.0" />
|
||||
</gazebo>
|
||||
|
||||
<joint name="${wheel_name}_wheel_joint" type="continuous">
|
||||
<parent link="base_link" />
|
||||
<child link="${wheel_name}_wheel_link" />
|
||||
<origin xyz="${xyz}" />
|
||||
<axis xyz="0 1 0" />
|
||||
</joint>
|
||||
</xacro:macro>
|
||||
</robot>
|
||||
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
|
||||
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/common_inertia.xacro" />
|
||||
<xacro:macro name="base_xacro" params="length radius">
|
||||
<link name="base_footprint" />
|
||||
|
||||
<joint name="base_joint" type="fixed">
|
||||
<parent link="base_footprint" />
|
||||
<child link="base_link" />
|
||||
<origin xyz="0.0 0.0 ${length/2.0+0.032-0.001}" rpy="0 0 0" />
|
||||
</joint>
|
||||
|
||||
<link name="base_link">
|
||||
<visual>
|
||||
<origin xyz="0 0 0.0" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<cylinder length="${length}" radius="${length}" />
|
||||
</geometry>
|
||||
<material name="blue">
|
||||
<color rgba="0.1 0.1 1.0 0.5"/>
|
||||
</material>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin xyz="0 0 0.0" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<cylinder length="${length}" radius="${length}" />
|
||||
</geometry>
|
||||
<material name="blue">
|
||||
<color rgba="0.1 0.1 1.0 0.5"/>
|
||||
</material>
|
||||
</collision>
|
||||
<xacro:cylinder_inertia m="1.0" r="${radius}" h="${length}"/>
|
||||
</link>
|
||||
|
||||
</xacro:macro>
|
||||
|
||||
</robot>
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0"?>
|
||||
<robot xmlns:xacro="http://ros.org/wiki/xacro">
|
||||
<xacro:macro name="box_inertia" params="m w h d">
|
||||
<inertial>
|
||||
<mass value="${m}" />
|
||||
<inertia ixx="${(m/12) * (h*h + d*d)}" ixy="0.0" ixz="0.0" iyy="${(m/12) * (w*w + d*d)}" iyz="0.0" izz="${(m/12) * (w*w + h*h)}" />
|
||||
</inertial>
|
||||
</xacro:macro>
|
||||
|
||||
<xacro:macro name="cylinder_inertia" params="m r h">
|
||||
<inertial>
|
||||
<mass value="${m}" />
|
||||
<inertia ixx="${(m/12) * (3*r*r + h*h)}" ixy="0" ixz="0" iyy="${(m/12) * (3*r*r + h*h)}" iyz="0" izz="${(m/2) * (r*r)}" />
|
||||
</inertial>
|
||||
</xacro:macro>
|
||||
|
||||
<xacro:macro name="sphere_inertia" params="m r">
|
||||
<inertial>
|
||||
<mass value="${m}" />
|
||||
<inertia ixx="${(2/5) * m * (r*r)}" ixy="0.0" ixz="0.0" iyy="${(2/5) * m * (r*r)}" iyz="0.0" izz="${(2/5) * m * (r*r)}" />
|
||||
</inertial>
|
||||
</xacro:macro>
|
||||
|
||||
</robot>
|
||||
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
|
||||
<xacro:macro name="fishbot_ros2_control">
|
||||
<ros2_control name="FishBotGazeboSystem" type="system">
|
||||
<hardware>
|
||||
<plugin>gazebo_ros2_control/GazeboSystem</plugin>
|
||||
</hardware>
|
||||
<joint name="left_wheel_joint">
|
||||
<command_interface name="velocity">
|
||||
<param name="min">-1</param>
|
||||
<param name="max">1</param>
|
||||
</command_interface>
|
||||
<command_interface name="effort">
|
||||
<param name="min">-0.1</param>
|
||||
<param name="max">0.1</param>
|
||||
</command_interface>
|
||||
<state_interface name="position" />
|
||||
<state_interface name="velocity" />
|
||||
<state_interface name="effort" />
|
||||
</joint>
|
||||
<joint name="right_wheel_joint">
|
||||
<command_interface name="velocity">
|
||||
<param name="min">-1</param>
|
||||
<param name="max">1</param>
|
||||
</command_interface>
|
||||
<command_interface name="effort">
|
||||
<param name="min">-0.1</param>
|
||||
<param name="max">0.1</param>
|
||||
</command_interface>
|
||||
<state_interface name="position" />
|
||||
<state_interface name="velocity" />
|
||||
<state_interface name="effort" />
|
||||
</joint>
|
||||
</ros2_control>
|
||||
<gazebo>
|
||||
<plugin filename="libgazebo_ros2_control.so" name="gazebo_ros2_control">
|
||||
<parameters>$(find fishbot_description)/config/fishbot_ros2_controller.yaml</parameters>
|
||||
</plugin>
|
||||
</gazebo>
|
||||
</xacro:macro>
|
||||
</robot>
|
||||
@@ -0,0 +1,29 @@
|
||||
<?xml version="1.0"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="fishbot">
|
||||
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/base.urdf.xacro" />
|
||||
<!-- 传感器组件 -->
|
||||
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/sensor/imu.urdf.xacro" />
|
||||
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/sensor/laser.urdf.xacro" />
|
||||
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/sensor/camera.urdf.xacro" />
|
||||
<!-- 执行器组件 -->
|
||||
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/actuator/wheel.urdf.xacro" />
|
||||
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/actuator/caster.urdf.xacro" />
|
||||
|
||||
<xacro:base_xacro length="0.12" radius="0.1" />
|
||||
<!-- 传感器 -->
|
||||
<xacro:imu_xacro xyz="0 0 0.02" />
|
||||
<xacro:laser_xacro xyz="0 0 0.10" />
|
||||
<xacro:camera_xacro xyz="0.10 0 0.075" />
|
||||
<!-- 执行器主动轮+从动轮 -->
|
||||
<xacro:wheel_xacro wheel_name="left" xyz="0 0.10 -0.06" />
|
||||
<xacro:wheel_xacro wheel_name="right" xyz="0 -0.10 -0.06" />
|
||||
<xacro:caster_xacro caster_name="front" xyz="0.08 0.0 -0.076" />
|
||||
<xacro:caster_xacro caster_name="back" xyz="-0.08 0.0 -0.076" />
|
||||
<!-- Gazebo 插件 -->
|
||||
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/plugins/gazebo_control_plugin.xacro" />
|
||||
<!-- <xacro:gazebo_control_plugin /> -->
|
||||
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/fishbot.ros2_control.xacro" />
|
||||
<xacro:fishbot_ros2_control />
|
||||
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/plugins/gazebo_sensor_plugin.xacro" />
|
||||
<xacro:gazebo_sensor_plugin />
|
||||
</robot>
|
||||
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
|
||||
<xacro:macro name="gazebo_control_plugin">
|
||||
<gazebo>
|
||||
<plugin name='diff_drive' filename='libgazebo_ros_diff_drive.so'>
|
||||
<ros>
|
||||
<namespace>/</namespace>
|
||||
<remapping>cmd_vel:=cmd_vel</remapping>
|
||||
<remapping>odom:=odom</remapping>
|
||||
</ros>
|
||||
<update_rate>30</update_rate>
|
||||
<!-- wheels -->
|
||||
<left_joint>left_wheel_joint</left_joint>
|
||||
<right_joint>right_wheel_joint</right_joint>
|
||||
<!-- kinematics -->
|
||||
<wheel_separation>0.2</wheel_separation>
|
||||
<wheel_diameter>0.064</wheel_diameter>
|
||||
<!-- limits -->
|
||||
<max_wheel_torque>20</max_wheel_torque>
|
||||
<max_wheel_acceleration>1.0</max_wheel_acceleration>
|
||||
<!-- output -->
|
||||
<publish_odom>true</publish_odom>
|
||||
<publish_odom_tf>true</publish_odom_tf>
|
||||
<publish_wheel_tf>true</publish_wheel_tf>
|
||||
|
||||
<odometry_frame>odom</odometry_frame>
|
||||
<robot_base_frame>base_footprint</robot_base_frame>
|
||||
</plugin>
|
||||
</gazebo>
|
||||
</xacro:macro>
|
||||
</robot>
|
||||
@@ -0,0 +1,146 @@
|
||||
<?xml version="1.0"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
|
||||
<xacro:macro name="gazebo_sensor_plugin">
|
||||
<gazebo reference="laser_link">
|
||||
<sensor name="laserscan" type="ray">
|
||||
<plugin name="laserscan" filename="libgazebo_ros_ray_sensor.so">
|
||||
<ros>
|
||||
<namespace>/</namespace>
|
||||
<remapping>~/out:=scan</remapping>
|
||||
</ros>
|
||||
<output_type>sensor_msgs/LaserScan</output_type>
|
||||
<frame_name>laser_link</frame_name>
|
||||
</plugin>
|
||||
<always_on>true</always_on>
|
||||
<visualize>true</visualize>
|
||||
<update_rate>5</update_rate>
|
||||
<pose>0 0 0 0 0 0</pose>
|
||||
<!-- 激光传感器配置 -->
|
||||
<ray>
|
||||
<!-- 设置扫描范围 -->
|
||||
<scan>
|
||||
<horizontal>
|
||||
<samples>360</samples>
|
||||
<resolution>1.000000</resolution>
|
||||
<min_angle>0.000000</min_angle>
|
||||
<max_angle>6.280000</max_angle>
|
||||
</horizontal>
|
||||
</scan>
|
||||
<!-- 设置扫描距离 -->
|
||||
<range>
|
||||
<min>0.120000</min>
|
||||
<max>8.0</max>
|
||||
<resolution>0.015000</resolution>
|
||||
</range>
|
||||
<!-- 设置噪声 -->
|
||||
<noise>
|
||||
<type>gaussian</type>
|
||||
<mean>0.0</mean>
|
||||
<stddev>0.01</stddev>
|
||||
</noise>
|
||||
</ray>
|
||||
</sensor>
|
||||
</gazebo>
|
||||
|
||||
|
||||
|
||||
<gazebo reference="imu_link">
|
||||
<sensor name="imu_sensor" type="imu">
|
||||
<plugin name="imu_plugin" filename="libgazebo_ros_imu_sensor.so">
|
||||
<ros>
|
||||
<namespace>/</namespace>
|
||||
<remapping>~/out:=imu</remapping>
|
||||
</ros>
|
||||
<initial_orientation_as_reference>false</initial_orientation_as_reference>
|
||||
</plugin>
|
||||
<update_rate>100</update_rate>
|
||||
<always_on>true</always_on>
|
||||
<!-- 六轴噪声设置 -->
|
||||
<imu>
|
||||
<angular_velocity>
|
||||
<x>
|
||||
<noise type="gaussian">
|
||||
<mean>0.0</mean>
|
||||
<stddev>2e-4</stddev>
|
||||
<bias_mean>0.0000075</bias_mean>
|
||||
<bias_stddev>0.0000008</bias_stddev>
|
||||
</noise>
|
||||
</x>
|
||||
<y>
|
||||
<noise type="gaussian">
|
||||
<mean>0.0</mean>
|
||||
<stddev>2e-4</stddev>
|
||||
<bias_mean>0.0000075</bias_mean>
|
||||
<bias_stddev>0.0000008</bias_stddev>
|
||||
</noise>
|
||||
</y>
|
||||
<z>
|
||||
<noise type="gaussian">
|
||||
<mean>0.0</mean>
|
||||
<stddev>2e-4</stddev>
|
||||
<bias_mean>0.0000075</bias_mean>
|
||||
<bias_stddev>0.0000008</bias_stddev>
|
||||
</noise>
|
||||
</z>
|
||||
</angular_velocity>
|
||||
<linear_acceleration>
|
||||
<x>
|
||||
<noise type="gaussian">
|
||||
<mean>0.0</mean>
|
||||
<stddev>1.7e-2</stddev>
|
||||
<bias_mean>0.1</bias_mean>
|
||||
<bias_stddev>0.001</bias_stddev>
|
||||
</noise>
|
||||
</x>
|
||||
<y>
|
||||
<noise type="gaussian">
|
||||
<mean>0.0</mean>
|
||||
<stddev>1.7e-2</stddev>
|
||||
<bias_mean>0.1</bias_mean>
|
||||
<bias_stddev>0.001</bias_stddev>
|
||||
</noise>
|
||||
</y>
|
||||
<z>
|
||||
<noise type="gaussian">
|
||||
<mean>0.0</mean>
|
||||
<stddev>1.7e-2</stddev>
|
||||
<bias_mean>0.1</bias_mean>
|
||||
<bias_stddev>0.001</bias_stddev>
|
||||
</noise>
|
||||
</z>
|
||||
</linear_acceleration>
|
||||
</imu>
|
||||
</sensor>
|
||||
</gazebo>
|
||||
|
||||
</xacro:macro>
|
||||
|
||||
|
||||
<gazebo reference="camera_link">
|
||||
<sensor type="depth" name="camera_sensor">
|
||||
<plugin name="depth_camera" filename="libgazebo_ros_camera.so">
|
||||
<frame_name>camera_optical_link</frame_name>
|
||||
</plugin>
|
||||
<always_on>true</always_on>
|
||||
<update_rate>10</update_rate>
|
||||
<camera name="camera">
|
||||
<horizontal_fov>1.5009831567</horizontal_fov>
|
||||
<image>
|
||||
<width>800</width>
|
||||
<height>600</height>
|
||||
<format>R8G8B8</format>
|
||||
</image>
|
||||
<distortion>
|
||||
<k1>0.0</k1>
|
||||
<k2>0.0</k2>
|
||||
<k3>0.0</k3>
|
||||
<p1>0.0</p1>
|
||||
<p2>0.0</p2>
|
||||
<center>0.5 0.5</center>
|
||||
</distortion>
|
||||
</camera>
|
||||
</sensor>
|
||||
</gazebo>
|
||||
|
||||
|
||||
</robot>
|
||||
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
|
||||
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/common_inertia.xacro" />
|
||||
<xacro:macro name="camera_xacro" params="xyz">
|
||||
<!-- ============相机模块================ -->
|
||||
<link name="camera_link">
|
||||
<visual>
|
||||
<origin xyz="0 0 0.0" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<box size="0.02 0.10 0.02" />
|
||||
</geometry>
|
||||
<material name="black">
|
||||
<color rgba="0.0 0.0 0.0 0.8"/>
|
||||
</material>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin xyz="0 0 0.0" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<box size="0.02 0.10 0.02" />
|
||||
</geometry>
|
||||
<material name="black">
|
||||
<color rgba="0.0 0.0 0.0 0.8"/>
|
||||
</material>
|
||||
</collision>
|
||||
<xacro:box_inertia m="0.01" w="0.02" h="0.10" d="0.02" />
|
||||
</link>
|
||||
<link name="camera_optical_link"></link>
|
||||
<joint name="camera_optical_joint" type="fixed">
|
||||
<parent link="camera_link" />
|
||||
<child link="camera_optical_link" />
|
||||
<origin xyz="0 0 0" rpy="${-pi/2} 0 ${-pi/2}" />
|
||||
</joint>
|
||||
|
||||
<joint name="camera_joint" type="fixed">
|
||||
<parent link="base_link" />
|
||||
<child link="camera_link" />
|
||||
<origin xyz="${xyz}" />
|
||||
</joint>
|
||||
</xacro:macro>
|
||||
|
||||
</robot>
|
||||
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
|
||||
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/common_inertia.xacro" />
|
||||
<xacro:macro name="imu_xacro" params="xyz">
|
||||
<link name="imu_link">
|
||||
<visual>
|
||||
<origin xyz="0 0 00" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<box size="0.02 0.02 0.02" />
|
||||
</geometry>
|
||||
<material name="black">
|
||||
<color rgba="0 0 0 0.8" />
|
||||
</material>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin xyz="0 0 00" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<box size="0.02 0.02 0.02" />
|
||||
</geometry>
|
||||
<material name="black">
|
||||
<color rgba="0 0 0 0.8" />
|
||||
</material>
|
||||
</collision>
|
||||
<xacro:box_inertia m="0.01" w="0.02" d="0.02" h="0.02"/>
|
||||
</link>
|
||||
|
||||
<joint name="imu_joint" type="fixed">
|
||||
<parent link="base_link" />
|
||||
<child link="imu_link" />
|
||||
<origin xyz="${xyz}" />
|
||||
</joint>
|
||||
</xacro:macro>
|
||||
</robot>
|
||||
@@ -0,0 +1,73 @@
|
||||
<?xml version="1.0"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
|
||||
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/common_inertia.xacro" />
|
||||
<xacro:macro name="laser_xacro" params="xyz">
|
||||
<gazebo reference="laser_cylinder_link">
|
||||
<material>Gazebo/Black</material>
|
||||
</gazebo>
|
||||
<gazebo reference="laser_link">
|
||||
<material>Gazebo/Black</material>
|
||||
</gazebo>
|
||||
|
||||
<!-- ============雷达支撑杆================ -->
|
||||
<link name="laser_cylinder_link">
|
||||
<visual>
|
||||
<origin xyz="0 0 0" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<cylinder length="0.10" radius="0.01" />
|
||||
</geometry>
|
||||
<material name="black">
|
||||
<color rgba="0.0 0.0 0.0 0.8" />
|
||||
</material>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin xyz="0 0 0" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<cylinder length="0.10" radius="0.01" />
|
||||
</geometry>
|
||||
<material name="black">
|
||||
<color rgba="0.0 0.0 0.0 0.8" />
|
||||
</material>
|
||||
</collision>
|
||||
<xacro:cylinder_inertia m="0.01" r="0.01" h="0.10" />
|
||||
</link>
|
||||
|
||||
|
||||
|
||||
<joint name="laser_cylinder_joint" type="fixed">
|
||||
<parent link="base_link" />
|
||||
<child link="laser_cylinder_link" />
|
||||
<origin xyz="${xyz}" />
|
||||
</joint>
|
||||
<!-- ============雷达================ -->
|
||||
<link name="laser_link">
|
||||
<visual>
|
||||
<origin xyz="0 0 0" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<cylinder length="0.02" radius="0.02" />
|
||||
</geometry>
|
||||
<material name="black">
|
||||
<color rgba="0.0 0.0 0.0 0.8" />
|
||||
</material>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin xyz="0 0 0" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<cylinder length="0.02" radius="0.02" />
|
||||
</geometry>
|
||||
<material name="black">
|
||||
<color rgba="0.0 0.0 0.0 0.8" />
|
||||
</material>
|
||||
</collision>
|
||||
<xacro:cylinder_inertia m="0.03" r="0.02" h="0.02" />
|
||||
</link>
|
||||
|
||||
<joint name="laser_joint" type="fixed">
|
||||
<parent link="laser_cylinder_link" />
|
||||
<child link="laser_link" />
|
||||
<origin xyz="0 0 0.05" />
|
||||
</joint>
|
||||
|
||||
</xacro:macro>
|
||||
|
||||
</robot>
|
||||
2745
chapt6/chapt6_ws/src/fishbot_description/world/custom_room.world
Normal file
2745
chapt6/chapt6_ws/src/fishbot_description/world/custom_room.world
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" ?>
|
||||
<model>
|
||||
<name>room</name>
|
||||
<version>1.0</version>
|
||||
<sdf version="1.7">model.sdf</sdf>
|
||||
<author>
|
||||
<name></name>
|
||||
<email></email>
|
||||
</author>
|
||||
<description></description>
|
||||
</model>
|
||||
297
chapt6/chapt6_ws/src/fishbot_description/world/room/model.sdf
Normal file
297
chapt6/chapt6_ws/src/fishbot_description/world/room/model.sdf
Normal file
@@ -0,0 +1,297 @@
|
||||
<?xml version='1.0'?>
|
||||
<sdf version='1.7'>
|
||||
<model name='room'>
|
||||
<pose>-0.972666 -0.903877 0 0 -0 0</pose>
|
||||
<link name='Wall_66'>
|
||||
<collision name='Wall_66_Collision'>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>19 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
</collision>
|
||||
<visual name='Wall_66_Visual'>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>19 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<material>
|
||||
<script>
|
||||
<uri>file://media/materials/scripts/gazebo.material</uri>
|
||||
<name>Gazebo/Grey</name>
|
||||
</script>
|
||||
<ambient>1 1 1 1</ambient>
|
||||
</material>
|
||||
<meta>
|
||||
<layer>0</layer>
|
||||
</meta>
|
||||
</visual>
|
||||
<pose>0.013921 5.50955 0 0 -0 0</pose>
|
||||
</link>
|
||||
<link name='Wall_67'>
|
||||
<collision name='Wall_67_Collision'>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>11.25 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
</collision>
|
||||
<visual name='Wall_67_Visual'>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>11.25 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<material>
|
||||
<script>
|
||||
<uri>file://media/materials/scripts/gazebo.material</uri>
|
||||
<name>Gazebo/Grey</name>
|
||||
</script>
|
||||
<ambient>1 1 1 1</ambient>
|
||||
</material>
|
||||
<meta>
|
||||
<layer>0</layer>
|
||||
</meta>
|
||||
</visual>
|
||||
<pose>9.43892 -0.040455 0 0 -0 -1.5708</pose>
|
||||
</link>
|
||||
<link name='Wall_68'>
|
||||
<collision name='Wall_68_Collision'>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>19 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
</collision>
|
||||
<visual name='Wall_68_Visual'>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>19 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<material>
|
||||
<script>
|
||||
<uri>file://media/materials/scripts/gazebo.material</uri>
|
||||
<name>Gazebo/Grey</name>
|
||||
</script>
|
||||
<ambient>1 1 1 1</ambient>
|
||||
</material>
|
||||
<meta>
|
||||
<layer>0</layer>
|
||||
</meta>
|
||||
</visual>
|
||||
<pose>0.013921 -5.59046 0 0 -0 3.14159</pose>
|
||||
</link>
|
||||
<link name='Wall_69'>
|
||||
<collision name='Wall_69_Collision'>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>11.25 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
</collision>
|
||||
<visual name='Wall_69_Visual'>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>11.25 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<material>
|
||||
<script>
|
||||
<uri>file://media/materials/scripts/gazebo.material</uri>
|
||||
<name>Gazebo/Grey</name>
|
||||
</script>
|
||||
<ambient>1 1 1 1</ambient>
|
||||
</material>
|
||||
<meta>
|
||||
<layer>0</layer>
|
||||
</meta>
|
||||
</visual>
|
||||
<pose>-9.41108 -0.040455 0 0 -0 1.5708</pose>
|
||||
</link>
|
||||
<link name='Wall_71'>
|
||||
<collision name='Wall_71_Collision'>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>4.75 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
</collision>
|
||||
<visual name='Wall_71_Visual'>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>4.75 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<material>
|
||||
<script>
|
||||
<uri>file://media/materials/scripts/gazebo.material</uri>
|
||||
<name>Gazebo/Grey</name>
|
||||
</script>
|
||||
<ambient>1 1 1 1</ambient>
|
||||
</material>
|
||||
<meta>
|
||||
<layer>0</layer>
|
||||
</meta>
|
||||
</visual>
|
||||
<pose>-1.11769 3.29046 0 0 -0 -1.5708</pose>
|
||||
</link>
|
||||
<link name='Wall_72'>
|
||||
<collision name='Wall_72_Collision'>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>6.75 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
</collision>
|
||||
<visual name='Wall_72_Visual'>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>6.75 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<material>
|
||||
<script>
|
||||
<uri>file://media/materials/scripts/gazebo.material</uri>
|
||||
<name>Gazebo/Grey</name>
|
||||
</script>
|
||||
<ambient>1 1 1 1</ambient>
|
||||
</material>
|
||||
<meta>
|
||||
<layer>0</layer>
|
||||
</meta>
|
||||
</visual>
|
||||
<pose>-4.41769 0.990456 0 0 -0 3.14159</pose>
|
||||
</link>
|
||||
<link name='Wall_79'>
|
||||
<collision name='Wall_79_Collision'>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>3.47722 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
</collision>
|
||||
<visual name='Wall_79_Visual'>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>3.47722 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<material>
|
||||
<script>
|
||||
<uri>file://media/materials/scripts/gazebo.material</uri>
|
||||
<name>Gazebo/Grey</name>
|
||||
</script>
|
||||
<ambient>1 1 1 1</ambient>
|
||||
</material>
|
||||
<meta>
|
||||
<layer>0</layer>
|
||||
</meta>
|
||||
</visual>
|
||||
<pose>0.391784 -3.86799 0 0 -0 1.5708</pose>
|
||||
</link>
|
||||
<link name='Wall_80'>
|
||||
<collision name='Wall_80_Collision'>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>7.5 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
</collision>
|
||||
<visual name='Wall_80_Visual'>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>7.5 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<material>
|
||||
<script>
|
||||
<uri>file://media/materials/scripts/gazebo.material</uri>
|
||||
<name>Gazebo/Grey</name>
|
||||
</script>
|
||||
<ambient>1 1 1 1</ambient>
|
||||
</material>
|
||||
<meta>
|
||||
<layer>0</layer>
|
||||
</meta>
|
||||
</visual>
|
||||
<pose>4.06678 -2.24484 0 0 -0 0</pose>
|
||||
</link>
|
||||
<link name='Wall_85'>
|
||||
<collision name='Wall_85_Collision'>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>6.25 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
</collision>
|
||||
<visual name='Wall_85_Visual'>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>6.25 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<material>
|
||||
<script>
|
||||
<uri>file://media/materials/scripts/gazebo.material</uri>
|
||||
<name>Gazebo/Grey</name>
|
||||
</script>
|
||||
<ambient>1 1 1 1</ambient>
|
||||
</material>
|
||||
<meta>
|
||||
<layer>0</layer>
|
||||
</meta>
|
||||
</visual>
|
||||
<pose>-6.38892 -1.80969 0 0 -0 0</pose>
|
||||
</link>
|
||||
<link name='Wall_86'>
|
||||
<collision name='Wall_86_Collision'>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>2.75 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
</collision>
|
||||
<visual name='Wall_86_Visual'>
|
||||
<pose>0 0 1.25 0 -0 0</pose>
|
||||
<geometry>
|
||||
<box>
|
||||
<size>2.75 0.15 2.5</size>
|
||||
</box>
|
||||
</geometry>
|
||||
<material>
|
||||
<script>
|
||||
<uri>file://media/materials/scripts/gazebo.material</uri>
|
||||
<name>Gazebo/Grey</name>
|
||||
</script>
|
||||
<ambient>1 1 1 1</ambient>
|
||||
</material>
|
||||
<meta>
|
||||
<layer>0</layer>
|
||||
</meta>
|
||||
</visual>
|
||||
<pose>-3.33892 -3.10969 0 0 -0 -1.5708</pose>
|
||||
</link>
|
||||
<static>1</static>
|
||||
</model>
|
||||
</sdf>
|
||||
Reference in New Issue
Block a user