Jaka_ros使用说明_v2.2

控制 JAKA 机器人

在这里插入图片描述

设置终端环境

  1. 在bash配置文件末尾添加以下信息,用来自动加载ROS工作空间,终端输入:
echo "source ~/xxx/devel/setup.sh" >> ~/.bashrc 
  1. 使配置生效,终端输入:source ~/.bashrc
  2. 确认是否写入成功,终端输入:gedit ~/.bashrc
  3. 重新编译,终端输入:catkin_make

在这里插入图片描述
在这里插入图片描述

ROS 常用指令

常用命令含义
roscore启动节点管理器
cd ~/catkin_ws catkin_make编译 ROS 程序
source ./devel/setup.bash添加程序包到环境变量中
rospack list查看软件包列表和定位软件包
rospack find package-name寻找一个软件包的目录
rosrun package-name executable-name启动节点
rosnode list查看节点列表
rosnode info node-name查看特定节点信息
rosnode kill node-name终止节点
rostopic -h查看 rostopic 所有操作
rostopic list查看所有 Topic 列表
rosrun rqt_graph rqt_graph rosrun rqt_plot rqt_plot图形化显示 topic
rostopic echo [topic]查看某个 Topic 信息
rostopic type [topic] rosmsg show [msg_type]查看 Topic 消息格式
rosservice -h查看所有 service 操作
rosservice list查看 service 列表
roslaunch package_name file.launch运行 launch 文件

设置编写.sh脚本启动文件

.sh 文件是一种脚本文件,主要在类Unix操作系统如Linux和macOS中使用。它是与Bash(Bourne Again SHell)或其他Shell程序关联的文本文件,用于存储一系列命令。这些命令是为了自动化任务而编写,当脚本被执行时,Shell会按顺序读取并执行这些命令,就像在命令行界面手动输入它们一样。
.sh文件的特点和用途包括:
自动化任务:可以将常见的或者复杂的命令序列整合到一个脚本中,以便快速执行重复性任务。
批量处理:处理大量文件或数据时,通过脚本可以高效地进行批量操作。
配置管理:用于系统配置或初始化设置,比如安装软件、设置环境变量等。
条件执行与控制结构:支持if语句、循环(for, while)等控制结构,使得脚本可以根据不同条件执行不同操作。
可移植性:因为是文本文件,易于阅读和修改,也便于在不同的Unix-like系统间迁移。
要运行.sh文件,通常需要给予执行权限,并可以通过以下几种方式执行:
在终端中,使用 ./script_name.sh 命令,前提是您位于该脚本所在的目录下,并且脚本具有执行权限。
使用 sh script_name.sh 命令,这不强制要求脚本本身具有执行权限。
通过修改文件权限使其可执行,使用命令 chmod +x script_name.sh,然后使用 ./script_name.sh 来运行。
.sh文件是系统管理员和高级用户日常工作中不可或缺的工具,对于自动化和简化系统维护任务特别有用。

#!/bin/bash 
source /opt/ros/noetic/setup.bash
##source ~/librealsense/devel/setup.bash
##source ~/pata/devel/setup.bash
source ~/jaka_ws/devel/setup.bash
sleep 10;
##gnome-terminal --tab --title="camera" -x bash -c "roslaunch realsense2_camera rs_camera.launch" & sleep 15;
##gnome-terminal --tab --title="rgbd" -x bash -c "rosrun pata_demo rgbd" & sleep 5;
gnome-terminal --tab --title="jaka" -x bash -c "rosrun jaka_driver project_0416_Hand" & sleep 1;

解释:

gnome-terminal: 这是GNOME桌面环境中的终端模拟器命令,用于打开新的终端窗口或标签页。
--tab: 参数告诉gnome-terminal在现有终端中打开一个新的标签页,而不是一个新的窗口。
--title="jaka": 设置新打开的标签页的标题为“jaka”,方便用户识别。
-x bash -c: 这个组合参数告诉gnome-terminal在新标签页中执行Bash shell,并传递给Bash一个命令字符串来执行。-x选项使Bash在执行时将命令和它们的参数打印出来,这对于调试脚本很有用。
"rosrun jaka_driver project_0416_Hand": 这是要在Bash shell中执行的具体命令。它使用ROS的rosrun命令来运行jaka_driver包中的project_0416_Hand节点。
;: 分号用于分隔Linux命令,允许在同一行执行多个命令。
sleep 1: 在执行完上述命令后,让脚本暂停1秒。这可能用于给系统一些时间来准备或确保操作顺序,例如在连续打开多个终端标签页时避免瞬间资源争抢。

Jaka_Ros 驱动接口

启动 robot_start_launch.launch 文件

<launch>
	<param name="ip" value="$(arg ip)" type="str"/>
	<node pkg="jaka_driver" type="jaka_driver" name="jaka_driver" output="screen"/>
</launch>
这是一个ROS(机器人操作系统)的启动文件XML。其内容解析如下:

<launch> 标签:这是ROS启动文件的根元素,包含了所有其他元素。

<param> 标签:这个元素用来定义可以在ROS系统中被节点访问的参数。在这里:

name="ip":参数的名字,这里是"ip"value="10.5.5.100":参数的值,一个表示IP地址的字符串(10.5.5.100)。
type="str":指定该值为字符串类型。
<node> 标签:这个元素用于启动一个ROS节点。各属性含义如下:

pkg="jaka_driver":包含节点的包名称,这里为"jaka_driver"type="jaka_driver":要运行的实际节点可执行文件,与包同名。
name="jaka_driver":ROS图中节点的唯一标识符。
output="screen":指示ROS将节点的输出直接显示在屏幕上。
launch-prefix="xterm -e gdb -ex run --args":这是一个启动前缀命令,会在运行节点前执行。它会启动一个xterm终端并运行gdb(GNU调试器),参数-ex run --args用于调试节点,这样可以控制代码的执行,如设置断点、单步执行等。
整个启动文件的目的是初始化一个名为"jaka_driver"的ROS节点,来自"jaka_driver"包,并将其连接到IP地址10.5.5.100。同时,通过gdb设置调试环境,以便对节点的执行进行详细的检查和控制。

关节运动

使用 rosservice call /jaka_driver/joint_move 并按要求输入参数,控制机器
人做关节运动。
在这里插入图片描述

注:案例将运动接口设置为阻塞接口,若是需要改为非阻塞接口可以通过修
改 jaka_driver.cpp 文件的相应接口参数实现。

直线运动

使用 rosservice call /jaka_driver/linear_move 并按要求输入参数,控制机器
人运动。注意:以下示例 pose 参数仅作参考,具体参数需根据实际型号设置(该示例为
Zu3),否则可能导致执行失败,同时 APP 弹出“直线运动到目标位置失败”,失败原因:
(1)超出运动范围;(2)遇到奇异点。

在机器人学中,奇异点是指机器人手臂在某些特定的位置或姿态时,其关节变量的雅可比矩阵(Jacobian Matrix)的行列式为零或接近零,导致机器人的运动控制变得不稳定或者无法运动。对于协作机械臂而言,奇异点同样是一个需要避免的问题,因为它们可能导致运动精度下降、力矩限制失效,甚至损坏机械臂或工作环境。

遇到奇异点时,可以采取以下策略来解决或避免:

重新规划路径:避开奇异点,通过算法重新规划机械臂的运动路径,使其在安全的非奇异区域运动。
关节空间控制:在接近奇异点时,切换到关节空间控制,通过调整关节角度而非末端执行器的位置来避开奇异位置。
力控模式:在协作机械臂中,常常有力/扭矩控制模式,当接近奇异点时,可以通过力反馈来限制继续进入奇异点。
增加冗余自由度:有些机器人设计有额外的关节以增加自由度,这有助于避免奇异点,因为额外的自由度可以提供更多运动路径选择。
软件滤波:在软件层面,可以设计滤波器或提前警告系统,当检测到即将进入奇异点时,提前做出反应。
硬件设计:优化机械臂的结构和关节布局,例如使用平行连杆机构,可以减少奇异点的出现。
用户提示:在人机交互界面中,当检测到奇异点时,向用户提供警告,指导他们改变操作或路径。
如果你正在编写代码来处理这个问题,可以使用逆动力学或正动力学库(如Robot Operating System, ROS 中的moveit!框架)来帮助规划和避免奇异点。确保在编程时考虑到这些策略,并进行充分的测试和验证。

求解机械臂正解

使用 rosservice call /jaka_driver/get_fk 并按要求输入参数,求取正解。

求解机械臂逆解

使用 rosservice call /jaka_driver/get_ik 并按要求输入参数,求取逆解。

Moveit 和 Gazebo 联合使用

实现功能:启动 Rviz 和 Gazebo,在 Rviz 中规划路径并执行,在 Gazebo 中的机器人仿真模型会移动到相应位置。具体操作步骤为:

启动 Zu3 的 demo_gazebo.launch 文件同时启动 Rviz 和 Gazebo。

若要启动其它型号机器人修改输入命令为相应 moveit 配置功能包(jaka_xx_moveit_config)即可。

roslaunch jaka_zu3_moveit_config demo_gazebo.launch 

从 RVIZ 界面的“Goal state”选择一个目标位置,点击“Plan & Execute”,RVIZ 界面会显示机器人的轨迹,并驱动 Gazebo 中仿真机器人到设置的目标位置。

注意:启动 demo_gazebo.launch 文件会出现报错“No p gain specified for pid.”,该报错是由于Moveit 设置使用的控制器是位置控制器,pid 不需要设置,就会存在这个报错,但不会影响使用。

<launch>

  <!-- By default, we do not start a database (it can be large) -->
  <arg name="db" default="false" />
  <!-- Allow user to specify database location -->
  <arg name="db_path" default="$(find jaka_zu3_moveit_config)/default_warehouse_mongo_db" />

  <!-- By default, we are not in debug mode -->
  <arg name="debug" default="false" />

  <!-- By default, we won't load or override the robot_description -->
  <arg name="load_robot_description" default="false"/>

  <!--
  By default, hide joint_state_publisher's GUI

  MoveIt!'s "demo" mode replaces the real robot driver with the joint_state_publisher.
  The latter one maintains and publishes the current joint configuration of the simulated robot.
  It also provides a GUI to move the simulated robot around "manually".
  This corresponds to moving around the real robot without the use of MoveIt.
  -->
  <arg name="use_gui" default="false" />

  <!-- Gazebo specific options -->
  <arg name="gazebo_gui" default="true"/>
  <arg name="paused" default="false"/>
  <!-- By default, use the urdf location provided from the package -->
  <arg name="urdf_path" default="$(find jaka_description)/urdf/jaka_zu3.urdf"/>

  <!-- launch the gazebo simulator and spawn the robot -->
  <include file="$(find jaka_zu3_moveit_config)/launch/gazebo.launch" >
    <arg name="paused" value="$(arg paused)"/>
    <arg name="gazebo_gui" value="$(arg gazebo_gui)"/>
    <arg name="urdf_path" value="$(arg urdf_path)"/>
  </include>

  <!-- If needed, broadcast static tf for robot root -->
  

  <!-- We do not have a robot connected, so publish fake joint states -->
  <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" unless="$(arg use_gui)">
    <rosparam param="source_list">[move_group/fake_controller_joint_states]</rosparam>
    <rosparam param="source_list">[/joint_states]</rosparam>
  </node>
  <node name="joint_state_publisher" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" if="$(arg use_gui)">
    <rosparam param="source_list">[move_group/fake_controller_joint_states]</rosparam>
    <rosparam param="source_list">[/joint_states]</rosparam>
  </node>

  <!-- Given the published joint states, publish tf for the robot links -->
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" respawn="true" output="screen" />

  <!-- Run the main MoveIt! executable without trajectory execution (we do not have controllers configured by default) -->
  <include file="$(find jaka_zu3_moveit_config)/launch/move_group.launch">
    <arg name="allow_trajectory_execution" value="true"/>
    <arg name="fake_execution" value="false"/>
    <arg name="info" value="true"/>
    <arg name="debug" value="$(arg debug)"/>
    <arg name="load_robot_description" value="$(arg load_robot_description)"/>
  </include>

  <!-- Run Rviz and load the default config to see the state of the move_group node -->
  <include file="$(find jaka_zu3_moveit_config)/launch/moveit_rviz.launch">
    <arg name="rviz_config" value="$(find jaka_zu3_moveit_config)/launch/moveit.rviz"/>
    <arg name="debug" value="$(arg debug)"/>
  </include>

  <!-- If database loading was enabled, start mongodb as well -->
  <include file="$(find jaka_zu3_moveit_config)/launch/default_warehouse_db.launch" if="$(arg db)">
    <arg name="moveit_warehouse_database_path" value="$(arg db_path)"/>
  </include>

</launch>

Moveit 和真实机器人联合使用

实现功能:启动 moveit 服务端及 RVIZ,RVIZ 规划路径,真实机械臂会移动到相应
位置。

前提条件:jaka_driver 服务端和 Moveit 服务端不能同时启动,所以启动 moveit 服务端之前确认 jaka_driver 服务端已经关闭(即未启动 robot_start_launch.launch)。

命令具体操作步骤

具体操作步骤为:

  1. 打开jaka_planner,启动 moveit_server.launch 文件(Moveit 服务端)。
  2. 启动 moveit 服务端时通过 ros 命令传参告知服务端机器人型号及 IP。新建终端,并输入:
roslaunch jaka_planner moveit_server.launch ip:=192.168.1.168 model:=zu3 

注意:ip:=xxx 中,xxx 表示机器人 IP 地址。model:=xxx 中,xxx 表示各机器人型号,均为小写,例如:zu3、minicobo、pro16。

  1. 另外新建一个终端,启动 demo.launch 文件(Moveit 客户端)。
roslaunch jaka_zu3_moveit_config demo.launch 

生成如下界面:Rviz 显示的姿态和实体机器人当前姿态一致。

  1. 从 RVIZ 界面的“Goal state”选择一个目标位置,点击“Plan & Execute”,RVIZ 界面会显示机器人的轨迹,并驱动实体机器人到设置的目标位置。

    注意:点击“Plan & Execute”,机器人运动停止后可能出现以下警告,这是由于 ros controller 更新与 joint_states 更新时间不同步引起的,不会影响机器运动,可忽略。

在这里插入图片描述

代码端控制

  1. 请参考以下文件/jaka_robot_v2.2/src/jaka_planner/src/moveit_test.cpp
    注:
    (1)示例代码型号对应的是 zu3,若机器人为其他型号需要先确认代码中的位置是否可
    达且在安全区域。
    (2)启动方式:分别在 3 个终端输入以下命令
roslaunch jaka_planner moveit_server.launch ip:=192.168.1.168 model:=zu3 
roslaunch jaka_zu3_moveit_config demo.launch 
rosrun jaka_planner moveit_test 

JAKA 机器人 ROS 功能包应用案例:

编写jaka zu3机械臂视觉抓取的代码

要编写jaka zu3机械臂视觉抓取的代码,需要以下步骤:
安装机械臂控制器软件和相机驱动程序
连接相机和机械臂控制器
编写相机的图像采集程序,并将采集到的图像传输到机械臂控制器
编写机械臂的控制程序,实现机械臂的抓取动作
在控制程序中集成视觉和机械臂控制,实现视觉抓取功能

下面是一个简单的视觉抓取代码的示例:

# 导入相关库
import cv2
import numpy as np
from jaka_zu3_api import JakaZu3API

# 初始化机械臂控制器
robot = JakaZu3API()

# 初始化相机
camera = cv2.VideoCapture(0)

while True:
    # 读取相机图像
    ret, img = camera.read()
    
    # 对图像进行处理,提取[目标](https://geek.csdn.net/educolumn/06c7a9ffb1969a0ad080048a16f82c4e?spm=1055.2569.3001.10083)物体的轮廓
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    blur = cv2.GaussianBlur(gray, (5, 5), 0)
    ret, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    # 如果存在[目标](https://geek.csdn.net/educolumn/06c7a9ffb1969a0ad080048a16f82c4e?spm=1055.2569.3001.10083)物体,就进行抓取
    if len(contours) > 0:
        # 计算[目标](https://geek.csdn.net/educolumn/06c7a9ffb1969a0ad080048a16f82c4e?spm=1055.2569.3001.10083)物体的质心
        M = cv2.moments(contours[0])
        cx = int(M['m10']/M['m00'])
        cy = int(M['m01']/M['m00'])
        
        # 控制机械臂移动到[目标](https://geek.csdn.net/educolumn/06c7a9ffb1969a0ad080048a16f82c4e?spm=1055.2569.3001.10083)物体上方并抓取
        robot.move_to((cx, cy, 100))
        robot.open_gripper()
        robot.move_to((cx, cy, 50))
        robot.close_gripper()
        robot.move_to((cx, cy, 100))
        
    # 显示图像
    cv2.imshow('image', img)
    
    # 等待按键
    key = cv2.waitKey(1)
    if key == 27:
        break
        
# 释放资源
camera.release()
cv2.destroyAll[window](https://geek.csdn.net/educolumn/03e5a5a554174a38fdfeb8376bd685e2?spm=1055.2569.3001.10083)s()
  • 26
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

没有余地 EliasJie

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

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

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

打赏作者

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

抵扣说明:

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

余额充值