重点注意事项
1 每次修改urdf文件之后,必须重新编译
2 killall gzserver
安装条件
这篇文章主要是参考 鱼香ROS2里面的教程,不过小鱼的操作环境应该是 ubuntu20.0+foxy
我的操作环境是 ubuntu18 + dashing
所以在一些函数名之类的操作上会有一些变化
如果是虚拟机 记得关闭3D图形加速
git rest --hard // 撤销掉你本地的修改 有重要的文件记得备份
git pull origin master // 拉取代码
catkin_make --pkg ** // 单独编译指定功能包
sudo apt-get install ros-dashing-gazebo-ros ros-dashing-gazebo-plugins ros-dashing-joint-state-publisher ros-dashing-joint-state-publisher-gui ros-dashing-robot-state-publisher
通过上面的链接,下载模型之后,把模型放到 ~/.gazebo/Models 下。然后在界面选择 insert -> Add Path 按钮,将这个目录添加进来。
但是模型放置的位置,不一定非要在 ~/.gazebo/Models 这个路径下。你只要能够正确的打开模型在的路径下就行。
基本使用
鼠标左键,视角移动;中键滚轮和右键,缩放;点击中键 旋转视角
通过file->building Editor 可以新建自己的室内的环境,绘制墙体,添加贴图。也可以添加自己的模型。
但是我用的gazebo9的版本,在添加门的时候,会出现bug,然后闪退。但是这个bug不是百分百出现的。
ros2 示例
// 运行两轮差速小车
gazebo /opt/ros/foxy/share/gazebo_plugins/worlds/gazebo_ros_diff_drive_demo.world
// 让小车动起来
ros2 topic pub /demo/cmd_demo geometry_msgs/msg/Twist "{linear: {x: 0.2,y: 0,z: 0},angular: {x: 0,y: 0,z: 0}}"
// 出现报错
[INFO] [launch]: All log files can be found below /home/xs-csy/.ros/log/2022-03-24-09-51-36-965705-dellg3-G3-2023
[INFO] [launch]: Default logging verbosity is set to INFO
[ERROR] [launch]: Caught exception in launch (see debug for traceback): cannot import name 'FindPackageShare'
urdf
我们把左轮,右轮、支撑轮子,IMU和雷达部件称为机器人的Link
而Link和Link之间的连接部分称之为Joint关节
urdf简单模型
// 建立工作空间和功能包
mkdir -p ~/test-ros2-launch/src
cd ~/test-ros2-launch/src
ros2 pkg create fishbot_description --build-type ament_python
// 建立URDF文件
cd fishbot_description && mkdir urdf
cd urdf
touch fishbot_base.urdf
编辑fishbot_base.urdf
<?xml version="1.0"?>
<robot name="fishbot">
<!-- base link -->
<link name="base_link">
<visual> <!-- 显示形状 -->
<origin xyz="0 0 0.0" rpy="0 0 0"/> <!-- origin (可选:默认在物体几何中心)属性 xyz默认为零矢量 rpy弧度表示的翻滚、俯仰、偏航 -->
<geometry> <!-- <geometry> (几何形状) -->
<cylinder length="0.12" radius="0.10"/> < !-- <cylinder> 圆柱体 标签属性:radius -半径 length-高度 -->
</geometry>
</visual>
</link>
<!-- laser link -->
<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"> <!--material 材质;属性 name名字;color 属性rgba a代表透明度 -->
<color rgba="0.0 0.0 0.0 0.8" />
</material>
</visual>
</link>
<!-- laser joint -->
<joint name="laser_joint" type="fixed"> <!-- name 关节的名称;type 关节的类型 -->
<parent link="base_link" /> <!-- parent 父link名称 -->
<child link="laser_link" /> <!-- child子link名称 -->
<origin xyz="0 0 0.075" /> <!-- origin 父子之间的关系xyz rpy -->
<axis xyz="0 0 1" /> <!-- axis 围绕旋转的关节轴 -->
</joint>
</robot>
tyep关节名称 | 类型 |
---|---|
revolute: | 旋转关节 绕单轴旋转,角度有上下限,比如舵机0-180 |
continuous | 旋转关节 可以绕单轴无限旋转,比如自行车的前后轮 |
fixed: | 固定关节 不允许运动的特殊关节 |
prismatic: | 滑动关节 沿某一轴线移动的关节,有位置极限 |
planer: | 平面关节 允许在xyz,rxryrz六个方向运动 |
floating: | 浮动关节 允许进行平移、旋转运动 |
cd ../
mkdir launch
cd launch
touch display_rviz2.launch.py
注意一下 这里面的部分函数 在dashing和foxy之间不是通用的,所以如果是foxy的环境,应该参考小鱼哥原版的教程
import os
from launch import LaunchDescription
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node
#from launch_ros.substitutions import FindPackageShare
from ament_index_python.packages import get_package_share_directory
def generate_launch_description():
package_name = 'fishbot_description'
urdf_name = "fishbot_base.urdf"
ld = LaunchDescription()
package=package_name
pkg_share = get_package_share_directory(package_name)
urdf_model_path = os.path.join(pkg_share, f'urdf/{urdf_name}')
robot_state_publisher_node = Node(
package='robot_state_publisher',
# executable='robot_state_publisher',
node_executable='robot_state_publisher',
arguments=[urdf_model_path]
)
joint_state_publisher_node = Node(
package='joint_state_publisher_gui',
# executable='joint_state_publisher_gui',
node_executable='joint_state_publisher_gui',
name='joint_state_publisher_gui',
arguments=[urdf_model_path]
)
rviz2_node = Node(
package='rviz2',
# executable='rviz2',
node_executable='rviz2',
name='rviz2',
output='screen',
)
ld.add_action(robot_state_publisher_node)
ld.add_action(joint_state_publisher_node)
ld.add_action(rviz2_node)
return ld
colcon build
source install/setup.bash
ros2 launch fishbot_description display_rviz2.launch.py
不过我的Rqt的节点关系图,和小鱼哥的不一样,现在还没有找到原因
urdf 小车
<?xml version="1.0"?>
<robot name="fishbot">
<!-- base link -->
<link name="base_link">
<visual>
<origin xyz="0 0 0.0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.12" radius="0.10"/>
</geometry>
<material name="blue ">
<color rgba="0.1 0.1 1.0 0.5" />
</material>
</visual>
</link>
<!-- laser link -->
<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>
</link>
<!-- laser joint -->
<joint name="laser_joint" type="fixed">
<parent link="base_link" />
<child link="laser_link" />
<origin xyz="0 0 0.075" />
</joint>
<!-- imu link -->
<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>
</link>
<!-- imu joint -->
<joint name="imu_joint" type="fixed">
<parent link="base_link" />
<child link="imu_link" />
<origin xyz="0 0 0.02" />
</joint>
<link name="right_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.5" />
</material>
</visual>
</link>
<joint name="right_wheel_joint" type="continuous">
<parent link="base_link" />
<child link="right_wheel_link" />
<origin xyz="-0.02 -0.10 -0.06" />
<axis xyz="0 1 0" />
</joint>
<link name="left_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.5" />
</material>
</visual>
</link>
<joint name="left_wheel_joint" type="continuous">
<parent link="base_link" />
<child link="left_wheel_link" />
<origin xyz="-0.02 0.10 -0.06" />
<axis xyz="0 1 0" />
</joint>
<link 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.5" />
</material>
</visual>
</link>
<joint name="caster_joint" type="fixed">
<parent link="base_link" />
<child link="caster_link" />
<origin xyz="0.06 0.0 -0.076" />
</joint>
<!-- Robot Footprint 避免车轮向下 -->
<link name="base_footprint"/>
<joint name="base_joint" type="fixed">
<parent link="base_footprint"/>
<child link="base_link"/>
<origin xyz="0.0 0.0 0.076" rpy="0 0 0"/>
</joint>
</robot>