配置环境: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”自动生成,后面的控制器类型有多种可以选择,一般机械臂本身关节使用位置控制,至于末端执行器,笔者目前不太清楚。

可以不管”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博客

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

1万+

被折叠的 条评论
为什么被折叠?



