有多少人工,就有多少智能

Franka Ros2 Build & Install

! franka_ros2在 Windows 上不受支持。

franka_ros2 repo包含libfranka的 ROS 2 集成 

 

franka_ros2 正在快速开发中。预计会出现重大变化。在 GitHub上报告错误。

先决条件:

  • ROS 2 Humble 安装 ros-humble-desktop)或带有 DevContainer 的 VSCode IDE。

  • PREEMPT_RT 内核可选,但强烈推荐)。

  • 对于cartesian_posejoint_positionelbow_position命令接口来说,实时内核是绝对必要的。

  • 系统范围的libfranka 安装。libfranka 的最低支持版本是 0.13.2。这是一个最小示例:

sudo apt install -y libpoco-dev libeigen3-dev
git clone https://github.com/frankaemika/libfranka.git --recursive
cd libfranka
git checkout 0.13.2
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=OFF  ..
cmake --build . -j$(nproc)
cpack -G DEB
sudo dpkg -i libfranka-*.deb

可选的 .bashrc 设置:

  • 要获得彩色的警告和错误消息,您可以将它放入 您的 中export RCUTILS_COLORIZED_OUTPUT=1.bashrc

  • 如果您的系统语言未设置为美式英语,您应该输入 避免 RViz 中出现问题。export LC_NUMERIC=en_US.UTF-8.bashrc

设置

从源安装

  1. 安装要求:

    sudo apt install -y \
    ros-humble-ament-cmake \
    ros-humble-ament-cmake-clang-format \
    ros-humble-angles \
    ros-humble-ros2-controllers \
    ros-humble-ros2-control \
    ros-humble-ros2-control-test-assets \
    ros-humble-controller-manager \
    ros-humble-control-msgs \
    ros-humble-control-toolbox \
    ros-humble-generate-parameter-library \
    ros-humble-joint-state-publisher \
    ros-humble-joint-state-publisher-gui \
    ros-humble-moveit \
    ros-humble-pinocchio \
    ros-humble-realtime-tools \
    ros-humble-xacro \
    ros-humble-hardware-interface \
    ros-humble-ros-gz \
    python3-colcon-common-extensions

    2. 创建 ROS 2 工作区:

    mkdir -p ~/franka_ros2_ws/src

      3. 克隆 repo 并构建包:

source /opt/ros/humble/setup.bash
cd ~/franka_ros2_ws
git clone https://github.com/frankaemika/franka_ros2.git src/franka_ros2
git clone https://github.com/frankaemika/franka_description.git src/franka_description
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
source install/setup.sh

使用 VSCode DevContainer

FrankaROS2 软件包带有 .devcontainer 文件夹,开发人员无需手动安装 ROS2 或 libfranka 即可使用 FrankaROS2 软件包。VSCode DevContainer 工作示意图如下图所示:

  1. 按照 VSCode devcontainer_setup的设置指南进行操作

  2. 创建 ROS 2 工作区:

mkdir franka_ros2_ws
cd franka_ros2_ws

3. 克隆仓库:

git clone https://github.com/frankaemika/franka_ros2.git src/franka_ros2
git clone https://github.com/frankaemika/franka_description.git src/franka_description

4. 将 .devcontainer 文件夹移动到 franka_ros2_ws 父文件夹:

mv src/franka_ros2/.devcontainer .

5. 打开 VSCode:

code .

6.在 DevContainer 中打开当前文件夹:

ctrl + shift + p

在命令提示符栏中写入:

Dev Containers: Rebuild and Reopen in Container

并在搜索结果中点击此选项

7.在 VScode 中打开终端:

ctrl + `

8. 获取环境:

source /opt/ros/humble/setup.sh

9. 安装 Franka ROS 2 软件包:

colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
source install/setup.sh

移動

为了检查一切是否正常,你可以尝试在机器人上运行 MoveIt 示例:

ros2 launch franka_fr3_moveit_config moveit.launch.py robot_ip:=<fci-ip>

MotionPlanning然后在RViz中激活显示。

如果您没有机器人,您仍然可以通过在虚拟硬件上运行来测试您的设置:

ros2 launch franka_fr3_moveit_config moveit.launch.py robot_ip:=dont-care use_fake_hardware:=true

等到您可以在终端内看到 MoveIt 的绿色消息。然后关闭并重新打开。之后再打开You can start planning now!PlanningSceneMotionPlanning

控制器示例

这个 repo 附带了位于包中的几个示例控制器franka_example_controllers

默认情况下,以下启动文件与夹持器一起执行。如果您未连接夹持器,则可以使用 禁用启动文件中的夹持器load_gripper:=false

移至开始

该控制器将机器人移动到其原始配置。

ros2 launch franka_bringup move_to_start_example_controller.launch.py arm_id:=fr3 robot_ip:=<fci-ip>

重力补偿

这是我们拥有的最简单的控制器,也是编写自己的控制器的良好起点。它将零作为扭矩命令发送到所有关节,这意味着机器人仅补偿其自身重量。
ros2 launch franka_bringup gravity_compensation_example_controller.launch.py arm_id:=fr3 robot_ip:=<fci-ip>

关节阻抗示例

该示例以非常柔顺的周期性运动移动关节 4 和 5。您可以尝试在运行时移动关节。

 

ros2 launch franka_bringup joint_impedance_example_controller.launch.py arm_id:=fr3 robot_ip:=<fci-ip

带 IK 的关节阻抗示例

该示例使用 MoveIt 服务中的 LMA-Orocos 解算器来计算所需姿势的关节位置。所需姿势是周期性地沿 x 和 z 方向移动末端执行器。您可以在 franka_moveit_config 包 kinematics.yaml 文件中更改运动学解算器。

ros2 launch franka_bringup joint_impedance_with_ik_example_controller.launch.py arm_id:=fr3 robot_ip:=<fci-ip>

模型示例控制器

这是一个只读控制器,它打印相对于基准框架的科里奥利力矢量、重力矢量、Joint4 的姿势矩阵、Joint4 主体雅可比矩阵和末端执行器雅可比矩阵。

ros2 launch franka_bringup model_example_controller.launch.py arm_id:=fr3 robot_ip:=<fci-ip>

关节位置示例

此示例向机器人发送周期性位置命令。

位置轨迹需要从机器人的初始位置开始。

要读取机器人的起始位置,您可以在开始发送任何命令之前读取initial_joint_position . state 接口值。

if (initialization_flag_) {
  for (size_t i = 0; i < 7; ++i) {
    initial_q_.at(i) = state_interface[i].get_value();
  }
  initialization_flag_ = false;
}
ros2 launch franka_bringup joint_position_example_controller.launch.py arm_id:=fr3 robot_ip:=<fci-ip>

关节速度示例

此示例向机器人的第 4 和第 5 关节发送周期性速度命令。
 
ros2 launch franka_bringup joint_velocity_example_controller.launch.py arm_id:=fr3 robot_ip:=<fci-ip>

笛卡尔姿势示例

 此示例使用 CartesianPose 接口向机器人发送周期性姿势命令。

ros2 launch franka_bringup cartesian_pose_example_controller.launch.py arm_id:=fr3 robot_ip:=<fci-ip>

笛卡尔方向示例

此示例使用 CartesianOrientation 接口发送围绕机器人末端执行器 X 轴的周期性方向命令。

ros2 launch franka_bringup cartesian_orientation_example_controller.launch.py arm_id:=fr3 robot_ip:=<fci-ip>

笛卡尔姿势肘部示例

此示例发送周期性的肘部命令,同时保持末端执行器的姿势恒定。

ros2 launch franka_bringup cartesian_elbow_example_controller.launch.py arm_id:=fr3 robot_ip:=<fci-ip>

笛卡尔速度示例

此示例使用 CartesianVelocity 接口向机器人发送周期性速度命令。

ros2 launch franka_bringup cartesian_velocity_example_controller.launch.py arm_id:=fr3 robot_ip:=<fci-ip>

笛卡尔肘部示例

此示例使用 CartesianElbow 接口向机器人发送周期性肘部命令,同时保持末端执行器速度恒定。

ros2 launch franka_bringup elbow_example_controller.launch.py arm_id:=fr3 robot_ip:=<fci-ip>

软件包描述

本节包含每个包的更详细描述。一般来说,包结构尽量遵循 此处提出的结构。

弗兰卡_bringup

该包包含示例的启动文件以及基本franka.launch.py启动文件,可用于在没有任何控制器的情况下启动机器人。

当您使用以下命令启动机器人时:

ros2 launch franka_bringup franka.launch.py arm_id:=fr3 robot_ip:=<fci-ip> use_rviz:=true

除了 之外,没有其他控制器在运行joint_state_broadcaster。但是,仍然建立了与机器人的连接,并且当前机器人姿势在 RViz 中可视化。在此模式下,当用户按下停止按钮时,可以引导机器人。但是,一旦使用 的控制器effort_command_interface启动,机器人将使用来自 libfranka 的扭矩接口。例如,可以 gravity_compensation_example_controller通过运行以下命令启动:

ros2 control load_controller --set-state active  gravity_compensation_example_controller

这相当于运行重力补偿gravity_compensation_example_controller.launch.py中提到的启动文件 

当控制器停止时:

ros2 control set_controller_state gravity_compensation_example_controller inactive

机器人将停止扭矩控制,并且仅通过 FCI 发送其当前状态。

您现在可以选择使用以下命令再次启动同一个控制器:

ros2 control set_controller_state gravity_compensation_example_controller active

或者加载并启动另一个:

ros2 control load_controller --set-state active joint_impedance_example_controller

franka_description

从 0.1.14 版本开始,franka_description 包不再在 franka_ros2 存储库中提供。它可在单独的存储库Franka Description中找到。

此包包含用于可视化机器人的 xacro 文件和网格。此外,它还包含一个启动文件,该文件可在无需访问真实机器人的情况下可视化机器人模型:

ros2 launch franka_description visualize_franka.launch.py load_gripper:=<true|false>

franka_example_controllers

此包包含一些控制器,可作为如何在 ROS 2 中编写控制器的示例。目前,控制器只能访问测量的关节位置和关节速度。基于此信息,控制器可以发送扭矩命令。目前无法使用其他接口,如关节位置接口。

弗兰卡夹子

此软件包包含用于franka_gripper_node与 交互的

提供franka_gripper_node以下操作:

  • homing- 将夹持器归位,并根据安装的手指更新最大宽度。

  • move- 以定义的速度移动到目标宽度。

  • grasp- 尝试以所需的力度抓取所需的宽度,同时以给定的速度闭合。如果d夹爪之间的距离为width epsilon.inner width epsilon.outer

  • gripper_action- MoveIt 的特殊抓握动作。

此外,还有一项stop服务可以中止夹持器动作并停止抓取。

使用以下启动文件来启动夹钳:

 
ros2 launch franka_gripper gripper.launch.py robot_ip:=<fci-ip>

您现在可以在不同的选项卡中执行归位并发送抓取命令:

ros2 action send_goal /fr3_gripper/homing franka_msgs/action/Homing {}
ros2 action send_goal -f /fr3_gripper/grasp franka_msgs/action/Grasp "{width: 0.00, speed: 0.03, force: 50}"

内部和外部 epsilon 默认为 0.005 米。您也可以明确设置 epsilon:

ros2 action send_goal -f /fr3_gripper/grasp franka_msgs/action/Grasp "{width: 0.00, speed: 0.03, force: 50, epsilon: {inner: 0.01, outer: 0.01}}"

要停止抓取,您可以使用stop服务:

ros2 service call /fr3_gripper/stop std_srvs/srv/Trigger {}

弗兰卡_硬件

自 0.1.14 版本起的重大变化:franka_hardwarerobot_state 和 robot_model 将以 为前缀arm_id

  • panda/robot_model  -> ${arm_id}/robot_model

  • panda/robot_state  -> ${arm_id}/robot_state

状态和命令接口的命名没有变化。它们以 URDF 中的关节名称作为前缀。

 

此软件包包含ros2_controlfranka_hardware所需的插件。该插件从机器人的 URDF 加载并通过机器人描述传递给控制器​​管理器。它为每个关节提供:

  • 包含测量的关节位置。position state interface

  • 包含测量的关节速度。velocity state interface

  • 包含测量的链接侧关节扭矩。effort state interface

  • 包含机器人初始关节位置的。initial_position state interface

  • 包含无重力情况下所需的关节扭矩。effort command interface

  • 包含 所需关节位置的。position command interface

  • 包含 所需关节速度的。velocity command interface

此外

  • 包含franka_robot_state机器人状态信息franka_robot_state

  • 包含franka_robot_model_interface指向模型对象的指针。

重要的

franka_robot_statefranka_robot_model_interface状态接口不应直接从硬件状态接口使用。相反,它们应该由franka_semantic_components接口使用。

机器人的 IP 是通过 URDF 中的参数读取的。

franka_语义组件

该包包含franka_robot_model、franka_robot_state和cartesian命令类。这些类用于转换franka_robot_model对象和franka_robot_state对象,它们以双指针形式存储在hardware_state_interface中。

有关如何使用这些类的更多参考: Franka Robot State Broadcaster 和 Franka Example Controllers(model_example_controller)

  • 笛卡尔位姿界面:

此接口用于使用借出的命令接口向机器人发送笛卡尔姿势命令。FrankaSemanticComponentInterface 类负责处理借出的命令接口和状态接口。在启动笛卡尔姿势接口时,用户需要向构造函数传递一个布尔标志,以指示该接口是否用于肘部。

auto is_elbow_active = false;
CartesianPoseInterface cartesian_pose_interface(is_elbow_active);

该接口允许用户读取franka硬件接口设置的当前姿势命令接口值。

std::array<double, 16> pose;
pose = cartesian_pose_interface.getInitialPoseMatrix();

人们还可以读取特征格式的四元数和平移值。

Eigen::Quaterniond quaternion;
Eigen::Vector3d translation;
std::tie(quaternion, translation) = cartesian_pose_interface.getInitialOrientationAndTranslation();

设置好笛卡尔接口后,您需要在控制器中执行assign_loaned_command_interfacesassign_loaned_state_interfaces。这需要在控制器的 on_activate() 函数中完成。示例可以在 分配借出的命令接口示例中找到

cartesian_pose_interface.assign_loaned_command_interfaces(command_interfaces_);
cartesian_pose_interface.assign_loaned_state_interfaces(state_interfaces_);

在控制器的更新功能中,您可以向机器人发送姿势命令。

std::array<double, 16> pose;
pose = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.5, 0, 0.5, 1};
cartesian_pose_interface.setCommanded(pose);

或者您可以以 Eigen 格式发送四元数、平移值。

Eigen::Quaterniond quaternion(1, 0, 0, 0);
Eigen::Vector3d translation(0.5, 0, 0.5);
cartesian_pose_interface.setCommand(quaternion, translation);
  • 笛卡尔速度接口:

此接口用于使用借出的命令接口向机器人发送笛卡尔速度命令。FrankaSemanticComponentInterface 类负责处理借出的命令接口和状态接口。

 
auto is_elbow_active = false;
CartesianVelocityInterface cartesian_velocity_interface(is_elbow_active);

要将速度命令发送给机器人,您需要在自定义控制器中分配_loaned_command_interface。

cartesian_velocity_interface.assign_loaned_command_interface(command_interfaces_);

在控制器的更新功能中,您可以向机器人发送笛卡尔速度命令。

std::array<double, 6> cartesian_velocity;
cartesian_velocity = {0, 0, 0, 0, 0, 0.1};
cartesian_velocity_interface.setCommand(cartesian_velocity);

franka_robot_state_broadcaster

此包包含只读的 franka_robot_state_broadcaster 控制器。它将 franka_robot_state 主题发布到名为/franka_robot_state_broadcaster/robot_state 的主题。此控制器节点由 franka_bringup 中的 franka_launch.py​​ 生成。因此,所有包含 franka_launch.py​​ 的示例都会发布 robot_state 主题。

弗兰卡MoveIt配置

此包包含 MoveIt2 的配置。有一个名为 的新移动组 panda_manipulator,其尖端位于夹持器手指之间,其 Z 轴旋转 -45 度,因此 X 轴现在朝前,使其更易于使用。移动组panda_arm仍然可用,以实现向后兼容。新应用程序应改用新的panda_manipulator移动组。

 新旧移动组的可视化

弗兰卡消息

该包包含不同夹持器动作和机器人状态消息的定义。

联合作用力轨迹控制器

此包包含一个经过修改的 joint_trajectory_controller,可以使用的努力接口 franka_hardware::FrankaHardwareInterface。它基于此 Pull 请求

笔记

由于修复程序已在 ros2_controllers主分支中可用,因此此软件包将很快被删除。一旦将其反向移植到 Humble,它将从 franka_ros2 存储库中删除。

弗兰卡凉亭

重要的

franka_description最低版本要求为 0.3.0。你可以从https://github.com/frankaemika/franka_description克隆 franka_description 包。

将 Franka ROS 2 与 Gazebo 模拟器集成的项目。

启动 RVIZ + Gazebo

启动一个生成 RVIZ 和 Gazebo 来显示机器人的示例:

 

ros2 launch franka_gazebo_bringup visualize_franka_robot.launch.py

如果要显示另一个机器人,可以定义arm_id:

ros2 launch franka_gazebo_bringup visualize_franka_robot.launch.py arm_id:=fp3

如果您想启动包括 franka_hand 的模拟:

ros2 launch franka_gazebo_bringup visualize_franka_robot.launch.py load_gripper:=true franka_hand:='franka_hand'

使用 Gazebo 的关节速度控制示例

开始之前,请确保构建了franka_example_controllersfranka_description包。franka_description 的最低版本必须是 0.3.0。

colcon build --packages-select franka_example_controllers

现在您可以使用 Gazebo 模拟器启动速度示例。 

ros2 launch franka_gazebo_bringup gazebo_joint_velocity_controller_example.launch.py load_gripper:=true franka_hand:='franka_hand'

请记住,夹持器关节与关节速度控制器存在错误。如果您有兴趣控制夹持器,请使用关节位置界面。

使用 Gazebo 的关节位置控制示例

要运行关节位置控制示例,您需要在关节速度控制部分列出所需的软件。

然后您可以使用以下命令运行。

ros2 launch franka_gazebo_bringup gazebo_joint_position_controller_example.launch.py load_gripper:=true franka_hand:='franka_hand'

Gazebo 的联合阻抗控制示例

对于运行扭矩示例。您必须编译位于franka_gazebo下的franka_ign_ros2_control包。您可以使用以下命令编译franka_ign_ros2_control 。

colcon build --packages-select franka_ign_ros2_control

然后获取您的工作区。

source install/setup.sh

 

然后您可以运行阻抗控制示例。

ros2 launch franka_gazebo_bringup gazebo_joint_impedance_controller_example.launch.py load_gripper:=true franka_hand:='franka_hand'

故障排除

如果您遇到 Gazebo 找不到您的模型文件的情况,请尝试包含工作区。例如

export GZ_SIM_RESOURCE_PATH=${GZ_SIM_RESOURCE_PATH}:/workspaces/src/

 

posted @ 2024-07-08 22:34  lvdongjie-avatarx  阅读(2)  评论(0编辑  收藏  举报