ROS学习记录(一)
用于学习ROS的记录,以便复习
一,创建工作空间
首先在home路径下创建文件夹
mkdir -p ~/catkin_test/src
cd到对应src文件夹下
cd ~/catkin_test/src
初始化工作空间
catkin_init_workspace
回到主文件夹下,编译工作空间
cd ~/catkin_test
catkin_make
catkin_make处会报错,原因是ROS用的是python2,而anaconda默认python为python3,将catkin_make替换为
catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3
即可,接下来这个工作空间使用catkin_make就不会再报错了
设置环境变量
gedit ~/.bashrc
在最后加上
source ~/catkin_test/devel/setup.bash
关闭保存后刷新
source ~/.bashrc
即完成环境变量的设置
用以下命令查看设置的路径
echo $ROS_PACKAGE_PATH
检查是否包含当前目录
二,在工作空间下,创建功能包
功能包都是放在工作空间下的src文件夹中
cd ~/catkin_test/src
catkin_create_pkg exam std_msgs rospy roscpp
回到上一目录进行编译功能包
cd ~/catkin_test
catkin_make
source devel/setup.bash
完成空白功能包的创建
三,完成对应任务,实现话题编程与服务编程
任务一:话题编程与服务编程,实现通过代码新生一只乌龟,放置在(5,5)点,命名为“tutle2”;通过代码订阅turtle2的实时位置并在终端打印;控制turtle2实现旋转运动;
简要介绍:
话题编程:存在话题发布者talker和接收者listener,两者异步单向通信,listener通过ROS话题去订阅talker发布的消息,类似于我通过邮件能够随时接受到github上关注一个项目的notifications(单方面接收消息)。
服务编程:存在服务器端server和客户端client,两者可同步相互通信
(一)使用turtlesim功能包产生乌龟,去订阅其位置
在功能包下创建对应的文件,turtle_pose.cpp(也可用python)
cd ~/catkin_test/src/exam/src
>turtle_pose.cpp
进行代码编写
点击查看代码
#include <ros/ros.h>
#include <turtlesim/Pose.h>
void poseCallback(const turtlesim::PoseConstPtr& msg)
{
ROS_INFO("x: [%f]", msg->x);
ROS_INFO("y: [%f]", msg->y);
ROS_INFO("theta: [%f]", msg->theta);
}
int main(int argc, char** argv)
{
// 初始化节点
ros::init(argc, argv, "turtle2_pose");
// 订阅乌龟的pose信息并打印
ros::NodeHandle node;
ros::Subscriber sub = node.subscribe("turtle2/pose", 10, &poseCallback);
ros::spin();
return 0;
};
(二)完成turtle位置发布的话题编程,turtle_controller.cpp
点击查看代码
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <turtlesim/Spawn.h>
#include <turtlesim/Kill.h>
int main(int argc, char** argv)
{
// 初始化节点
ros::init(argc, argv, "my_turtle");
ros::NodeHandle node;
// 通过服务调用,产生第二只乌龟turtle2
ros::service::waitForService("spawn");
ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("spawn");
turtlesim::Spawn::Request req;
turtlesim::Spawn::Response resp;
req.x=5;
req.y=5;
req.theta=0;
req.name="turtle2";
bool success=add_turtle.call(req,resp);
if(success)
{
ROS_INFO("Spawn a turtle nemed turtle2");
}else{
ROS_INFO("Spawn a turtle failed.");
}
ros::service::waitForService("kill");
ros::ServiceClient kill_turtle = node.serviceClient<turtlesim::Kill>("kill");
turtlesim::Kill turtle;
turtle.request.name="turtle1";
kill_turtle.call(turtle);
// 定义turtle2的速度控制发布器
ros::Publisher turtle_vel =
node.advertise<geometry_msgs::Twist>("turtle2/cmd_vel", 10);
ros::Rate rate(10.0);
while (node.ok())
{
// 并发布速度控制指令,使turtle2做圆周运动
geometry_msgs::Twist vel_msg;
vel_msg.angular.z = 1;
vel_msg.linear.x = 2;
turtle_vel.publish(vel_msg);
//发布turtle2的位置
rate.sleep();
}
return 0;
};
(三)使用launch文件去启动相关节点
点击查看代码
<launch>
<!-- 海龟仿真器 -->
<node pkg="turtlesim" type="turtlesim_node" name="sim"/>
<!-- 打印turtle2的位置 -->
<node pkg="exam" type="turtle_pose"
name="turtle2_pose" output="screen" />
<!-- 发布话题,并且控制turtle2移动 -->
<node pkg="exam" type="turtle_controller"
name="listener"/>
</launch>
同时完成CmakeLists.txt和package.xml文件的配置
对于CmakeLists.txt设置需要编译的代码和生成的可执行文件;
在CmakeLists.txt中加入以下
add_executable(turtle_pose src/turtle_pose.cpp)
target_link_libraries(turtle_pose ${catkin_LIBRARIES})
add_executable(turtle_controller src/turtle_controller.cpp)
target_link_libraries(turtle_controller ${catkin_LIBRARIES})
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
turtlesim
)
//加入turtlesim功能包
在package.xml文件中加入
添加依赖项
<build_depend>turtlesim</build_depend>
<build_export_depend>turtlesim</build_export_depend>
<exec_depend>turtlesim</exec_depend>
<build_depend>geometry_msgs</build_depend>
<build_export_depend>geometry_msgs</build_export_depend>
<exec_depend>geometry_msgs</exec_depend>
以上即完成任务一,但代码方面主要来自网上,需要好好研究。尤其是关于乌龟位置的发布,乌龟的控制。一些细节未把握如,乌龟放置在(5,5)位置出,是否实现?