Chapter5-MoveIt机械臂控制
# What is MoveIt!
# MoveIt!系统架构
# move_group
核心节点,可以综合其他独立的功能组件为用户提供ROS中的动作指令和服务
本身不具备丰富的功能,主要完成各功能包、插件的集成
- 通过消息或服务的方式接收服务器发布的点云信息、关节状态信息、以及机器人的TF坐标变换
- 需要ROS参数服务器提供机器人的运动学参数
# motion_planner
# 规划场景
为机器人创建一个工作环境,包括外界环境中的桌面、工件等物体
# 运动学求解器
运动学插件允许开发者灵活选择多种可供使用的运动学求解器
- 默认为从Orocos项目中移植过来的KDL
- 可以选择自己的运动学求解器
# 碰撞检测
- 使用CollisionWorld对象进行碰撞检测
- 采用FCL(Flexible Collision Library)功能包实现
- 为减少计算量,在MoveIt!Setup Assistant中设置免检冲突矩阵(ACM)进行优化
# 如何使用MoveIt!
# 创建机械臂模型
报错
解决Could not find a package configuration file provided by “manipulation_msgs“
https://blog.csdn.net/weixin_43738246/article/details/115751901?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162659565416780262583241%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162659565416780262583241&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-1-115751901.first_rank_v2_pc_rank_v29&utm_term=+Could+not+find+a+package+configuration+file+provided+by+%22manipulation_msgs%22&spm=1018.2226.3001.4187
ros编译时报Invoking "make -j4 -l4" failed
https://www.cnblogs.com/dayspring/p/13521510.html
‘file‘ object has no attribute ‘push
https://blog.csdn.net/CH_monsy/article/details/108129073
ModuleNotFoundError: No module named 'em'
https://blog.csdn.net/Chen1189/article/details/107327167
pip3 install empy
# arm.xaro
宏定义
- 颜色、机器人尺寸、惯性矩阵
<!-- Defining the colors used in this robot -->
<material name="Black">
<color rgba="0 0 0 1"/>
</material>
<material name="White">
<color rgba="1 1 1 1"/>
</material>
<material name="Blue">
<color rgba="0 0 1 1"/>
</material>
<material name="Red">
<color rgba="1 0 0 1"/>
</material>
<!-- Constants -->
<xacro:property name="M_PI" value="3.14159"/>
<!-- link1 properties -->
<xacro:property name="link1_width" value="0.03" />
<xacro:property name="link1_len" value="0.10" />
<!-- link2 properties -->
<xacro:property name="link2_width" value="0.03" />
<xacro:property name="link2_len" value="0.14" />
<!-- link3 properties -->
<xacro:property name="link3_width" value="0.03" />
<xacro:property name="link3_len" value="0.22" />
<!-- link4 properties -->
<xacro:property name="link4_width" value="0.025" />
<xacro:property name="link4_len" value="0.06" />
<!-- link5 properties -->
<xacro:property name="link5_width" value="0.03" />
<xacro:property name="link5_len" value="0.06" />
<!-- link6 properties -->
<xacro:property name="link6_width" value="0.04" />
<xacro:property name="link6_len" value="0.02" />
<!-- Left gripper -->
<xacro:property name="left_gripper_len" value="0.08" />
<xacro:property name="left_gripper_width" value="0.01" />
<xacro:property name="left_gripper_height" value="0.01" />
<!-- Right gripper -->
<xacro:property name="right_gripper_len" value="0.08" />
<xacro:property name="right_gripper_width" value="0.01" />
<xacro:property name="right_gripper_height" value="0.01" />
<!-- Gripper frame -->
<xacro:property name="grasp_frame_radius" value="0.001" />
<!-- Inertial matrix -->
<xacro:macro name="inertial_matrix" params="mass">
<inertial>
<mass value="${mass}" />
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="0.5" iyz="0.0" izz="1.0" />
</inertial>
</xacro:macro>
创建六轴机械臂模型
<!-- /////////////////////////////////////// bottom_joint ////////////////////////////////////////// -->
<joint name="bottom_joint" type="fixed">
<origin xyz="0 0 0" rpy="0 0 0" />
<parent link="base_link"/>
<child link="bottom_link"/>
</joint>
<link name="bottom_link">
<visual>
<origin xyz=" 0 0 -0.02" rpy="0 0 0"/>
<geometry>
<box size="1 1 0.02" />
</geometry>
<material name="Brown" />
</visual>
<collision>
<origin xyz=" 0 0 -0.02" rpy="0 0 0"/>
<geometry>
<box size="1 1 0.02" />
</geometry>
</collision>
<xacro:inertial_matrix mass="500"/>
</link>
<!-- ///////////////////////////////////// BASE LINK ////////////////////////////////////////////// -->
<link name="base_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.1 0.1 0.04" />
</geometry>
<material name="White" />
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.1 0.1 0.04" />
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
<joint name="joint1" type="revolute">
<parent link="base_link"/>
<child link="link1"/>
<origin xyz="0 0 0.02" rpy="0 ${M_PI/2} 0" />
<axis xyz="-1 0 0" />
<limit effort="300" velocity="1" lower="-2.96" upper="2.96"/>
<dynamics damping="50" friction="1"/>
</joint>
<!-- ///////////////////////////////////// LINK1 ////////////////////////////////////////////// -->
<link name="link1" >
<visual>
<origin xyz="-${link1_len/2} 0 0" rpy="0 ${M_PI/2} 0" />
<geometry>
<cylinder radius="${link1_width}" length="${link1_len}"/>
</geometry>
<material name="Blue" />
</visual>
<collision>
<origin xyz="-${link1_len/2} 0 0" rpy="0 ${M_PI/2} 0" />
<geometry>
<cylinder radius="${link1_width}" length="${link1_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
<joint name="joint2" type="revolute">
<parent link="link1"/>
<child link="link2"/>
<origin xyz="-${link1_len} 0 0.0" rpy="-${M_PI/2} 0 ${M_PI/2}" />
<axis xyz="1 0 0" />
<limit effort="300" velocity="1" lower="-2.35" upper="2.35" />
<dynamics damping="50" friction="1"/>
</joint>
<!-- /////////////////////////////////////// LINK2 ////////////////////////////////////////////// -->
<link name="link2" >
<visual>
<origin xyz="0 0 ${link2_len/2}" rpy="0 0 0" />
<geometry>
<cylinder radius="${link2_width}" length="${link2_len}"/>
</geometry>
<material name="White" />
</visual>
<collision>
<origin xyz="0 0 ${link2_len/2}" rpy="0 0 0" />
<geometry>
<cylinder radius="${link2_width}" length="${link2_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
<joint name="joint3" type="revolute">
<parent link="link2"/>
<child link="link3"/>
<origin xyz="0 0 ${link2_len}" rpy="0 ${M_PI} 0" />
<axis xyz="-1 0 0" />
<limit effort="300" velocity="1" lower="-2.62" upper="2.62" />
<dynamics damping="50" friction="1"/>
</joint>
<!-- ///////////////////////////////// LINK3 ///////////////////////////////////////////////////// -->
<link name="link3" >
<visual>
<origin xyz="0 0 -${link3_len/2}" rpy="0 0 0" />
<geometry>
<cylinder radius="${link3_width}" length="${link3_len}"/>
</geometry>
<material name="Blue" />
</visual>
<collision>
<origin xyz="0 0 -${link3_len/2}" rpy="0 0 0" />
<geometry>
<cylinder radius="${link3_width}" length="${link3_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
<joint name="joint4" type="revolute">
<parent link="link3"/>
<child link="link4"/>
<origin xyz="0.0 0.0 -${link3_len}" rpy="0 ${M_PI/2} ${M_PI}" />
<axis xyz="1 0 0" />
<limit effort="300" velocity="1" lower="-2.62" upper="2.62" />
<dynamics damping="50" friction="1"/>
</joint>
<!-- /////////////////////////////////// LINK4 //////////////////////////////////////////////// -->
<link name="link4" >
<visual>
<origin xyz="${link4_len/2} 0 0" rpy="0 ${M_PI/2} 0" />
<geometry>
<cylinder radius="${link4_width}" length="${link4_len}"/>
</geometry>
<material name="Black" />
</visual>
<collision>
<origin xyz="${link4_len/2} 0 0" rpy="0 ${M_PI/2} 0" />
<geometry>
<cylinder radius="${link4_width}" length="${link4_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
<joint name="joint5" type="revolute">
<parent link="link4"/>
<child link="link5"/>
<origin xyz="${link4_len} 0.0 0.0" rpy="0 ${M_PI/2} 0" />
<axis xyz="1 0 0" />
<limit effort="300" velocity="1" lower="-2.62" upper="2.62" />
<dynamics damping="50" friction="1"/>
</joint>
<!-- ////////////////////////////////// LINK5 ///////////////////////////////////////////////// -->
<link name="link5">
<visual>
<origin xyz="0 0 ${link4_len/2}" rpy="0 0 0" />
<geometry>
<cylinder radius="${link5_width}" length="${link5_len}"/>
</geometry>
<material name="White" />
</visual>
<collision>
<origin xyz="0 0 ${link4_len/2} " rpy="0 0 0" />
<geometry>
<cylinder radius="${link5_width}" length="${link5_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
<joint name="joint6" type="revolute">
<parent link="link5"/>
<child link="link6"/>
<origin xyz="0 0 ${link4_len}" rpy="${1.5*M_PI} -${M_PI/2} 0" />
<axis xyz="1 0 0" />
<limit effort="300" velocity="1" lower="-6.28" upper="6.28" />
<dynamics damping="50" friction="1"/>
</joint>
<!-- //////////////////////////////// LINK6 ///////////////////////////////////////////////// -->
<link name="link6">
<visual>
<origin xyz="${link6_len/2} 0 0 " rpy="0 ${M_PI/2} 0" />
<geometry>
<cylinder radius="${link6_width}" length="${link6_len}"/>
</geometry>
<material name="Blue" />
</visual>
<collision>
<origin xyz="${link6_len/2} 0 0" rpy="0 ${M_PI/2} 0" />
<geometry>
<cylinder radius="${link6_width}" length="${link6_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
<joint name="finger_joint1" type="prismatic">
<parent link="link6"/>
<child link="gripper_finger_link1"/>
<origin xyz="0.0 0 0" />
<axis xyz="0 1 0" />
<limit effort="100" lower="0" upper="0.06" velocity="1.0"/>
<dynamics damping="50" friction="1"/>
</joint>
<!-- ////////////////////////////////////// gripper ////////////////////////////////////////////// -->
<!-- LEFT GRIPPER AFT LINK -->
<link name="gripper_finger_link1">
<visual>
<origin xyz="0.04 -0.03 0"/>
<geometry>
<box size="${left_gripper_len} ${left_gripper_width} ${left_gripper_height}" />
</geometry>
<material name="White" />
</visual>
<xacro:inertial_matrix mass="1"/>
</link>
<joint name="finger_joint2" type="fixed">
<parent link="link6"/>
<child link="gripper_finger_link2"/>
<origin xyz="0.0 0 0" />
</joint>
<!-- RIGHT GRIPPER AFT LINK -->
<link name="gripper_finger_link2">
<visual>
<origin xyz="0.04 0.03 0"/>
<geometry>
<box size="${right_gripper_len} ${right_gripper_width} ${right_gripper_height}" />
</geometry>
<material name="White" />
</visual>
<xacro:inertial_matrix mass="1"/>
</link>
<!-- Grasping frame -->
<link name="grasping_frame"/>
<joint name="grasping_frame_joint" type="fixed">
<parent link="link6"/>
<child link="grasping_frame"/>
<origin xyz="0.08 0 0" rpy="0 0 0"/>
</joint>
加入gazebo属性
<!-- ///////////////////////////////// Gazebo ////////////////////////////////////// -->
<gazebo reference="bottom_link">
<material>Gazebo/White</material>
</gazebo>
<gazebo reference="base_link">
<material>Gazebo/White</material>
</gazebo>
<gazebo reference="link1">
<material>Gazebo/Blue</material>
</gazebo>
<gazebo reference="link2">
<material>Gazebo/White</material>
</gazebo>
<gazebo reference="link3">
<material>Gazebo/Blue</material>
</gazebo>
<gazebo reference="link4">
<material>Gazebo/Black</material>
</gazebo>
<gazebo reference="link5">
<material>Gazebo/White</material>
</gazebo>
<gazebo reference="link6">
<material>Gazebo/Blue</material>
</gazebo>
<gazebo reference="gripper_finger_link1">
<material>Gazebo/White</material>
</gazebo>
<gazebo reference="gripper_finger_link2">
<material>Gazebo/White</material>
</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="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"/>
<xacro:transmission_block joint_name="finger_joint1"/>
<!-- ros_control plugin -->
<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<robotNamespace>/arm</robotNamespace>
</plugin>
</gazebo>
显示机器人模型view_arm.launch
<launch>
<arg name="model" />
<!-- 加载机器人模型参数 -->
<param name="robot_description" command="$(find xacro)/xacro --inorder $(find marm_description)/urdf/arm.xacro" />
<!-- 设置GUI参数,显示关节控制插件 -->
<param name="use_gui" value="true"/>
<!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<!-- 运行robot_state_publisher节点,发布tf -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
<!-- 运行rviz可视化界面 -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find marm_description)/urdf.rviz" required="true" />
</launch>
roslaunch marm_description view_arm.launch
# 使用setup assistant配置机械臂
sudo apt-get install ros-melodic-moveit-*
roscore
rosrun moveit_setup_assistant moveit_setup_assistant
报错:libmoveit_kinematics_base.so.1.0.8: cannot open shared object file: No such file or directory
https://blog.csdn.net/fightingforcv/article/details/51850123?ops_request_misc=&request_id=&biz_id=102&utm_term=error%20while%20loading%20shared%20lib&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-7-.nonecase&spm=1018.2226.3001.4187
# 启动MoveIt!
roslaunch marm_moveit_config demo.launch
# 配置文件
配置文件 | 作用 |
---|---|
arm.srdf | Semantic Robot Description Fromat,机械臂参数、夹具参数、规划组、自定义位姿…… |
fake_controllers.yaml | 虚拟控制器参数控制 MoveIt!机械臂的运动轨迹 |
joint_limits.yaml | 设置机器人运动关节的速度限位,速度、加速度 |
kinematics.yaml | 运动学求解器 |
ompl_planning.yaml | MoveIt!中默认使用的运动规划库 |
# arm.srdf
规划组
<group name="arm"> <chain base_link="base_link" tip_link="grasping_frame" /> </group> <group name="gripper"> <link name="gripper_finger_link1" /> <link name="gripper_finger_link2" /> <joint name="finger_joint1" /> <joint name="finger_joint2" /> </group>
自定义位姿
<group_state name="home" group="arm"> <joint name="joint1" value="0" /> <joint name="joint2" value="0" /> <joint name="joint3" value="0" /> <joint name="joint4" value="0" /> <joint name="joint5" value="0" /> <joint name="joint6" value="0" /> </group_state> <group_state name="forward" group="arm"> <joint name="joint1" value="0" /> <joint name="joint2" value="0.4132" /> <joint name="joint3" value="0.7486" /> <joint name="joint4" value="0.2015" /> <joint name="joint5" value="-0.4031" /> <joint name="joint6" value="0" /> </group_state>
机械臂终端
<end_effector name="robot_gripper" parent_link="grasping_frame" group="gripper" />
碰撞矩阵
<disable_collisions link1="base_link" link2="bottom_link" reason="Adjacent" /> <disable_collisions link1="base_link" link2="link1" reason="Adjacent" /> <disable_collisions link1="bottom_link" link2="link1" reason="Never" /> <disable_collisions link1="bottom_link" link2="link2" reason="Never" /> <disable_collisions link1="gripper_finger_link1" link2="link2" reason="Never" /> <disable_collisions link1="gripper_finger_link1" link2="link5" reason="Default" /> <disable_collisions link1="gripper_finger_link1" link2="link6" reason="Adjacent" /> <disable_collisions link1="gripper_finger_link2" link2="link2" reason="Never" /> <disable_collisions link1="gripper_finger_link2" link2="link5" reason="Default" /> <disable_collisions link1="gripper_finger_link2" link2="link6" reason="Adjacent" /> <disable_collisions link1="link1" link2="link2" reason="Adjacent" /> <disable_collisions link1="link1" link2="link4" reason="Never" /> <disable_collisions link1="link1" link2="link5" reason="Never" /> <disable_collisions link1="link2" link2="link3" reason="Adjacent" /> <disable_collisions link1="link2" link2="link4" reason="Never" /> <disable_collisions link1="link2" link2="link5" reason="Never" /> <disable_collisions link1="link2" link2="link6" reason="Never" /> <disable_collisions link1="link3" link2="link4" reason="Adjacent" /> <disable_collisions link1="link4" link2="link5" reason="Adjacent" /> <disable_collisions link1="link5" link2="link6" reason="Adjacent" />
fake_controllers.yaml
controller_list:
- name: fake_arm_controller
joints:
- joint1
- joint2
- joint3
- joint4
- joint5
- joint6
- name: fake_gripper_controller
joints:
- finger_joint1
joint_limits.yaml
# joint_limits.yaml allows the dynamics properties specified in the URDF to be overwritten or augmented as needed
# Specific joint properties can be changed with the keys [max_position, min_position, max_velocity, max_acceleration]
# Joint limits can be turned off with [has_velocity_limits, has_acceleration_limits]
joint_limits:
finger_joint1:
has_velocity_limits: true
max_velocity: 1
has_acceleration_limits: false
max_acceleration: 0
joint1:
has_velocity_limits: true
max_velocity: 1
has_acceleration_limits: false
max_acceleration: 0
joint2:
has_velocity_limits: true
max_velocity: 1
has_acceleration_limits: false
max_acceleration: 0
joint3:
has_velocity_limits: true
max_velocity: 1
has_acceleration_limits: false
max_acceleration: 0
joint4:
has_velocity_limits: true
max_velocity: 1
has_acceleration_limits: false
max_acceleration: 0
joint5:
has_velocity_limits: true
max_velocity: 1
has_acceleration_limits: false
max_acceleration: 0
joint6:
has_velocity_limits: true
max_velocity: 1
has_acceleration_limits: false
max_acceleration: 0
kinematics.yaml
arm:
kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin
kinematics_solver_search_resolution: 0.005
kinematics_solver_timeout: 0.05
kinematics_solver_attempts: 3
# MoveIt!编程基础
# 关节空间规划例程
roslaunch marm_moveit_config demo.launch
rosrun marm_planning moveit_fk.py
# 工作空间规划例程
roslaunch marm_moveit_config demo.launch
rosrun marm_planning moveit_ik.py
' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
# 笛卡尔路径规划例程
roslaunch marm_moveit_config demo.launch
rosrun marm_planning moveit_cartesian_demo.py _cartesian:=True
rosrun marm_planning moveit_cartesian_demo.py _cartesian:=False
# 自主避障规划例程
roslaunch marm_moveit_config demo.launch
rosrun marm_planning moveit_obstacles_demo.py