Franka机械臂:学习记录1---moveit与gazebo

配置环境:ubuntu20.04 ros-noetic

参考链接:

1.Moveit +Gazebo:搭建单臂机械臂仿真平台_moveit gazebo-CSDN博客

2.Moveit + Gazebo实现联合仿真:ABB yumi双臂机器人( 一、基本仿真搭建及简单运动实现 )_moveit+gazebo仿真-CSDN博客

注:该学习记录只是单臂

一、moveit配置

1.首先是必须有一个正确的urdf/xacro文件,如若直接使用franka_description/panda_arm.urdf.xacro进行moveit助手配置,虽然前期可以配置成功,但是后期可能会发现机械臂松软无力或者疯狂乱动等情况,通过多次对比发现,笔者认为可能是因为其原文件中缺少与gazebo的相关描述和参数(其实也不是缺少,笔者认为将下图中的参数改变也可以,但是未曾尝试),故直接使用了参考链接1中的修改过的urdf文件

(1)先到工程文件(笔者是安装包下载的franka_ros而非源码)下,source后再打开moveit_setup_assistant(命令可在如下图片中看到)

(2)选择"create new moveit"并选中自己的urdf/xacro文件,再进行加载

(3)自碰撞检测,直接点击下图中红色框选部分

virtual joints是用来添加虚拟关节的,但是可以先不管 。

(4)分组,因为笔者是单臂带爪,分了两个组:“left_arm”和"left_hand"(下图中的组名有差别是因为这是之前配置时截的图,后面重新配置忘记截图了),其他配置可如下图,"Add Kin.Chain"可以不用,但是需要"Add Joints"和"Add Links",配置末端抓取器的时候由于夹爪不需要运动学解算,所以"kinematic Solver"保持为“None”,“OMPL Planning”也是“None”

最终分组情况如下图:

“Add Links”的一个示例,名字同上图也有点区别,也是因为这是之前配置时截的图。

(5)此处可以定义一些机械臂的位姿,笔者只记录了初始位姿,拖动下图中关节的滑块读者还可以自己创建保存多种位姿。

(6)定义末端执行器,没有末端执行器的可以跳过这一步(下图中的组名与最终的有差别是因为这是之前配置时截的图,后面重新配置忘记截图了)

“Passive Joints”可以跳过。

(7)创建控制器

点击“Auto Add_FollowJointsTrajectory Controller For Each Planning Group”自动生成,后面的控制器类型有多种可以选择,一般机械臂本身关节使用位置控制,至于末端执行器,笔者目前不太清楚。

moveit中不同ros控制器的区别:Position Controller,Velocity Controller,Effort_controllers,FollowJointTrajectory_follow joint trajectory-CSDN博客

可以不管”Simulation“和"3D Perception"。

(8)如下图

(9)如下图

二、编写launch文件及yaml文件

1.moveit_setup_assistant配置成功后可以在自己的工作空间下找到生成的功能包,笔者的名字叫做“left_arm_moveit_config”(上图中的“franka_panda_moveit_config”是之前配置的)

2.笔者先在此处说清楚到底有几个关键的文件:一个launch文件,三个yaml文件,主要参考了链接1和链接2。笔者先从launch文件讲起随后引入这两个yaml配置文件。

先把launch文件内容放这里,然后笔者对其中重点的进行解读。

<?xml version="1.0"?>
<launch>
        <arg name="world_pose" default="-x -0.5 -y 0 -z 0 -R 0 -P 0 -Y 0"/>
        <!-- Run the main MoveIt executable with trajectory execution -->
        <include file="$(find left_arm_moveit_config)/launch/move_group.launch">
            <arg name="allow_trajectory_execution" value="true" />
            <arg name="moveit_controller_manager" value="ros_control" />
            <arg name="fake_execution_type" value="interpolate" />
            <arg name="info" value="true" />
            <arg name="debug" value="false" />
            <arg name="pipeline" value="ompl" />
            <arg name="load_robot_description" value="true" />
        </include>
 
        <!-- Launch empty Gazebo world -->
        <include file="$(find gazebo_ros)/launch/empty_world.launch">
            <arg name="world_name" value="$(find arm_manipulation)/world/stone.sdf" />
            <arg name="use_sim_time" value="true" />
            <arg name="gui" value="true" />
            <arg name="paused" value="false" />
            <arg name="debug" value="false" /> 
        </include>
 
        <param name="robot_description" textfile="$(find arm_manipulation)/urdf/left_arm_panda_gazebo.urdf" />
        <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-urdf -param robot_description -model left_arm $(arg world_pose) " />
 

        <!-- Robot state publisher -->
        <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher">
            <param name="publish_frequency" type="double" value="50.0" />
            <param name="tf_prefix" type="string" value="" />
        </node>

        
        <!-- Joint state controller -->
        <rosparam file="$(find left_arm_moveit_config)/config/gazebo_controllers.yaml" command="load" />
        <node name="joint_state_controller_spawner" pkg="controller_manager" type="spawner"  args="joint_state_controller" respawn="false" output="screen" />
 
        <!-- Joint trajectory controller -->
        <rosparam file="$(find left_arm_moveit_config)/config/ros_controllers.yaml" command="load" />
        <node name="arms_trajectory_controller_spawner" pkg="controller_manager" type="spawner"  respawn="false" output="screen"  args="left_arm_controller left_hand_controller" />
    
        <!-- Start moveit_rviz with the motion planning plugin -->
        <include file="$(find left_arm_moveit_config)/launch/moveit_rviz.launch">
            <arg name="rviz_config" value="$(find left_arm_moveit_config)/launch/moveit.rviz" />
        </include>
</launch>

(1)首先是加载move_group.launch文件这里

其中,“moveit_controller_manager”的值为“ros_control”,一般来说,其值可以分为三种,"fake"、“simple”和“ros_control”,好像是只使用moveit而不仿真时用fake,而“ros_control”代表的是用户可以自定义的控制器(所以好像也可以自定义这个控制器的名字,但是“ros_control”是moveit给用户默认生成的,只是具体内容需要用户自己填写)。

此时首先读者需要在moveit_setup_assistant生成的功能包(比如,笔者我是“left_arm_moveit_config”)中对一个名为“ros_control_moveit_controller_manager.launch.xml”的文件进行修改,读者可以在以下路径找到:

修改为:

<launch>
  <!-- Define the MoveIt controller manager plugin to use for trajectory execution -->
  <param name="moveit_controller_manager" value="moveit_simple_controller_manager/MoveItSimpleControllerManager" />

  <!-- Load controller list to the parameter server -->
  <rosparam file="$(find left_arm_moveit_config)/config/controllers_gazebo.yaml" />
</launch>

这就引入了第一个关键的yaml文件:“controllers_gazebo.yaml”,需要自己创建。

“controllers_gazebo.yaml”:

controller_list:
  - name: left_arm_controller
    action_ns: follow_joint_trajectory
    type: FollowJointTrajectory
    default: true
    joints:
      - left_arm_joint1
      - left_arm_joint2
      - left_arm_joint3
      - left_arm_joint4
      - left_arm_joint5
      - left_arm_joint6
      - left_arm_joint7

  - name: left_hand_controller
    action_ns: follow_joint_trajectory
    type: FollowJointTrajectory
    default: true
    joints:
      - left_arm_finger_joint1

(2)再看launch文件的此处

        <!-- Joint state controller -->
        <rosparam file="$(find left_arm_moveit_config)/config/gazebo_controllers.yaml" command="load" />
        <node name="joint_state_controller_spawner" pkg="controller_manager" type="spawner"  args="joint_state_controller" respawn="false" output="screen" />

这里引入了第二个关键的yaml文件:gazebo_controllers.yaml,这个文件moveit_setup_assistant配置完成后会自动生成且不需要修改

# Publish joint_states
joint_state_controller:
  type: joint_state_controller/JointStateController
  publish_rate: 50

实际上就是建立了关节状态控制器。

(3)最后看launch文件的此处

       <!-- Joint trajectory controller -->
        <rosparam file="$(find left_arm_moveit_config)/config/ros_controllers.yaml" command="load" />
        <node name="arms_trajectory_controller_spawner" pkg="controller_manager" type="spawner"  respawn="false" output="screen"  args="left_arm_controller left_hand_controller" />

此处加载最后一个关键的yaml文件:ros_controllers.yaml文件,moveit_setup_assistant配置完成后会自动生成但可能需要修改。

left_arm_controller:
  type: position_controllers/JointTrajectoryController
  joints:
    - left_arm_joint1
    - left_arm_joint2
    - left_arm_joint3
    - left_arm_joint4
    - left_arm_joint5
    - left_arm_joint6
    - left_arm_joint7
  gains:
    left_arm_joint1:
      p: 100
      d: 1
      i: 1
      i_clamp: 1
    left_arm_joint2:
      p: 100
      d: 1
      i: 1
      i_clamp: 1
    left_arm_joint3:
      p: 100
      d: 1
      i: 1
      i_clamp: 1
    left_arm_joint4:
      p: 100
      d: 1
      i: 1
      i_clamp: 1
    left_arm_joint5:
      p: 100
      d: 1
      i: 1
      i_clamp: 1
    left_arm_joint6:
      p: 100
      d: 1
      i: 1
      i_clamp: 1
    left_arm_joint7:
      p: 100
      d: 1
      i: 1
      i_clamp: 1

left_hand_controller:
    type: "effort_controllers/JointTrajectoryController"
    joints:
        - left_arm_finger_joint1
    gains:
        left_arm_finger_joint1:  {p: 50.0, d: 1.0, i: 0.01, i_clamp: 1.0}

至于有些文章,比如参考链接2,在该yaml文件第一行加了命名空间,笔者认为可加可不加,笔者没有加。

“controllers_gazebo.yaml”和“ros_controllers.yaml”二者对应的控制器的名字和关节名字一定要一一对应,两个yaml文件实际上是建立起了gazebo和moveit之前的通信。

三、运行launch文件

可以看到,成功实现了moveit和gazebo的联合

注:如果遇到如下报错,可以暂时不管,貌似目前没啥影响。如果读者觉得扎眼想要解决,可以参考一下这篇文章ROS Gazabo仿真问题解决:[ERROR]: No p gain specified for pid. Namespace: /gazebo_ros_control/pid_gains/~-CSDN博客

笔者也只是初入机械臂,如有不对之处敬请海涵。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值