概述
gazebo初步
gazebo是一个ros的一个仿真平台
启动
rosrun gazebo_ros gazebo
模型下载
官网给出了一些模型可以自行插入
下载地址为 https://github.com/osrf/gazebo_models
可能打开比较麻烦
所以使用:
链接: https://pan.baidu.com/s/1KlBz4grygtHg91C3nBcM7A 密码: geq1
下载后把模型放到
~/.gazebo/models/
(如果是图形界面操作,注意显示隐藏文件夹)
panda仿真
franka_ros库的安装
本人是noetic,所以安装命令如下
sudo apt-get install ros-noetic-franka-ros
这会包含franka_description
、panda_moveit_config
等一系列包
gazebo-ros-control库的安装
sudo apt-get install ros-noetic-gazebo-ros-control
moveit库的安装
moveit用于机械臂的轨迹规划,建议还是安装
首先获取包
sudo apt install ros-noetic-moveit
接下来使用moveit设置助手可以进行一些图形化操作
roslaunch moveit_setup_assistant setup_assistant.launch
详见
https://ros-planning.github.io/moveit_tutorials/doc/setup_assistant/setup_assistant_tutorial.html
这可以帮忙自动生成一些文件
机械臂模型的整合
参考https://ros-planning.github.io/moveit_tutorials/doc/gazebo_simulation/gazebo_simulation.html
进入如下目录
/opt/ros/noetic/share/franka_description/robots
对panda_arm.xarco
、hand.xarco
进行修改
连接到世界
在panda_arm.xacro
添加如下,来连接到世界
<link name="world" />
<joint name="robot_to_world" type="fixed">
<parent link="world" />
<child link="${arm_id}_link0" />
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
</joint>
添加阻尼
添加一个常量 joint_damping(阻尼),在除了固定的每一个关节上加一个<dynamics/>
的阻尼参数,固定关节可以不加
<xacro:property name="joint_damping" value="1.0"/>
<joint name="robot_to_world" type="fixed">
<parent link="world" />
<child link="${arm_id}_link0" />
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
<dynamics damping="${joint_damping}"/>
</joint>
添加惯性矩阵
给每个link添加<inertia/>
属性,只输入六个参数是因为对称性(该数据为推测数据,非官方的)
<link name="${arm_id}_link0">
<visual>
<geometry>
<mesh filename="package://${description_pkg}/meshes/visual/link0.dae" />
</geometry>
</visual>
<collision>
<geometry>
<mesh filename="package://${description_pkg}/meshes/collision/link0.stl" />
</geometry>
</collision>
<inertial>
<origin xyz="0 0 0" rpy="0 0 0" />
<inertia ixx="0.3" ixy="0.0" ixz="0.0" iyy="0.3" iyz="0.0" izz="0.3" />
</inertial>
</link>
添加质量
<inertial>
<origin xyz="0 0 0" rpy="0 0 0" />
<mass value="3.06" />
<inertia ixx="0.3" ixy="0.0" ixz="0.0" iyy="0.3" iyz="0.0" izz="0.3" />
</inertial>
下面的质量是某网友用meshlab估计的
https://erdalpekel.de/?p=55
第八个link是一块小的金属圆柱,可以不加质量
添加关节摩擦力和颜色
是按照0.2摩擦系数来算的,手臂颜色是白色,爪子颜色是灰色
在刚才的目录新建panda.gazebo.xacro
(这样新建是为了简洁),输入如下代码
<?xml version='1.0' encoding='utf-8'?>
<!-- panda.gazebo.xacro -->
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:macro name="panda_gazebo" params="arm_id">
<xacro:macro name="arm_gazebo" params="link">
<gazebo reference="${link}">
<material>Gazebo/White</material>
<mu1>0.2</mu1>
<mu2>0.2</mu2>
</gazebo>
</xacro:macro>
<xacro:macro name="hand_gazebo" params="link">
<gazebo reference="${link}">
<material>Gazebo/Grey</material>
<mu1>0.2</mu1>
<mu2>0.2</mu2>
</gazebo>
</xacro:macro>
<xacro:arm_gazebo link="${arm_id}_link0"/>
<xacro:arm_gazebo link="${arm_id}_link1"/>
<xacro:arm_gazebo link="${arm_id}_link2"/>
<xacro:arm_gazebo link="${arm_id}_link3"/>
<xacro:arm_gazebo link="${arm_id}_link4"/>
<xacro:arm_gazebo link="${arm_id}_link5"/>
<xacro:arm_gazebo link="${arm_id}_link6"/>
<xacro:hand_gazebo link="${arm_id}_link7"/>
<xacro:hand_gazebo link="${arm_id}_link8"/>
<xacro:hand_gazebo link="${arm_id}_hand"/>
<xacro:hand_gazebo link="${arm_id}_rightfinger"/>
<xacro:hand_gazebo link="${arm_id}_leftfinger"/>
</xacro:macro>
</robot>
题外话
inertial标签下为惯性相关参数,其下包括origin、mass、inertia三部分。其中:
- origin部分为惯性参考系相对于本坐标系(wheel_lf_link坐标系)的姿态,惯性参考系的原点即为重心,坐标轴一般默认与本坐标系对齐(rpy参数均为0):
<origin xyz="0 0.0125 0" rpy="0 0 0" />
- mass标签下为质量参数,即本link下全部零件(左前轮)的总质量,单位为千克:
<mass value="0.09763481" />
- inertia标签下为本link下零件在本坐标系下的惯性张量,单位为千克*平方米:
<inertia ixx="3.51383610148207E-05" ixy="0" ixz="0" iyy="6.01064294059595E-05" iyz="0" izz="3.51383610148207E-05" />
joint标签下为关节相关参数,其下包括name、type、origin、parent、child、axis六部分。其中:
- name为关节名称
- type为关节类型:
<joint name="wheel_lf_joint" type="continuous">
- origin为子link坐标系相对于父link坐标系的坐标变换,包括xyz和rpy六个数据:
<origin xyz="0.0625 0.05 0.014" rpy="0 0 0" />
- parent为父link名称
- child为子link名称;
<parent link="base_link" /> <child link="wheel_lf_link" />
- axis为基准轴在本坐标系中的姿态:
添加执行器(马达)
<xacro:macro name="arm_control" params="transmission joint motor">
<transmission name="${transmission}">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${joint}">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
</joint>
<actuator name="${motor}">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
</xacro:macro>
<xacro:arm_control transmission="${arm_id}_tran_1" joint="${arm_id}_joint1" motor="${arm_id}_motor_1"/>
类似的把完整的写在panda.control.xacro
中
汇总配置后的模型
<?xml version="1.0" encoding="utf-8"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="panda">
<xacro:include filename="$(find franka_description)/robots/panda_arm.xacro"/>
<xacro:include filename="$(find franka_description)/robots/hand.xacro"/>
<xacro:include filename="$(find franka_description)/robots/panda.gazebo.xacro"/>
<xacro:include filename="$(find franka_description)/robots/panda.control.xacro"/>
<xacro:panda_arm xyz="0 0 0" rpy="0 0 0" connected_to="world" arm_id="panda"/>
<xacro:hand ns="panda" rpy="0 0 ${-pi/4}" connected_to="panda_link8"/>
<xacro:panda_gazebo arm_id="panda"/>
<xacro:panda_control arm_id="panda"/>
</robot>
配置控制器
# MoveIt-specific simulation settings
moveit_sim_hw_interface:
joint_model_group: controllers_initial_group_
joint_model_group_pose: controllers_initial_pose_
# Settings for ros_control control loop
generic_hw_control_loop:
loop_hz: 300
cycle_time_error_threshold: 0.01
# Settings for ros_control hardware interface
hardware_interface:
joints:
- panda_joint1
- panda_joint2
- panda_joint3
- panda_joint4
- panda_joint5
- panda_joint6
- panda_joint7
- panda_finger_joint1
sim_control_mode: 1 # 0: position, 1: velocity
# Publish all joint states
# Creates the /joint_states topic necessary in ROS
joint_state_controller:
type: joint_state_controller/JointStateController
publish_rate: 50
panda_arm_controller:
type: effort_controllers/JointTrajectoryController
joints:
- panda_joint1
- panda_joint2
- panda_joint3
- panda_joint4
- panda_joint5
- panda_joint6
- panda_joint7
gains:
panda_joint1: { p: 12000, d: 50, i: 0.0, i_clamp: 10000 }
panda_joint2: { p: 30000, d: 100, i: 0.02, i_clamp: 10000 }
panda_joint3: { p: 18000, d: 50, i: 0.01, i_clamp: 1 }
panda_joint4: { p: 18000, d: 70, i: 0.01, i_clamp: 10000 }
panda_joint5: { p: 12000, d: 70, i: 0.01, i_clamp: 1 }
panda_joint6: { p: 7000, d: 50, i: 0.01, i_clamp: 1 }
panda_joint7: { p: 2000, d: 20, i: 0.0, i_clamp: 1 }
constraints:
goal_time: 2.0
state_publish_rate: 25
panda_hand_controller:
type: effort_controllers/JointTrajectoryController
joints:
- panda_finger_joint1
- panda_finger_joint2
gains:
panda_finger_joint1: { p: 5, d: 3.0, i: 0, i_clamp: 1 }
panda_finger_joint2: { p: 5, d: 1.0, i: 0, i_clamp: 1 }
state_publish_rate: 25
controller_list:
- name: panda_arm_controller
action_ns: follow_joint_trajectory
type: FollowJointTrajectory
default: true
joints:
- panda_joint1
- panda_joint2
- panda_joint3
- panda_joint4
- panda_joint5
- panda_joint6
- panda_joint7
- name: panda_hand_controller
action_ns: follow_joint_trajectory
type: FollowJointTrajectory
default: true
joints:
- panda_finger_joint1
- panda_finger_joint2
完全替换掉panda_moveit_config/config/ros_controllers.yaml
主要是修改为力的输出并设置pid增益?
之后是把模型存到gazebo服务器并在空世界生成,加载moveit在rviz的可视化工具,然后就可以进行路径规划了(咕咕)
通常问题
机械臂鬼畜摆动
没有使用力控制器而是在用位置控制器之类的
gazebo和rviz的机械臂位姿不同
没有重新映射
<node name="joint_state_desired_publisher" pkg="topic_tools" type="relay" args="joint_states joint_states_desired" />
完整代码详见资源https://download.csdn.net/download/qq_35975855/21458798 亲测可用
最后
以上就是潇洒季节为你收集整理的ros-noetic gazebo 对Panda机器人仿真笔记gazebo初步panda仿真的全部内容,希望文章能够帮你解决ros-noetic gazebo 对Panda机器人仿真笔记gazebo初步panda仿真所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复