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_pose
、joint_position
和elbow_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
设置
从源安装
-
安装要求:
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 工作示意图如下图所示:
-
按照 VSCode devcontainer_setup的设置指南进行操作。
-
创建 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!
PlanningScene
MotionPlanning
控制器示例
这个 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>
关节速度示例
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
此包包含用于可视化机器人的 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 < d < 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_hardware
robot_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_state
和franka_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_interfaces
并assign_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_controllers和franka_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/