ROS学习——实现对机器人运动的控制
代码实现思路
- 构建一个新的软件包,包名为"vel_pkg"
- 新建发布者节点vel_node
- 通过NodeHandle/rospy发布话题"/cmd_vel",发布对象vel_pub
- 构建一个"geometry_msgs/Twist"类型消息包vel_msg
- 创建while循环,不停的通过vel_pub对象发送速度消息包vel_msg
- 机器人运动分为矢量速度linear以及旋转速度angular,即分别对应**线速度(线性速度)**和 角速度(角速度),其中默认规定的速度单位分别为m/s以及rad/s(正值表示逆时针旋转,负值表示顺时针旋转)
1. 创建package软件包
在工作空间中的src目录下,打开终端输入catkin_create_pkg vel_pkg roscpp rospy geometry_msgs
,创建一个名为vel_pkg的软件包
2. 编写代码
编写机器人运动节点的 C++ 代码
- 在vscode中找到新创建的软件包的src目录,在该目录下新建节点vel_node
- 编写vel_node代码
#include <ros/ros.h> #include <geometry_msgs/Twist.h> // 引入Twist消息类型的头文件 int main(int argc, char *argv[]) { ros::init(argc, argv, "vel_node"); ros::NodeHandle nh; ros::Publisher vel_pub = nh.advertise<geometry_msgs::Twist>("/cmd_vel", 10); // 话题名称"/cmd_vel" geometry_msgs::Twist vel_msg; vel_msg.linear.x = 0.1; vel_msg.linear.y = 0; vel_msg.linear.z = 0; // 规定线速度 vel_msg.angular.x = 0; vel_msg.angular.y = 0; vel_msg.angular.z = 0; //规定角速度 ros::Rate r(30);// 规定消息发布频率 while (ros::ok()) { vel_pub.publish(vel_msg); r.sleep(); } return 0; }
- 在vel_pkg的CMakeLists.txt文件中添加以下声明
add_executable(vel_node src/vel_node.cpp) target_link_libraries(vel_node ${catkin_LIBRARIES} ) add_dependencies(vel_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
- 编译工作空间
-
- 方法一:在vscode中直接
ctrl + shift + B
编译
- 方法一:在vscode中直接
-
- 方法二:在工作空间目录下打开终端,并通过
catkin_make
进行编译
- 方法二:在工作空间目录下打开终端,并通过
-
编写机器人运动节点的 Python 代码
- 在vscode中找到新创建的软件包的src目录,创建同级目录scripts,并在该目录下新建节点vel_node.py
- 编写vel_node代码
#!/usr/bin/env python3 # coding = utf-8 import rospy from geometry_msgs.msg import Twist # 引入消息包Twist类型 if __name__ == "__main__": rospy.init_node("vel_node") # 初始化节点 vel_pub = rospy.Publisher("/cmd_vel",Twist,queue_size=10) # 初始化发布者 vel_msg = Twist() # 定义vel_msg 为Twist消息类型 vel_msg.linear.x = 0.1 # 规定线速度x轴上速度为0.1 rate = rospy.Rate(30) # 规定消息发布频率 while not rospy.is_shutdown(): vel_pub.publish(vel_msg) rate.sleep()
- 在scripts目录下打开终端,运行
chmod +x vei_node.py
给予新创建的节点可执行权限
3. 通过仿真环境测试节点代码
下载wpr_simulation软件包
- 如果已经下载过wpr_simulation软件包,进入工作空间中的该软件包目录下的终端,通过
git pull
更新软件包,并重新编译工作空间 - 如果没有下载过wpr_simulation软件包,需要完成以下操作
-
- 在github中找到该软件包的链接,在工作空间下的src目录进行
git clone 克隆链接
,具体可见"ROS包的下载&创建工作空间"
- 在github中找到该软件包的链接,在工作空间下的src目录进行
-
- 进入该软件包的scripts目录下的终端,运行
./install_for_ROS版本.sh
,用于自动下载和安装该软件包编译所需的依赖项
- 进入该软件包的scripts目录下的终端,运行
-
- 通过
catkin_make
重新编译工作空间
- 通过
-
打开仿真环境
- 打开终端运行
roslaunch wpr_simulation wpb_simple.launch
- 如果出现
[gazebo-2] process has died
报错,可能是之前下载软件包时没有下载完整,可以在通过sudo apt install ros-$ROS_DISTRO-gazebo-ros-pkgs
解决 - 也有可能是因为之前的gazabo仿真环境关闭的不够彻底,可以通过
killall gazserver
杀死之前未关闭彻底的仿真环境
终端中通过rosrun vel_pkg vel_node
运行机器人运动节点,观察仿真现象
如果出现以下现象,代表节点编写成功
ROS机器人运动仿真