一、ros经验积累总结(待更新)
1.ros常用shell命令
roslaunch 运行启动文件
catkin_create_pkg 创建功能包
rospack 获取功能包
catkin_make 编译工作空间中的功能包
rosdep 自动安装功能包依赖的其他包
roscd 功能包目录跳转
roscp 拷贝功能包中的文件
rosed 编辑功能包中的文件
rosrun 运行功能包中的可执行文件
roscd-跳转、roscore-启动ros
新开终端:rosrun
~$ rosrun turtlesim turtlesim_node
~$ rosnode list #节点列表
~$ rosnode info /turtlesim #节点信息
rosnode、rostopic、rosservice、rosmsg、rossrv、rosbag
rostopic echo/rostopic hz:输出正在运动的小乌龟的信息。rostopic pub /turtle1/cmd_vel(tab自动补全):手动更改小乌龟运动
2.ros常用图形工具(rqt rviz)
~$ rqt_graph:显示各节点的订阅发布的关系
~$ rqt_plot:绘制相关曲线
3.ros坐标和tf坐标(遥控turtle2跟随turtle1)
roslaunch turtle_tf turtle_tf_demo.launch
rosrun rqt_tf_tree rqt_tf_tree
rosrun tf tf_echo /world /turtle1
rosrun tf tf_echo /turtle1 /turtle2
rosrun turtlesim turtle_teleop_key ns:=turtle1
rviz
二、ros创建简单项目
在vscode中打开源文件,根据提示下载相应插件,如cmake tools、python、c++、ros等,以便代码块的补全和跳转
1.新建一个功能包(注意在工作空间的src目录下)
catkin_creat_pkg <功能包名> <依赖>
在vscode的终端中运行:catkin_make,进行编译检查
2.编写发布/订阅节点(cpp)
发布:
v_1(功能包)--->src--->talker.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char **argv){
ros::init(argc,argv,"talker");
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",1000);
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss<<"hello world"<<count;
msg.data=ss.str();
ROS_INFO("%s",msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
count++;
}
}
v_1--->CMakeList.txt修改
find_package(catkin REQUIRED
roscpp
std_msgs
)
……
include_directories(
include
${catkin_INCLUDE_DIRS}
)
....
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
保存编译,终端依次开启roscore、rosrun v_1 talker。生成的可执行文件位置:工作空间/devel/lib/v_1/talker,在此文件夹下运行终端./talker和终端启动效果一样。
订阅:
v_1(功能包)--->src--->listener.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
void chatterCallback(const std_msgs::String::ConstPtr& msg){
ROS_INFO("i heard:[%s]",msg->data.c_str());
}
int main(int argc, char **argv){
ros::init(argc,argv,"listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter",1000,chatterCallback);
ros::spin();
return 0;
}
v_1--->CMakeList.txt修改
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
保存并编译。依次开终端运行:roscore、rosrun v_1 talker、rosrun v_1 listener、rpt_graph进行验证。
3.编写launch文件(通过launch方式启动节点,注意在创建的功能包目录下创建launch文件夹)
通过launch可以一次性启动多个节点,并改变节点名称,且可以调用其他launch文件(通过一条指令启动所有功能)。
launch--->talker.launch
<launch>
<node pkg="v_1" type="talker" name="talker" output="screen"/>
</launch>
launch--->listener.launch
<launch>
<node pkg="v_1" type="listener" name="listener" output="screen"/>
</launch>
终端分别运行验证:roslaunch v_1 talker.launch、roslaunch v_1 listener.launch
4.自定义消息类型并编写节点发布/订阅(cpp)(代码根据需求待修改)
在工作空间/src/v_1/下新建文件夹msg/新建消息文件obstacle.msg:
string first_name
string last_name
uint8 age
uint32 score
v_1--->CMakeList.txt修改:(ctrl+/快速增加去掉注释)
find_package(catkin REQUIRED
roscpp
std_msgs
message_generation
)
……
add_message_files(
FILES
Obstacle.msg
#Message1.msg
#Message2.msg
)
……
generate_messages(
DEPENDENCIES
std_msgs # Or other packages containing msgs
)
……
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES v_1
CATKIN_DEPENDS other_catkin_pkg
# DEPENDS system_lib
)
package.xml修改,增加依赖:
<build_depend>message_runtime</build_depend>
<build_export_depend>message_runtime</build_export_depend>
保存编译成功(catkin_make -DCATKIN_WHITELIST_PACKAGES=<功能包>)!
编译后:devel/incude下自动生成cpp依赖头文件。devel/lib/python3下生成py依赖头文件
终端验证:rosmsg show v_1/Obstacle
/
注意在.vscode/c_cpp_properties.json文件中做修改:
"includePath": [
"/home/.../devel/include/**",
"/opt/ros/noetic/include/**",
"/usr/include/**"
],
v_1/src/新建文件msg_pub.cpp:
代码省略……
v_1--->CMakeList.txt修改:
add_executable(msg_pub src/msg_pub.cpp)
target_link_libraries(msg_pub ${catkin_LIBRARIES})
add_dependencies(msg_pub v_1_generate_messages_cpp)
保存编译!
终端验证:rosrun v_1 msg_pub、rostopic echo /obstacle_info
v_1/src/新建文件msg_sub.cpp:
过程雷同,代码省略……
v_1--->CMakeList.txt修改:
过程雷同,代码省略……
终端验证:rosrun v_1 msg_pub、rosrun v_1
5.自定义服务类型并编写服务端/客户端节点(cpp)
v_1/下新建文件夹srv/新建服务文件AddTwoInts.srv:
int64 a
int64 b
---
int64 sum
v_1--->CMakeList.txt修改:
add_service_files(
FILES
AddTwoInts.srv
#Service1.srv
#Service2.srv
)
保存编译,终端验证:rossrv show v_1/AddTwoInts
v_1/src/新建文件add_two_ints_server.cpp:
过程雷同,代码省略……
v_1--->CMakeList.txt修改:
过程雷同,代码省略……
终端验证:rosrun v_1 add_two_ints_server、rosservice call /add_two_ints 3 5
v_1/src/新建文件add_two_ints_client.cpp:
过程雷同,代码省略……
v_1--->CMakeList.txt修改:
过程雷同,代码省略……
终端验证:rosrun v_1 add_two_ints_client、rosservice call /add_two_ints 3 5
6.tf变换(静态/动态)
静态坐标转换:
v_1--->launch--->tf_transform.launch:
参考一、3节进行验证
动态坐标转换:
src--->tf_transform.cpp
#include "ros/ros.h"
#include "tf/transform_broadcaster.h"
#include "tf/transform_datatypes.h"
注意在package.xml修改(CMakeList.txt):
<build_depend>tf</build_depend>
<build_export_depend>tf</build_export_depend>
终端验证:roscore、rosrun v_1 tf_transform、rviz