roboware-studio命令打开ros的ide,方便操作
roscore
打开ros
rosrun turtlesim turtlesim_node
打开乌龟
rosrun turtlesim turtle_teleop_key
打开键盘控制界面
rqt_graph
查看节点图
rosnode
查看节点
rosnode list
列出节点
rosnode info /turtlesim
查看某个节点到具体信息
rostopic list
打印话题列表
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twt "linear: x: 2.0 y: 1.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 2.0"
-r 10 是循环 上面到命令可以用来控制海龟 turtle1是海龟名
rosservice call /spawn "x: 0.0 y: 2.0 theta: 0.0 name: 'sss'"
产生新海龟,海龟名字为sss
rosbag record -a -0 cmd_record
保存路径到文件cmd_record
rosbag play cmd_record.bag
重现文件的内容
工作空间是一个存放工程开发相关文件的文件夹:
src:代码空间
build:编译空间
devel:开发空间
install:安装空间
创建工作空间:
mkdir -p~/catkin_ws/src
//catkin_ws/src为文件路径
cd~/catkin_ws/src
//意思是在该路径下执行下面那句话
catkin_init_workspace
编译工作空间:
cd~/catkin_ws/
//意思是在该路径下执行下面那句话
catkin_make
catkin_make install
//生成install文件
引入功能包: //在新建的src文件下面执行
catkin_create_pkg test_pkg roscpp rospy std_mags
//test_pkg是要引入的功能包,后面是以来到语言
设置环境变量: // 在catkin_ws文件下面执行
source devel/setup.bash
或者 source ~/catkin_ws/devel/setup.bash
检查环境变量:
echo $ROS_PACKAGE_PATH
用于发布信息,通过Topic,传输给订阅者Subscriber,来控制海龟运动。
在/catkin_ws/src文件目录下执行:
catkin_create_pkg 文件名 rospy std_msgs geometry_msgs turtlesim
//在要上面创建到src文件中,输入该指令,建立功能包。
上面rospy是在python文件时用的,写c++文件时用roscpp
然后在**/catkin_ws/src/文件名/scr路径**下建立cpp文件,写代码。
创建的功能包的CMakeLists.txt文件修改信息,加入两句话:
add_executable(velocity_publisher src/velocity_publisher.cpp)
//代码编译
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
//代码做链接
其中的 velocity_publisher是cpp的文件名,当有多个cpp文件要编译时,就要多复制几遍,但是文件名要修改。
回到工作空间到根目录下:即catkin_ws
执行:
catkin_make
source devel/setup.bash
//设置环境变量
打开新终端执行:
roscore
//这三句话开三个终端执行/home/mol/study/ros_learn/catkin_ws/src
再打开新终端执行:
rosrun turtlesim turtlesim_node
在设置环境变量的终端中执行:
rosrun learning_topic velocity_publisher
同上面过程一样,只不过要更换cpp代码。
因为不知道什么时候会有数据进来,所以设置回调函数,一有消息进来就立即调用函数。(类似中断)
回调函数要完成消息处理,不要嵌套,要高效进行。
写完cpp文件后,要更改CMakeLists文件。
定义msg文件为Person.msg,内容为:(在功能包中(/catkin_ws/src/文件名 路径下)创建smg文件夹,将Person.msg存在该文件夹中)
包含的变量:
string name uint8 sex uint8 age
宏定义:
uint8 unknown = 0 uint8 male = 1 uint8 female = 2
在package.xml文件中添加功能包依赖:(放最下面)
在CMakeLists.txt添加编译选项
• find_package( … message_generation)
• add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)
• catkin_package(… message_runtime)
在catkin_ws下执行:catkin_make
编写cpp文件:person_publisher.cpp和person_subscriber.cpp
将下面代码写入CMakeLists文件中:(因为代码中的一些程序是要关联一些自动生成的文件,所以多了一句:add_dependencies)
add_executable(person_publisher src/person_publisher.cpp) target_link_libraries(person_publisher ${catkin_LIBRARIES}) add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp) add_executable(person_subscriber src/person_subscriber.cpp) target_link_libraries(person_subscriber ${catkin_LIBRARIES}) add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)
然后执行:
$ cd ~/catkin_ws $ catkin_make $ source devel/setup.bash $ roscore $ rosrun learning_topic person_subscriber $ rosrun learning_topic person_publisher
错误:自己改写代码时,定义了string变量,但是ROS_INFO用%s输出乱码,需要将变量进行.c_str(),即:
ROS_INFO("sex:%s", sex);
改为: ROS_INFO("sex:%s", sex.c_str());
**发布者与订阅者要分别写在两个cpp文件中,要使两者关联,就使订阅名与发布名相同。**在一个文件中订阅者不会收到信息,因为他需要循环等待信息到来,而同时发布者又在不断发送信息,所以不可以写在同一文件中。
Client会发布请求Request给Server端,Server端收到请求并进行执行,返回一个Response。
例子:参生新的海龟,自己写Client代码,Server是海龟节点turtlesim,发送的Request信息格式是turtlesim::Spawn
产生功能包:
$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_service roscpp rospy std_msgs geometry_msgs turtlesim
在CMakeLists.txt文件中加入:
add_executable(turtle_spawn src/turtle_spawn.cpp)
target_link_libraries(turtle_spawn ${catkin_LIBRARIES})
然后:
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_service turtle_spawn
如果是写py代码,就不需要在CMakeLists.txt文件添加东西,直接在终端执行以上程序就可以。
例子:客户端相当于控制海龟的运动和停止,信息数据类型为:std_srvs:Trigger,该数据类型的Request为空,Response有两个值。终端输入:rossrv show std_srvs/Trigger
得到:
--
-
bool success
string message
其中---
是分割线,上面是Request的数据信息,为空,下面是Response的数据信息,有两个值,设置回调函数时要注意Response内容写对。
可以通过rossrv list
来查看所有的srv的数据类型,就是服务或者话题之间消息传输所用的类型。
代码中需要创建Publisher,用于控制海龟运动还是停止,Server接受信息后通过Publisher控制海龟。(python代码需要多线程)
在CMakeLists.txt文件中加入:
add_executable(turtle_command_server src/turtle_command_server.cpp)
target_link_libraries(turtle_command_server ${catkin_LIBRARIES})
然后执行:(需要四个终端)
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_service turtle_command_server
$ rosservice call /turtle_command "{}"
最后一句是启动Client,输入Request数据为空,即"{}"。其中call和后面的/turtle… 是有空格的。/turtle_command是代码中自己定义的服务名称。
定义srv文件,建立文件夹./learning_service/srv,然后在该文件夹中建立Person.src文件,写入:
string name uint8 age uint8 sex
uint8 unknown =0 uint8 male= 1
uint8 female = 2`
---
string result
其中---
是分割Request和Response的。
然后在package.xml中添加功能包依赖:
在CMakeLists.txt添加编译选项
• find_package( … message_generation)
• add_service_files(FILES Person.srv)
generate_messages(DEPENDENCIES std_msgs)
• catkin_package(… message_runtime)
然后写cpp文件,在CMakeLists.txt添加:
add_executable(person_server src/person_server.cpp)
target_link_libraries(person_server ${catkin_LIBRARIES})
add_dependencies(person_server ${PROJECT_NAME}_gencpp)
add_executable(person_client src/person_client.cpp)
target_link_libraries(person_client ${catkin_LIBRARIES})
add_dependencies(person_client ${PROJECT_NAME}_gencpp)
然后在终端运行:(三个终端)
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun learning_service person_server
$ rosrun learning_service person_client
ROS Master中有一个参数服务器Parameter Server,是一个全局字典,保存每个节点中的配置参数,这些参数每个节点都可以访问。
介绍一些命令行的使用(rosparam):
⚫ 列出当前多有参数
$ rosparam list
⚫ 显示某个参数值
$ rosparam get param_key
⚫ 设置某个参数值
$ rosparam set param_key param_value
⚫ 保存参数到文件,默认路径是主文件夹路径,就是/home/mol/下,也可以:/home/mol/study/ros_learn/param.yaml
$ rosparam dump file_name
⚫ 从文件读取参数,file_name是文件路径
$ rosparam load file_name
⚫ 删除参数
$ rosparam delete param_key
可以利用海龟测试上面命令行,roscore
然后rosrun turtlesim turtlesim_node
,然后再打开一个终端就可以测试上面命令行。
当数据比较多时,使用YAML文件来储存数据。
写parameter_config.cpp文件,CMakeLists.txt中加入
add_executable(parameter_config src/parameter_config.cpp)
target_link_libraries(parameter_config ${catkin_LIBRARIES})
然后执行:
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_parameter parameter_config
机器人的坐标系变换:
P A = T B A ∗ P B P^A=T^A_B*P^B PA=TBA∗PB
ros中的 TF 功能包:可以管理所有的坐标系,保存10秒内所有坐标系的位置信息,能够获取各个坐标系之间的转换关系。
TF 坐标变换如何实现:广播 TF 变换; 监听 TF 变换。
用海龟案例测试:
$ sudo apt-get install ros-kinetic-turtle-tf
安装功能包
$ roslaunch turtle_tf turtle_tf_demo.launch
启动一个launch文件,该文件是一个脚本,可以一次性提供很多节点
$ rosrun turtlesim turtle_teleop_key
打开按键控制
$ rosrun tf view_frames
可视化系统中 tf 的关系,生成一个PDF文件,存在根目录/home/mol/下
在执行第二和四步的时候会出现错误:ImportError: dynamic module does not define module export function (PyInit__tf2)
,是因为python版本问题导致的,可以通过退出base环境来解决:conda deactivate
,然后再执行第二步。
也可以通过rosrun tf tf_echo turtle1 turtle2
,查看坐标系turtle1和坐标系turtle2的变换关系:
Translation: [0.203, -0.123, 0.000]
Rotation: in Quaternion [0.000, 0.000, 0.963, 0.269] in RPY (radian) [0.000, -0.000, 2.596] in RPY (degree) [0.000, -0.000, 148.745]
Translation是表示平移量,Rotation表示旋转角:Quaternion四元素描述; radian弧度描述; degree角度描述。
也可以通过可视化工具:rosrun rviz rviz -d
rospack find turtle_tf/rviz/turtle_rviz.rviz
打开后在左下角 add 按键添加 TF ,选world坐标系。
创建功能包:
$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_tf roscpp rospy tf turtlesim
编写代码文件:turtle_tf_broadcaster.cpp和turtle_tf_listener.cpp
turtle_tf_broadcaster.cpp是实现 tf 的广播功能,获取海龟相对于世界坐标系的位置,然后储存。
turtle_tf_listener.cpp是实现 tf 的监听功能,通过上面代码获取的海龟位置来得到两个海龟间的相对位置,并用 Publisher 实现海龟2向海龟1靠近。
配置CMakeLists.txt中的编译规则
add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp)
target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})
add_executable(turtle_tf_listener src/turtle_tf_listener.cpp)
target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES})
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_tf turtle_tf_broadcaster __name:=turtle1_tf_broadcaster /turtle1
$ rosrun learning_tf turtle_tf_broadcaster __name:=turtle2_tf_broadcaster /turtle2
$ rosrun learning_tf turtle_tf_listener
$ rosrun turtlesim turtle_teleop_key
__name:=turtle1_tf_broadcaster是重映射机制,因为代码中已经有了节点名字,但是这个代码要运行两次,同名的节点不允许出现,所以这里将节点重命名。
launch文件可以实现多个节点之间的配置和启动,可以自动启动ros-master
启动节点:
output是控制节点是否要输出显示信息;respawn是控制节点挂掉是否要重启;required是控制节点是否是一定要启动的,ns是命名空间,给每个节点设置命名空间,避免命名冲突;args是给节点输入参数。
参数设置:
设置ROS系统运行中的参数,存储一个参数到参数服务器中:
• name:参数名
• value:参数值
加载参数文件中的多个参数:
launch文件内部的局部变量,仅限于launch文件使用
• name:参数名
• value:参数值
调用:
重映射:
重映射ROS计算图资源的命名。
• from:原命名
• to:映射之后的命名
嵌套:
包含其他launch文件,类似C语言中的头文件包含。
•file:包含的其他launch文件路径
更多标签可参见:http://wiki.ros.org/roslaunch/XML
创建功能包:catkin_create_pkg learning_launch
不需要添加依赖
进入功能包路径,创建文件夹launch
$ cd ~/catkin_ws
$ catkin_make
$ roslaunch learning_launch simple.launch
代码中turtlesim_parameter_config.launch文件中,放在节点
里面和外面是不一样的,通过rosparam 查看节点可以看到,在节点内加入的参数带有/turtlesim_node,节点外的则没有。
c++和py代码在launch中设置节点是不一样的,因为py没有可执行文件,详细的看:start_tf_demo_c++.launch和start_tf_demo_py.launch
QT
roscore
rosrun turtlesim turtlesim_node
用 rqt_
加 Tab键可以看到 ros 中 qt 工具箱的工具:
rqt_bag rqt_dep rqt_image_view rqt_plot rqt_console rqt_graph rqt_logger_level rqt_shell
其中的rqt_console
是显示系统的日志信息,比如警告等。
rqt_plot (电脑有误,无法打开),
rqt_image_view:显示摄像头图片
非常综合的工具:rqt,他综合了rqt相关工具的结合,rqt_plot可以通过plugins->visualization->plot打开,它可以打开各种检测窗口。
Rviz
机器人开发过程中的数据可视化界面,显示数据,必须要先有数据,所以加入的要链接数据获取的话题。其他看ppt或网上搜索。
roscore
rosrun rviz rviz
Gazebo
Gazebo是一款功能强大的三维物理仿真平台
roslaunch gazebo_ros willowgarage_world.launch