机器人运动控制的实现
实验介绍
随着机器人技术的飞速发展,ROS2(Robot Operating System 2)作为新一代开源机器人操作系统,逐渐成为研究和开发领域的热门选择。ROS2不仅提供了丰富的工具和库,还具备强大的硬件抽象、进程间通信和包管理等功能,极大地简化了机器人系统的开发和集成。
本实验旨在通过ROS2平台,实现一个机器人运动控制系统。该系统能够接收外部指令,通过传感器获取环境信息,并实时调整机器人的运动状态。通过这一实验,学员将深入理解ROS2的基本架构和运行机制,掌握ROS2在机器人运动控制中的实际应用。
实验过程
下面将会实现一个发布者节点,向“/cmd_vel”话题发布 geometrymsgs::Twist 类型的消息包,以实现对机器人运动速度的控制。
编写速度控制程序
首先在工作空间中创建一个软件包,打开一个新的终端窗口,输入如下指令,进人 ROS2 工作空间。
cd~/ros2 ws/src/
然后用如下指令创建一个名为“vel_ pkg”的软件包,
ros2 pkg create vel_pkg
创建好软件包后,在这个软件包中创建一个节点。
1.编写节点代码
先创建这个节点的源码文件。,在VSCode的[资源管理器]中找到[vel_pkg]软件包,用鼠标右键单击它的[src]子目录,在弹出的快捷菜单中选择[新建文件]。此时会提示输入文件名,,输入“vel_node.cpp”,然后按[Enter]键创建文件。
下面编写这个源码文件的内容。
#include <rclcpp/rclcpp.hpp>
#include <geometry_msgs/msg/twist.hpp>
int main(int argc, char** argv)
{
rclcpp::init(argc, argv);
auto node = std::make_shared<rclcpp::Node>("velocity_command_node");
auto vel_pub = node->create_publisher<geometry_msgs::msg::Twist>("/cmd_vel", 10);
geometry_msgs::msg::Twist vel_msg;
vel_msg.linear.x = 0.1;
vel_msg.linear.y = 0.0;
vel_msg.linear.z = 0.0;
vel_msg.angular.x = 0.0;
vel_msg.angular.y = 0.0;
vel_msg.angular.z = 0.0;
rclcpp::Rate loop_rate(30);
while (rclcpp::ok())
{
vel_pub->publish(vel_msg);
loop_rate.sleep();
}
rclcpp::shutdown();
return 0;
}
上述代码可以从 wpr_simulation2的例程文件中找到。如果编译报错,可以与 wpr_simulation2 \demo_cpp\4_velocity_command.cpp 文件中的代码进行比对。
代码编写完毕后,需要进行保存。保存成功后,编辑界面文件名后面的圆点符号会变成一个叉符号。
2.设置编译规则
节点源码的编译规则写在vel_pkg的CMakeLists.txt文件里。在 VSCode 中打开这个文件,在这个文件里添加节点的编译规则。首先使用如下代码寻找节点代码中用到的rclcpp 和消息类型等依赖项。
find_package(rclcpp REQUIRED)
find_package(geometry_msgs REQUIRED)
然后使用如下代码添加节点源码的编译规则。
add_executable(vel_node src/vel_node.cpp)
ament_target_dependencies(vel_node "rclcpp" "geometry_msgs")
最后使用如下代码添加节点编译完成后的安装规则。
install(TARGETS vel_node
DESTINATION lib/${PROJECT_NAME})
这些内容可以从 wpr_simulation2的例程文件中找到。如果编译报错,可以与 wpr_simulatien2 \demo_cmakelists \4_vel_node.txt文件中的代码进行比对。
上述规则添加完毕后,一定要保存文件,否则规则无法生效。
3.修改软件包信息
在VSCode 中打开 vel_pkg软件包的package.xml文件,使用如下代码添加依赖项信息
<depend>rclcpp</depend>
<depend>geometry_msgs</depend>
这些内容可以从 wpr_simulation2 的例程文件中找到。如果编译报错,可以与 wpr_simulation2\demo_package\4_vel_node.xml 文件中的代码进行比对。
文件修改后,一定要保存文件,否则新的包信息无法生效
4.编译软件包
修改完上述文件后,打开终端窗口,执行如下指令,进入工作空间
cd ~/ros2_ws
然后执行如下指令,对工作空间中的所有软件包进行编译
colcon build
5.节点自测
节点代码编译完成后,可以先进行自测,以便发现单词拼写之类的小失误。在自测前,需要加载当前工作空间中的设置参数,这样ros2指令才能找到刚才编译后的软件包和节点文件。保持终端的当前路径依然在工作空间目录ros2_ws中,然后执行如下指令。
source install/setup.bash
然后执行如下指令运行刚才编写的节点
ros2 run vel_pkg vel_node
按组合键[Ctrl+Shift+O],将终端分为上、下两个子窗口,在新的窗口中执行如下指令,查看当前正在活跃的话题列表
ros2 topic list
执行后会看到如下图 所示的话题列表。
话题列表中的“/cmd_vel”就是前面编写的vel_node节点发布的话题。这时再检查一下话题里发布的消息包是否正确,在下面的终端窗口中执行如下指令,
ros2 topic echo /cmd_vel
按[Enter]键后,可以看到下面的终端窗口在不断刷新话题中消息包的数据内容,如下图所示。
可以看到话题中的消息包在不断刷新,消息包的linear部分的x为0.1,其他数值都为0,与节点代码中的描述一致,节点自测通过。
仿真运行速度控制程序
下面来运行前面编写的节点。在运行前,需要确认已经按照之前下载了wprsimulaten2仿真项目。然后,先加载当前工作空间中的环境设置。保持终端的当前路径依然在工作空间目录ros2_ws中,执行如下指令。
source install/setup.bash
接下来启动带有机器人的仿真环境。执行如下指令,
ros2 launch wpr_simulation2 wpb_simple.launch.py
这时会启动仿真程序的图形窗口,如下图所示,里面有一台仿真机器人,面对一个书柜。
接下来运行刚才编写的速度控制节点vel_node。在Terminator 终端中按组合键[Ctrl+Shift+O],将终端分为上、下两个子窗口。
然后,在下面的新窗口中先运行如下指令,加载环境变量,
source install/setup.bash
新窗口加载好环境变量后,使用如下指令运行刚才编写的vel_node节点,
ros2 run vel_pkg vel_node
节点运行起来之后,切换到刚才的仿真窗口。可以看到机器人以0.1m/s的速度向前移动,速度控制功能成功实现。
实验总结
在本次《机器人运动控制的实现》实验中,我们成功地利用ROS2(Robot Operating System 2)这一先进的开源机器人操作系统,设计并实现了一个机器人运动控制系统。通过这一实践过程,我们不仅加深了对ROS2基本架构和运行机制的理解,还掌握了ROS2在机器人运动控制中的具体应用方法。
在实验过程中,我们首先创建了一个发布者节点,该节点能够向“/cmd_vel”话题发布geometry_msgs::Twist
类型的消息包,从而实现对机器人运动速度的控制。我们详细记录了从创建软件包、编写节点代码、设置编译规则、修改软件包信息,到编译软件包和节点自测的每一步操作。特别是在编写节点代码时,我们仔细参考了wpr_simulation2的例程文件,确保了代码的正确性和可运行性。
在实验过程中,我们首先创建了一个发布者节点,该节点能够向“/cmd_vel”话题发布geometry_msgs::Twist
类型的消息包,从而实现对机器人运动速度的控制。我们详细记录了从创建软件包、编写节点代码、设置编译规则、修改软件包信息,到编译软件包和节点自测的每一步操作。特别是在编写节点代码时,我们仔细参考了wpr_simulation2的例程文件,确保了代码的正确性和可运行性。
在节点自测阶段,我们成功验证了发布的消息包内容是否与节点代码中的描述一致,从而确保了速度控制功能的正确性。随后,我们运行了前面编写的节点,并在wpr_simulation2仿真环境中观察了机器人的运动情况。实验结果表明,机器人能够按照设定的速度向前移动,速度控制功能得到了成功实现。