ros-noetic gazebo 对Panda机器人仿真笔记

这篇博客介绍了如何在ROS的Gazebo仿真环境中配置和控制Franka Panda机械臂。首先讲解了启动Gazebo和安装相关库,如franka_ros和gazebo-ros-control。接着详细阐述了如何下载和修改机械臂模型,包括添加世界连接、关节阻尼、惯性和质量参数。此外,还提到了设置关节摩擦力和颜色,并创建了gazebo.xacro文件。最后,配置了控制器参数,包括力控制和PID增益,并提供了可能出现的问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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_descriptionpanda_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.xarcohand.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.youkuaiyun.com/download/qq_35975855/21458798 亲测可用

<think>好的,我现在需要解决用户遇到的在安装ros-noetic-gazebo-dev和ros-noetic-gazebo-ros时出现的“E: Unable to locate package”错误。首先,我应该回忆一下ROS Noetic的安装流程和相关依赖包的管理。 用户提到他们尝试安装这两个包,但系统提示找不到。可能的原因有几个: 1. **软件源未正确配置**:ROS的软件源可能没有被正确添加到系统的sources.list中,导致apt无法找到相关的包。需要确认用户是否按照官方指南添加了正确的仓库。 2. **包名称错误**:用户可能输入了错误的包名,比如拼写错误或者包的实际名称不同。我需要检查这两个包在ROS Noetic中的确切名称。 3. **未更新软件列表**:有时候,添加了新的软件源后,需要运行sudo apt update来更新本地的包索引,否则apt不知道有新包可用。 接下来,我需要查阅用户提供的引用内容。引用[2]提到用户是在Jetson Nano上安装ROS Noetic,并配置了软件源。引用[4]中用户尝试安装ros-noetic-simulators时遇到依赖问题,但后来通过安装其他依赖包解决了部分问题。引用[4]还提到安装了ros-noetic-gazebo-ros-pkgs,这可能是一个相关的包。 首先,我应该确认ros-noetic-gazebo-dev和ros-noetic-gazebo-ros是否存在。根据ROS官方文档,gazebo-ros包确实存在,但通常安装的是ros-noetic-gazebo-ros-pkgs,它可能包含了所需的组件。而gazebo-dev可能属于开发包,可能需要不同的命名或者被包含在其他包中。 可能的解决方案步骤: 1. **检查软件源**:确保用户已经正确配置了ROSGazebo的软件源。ROS的安装通常需要添加packages.ros.org的源,而Gazebo可能需要OSRF的仓库。引用[4]中提到用户已经配置了软件源,但可能缺少Gazebo的源。 2. **更新包列表**:运行sudo apt update,确保本地缓存是最新的。 3. **确认包名称**:检查正确的包名。例如,ros-noetic-gazebo-ros-pkgs可能已经包含了所需的ros-noetic-gazebo-ros。此外,可能不需要单独安装-dev包,或者该包可能已被合并或改名。 4. **安装相关包组**:使用rosdep安装依赖,或者安装metapackage,如ros-noetic-desktop-full,这可能会包含所需的Gazebo相关包。 5. **检查Gazebo版本兼容性**:ROS Noetic通常与Gazebo 9或11配合使用,需要确保系统安装了正确版本的Gazebo,并且ROS包与之兼容。 在用户提供的引用[4]中,他们成功安装了ros-noetic-gazebo-ros-pkgs,所以可能需要建议用户安装这个包,而不是单独找gazebo-ros。另外,可能用户需要先安装Gazebo本身,再安装ROS的接口包。 可能的错误原因:用户可能没有添加Gazebo的软件源,或者ROS的软件源中没有这些特定的包。需要指导用户正确添加所有必要的仓库,并确保系统架构(arm64)支持这些包。 总结解决步骤: 1. 更新系统并添加必要的软件源。 2. 安装完整的ROS桌面版以包含Gazebo包。 3. 使用正确的包名称安装。 4. 处理依赖问题,使用rosdep解决。</think>### 分步解决方案 **问题**:安装`ros-noetic-gazebo-dev`和`ros-noetic-gazebo-ros`时出现`E: Unable to locate package`错误 #### 1. 检查软件源配置 - **原因**:未正确配置ROSGazebo软件源时,系统无法找到相关包。 - **操作**: 1. 添加ROS官方源: ```bash sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' ``` 2. 添加Gazebo源(以Gazebo 11为例,适配Ubuntu 20.04): ```bash sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -sc) main" > /etc/apt/sources.list.d/gazebo-stable.list' ``` 3. 导入密钥: ```bash curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | sudo apt-key add - curl -sSL http://packages.osrfoundation.org/gazebo.key | sudo apt-key add - ``` #### 2. 更新软件包列表 - **原因**:新添加的软件源需要同步到本地。 - **操作**: ```bash sudo apt update ``` #### 3. 确认正确的包名称 - **原因**:部分包可能被合并或命名不同。 - **操作**: 1. Gazebo ROS接口通常通过`ros-noetic-gazebo-ros-pkgs`提供[^4]: ```bash sudo apt install ros-noetic-gazebo-ros-pkgs ``` 2. 开发包可能需要安装: ```bash sudo apt install ros-noetic-gazebo-ros-dev ``` 3. 若需完整功能,建议安装桌面完整版: ```bash sudo apt install ros-noetic-desktop-full ``` #### 4. 使用rosdep解决依赖 - **原因**:ROS依赖管理工具可自动处理缺失依赖[^3]。 - **操作**: ```bash sudo rosdep init rosdep update rosdep install --from-paths src --ignore-src -r -y ``` #### 5. 验证Gazebo版本 - **原因**:ROS Noetic需匹配Gazebo 11。 - **操作**: 1. 安装Gazebo 11: ```bash sudo apt install gazebo11 ``` 2. 检查Gazebo ROS插件配置(参考引用[1]的`<gazebo>`标签配置)。 --- ### 最终验证 ```bash # 检查包是否安装成功 apt search ros-noetic-gazebo # 启动Gazebo测试 roscore & gazebo ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萧易风船长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值