1. ROS使用命令控制小乌龟画圆
1.1 关于ROS常用的命令介绍
命令 | 作用 |
---|---|
rosrun | 用于启动ROS节点 基本格式为 rosrun 包名 可执行文件名 ,其中可执行文件可以为编译后的cpp文件或者具有可执行权限的py文件 |
rosnode | 管理并检查ROS节点状态,如rosnode list列出所有运行的节点,rosnode info 节点名称提供指定节点的详细信息 |
rostopic | 操作和显示话题信息。使用rostopic list -v可以查看所有活跃话题以及它们的发布者和订阅者信息,rostopic echo 话题名称可以打印出该话题接收到的消息内容。 |
rosservice | 调用ROS服务的命令。例如,rosservice call 服务名称 参数可以调用指定的服务并传递参数。 |
rosmsg | 用于显示消息类型的详细信息 |
rossrv | 用于显示服务类型的详细信息 |
1.2 使用ROS命令控制小乌龟画圆
首先我们打开终端,在第一个终端输入
roscore
启动服务
打开第二个终端,启动小海龟节点
rosrun turtlesim turtlesim_node
打开第三个终端,启动小海龟控制器
rosrun turtlesim turtle_teleop_key
到这里就可以使用我们的键盘上下左右控制小海龟行动了
接下来我们打开第四个终端使用rostopic命令,使我们的小海龟做出画圆的操作
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear:
x: 1.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 1.0"
这里我们主要使用rostopic命令设置我们小乌龟的线速度和角速度同时写一个循环来对我们的小乌龟进行画圆操作
2. 使用c++程序控制小海龟画圆
首先我们创建一个ros工作空间,创建一个catkin_ws文件夹放置功能源码包
mkdir -p ~/catkin_ws/src
然后进入我们的src文件夹,初始化工作空间
cd ~/catkin_ws/src
catkin_init_workspace
这样就在src文件中创建了一个 CMakeLists.txt 的文件,目的是告诉系统,这个是ROS的工作空间。
然后我们编译工作空间catkin_make
我们所有的编译工作都需要在我们的catkin_ws文件夹中进行,所以这里我们先进入catkin_ws文件夹
cd ~/catkin_ws
使用catkin_make命令进行编译,编译完成后我们可以发现catkin_ws文件夹中会出现build和devel两个新的文件夹
catkin_make
使用ls命令进行查看可以看到,我们的catkin_ws文件夹中现在有三个文件夹,build ,devel和src三个文件夹,我们的代码主要存放在src文件夹下面
接下来我们设置环境变量
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
配置环境变量生效
source ~/.bashrc
然后我们进入src文件夹中,创建一个功能包,名字叫my_turtle_package
cd ~/catkin_ws/src
catkin_create_pkg my_turtle_package rospy roscpp
我们使用ls命令可以看到,在我们的src文件夹中出现了一个叫my_turtle_package的文件和一个CMakeLists.txt的文件
接下来我们要在我们创建的包里面创建一个cpp文件
gedit draw_circle.cpp
然后将以下内容写入cpp中并保存
#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;
}
之后打开CMakeLists.txt,在CMakeLists.txt文件中找到## Declare a C++ executable
gedit CMakeLists.txt
可以使用ctrl+f快捷搜索找到## Declare a C++ executable然后在前面添加如下内容
add_executable(draw_circle src/draw_circle.cpp)
target_link_libraries(draw_circle ${catkin_LIBRARIES})
保存之后进入catkin_ws文件夹中开始编译工作
cd ~/catkin_ws/
catkin_make
编译成功之后我们打开ros机器人
第一个终端输入roscore
打开第二个终端打开小乌龟节点rosrun turtlesim turtlesim_node
打开第三个终端启动画圆程序
cd ~/catkin_ws/
source devel/setup.bash
rosrun my_turtle_package draw_circle
可以看见我们的小乌龟正在以匀速进行圆周运动