服务机器人与机械臂开发全解析
服务机器人开发
服务从节点
服务从节点中受监控的节点与机器人的控制直接相关。以TurtleBot3 Carrier3为例,执行SLAM和导航时所执行的节点是主要节点。为开发TurtleBot3 Carrier,对TurtleBot3源代码进行了修改,主要使用的包如下:
| 包相关说明 | 详情 |
| ---- | ---- |
| 包的用途 | 用于创建配送服务机器人 |
| 包的结构 | 图中每个箭头代表一个子包 |
| 修改需求 | 部分包需要修改以实现配送服务机器人功能 |
为创建配送服务机器人,对源代码进行了如下修改:
- 激光传感器距离处理 : poll() 函数使用LDS(HLS - LFCD2)激光传感器处理附近物体的距离测量值。由于TurtleBot3 Carrier的LDS周围有支柱,在LDS运行时会识别这些支柱,影响SLAM或导航结果。因此,当检测到物体距离小于0.15时,将检测值设为 ‘0’,在导航算法中,距离值 ‘0’ 被识别为 ‘无物体’,从而消除支柱对SLAM或导航的影响。相关代码如下:
hld_lfcd_lds_driver/src/hlds_laser_publisher.cpp
void LFCDLaser::poll(sensor_msgs::LaserScan::Ptr scan)
{
…omitted…
while (!shutting_down_ && !got_scan)
{
… omitted …
if(start_count == 0)
{
if(raw_bytes[start_count] == 0xFA)
{
start_count = 1;
}
}
else if(start_count == 1)
{
if(raw_bytes[start_count] == 0xA0)
{
… omitted …
//read data in sets of 6
for(uint16_t i = 0; i < raw_bytes.size(); i=i+42)
{
if(raw_bytes[i] == 0xFA && raw_bytes[i+1] == (0xA0 + i / 42))
{
… omitted …
for(uint16_t j = i+4; j < i+40; j=j+6)
{
index = (6*i)/42 + (j-6-i)/6;
// Four bytes per reading
uint8_t byte0 = raw_bytes[j];
uint8_t byte1 = raw_bytes[j+1];
uint8_t byte2 = raw_bytes[j+2];
uint8_t byte3 = raw_bytes[j+3];
// Remaining bits are the range in mm
uint16_t intensity = (byte1 << 8) + byte0;
uint16_t range = (byte3 << 8) + byte2;
scan->ranges[359-index] = range / 1000.0;
scan->intensities[359-index] = intensity;
}
}
}
/// Add pillars ///
for(uint16_t deg = 0; deg < 360; deg++)
{
if(scan->ranges[deg] < 0.15)
{
scan->ranges[deg] = 0.0;
scan->intensities[deg] = 0.0;
}
}
/// end of addition ///
scan->time_increment = motor_speed/good_sets/1e8;
}
else
{
start_count = 0;
}
}
}
}
- 电机驱动控制 :
turtlebot3_core是安装在TurtleBot3使用的控制板OpenCR上的固件,turtlebot3_motor_driver.cpp是直接控制TurtleBot3执行器的源代码。实际服务机器人在负载物体移动时,需要适当控制以确保安全移动。因此,在turtlebot3_motor_driver.cpp中添加了Dynamixels的轮廓控制,ADDR_X_PROFILE_ACCELERATION的值为108。相关代码如下:
turtlebot3_core(for TurtleBot3 Waffle)/turtlebot3_motor_driver.cpp
bool Turtlebot3MotorDriver::init(void)
{
… omitted …
// Enable Dynamixel Torque
setTorque(left_wheel_id_, true);
setTorque(right_wheel_id_, true);
/// begin addition ///
// Set Dynamixel Profile Acceleration
setProfileAcceleration(left_wheel_id_, 15);
setProfileAcceleration(right_wheel_id_, 15);
/// end of addition ///
… omitted …
return true;
}
bool Turtlebot3MotorDriver::setTorque(uint8_t id, bool onoff)
{
… omitted …
}
bool Turtlebot3MotorDriver::setProfileAcceleration(uint8_t id, uint32_t value)
{
uint8_t dxl_error = 0;
int dxl_comm_result = COMM_TX_FAIL;
dxl_comm_result = packetHandler_->write4ByteTxRx(portHandler_, id, ADDR_X_PROFILE_ACCELERATION,
value, &dxl_error);
if(dxl_comm_result != COMM_SUCCESS)
{
packetHandler_->printTxRxResult(dxl_comm_result);
}
else if(dxl_error != 0)
{
packetHandler_->printRxPacketError(dxl_error);
}
}
- 导航启动文件修改 :
turtlebot3_navigation.launch文件用于启动TurtleBot3导航时执行的节点。为了在多个机器人同时使用相同的ROS包,需要将节点和ROS主题分组到一个组命名空间中。在启动源代码中,将节点分组到 ‘tb3g’ 命名空间,并使用重映射功能接收来自未分组在同一命名空间中的其他节点的消息。此方法也适用于源代码中无法修改主题名称的情况。注意,此修改不仅要在启动文件中进行,还需在所有需要分组的区域(如RViz文件)中进行。相关代码如下:
turtlebot3/turtlebot3_navigation/turtlebot3_navigation.launch
<launch>
<!—- addition starts -->
<group ns="tb3g">
<remap from="/tf" to="/tb3g/tf"/>
<remap from="/tf_static" to="/tb3g/tf_static"/>
<!-- addition ends -->
<arg name="model" default="waffle" doc="model type [burger, waffle]"/>
… omitted …
</node>
<!—- addition starts -->
</group>
<!-- addition ends -->
</launch>
Android平板PC与ROS Java编程
环境搭建
为了在Linux上安装Android Studio IDE并构建ROS Java开发环境,需要进行以下操作:
1. 安装JDK :
$ sudo apt-get install openjdk-8-jdk
- 配置环境变量 :
$ echo export PATH=${PATH}:/opt/android-sdk/tools:/opt/android-sdk/platform-tools:/opt/android-studio/bin >> ~/.bashrc
$ echo export ANDROIS_HOME=/opt/android-sdk >> ~/.bashrc
$ source ~/.bashrc
- 下载ROS Java构建工具 :
$ sudo apt-get install ros-kinetic-rosjava-build-tools
- 创建工作空间并初始化 :
$ mkdir -p ~/android_core
$ wstool init -j4 ~/android_core/src https://raw.github.com/rosjava/rosjava/kinetic/android_core.rosinstall
- 设置ROS环境并编译 :
$ source /opt/ros/kinetic/setup.bash
$ cd ~/android_core
$ catkin_make
- 安装必要的依赖包 :
$ sudo apt-get install lib32z1 lib32ncurses5 lib32stdc++6
- 修改文件夹权限 :
$ sudo chown -R $USER:$USER /opt
- 下载并解压Android Studio IDE :从 此处 下载安装文件,解压到 ‘/opt/android-studio’。
- 启动IDE安装 :
$ /opt/android-studio/bin/studio.sh
- 安装过程操作 :出现窗口后,点击 ‘Run without import’ 进行 ‘custom install’。安装Android SDK时,将安装位置设置为 ‘/opt/android-sdk’,若没有该文件夹则创建。
项目操作
- 更新Android SDK :安装完成后,通过Configure → SDK Manager更新Android SDK,可更新的SDK版本有10(Gingerbread)、13(Honeycomb)、15(Ice cream)和18(Jellybean)。
- 导入项目 :点击现有Android Studio项目,导入之前安装的 ‘android_core’。
- 运行示例 :选择 ‘android_tutorial_pubsub’ 示例,点击播放按钮选择执行程序的设备。设备成功下载源代码后,在终端输入ROS主节点的IP并点击Connect。运行 ‘android_tutorial_pubsub’ 后,设备会发布 ‘Hello world!’ 后跟递增数字的消息。在计算机上使用
rostopic echo /chatter命令可订阅该消息。
graph LR
A[安装JDK] --> B[配置环境变量]
B --> C[下载ROS Java构建工具]
C --> D[创建工作空间并初始化]
D --> E[设置ROS环境并编译]
E --> F[安装必要依赖包]
F --> G[修改文件夹权限]
G --> H[下载并解压Android Studio IDE]
H --> I[启动IDE安装]
I --> J[安装过程操作]
J --> K[更新Android SDK]
K --> L[导入项目]
L --> M[运行示例]
机械臂开发
机械臂简介
机械臂是为工厂中执行简单重复任务而设计的机器人,旨在取代危险工作或重复性任务。近年来,随着人机交互(HRI)研究的活跃,机械臂不仅在工厂中得到应用,还在媒体艺术、VR等多个领域崭露头角,为公众带来了全新体验。
通过结合数字执行器和3D打印技术,机械臂变得更加普及,成为创客和教育行业的重要组成部分。然而,也有人担心机械臂与人工智能的结合会抢走人类的工作。但总体而言,机械臂长期以来一直是丰富社会的工具,在许多不同领域为人们提供帮助。未来,如果机械臂的发展能融入我们的生活且不失其本质,有望像机器人吸尘器一样成为我们生活的一部分。
机械臂结构与控制
机械臂结构
机械臂的基本结构由基座、连杆、关节和末端执行器组成,具体如下:
| 结构名称 | 说明 |
| ---- | ---- |
| 基座 | 通常是机械臂固定的部分,受力与末端执行器的长度和速度成正比,是最坚固的部分。基座也可以是像移动机器人这样具有运动能力的物体,以补充机械臂的自由度。 |
| 连杆 | 通常有一个或多个关节,通过关节的旋转产生运动。 |
| 关节 | 代表旋转轴,大多由电动机组成。根据运动方式,可分为旋转关节、棱柱关节、螺旋关节、圆柱关节、万向关节和球形关节等。近年来,还出现了使用液压而非电动机的关节,并且寻找替代电动机的新型关节的研究也在积极进行中。 |
| 末端执行器 | 由于机械臂的主要功能是拾取和移动物体,因此末端执行器通常是抓手。抓手的大小和形状因用途而异,人们一直在尝试提供能适应不同用途的抓手。 |
机械臂控制方法
机械臂的控制方法可分为关节空间控制和任务空间控制:
| 控制方法 | 输入 | 输出 | 计算方式 |
| ---- | ---- | ---- | ---- |
| 关节空间控制 | 每个关节的旋转角度 | 机械臂末端的坐标 | 通过正向运动学计算得到机械臂末端的坐标(X, Y, Z, i, z, 和 })。 |
| 任务空间控制 | 机械臂末端的坐标 | 每个关节的旋转角度 | 通过逆向运动学计算得到每个关节的旋转角度。任务空间中物体的位姿包括位置和方向,在三维世界中,位置可以用X、Y、Z表示,方向可以用i(滚动)、z(俯仰)和 }(偏航)表示。 |
机械臂与ROS
ROS凭借其开源的可扩展性和灵活性吸引了众多用户。随着使用ROS的用户越来越多,支持ROS的平台也逐渐增加,现在有公司收集并销售这些平台,个人为研究或爱好创建的平台也会在ROS官方包中注册并介绍给更多用户。目前约有180个平台支持ROS,可在ROS Robots上查看。
常见支持ROS的机械臂有:
| 机械臂名称 | 说明 |
| ---- | ---- |
| ABB工业机械臂 | 由ROS - INDUSTRIAL支持。 |
| Kinova的JACO | 广泛用于研究,支持ROS。 |
| ROBOTIS的MANIPULATOR - H | 在韩国,该机械臂支持ROS。 |
OpenManipulator建模与仿真
ROS为机械臂提供了一些实用工具,下面将介绍如何使用这些工具并通过示例代码实现。
工具介绍
| 工具名称 | 说明 |
|---|---|
| URDF文件 | 以可扩展标记语言(XML)形式创建的统一机器人描述格式文件,可作为机器人建模的可视化工具。可以创建简单的机械臂或自定义设计的部件,并在ROS可视化工具RViz中查看。 |
| Gazebo 3D模拟器 | 可以模拟实际操作环境,其仿真环境可使用基于XML的仿真描述格式(SDF)文件轻松创建。Gazebo还支持ROS - Control和插件功能,用于控制各种传感器和机器人。 |
| MoveIt! | 一个用于机械臂的集成库和强大工具,提供了运动学和动力学库(KDL)、开放运动规划库(OMPL)等开放库,有助于识别机械臂的各种功能,如碰撞计算、运动规划和拾取放置演示等。 |
OpenManipulator介绍
OpenManipulator是由ROBOTIS开发的基于开源软件和开源硬件的机械臂,支持Dynamixel X系列执行器,用户可以根据需要选择不同规格的执行器来制作机器人。它由基本框架和3D打印框架组成,可根据环境或目的制作新型机械臂。除了四关节机械臂外,还将提供SCARA、平面和Delta等各种形状和功能的机械臂。OpenManipulator支持ROS、OpenCR、Arduino IDE和Processing。
graph LR
A[URDF文件] --> D[OpenManipulator建模与仿真]
B[Gazebo 3D模拟器] --> D
C[MoveIt!] --> D
D --> E[创建机械臂模型]
D --> F[模拟操作环境]
D --> G[实现机械臂功能]
综上所述,无论是服务机器人还是机械臂的开发,都涉及到多个方面的知识和技术。通过对TurtleBot3的改造和OpenManipulator的建模与仿真,我们可以看到如何利用ROS等工具来实现机器人的各种功能。在实际开发过程中,需要根据具体需求选择合适的工具和方法,不断探索和实践,以实现更加智能、高效的机器人系统。
超级会员免费看
54

被折叠的 条评论
为什么被折叠?



