ROS实践–运行小海龟仿真例程
由于在之前就已经安装了ROS,所以本文章只有小海龟的相关实验。
1.启动小海龟及其键盘控制
1.1 启动rosmaster
打开一个终端(快捷键ctrl+alt+t),输入roscore
1.2 启动小海龟仿真器
打开第二个终端,输入rosrun turtlesim turtlesim_node。rosrun是一个启动执行文件的命令
1.3 启动海龟控制节点
打开第三个终端,输入rosrun turtlesim turtle_teleop_key
这是用键盘控制小海龟运动,鼠标要在这个终端上,不然键盘就会失去控制。
1.4 启动rqt_graph查看这个程序运行的结构计算图
再打开一个终端,输入rqt_graph
rosout是ros里面一直存在的节点,主要用于存储日志信息。在这个rqt界面上,点上debug后,就只显示有效信息。
rosout是ros里面一直存在的节点,主要用于存储日志信息。在这个rqt界面上,点上debug后,就只显示有效信息。
1.5 查看节点信息
rosnode list
rosnode info /turtlesim
想要看一下现在运行的ros有哪些节点,就用rosnode list,都列举出来。想要看某一个节点的具体信息,就用rosnode info /turtlesim,查看此节点信息
Publications:
/rosout [rosgraph_msgs/Log]
/turtle1/cmd_vel [geometry_msgs/Twist]
其中 /turtle1/cmd_vel [geometry_msgs/Twist]是我们要的信息
以 /turtle1/cmd_vel消息管道,以geometry_msgs::Twist传递消息
Services:
/teleop_turtle/get_loggers
/teleop_turtle/set_logger_level
这里面可以看到/teleop_turtle,该为发布者的节点名
1.6 查看话题
rostopic list
查看话题,使用rostopic list,就会列举出现在的所有话题,查看某一话题的具体内容,添加info即可,如:rostopic info /turtle1/cmd_vel。
1.7 监听话题内容
rostopic echo /turtle1/cmd_vel
通过键盘控制小海龟运动的同时,通过话题监听就可以查看小海龟运动的实时的线速度、角速度
1.8 按控制量移动海龟运行
如果想控制小海龟运动,就自己发布一个消息,发布一次信息,比如发布小海龟线速度,rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear:修改linear的X为1.0,回车后,看见小海龟向前运动了一截。如果想按照一定的频率发布消息,那就要加一个参数,rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist …,即可.
- 节点(node):节点,一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信。
- 话题(topic):话题,节点可以发布消息到话题,也可以订阅话题以接收消息。
- 消息(message):消息,消息是一种ROS数据类型,用于订阅或发布到一个话题。
- 服务(service):服务是节点之间通讯的另一种方式。服务允许节点发送请求(request) 并获得一个响应(response)
- 节点管理器(master):节点管理器,ROS名称服务 (比如帮助节点找到彼此)。
2. 用C++或python写一个程序,控制小海龟走一个圆形
工作空间workspace,我们在开发一个ROS项目的时候,是以工作空间来代表一个项目的。
- workspace: 工作空间
- build:ros编译打包的结果产出目录。我们不需要对这个文件夹做任何编辑操作,属于自动生成。
- devel: 开发所需要的目录
- src:存放package的目录
- CMakeLists.txt: 整个工作空间编译的脚本。此文件我们通常不用去做修改操作。
工作单元package,一个项目中可以创建多个工作单元,这个工作单元,我们称之为package。
- pkg1: package的名称,开发过程中根据自己实际情况进行创建设定。
- CMakeLists.txt: 当前package的编译脚本。通常需要为c++代码添加编译时的依赖,执行等操作。
- package.xml: package相关信息。通常添加一些ros库的支持
- include文件夹: 存放c++ 头文件的
- config文件夹:存放参数配置文件,格式为yaml
- launch文件夹:存放.launch文件的。
- src:c++源代码
- scripts:python源代码
- srv:存放定义的service
- msg: 存放自定义的消息协议
- action: 存放自定义的action
2.1 Workspace创建
新建工作空间目录结构
1.新建一个文件夹,命名为catkin_ws
2.在文件夹 catkin_ws 下创建一个文件夹 src
3.移动到src目录下输入catkin_init_workspace。在src文件夹中出现CMakeLists.txt文件
4.返回catkin_ws,对其进行编译
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws
catkin_make
2.2 设置环境变量
设置环境变量是为了让系统知道功能包的位置在哪,以便能找到。确保安装脚本正确地覆盖了工作空间,ROS_PACKAGE_PATH环境变量包含在目录中。
在catkin_ws路径下终端输入source devel/setup.bash,使系统知道功能包放置在catkin_ws这个工作空间下。
检查环境变量
查看当前环境变量,终端输入echo $ROS_PACKAGE_PATH
2.3 Package创建
来到workspace的src目录下,新建my_turtle_package包
cd ./src
catkin_create_pkg my_turtle_package std_msgs rospy roscpp
catkin_create_pkg是创建package的命令。运行以上命令,会新建好package的目录,并且在目录中创建CMakeLists.txt,package.xml,src,include等文件和 目录第一个参数firstros是指创建的package名称,可以根据自己的实际需求去设定。
后面的参数roscpp,rospy,rosmsg是指当前创建的这个package需要提供哪些环境依赖。
- roscpp是对c++的一种依赖,有了它就可以用c++开发ros程序。
- rospy是对python的一种依赖,有了它就可以用python开发ros程序。
进入my_turtle_package的src文件中
新建画圆程序名为yuan.cpp
touch yuan.cpp
2.3 画圆程序编写
2.3.1 打开yuan.cpp
gedit yuan.cpp
2.3.2 画圆的代码
#include "ros/ros.h"
#include<geometry_msgs/Twist.h> //运动速度结构体类型 geometry_msgs::Twist的定义文件
int main(int argc, char *argv[])
{
ros::init(argc, argv, "vel_ctrl"); //对该节点进行初始化操作
ros::NodeHandle n; //申明一个NodeHandle对象n,并用n生成一个广播对象vel_pub
ros::Publisher vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
//vel_pub会在主题"/cmd_vel"(机器人速度控制主题)里广播geometry_msgs::Twist类型的数据
ROS_INFO("draw_circle start...");//输出显示信息
while(ros::ok())
{
geometry_msgs::Twist vel_cmd; //声明一个geometry_msgs::Twist 类型的对象vel_cmd,并将速度的值赋值到这个对象里面
vel_cmd.linear.x = 2.0;//前后(+-) m/s
vel_cmd.linear.y = 0.0; //左右(+-) m/s
vel_cmd.linear.z = 0.0;
vel_cmd.angular.x = 0;
vel_cmd.angular.y = 0;
vel_cmd.angular.z = 1.8; //机器人的自转速度,+左转,-右转,单位是rad/s
vel_pub.publish(vel_cmd); //赋值完毕后,发送到主题"/cmd_vel"。机器人的核心节点会从这个主题接受发送过去的速度值,并转发到硬件体上去执行
ros::spinOnce();//调用此函数给其他回调函数得以执行(比例程未使用回调函数)
}
return 0;
}
2.4 修改CMakeLists.txt文件内容
返回my_turtle_package,打开CMakeLists.txt文件
在CMakeLists.txt文件中找到##Declare a C++ executable
,在这一行的前面添加如下内容:
add_executable(yuan src/yuan.cpp)
target_link_libraries(yuan ${catkin_LIBRARIES})
2.5 编译程序
进入catkin_ws,编译程序
cd ~/catkin_ws/
catkin_make
2.6 运行程序
新建一个终端,运行ros。
再新建一个终端,启动我们的小海龟。
rosrun turtlesim turtlesim_node
再打开一个终端
cd ~/catkin_ws/
source devel/setup.bash #程序注册
rosrun my_turtle_package yuan
按下Ctr+C退出节点,小乌龟停止运动。