仿真主要步骤

0、学习urdf知识

https://www.bilibili.com/video/BV1fQg8zxEL1

1、用solidworks导出模型urdf

参考视频:https://www.bilibili.com/video/BV1dBsgzeEHD
假如你导出的文件目录是:
在这里插入图片描述
需要修改一下小bug,将以上package.xml的邮箱改正常:

<maintainer email="me2email.com"/>

改为:

<maintainer email="me@email.com"/>

2、改写urdf

将全局坐标global_link改建到世界坐标系world的子坐标下:

<robot name="robotic_reline2">

  <link name="world"/>
  <joint name="world_to_global" type="fixed">
    <parent link="world"/>
    <child link="global_link"/>
    <origin xyz="0 0 0" rpy="0 0 0"/>
  </joint>

  <link name="global_link">
    <inertial>
      <origin xyz="-2.60208521396521E-18 4.33680868994202E-19 0.05" rpy="0 0 0" />
      <mass value="3.14159265358979" />
      <inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0" />
    </inertial>
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <mesh filename="package://robotic_reline2/meshes/global_link.STL" />
      </geometry>
      <material name="">
        <color rgba="1 1 1 1" />
      </material>
    </visual>
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <mesh filename="package://robotic_reline2/meshes/global_link.STL" />
      </geometry>
    </collision>
  </link>
  
  ,
  ,
  ,
  </robot>

因为moveit和gazebo都不支持最开始的坐标系有惯性参数和质量,而global_link(在solidworks中必须有实体对应该坐标系)有惯性参数和质量,所以不能作为最开始的坐标,要增加一个world坐标作为初始坐标系,很多地方是写成dummy_link,其实就是我这里写的world坐标。

3、修改launch目录下的display.launch

<launch>
  <arg
    name="model" />
  <arg
    name="gui"
    default="False" />
  <param
    name="robot_description"
    textfile="$(find robotic_reline2)/urdf/robotic_reline2.urdf" />
  <param
    name="use_gui"
    value="$(arg gui)" />
  <node
    name="joint_state_publisher"
    pkg="joint_state_publisher_gui"
    type="joint_state_publisher_gui" />
  <node
    name="robot_state_publisher"
    pkg="robot_state_publisher"
    type="robot_state_publisher" />
  <node
    name="rviz"
    pkg="rviz"
    type="rviz"
    args="-d $(find robotic_reline2)/urdf.rviz" />
</launch>

之后你便可用rviz查看导出的机械臂模型,并用弹出的面板控制关节转动,依次执行以下命令:

xxx@service:~/test_ws$ catkin_make
xxx@service:~/test_ws$ source ./devel/setup.bash
xxx@service:~/test_ws$ roslaunch robotic_reline2 display.launch

如果还有报错,那么应该是有很多插件没安装,以下$ROS_DISTRO为ros版本:

# 安装 joint-state-publisher-gui
sudo apt install ros-$ROS_DISTRO-joint-state-publisher-gui
# 安装moveit
sudo apt-get install ros-$ROS_DISTRO-moveit-setup-assistant
# 安装 OMPL 规划器
sudo apt-get install ros-$ROS_DISTRO-moveit-planners-ompl
# 安装 CHOMP 规划器
sudo apt-get install ros-$ROS_DISTRO-moveit-planners-chomp
# 安装 Pilz 工业运动规划器
sudo apt-get install ros-$ROS_DISTRO-pilz-industrial-motion-planner 
# 安装关节轨迹控制器
sudo apt-get install ros-$ROS_DISTRO-joint-trajectory-controller
# 安装位置控制器
sudo apt-get install ros-$ROS_DISTRO-position-controllers
# 安装力/扭矩控制器(如果需要)
sudo apt-get install ros-$ROS_DISTRO-force-torque-sensor-controller
# 一次性安装常用的所有控制器
sudo apt-get install ros-$ROS_DISTRO-ros-controllers
# 安装 rviz_visual_tools 包
# sudo apt-get install ros-$ROS_DISTRO-rviz-visual-tools
# 安装 MoveIt! 简单控制器管理器
sudo apt-get install ros-$ROS_DISTRO-moveit-simple-controller-manager
# 安装Gazebo ROS 控制插件
sudo apt-get install ros-$ROS_DISTRO-gazebo-ros-control
# 安装Gfake-controller-manager
sudo apt-get install ros-${ROS_DISTRO}-moveit-fake-controller-manager

sudo apt-get install ros-${ROS_DISTRO}-moveit-ros-perception
sudo apt-get install ros-${ROS_DISTRO}-moveit-ros-visualization
sudo apt-get install ros-${ROS_DISTRO}-moveit-commander
sudo apt-get install ros-${ROS_DISTRO}-visp

sudo apt install ros-$ROS_DISTRO-gazebo-ros ros-$ROS_DISTRO-gazebo-ros-control ros-$ROS_DISTRO-gazebo-plugins ros-$ROS_DISTRO-joint-state-publisher ros-$ROS_DISTRO-joint-state-publisher-gui ros-$ROS_DISTRO-robot-state-publisher
sudo apt-get install ros-$ROS_DISTRO-teleop-twist-keyboard
# 以后用gazebo做slam仿真的一些包
sudo apt-get install ros-$ROS_DISTRO-amcl ros-$ROS_DISTRO-move-base ros-$ROS_DISTRO-slam-gmapping ros-$ROS_DISTRO-slam-karto ros-$ROS_DISTRO-dwa-local-planner ros-$ROS_DISTRO-teb-local-planner ros-$ROS_DISTRO-map-server ros-$ROS_DISTRO-hector-slam*
sudo apt install ros-$ROS_DISTRO-gmapping

sudo apt-get install ros-$ROS_DISTRO-moveit-simple-controller-manager
sudo apt install ros-$ROS_DISTRO-ros-controllers
 
sudo apt-get install ros-$ROS_DISTRO-ros-control
sudo apt-get install ros-$ROS_DISTRO-gazebo-ros-control

# MoveIt规划器
sudo apt-get install ros-noetic-moveit-planners-ompl
sudo apt-get install ros-noetic-moveit-planners-chomp
sudo apt-get install ros-noetic-pilz-industrial-motion-planner

# ROS控制器
sudo apt-get install ros-noetic-ros-control
sudo apt-get install ros-noetic-ros-controllers
sudo apt-get install ros-noetic-joint-trajectory-controller
sudo apt-get install ros-noetic-position-controllers
sudo apt-get install ros-noetic-effort-controllers

后面涉及到python代码控制机械臂,也需要在你的python环境安装一些包:

# 安装MoveIt相关的Python接口
pip install moveit-commander
# 安装ROS消息相关的Python包
pip install rospy
pip install geometry-msgs
pip install moveit-msgs
pip3 install transforms3d
# 对于ROS Noetic (Python3)
sudo apt install ros-noetic-moveit-commander
sudo apt install ros-noetic-moveit-msgs
sudo apt install ros-noetic-geometry-msgs

以上是我用ros1玩机械臂安装的一些包,应该不会再缺包。

4、配置moveit

先启动roscore
之后
xxx@service:~/test_ws$ rosrun moveit_setup_assistant moveit_setup_assistant

启动moveit配置界面后,找到你的urdf路径,加载模型:
在这里插入图片描述
碰撞检测:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里group name 你自己取,这个是被控制关节的组名,代码通过该组名连接和控制机械臂。
在这里插入图片描述
这里base_link选全局坐标,tip_link选你机械臂末端工具的坐标
在这里插入图片描述
设定一个home姿态,代码中可以实现在机械臂的任意姿态回到home姿态
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
写你自己的邮箱,随便写
在这里插入图片描述
上图第2步骤得先创建那个目录,才能选择那个目录进行配置文件的保存,点击生成后,如下目录会有多个文件,配置结束,关闭窗口即可:
在这里插入图片描述
至此,可以通过rviz中的moveit面板控制机械臂规划移动到指定姿态:

xxx@service:~/test_ws$ catkin_make
xxx@service:~/test_ws$ source ./devel/setup.bash
xxx@service:~/test_ws$ roslaunch robotic_reline2_moveit demo.launch

在这里插入图片描述

5、下载深度相机模型realsense D435

cd test_ws/src
git clone https://gitee.com/nie_xun/realsense_ros_gazebo.git
cd test_ws
catkin_make
source devel/setup.sh

待用,此时目录结构:
在这里插入图片描述

6、配置gazebo所用模型文件

urdf文件直接加载到gazebo会出现问题,惯性参数和质量设置有问题会东倒西歪,即便设置合适了,机械臂也会因为没有设置运动控制器而倒在地上;复制一下urdf文件,将复制的urdf改后缀为xacro,如下图所示:
在这里插入图片描述
修改xacro文件:
第1步, 设置各个物体的惯性参数和质量:

...
省略
...
  <link
    name="global_link">
    <inertial>
      <origin xyz="-2.60208521396521E-18 4.33680868994202E-19 0.05" rpy="0 0 0" />
      <mass value="0.001" />
      <inertia ixx="10.0" ixy="0" ixz="0" iyy="10.0" iyz="0" izz="10.0" />
    </inertial>
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <mesh filename="package://robotic_reline2/meshes/global_link.STL" />
      </geometry>
      <material name="">
        <color rgba="1 1 1 1" />
      </material>
    </visual>
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <mesh filename="package://robotic_reline2/meshes/global_link.STL" />
      </geometry>
    </collision>
  </link>

  <!-- 确保基座固定 -->
  <gazebo reference="global_link">
    <static>true</static>  <!-- 如果global_link应该是固定的 -->
  </gazebo>
...
省略
...

如上,将world之外的所有link的质量和惯性参数都设置成一样,质量小,惯性大,这是多次测试才成功的参数;

第2步,在模型都是建立在z>=0的情况下,为了防止模型的底部存在z<0的部分,架高世界坐标world半米:

...
省略
...
  <link name="world"/>

  <joint name="world_to_global" type="fixed">
    <parent link="world"/>
    <child link="global_link"/>
    <origin xyz="0 0 0.5" rpy="0 0 0"/>
  </joint>
...
省略
...

如上参数的z轴改为0.5

第3步,添加深度相机,

<?xml version="1.0"?>
<robot name="robotic_reline2" xmlns:xacro="http://ros.org/wiki/xacro">

  <xacro:property name="M_PI" value="3.1415926536"/>
  <xacro:include filename="$(find realsense_ros_gazebo)/xacro/depthcam.xacro"/>
  ...
  中间省略
  ...
  <!-- add realsense D435 -->
  <xacro:realsense_d435 sensor_name="d435" parent_link="link6" rate="10">
    <origin xyz="0.7 0 -0.425" rpy="0 0 0"/>
  </xacro:realsense_d435>
  
</robot>

以上配置中realsense_ros_gazebo是第五小节下载的模型目录,深度相机的插入坐标,是我通过在solidworks中的机械臂末端工具表面建坐标系获知,建坐标方法参考第一小节的视频。

第4步,添加运动关节控制器,以及设置各个link的颜色(前面urdf中配置的颜色在gazebo中无效,要特别设置):

...
前面的省略
...
  <!-- Transmissions for ROS Control -->
  <xacro:macro name="transmission_block" params="joint_name">
    <transmission name="tran1">
      <type>transmission_interface/SimpleTransmission</type>
      <joint name="${joint_name}">
        <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
      </joint>
      <actuator name="motor1">
        <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
        <mechanicalReduction>1</mechanicalReduction>
      </actuator>
    </transmission>
  </xacro:macro>
  
  <xacro:transmission_block joint_name="joint0"/>
  <xacro:transmission_block joint_name="joint1"/>
  <xacro:transmission_block joint_name="joint2"/>
  <xacro:transmission_block joint_name="joint3"/>
  <xacro:transmission_block joint_name="joint4"/>
  <xacro:transmission_block joint_name="joint5"/>
  <xacro:transmission_block joint_name="joint6"/>

  <!-- ros_control plugin -->
  <gazebo>
    <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
      <robotNamespace>/robotic_reline2</robotNamespace>
      <robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType>
      <legacyModeNS>true</legacyModeNS>
    </plugin>
  </gazebo>

  <!--设置材料颜色 -->
  <gazebo reference="mill_link">
    <material>Gazebo/Yellow</material>
  </gazebo>

  <gazebo reference="driver_link1">
    <material>Gazebo/Blue</material>
  </gazebo>

  <gazebo reference="driver_link2">
    <material>Gazebo/Blue</material>
  </gazebo>

  <gazebo reference="shelf_link">
    <material>Gazebo/FlatBlack</material>
  </gazebo>
  
 </robot>

注意: 由于增加了相机模型,第四小节的moveit配置需要配置一遍(把原来生成的目录删除掉,新建一个一样名字的目录,重新配置,但这次加载的模型文件是改好后的xacro,而非之前的urdf),碰撞检测多了个相机,其他配置步骤和参数都一样。

7、配置gazebo

如下目录内新建一个gazebo_moveit_launch目录,用于配置gazebo和moveit的连接:
在这里插入图片描述
在如上目录config创建gazebo_joint_states.yaml, trajectory_control.yaml两个参数文件,
在gazebo_moveit_launch目录创建gazebo_world.launch,gazebo_states.launch,gazebo_trajectory_controller.launch,bringup_moveit.launch启动文件。

gazebo_world.launch内容:

<launch>
  <!-- these are the arguments you can pass this launch file, for example paused:=true -->
  <arg name="paused" default="false"/>
  <arg name="use_sim_time" default="true"/>
  <arg name="gui" default="true"/>
  <arg name="headless" default="false"/>
  <arg name="debug" default="false"/>

  <!-- We resume the logic in empty_world.launch -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="debug" value="$(arg debug)" />
    <arg name="gui" value="$(arg gui)" />
    <arg name="paused" value="$(arg paused)"/>
    <arg name="use_sim_time" value="$(arg use_sim_time)"/>
    <arg name="headless" value="$(arg headless)"/>
  </include>

  <!-- Load the URDF into the ROS Parameter Server -->
  <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find robotic_reline2)/urdf/robotic_reline2.xacro'" /> 

  <!-- Run a python script to the send a service call to gazebo_ros to spawn a URDF robot -->
  <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
	args="-urdf -model robotic_reline2 -param robot_description"/> 

</launch>

gazebo_joint_states.yaml参数文件内容,用于配置机械臂发布状态的频率:

robotic_reline2:
  # Publish all joint states -----------------------------------
  joint_state_controller:
    type: joint_state_controller/JointStateController
    publish_rate: 50  

配置gazebo_states.launch内容:

<launch>
    <!-- 将关节控制器的配置参数加载到参数服务器中 -->
    <rosparam file="$(find robotic_reline2)/config/gazebo_joint_states.yaml" command="load"/>

    <node name="joint_controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
          output="screen" ns="/robotic_reline2" args="joint_state_controller" />

    <!-- 运行robot_state_publisher节点,发布tf  -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
        respawn="false" output="screen">
        <remap from="/joint_states" to="/robotic_reline2_states" />
    </node>

</launch>

trajectory_control.yaml参数文件内容,用于配置机械臂控制器参数:

robotic_reline2:
  arm_joint_controller:
    type: "position_controllers/JointTrajectoryController"
    joints:
      - joint0
      - joint1
      - joint2
      - joint3
      - joint4
      - joint5
      - joint6

    gains:
      joint0:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint1:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint2:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint3:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint4:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint5:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint6:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}

配置gazebo_trajectory_controller.launch内容:

<launch>

    <rosparam file="$(find robotic_reline2)/config/trajectory_control.yaml" command="load"/>

    <node name="arm_controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
          output="screen" ns="/robotic_reline2" args="arm_joint_controller"/>
</launch>

在目录robotic_reline2_moveit/launch创建moveit_planning_execution.launch:

<launch>
  <include file="$(find robotic_reline2_moveit)/launch/move_group.launch">
    <arg name="publish_monitored_planning_scene" value="true" />
  </include>

  <!--The visualization component of MoveIt!-->
  <include file="$(find robotic_reline2_moveit)/launch/moveit_rviz.launch"/>
    <arg name="rviz_config" value="true"/>
    <arg name="debug" value="false"/>

    <!-- We do not have a robot connected, so publish fake joint states -->
  <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher">
    <param name="/use_gui" value="false"/> 
    <rosparam param="/source_list">[/robotic_reline2/joint_states]</rosparam>
  </node>

</launch>

对比前面配置文件涉及到的两个state_publisher:
在这里插入图片描述
在这里插入图片描述
总结来讲:
joint_state_publisher:为MoveIt!提供当前的关节角度信息
robot_state_publisher:为MoveIt!和RViz提供机器人的3D模型显示和碰撞检测所需的坐标变换


修改两文件的控制器名称,由原来的haha_controller改为robotic_reline2/arm_joint_controller,
这是为了跟前面的gazebo_trajectory_controller.launch配置保持一致,使得moveit能够连上该控制器进行控制数据传输。
修改目录robotic_reline2_moveit/config/simple_moveit_controllers.yaml:
在这里插入图片描述
修改目录robotic_reline2_moveit/config/ros_controllers.yaml:
在这里插入图片描述

配置bringup_moveit.launch内容:

<launch>
  
    <!-- Launch Gazebo  -->
    <include file="$(find  robotic_reline2)/gazebo_moveit_launch/gazebo_world.launch" />

    <!-- ros_control arm launch file -->
    <include file="$(find robotic_reline2)/gazebo_moveit_launch/gazebo_states.launch" />   

    <!-- ros_control trajectory control dof arm launch file -->
    <include file="$(find robotic_reline2)/gazebo_moveit_launch/gazebo_trajectory_controller.launch" />

    <!-- moveit launch file -->
    <include file="$(find robotic_reline2_moveit)/launch/moveit_planning_execution.launch" />

</launch>

这个bringup_moveit.launch是最终的统一启动文件,其先启动了gazebo_world.launch,让模型加载到gazebo;而后的gazebo_states.launch和gazebo_trajectory_controller.launch不分先后,gazebo_states用于发布gazebo中机械臂的关节状态,能够生成/robotic_reline2/joint_states话题和发布TF树,rviz得到该话题后正常显示模型;而gazebo_trajectory_controller则用于启动命名空间robotic_reline2下的控制器arm_joint_controller,前面修改目录robotic_reline2_moveit/config/中的2个配置文件,就是为了使得ros加载启用这个控制器,使得moveit可以控制gazebo中的模型运动。

8、moveit控制gazebo模型运动

xxxxx@service:~/test_ws$ catkin_make
xxxxx@service:~/test_ws$ source ./devel/setup.bash
xxxxx@service:~/test_ws$ roslaunch robotic_reline2 bringup_moveit.launch 

之后可以启动rviz,自己添加控制面板:
在这里插入图片描述
手动拖动rviz中的机械臂,规划执行,gazebo中的机械臂也能跟着动,另外可以在另一个终端:

xxxx@service:~/test_ws$ rqt_image_view

该界面可订阅gazebo中相机的话题,查看相机画面,或者看深度图:
在这里插入图片描述

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐