ROS学习笔记(二)- ROS驱动机器人实例

利用周末玩了一下先锋机器人(Pioneer3, P3AT),前后装了两次ROS,以及一大堆操作细节,打算整理记录一下方便以后解决问题用,同时通过实际操作,对上一篇学习笔记罗列出来的指令有了更深的理解,也把这里面的思考逻辑整理出来。

安装ROS

安装ROS的过程还是跟随wiki走http://wiki.ros.org/indigo/Installation/Ubuntu
这里要补充说明的是要根据Ubuntu的版本选择正确ROS版本,我用的是Ubuntu 14.04,选择ROS版本是indigo。 如果选择的ROS版本不支持相应Ubuntu系统(比如Ubuntu 14.04装kinetic),会报类似找不到源的错误。
按照上面wiki走完一遍之后,就建立工作空间和初始化,这步对于后续所有程序都有必要(对于只有一个工作空间),所以把其列在安装里,同时把依次的操作列出来:

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws/
catkin_make
source devel/setup.bash
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc

两点:
1.注意操作对应的路径,如在~/catkin_ws/下catkin_make和source操作
2.上面最后一句是为了每次打开一个终端时都自动执行这个命令,否则需要时需要手动执行
至此安装和环境配置完成。

下载ROSARIA和测试

ROSARIA包含机器人底层驱动的接口,可以在ROS里面驱动先锋机器人,具体的过程见http://wiki.ros.org/ROSARIA/Tutorials/How%20to%20use%20ROSARIA,因为一部分过程与上面配置ROS环境的内容重合,这里只列出接下来需要的必要操作:

cd ~/catkin_ws/src
git clone https://github.com/amor-ros-pkg/rosaria.git
cd ~/catkin_ws
rosdep update
rosdep install rosaria
catkin_make

到这里ROSARIA应该已经可以使用了。

假设到这里都没有问题了,下面就开始测试了,找到一个比较好的测试程序:https://github.com/pengtang/rosaria_client,是依赖于ROSARIA的另一个包,里面的readme也有详细的过程,按照里面步骤走没有问题。

测试驱动机器人

这里假设已经安装好MobileSim和ssh远程,因为都是师兄弄好的,这里也没有再找过程。另外,下载好rosaria_client到工作空间用于测试。

1.仿真机器人

Alt+t 打开一个新终端。

因为roscore是每次运行ROS前都需要进行的操作,但是在运行过程中占用一个终端窗口又不需要操作,所有这里用一下Ubuntu后台运行的小技巧

roscore &

这样就可以把程序一直放在后台运行而不占用窗口。同样的,后面一些长时间不运行不需要关闭的节点,可以通过“命令+空格+&”的方式放在后台运行,节点可以通过rosnode kill <节点>关闭。

运行机器人仿真:

MobileSim

Shift+Alt+t 打开终端的一个新标签,直接用roslaunch运行多个节点

roslaunch rosaria_client rosaria_client_launcher.launch 

如果运行没问题,则进入到一个界面,根据提示可以运行相应节点操作机器人,仿真完成。如果不想用launch,也可以参照https://github.com/pengtang/rosaria_client步骤2提到的另一种方式进行。

2.实际驱动先锋3

实际驱动机器人的过程跟仿真类似,只是里面端口的参数默认设置成了仿真机器人的端口,在实际驱动时需要重新设置一下。

ssh pioneer3-onboard@192.168.1.105
roscore
rosrun rosaria RosAria _port:=/dev/ttyS0
rosrun rosaria_client interface

如果仍想用launch命令,可以改一下.launch文件

cd ~/catkin_ws/src/rosaria_client/launch
vim rosaria_client_launcher.launch

可以看到

<launch>
        <node pkg = "rosaria" type = "RosAria" name = "RosAria">
                <param name="port" value="/dev/ttyUSB0" type="string"/>
        </node>

        <node pkg="rosaria_client" type="interface" name="RosAria_interface" output="screen"/>

</launch>

把/dev/ttyUSB0改成/dev/ttyS0就可以了,或者改完以后另存一个.launch文件。

这就是简单的对ROS驱动先锋机器人的测试,往后会持续探索更多功能实现,另外也还有另外一些测试实例,可以作为参考http://blog.csdn.net/david_han008/article/details/53966532

对ROS指令的理解

rosnode

ROS的核心操作对象是节点,一个节点即一个可执行程序,因而要实现功能时,先了解有哪些节点。 运行一个节点的指令是

rosrun [package_name] [node_name]

这个就是运行节点时的核心操作,如果不知道有哪些节点,可以在输完包名称后,按两次Tab键,列出包下面所有可运行的节点,即所有可执行的程序,这是理解程序包的第一步,也是运行的第一步。一般在运行节点以后,后面的命令才可用。

这里用MobileSim仿真的例子来说明,假设已运行roscore, MobileSim。 用Shift+Alt+t打开新窗口,然后运行

rosrun rosaria RosAria

为了查询节点的可用的服务、话题等功能,运行

rosnode info RosAria

可以看到

Node [/RosAria]
Publications: 
 * /RosAria/sonar_pointcloud2 [sensor_msgs/PointCloud2]
 * /RosAria/pose [nav_msgs/Odometry]
 * /RosAria/parameter_descriptions [dynamic_reconfigure/ConfigDescription]
 * /RosAria/motors_state [std_msgs/Bool]
 * /rosout [rosgraph_msgs/Log]
 * /tf [tf2_msgs/TFMessage]
 * /RosAria/parameter_updates [dynamic_reconfigure/Config]
 * /RosAria/battery_state_of_charge [std_msgs/Float32]
 * /RosAria/bumper_state [rosaria/BumperState]
 * /RosAria/battery_voltage [std_msgs/Float64]
 * /RosAria/battery_recharge_state [std_msgs/Int8]
 * /RosAria/sonar [sensor_msgs/PointCloud]

Subscriptions: 
 * /RosAria/cmd_vel [unknown type]

Services: 
 * /RosAria/set_parameters
 * /RosAria/disable_motors
 * /RosAria/get_loggers
 * /RosAria/set_logger_level
 * /RosAria/enable_motors


contacting node http://pioneerclient-Lenovo-G40-70m:50648/ ...
Pid: 4192
Connections:
 * topic: /rosout
    * to: /rosout
    * direction: outbound
    * transport: TCPROS

这样就列出了RosAria节点的话题和服务。

rostopic

假设想让仿真机器人以一定线速度向前走,这时,可以从http://wiki.ros.org/ROSARIA找对应的API接口,这里用到话题/RosAria/cmd_vel,这个名称的话题在ROS里面经常是改变速度的功能,在乌龟仿真中也有提到。当然,还可以直接查询,利用rostopic。如果这里忘记了rostopic的用法,这里运行

rostopic -h

看到

rostopic is a command-line tool for printing information about ROS Topics.

Commands:
        rostopic bw     display bandwidth used by topic
        rostopic delay  display delay of topic from timestamp in header
        rostopic echo   print messages to screen
        rostopic find   find topics by type
        rostopic hz     display publishing rate of topic    
        rostopic info   print information about active topic
        rostopic list   list active topics
        rostopic pub    publish data to topic
        rostopic type   print topic type

Type rostopic <command> -h for more detailed usage, e.g. 'rostopic echo -h'

进一步想到,可以用rostopic list列出所有活动的话题,得到

rostopic list

/RosAria/battery_recharge_state
/RosAria/battery_state_of_charge
/RosAria/battery_voltage
/RosAria/bumper_state
/RosAria/cmd_vel
/RosAria/motors_state
/RosAria/parameter_descriptions
/RosAria/parameter_updates
/RosAria/pose
/RosAria/sonar
/RosAria/sonar_pointcloud2
/rosout
/rosout_agg
/tf

然后可以通过rostopic info 查询这些话题,这里已经知道是/RosAria/cmd_vel,所以运行得到

rostopic info /RosAria/cmd_vel 
Type: geometry_msgs/Twist

Publishers: None

Subscribers: 
 * /RosAria (http://pioneerclient-Lenovo-G40-70m:50648/)

顺便在这里提非常有实用的一点,就是善用Tab补全,比如在上面输完rostopic info 后,按下两次Tab键,自然列出所有操作的对象,这里是所有活动话题:

rostopic info /

/RosAria/battery_recharge_state   /RosAria/parameter_updates
/RosAria/battery_state_of_charge  /RosAria/pose
/RosAria/battery_voltage          /RosAria/sonar
/RosAria/bumper_state             /RosAria/sonar_pointcloud2
/RosAria/cmd_vel                  /rosout
/RosAria/motors_state             /rosout_agg
/RosAria/parameter_descriptions   /tf

相反,如果输入的指令不对,按Tab补全的时候会无效,可以查看哪里有问题。
这对于实际操作来说非常方便,在所有地方都会用到,需慢慢习惯使用。

接着上面列出/RosAria/cmd_vel的信息,可以看到话题的消息(msg)类型是geometry_msgs/Twist。为了知道这个消息类型的含义,一方面可以通过wiki的相关跳转找到,比如找到cml_vel的条目,括号里的类型有跳转链接http://docs.ros.org/api/geometry_msgs/html/msg/Twist.html,如果仍不知道vector3的含义,可以再次跳转http://docs.ros.org/api/geometry_msgs/html/msg/Vector3.html,结合这两条就知道geometry_msgs/Twist实际就是两个float类型的向量。

如果不想这么麻烦地查找网页,有更加简便的方法,就是使用rosmsg查询。如在这里,可以运行

rosmsg show geometry_msgs/Twist

可以看到

geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

变量的显示一目了然,同时看到第一个向量是线速度,第二个向量是角速度。知道了消息类型,就可以往/RosAria/cmd_vel发布消息,假设在这里忘记了发布消息的格式,继续用-h,这里运行

rostopic pub -h

可以看到

Usage: rostopic pub /topic type [args...]

所以在这里运行

rostopic pub /RosAria/cmd_vel geometry_msgs/Twist '[10.0, 0.0, 0.0]' '[0.0, 0.0, 0.0]'

就可以看到机器人向前行进了一小段,这是由于只往话题发布了一次消息。
至此,对于话题的使用根据这个思路基本上可以复现,其它的功能用-h帮助进行,如想按一定频率连续发布消息,继续-h(就是上面的操作),后面的那一段是

Options:
  -h, --help            show this help message and exit
  -v                    print verbose output
  -r RATE, --rate=RATE  publishing rate (hz).  For -f and stdin input, this
                        defaults to 10.  Otherwise it is not set.
  -1, --once            publish one message and exit
  -f FILE, --file=FILE  read args from YAML file (Bagy)
  -l, --latch           enable latching for -f, -r and piped input.  This
                        latches the first message.
  -s, --substitute-keywords
                        When publishing with a rate, performs keyword ('now'
                        or 'auto') substitution for each message

看到上面的-r RATE的格式,所以这里运行

rostopic pub /RosAria/cmd_vel geometry_msgs/Twist  -r 1 '[10.0,0.0,0.0]' '[0.0,0.0,0.0]'

以1Hz的频率发布,即每秒发布一次,可以看到机器人一直向前走。

rosservice

用类似的思路来看看rosservice的用法,首先运行

rosservice -h

Commands:
        rosservice args print service arguments
        rosservice call call the service with the provided args
        rosservice find find services by service type
        rosservice info print information about service
        rosservice list list active services
        rosservice type print service type
        rosservice uri  print service ROSRPC uri

看看rosservice有哪些用法,然后运行

rosservice list

/RosAria/disable_motors
/RosAria/enable_motors
/RosAria/get_loggers
/RosAria/set_logger_level
/RosAria/set_parameters
/rosout/get_loggers
/rosout/set_logger_level

看看有哪些可用的服务。要调用服务要用rosservice call

rosservice call -h
Usage: rosservice call /service [args...]

假设现在要调用/RosAria/enable_motors,用rosservice args查询需要的参数

rosservice args /RosAria/enable_motors

可以看到上面的结果为空,所以最后

rosservice call /RosAria/enable_motors

直接调用即可,不过这个例子在这里看不到明显现象。

roslaunch

roslaunch的用法就简单得多,它的功能是同时运行多个节点,主要由.launch文件实现,而.launch文件也很好理解,再贴一次上面驱动机器人实验时的.launch文件

<launch>
        <node pkg = "rosaria" type = "RosAria" name = "RosAria">
                <param name="port" value="/dev/ttyUSB0" type="string"/>
        </node>

        <node pkg="rosaria_client" type="interface" name="RosAria_interface" output="screen"/>

</launch>

更加详细的解释可以参照wiki

总结

由于ROS的概念、操作较多,这里整理了遗忘重拾的思路,方便对操作未熟练以及太久遗忘的情况,可以通过指令来找回一些基本操作,实际上上面的举例跟乌龟仿真的实验非常相似。

一些遇见的问题

记录一下遇到的问题和解决办法,在安装ROS时报错:
E: Sub-process /usr/bin/dpkg returned an error code
这是因为Ubuntu自身的问题,在安装过程中由于未知原因系统出现问题打断了安装,导致重新装出现问题。解决办法见http://yanue.net/post-123.html

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
搭建自己的机器人模型需要进行以下步骤: 1. 安装ROS和仿真工具包 2. 创建ROS包和机器人模型 3. 编写机器人控制程序 4. 启动仿真环境并加载机器人模型 5. 运行机器人控制程序,观察仿真结果 下面是一个简单的机器人模型搭建示例,使用ROS Kinetic和Gazebo仿真工具包: 1. 安装ROS和仿真工具包 在Ubuntu系统中使用以下命令安装ROS Kinetic和Gazebo仿真工具包: ``` sudo apt-get update sudo apt-get install ros-kinetic-desktop-full sudo apt-get install ros-kinetic-gazebo-ros-pkgs ros-kinetic-gazebo-ros-control ``` 2. 创建ROS包和机器人模型 使用以下命令创建一个名为my_robot的ROS包,并在其中创建一个名为urdf的目录用于存放机器人模型文件: ``` mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_create_pkg my_robot cd my_robot mkdir urdf ``` 在urdf目录中创建一个名为my_robot.urdf的机器人模型文件,内容如下: ```xml <?xml version="1.0"?> <robot name="my_robot" xmlns:xacro="http://www.ros.org/wiki/xacro"> <link name="base_link"> <visual> <geometry> <box size="0.3 0.3 0.1"/> </geometry> </visual> </link> <joint name="base_joint" type="fixed"> <parent link="world"/> <child link="base_link"/> <origin xyz="0 0 0.05"/> </joint> <link name="left_wheel_link"> <visual> <geometry> <cylinder length="0.05" radius="0.1"/> </geometry> </visual> </link> <joint name="left_wheel_joint" type="continuous"> <parent link="base_link"/> <child link="left_wheel_link"/> <origin xyz="0.15 0 -0.05"/> <axis xyz="0 1 0"/> </joint> <link name="right_wheel_link"> <visual> <geometry> <cylinder length="0.05" radius="0.1"/> </geometry> </visual> </link> <joint name="right_wheel_joint" type="continuous"> <parent link="base_link"/> <child link="right_wheel_link"/> <origin xyz="0.15 0 0.05"/> <axis xyz="0 1 0"/> </joint> </robot> ``` 这个机器人模型由一个长方体的底座和两个圆柱形的轮子组成,使用URDF格式描述。其中base_link表示机器人的底座,left_wheel_link和right_wheel_link分别表示左右两个轮子。 3. 编写机器人控制程序 在ROS包的src目录中创建一个名为my_robot_control.cpp的控制程序文件,内容如下: ```cpp #include <ros/ros.h> #include <geometry_msgs/Twist.h> int main(int argc, char** argv) { ros::init(argc, argv, "my_robot_control"); ros::NodeHandle nh; ros::Publisher cmd_vel_pub = nh.advertise<geometry_msgs::Twist>("cmd_vel", 10); ros::Rate loop_rate(10); while (ros::ok()) { geometry_msgs::Twist cmd_vel; cmd_vel.linear.x = 0.1; cmd_vel.angular.z = 0.5; cmd_vel_pub.publish(cmd_vel); ros::spinOnce(); loop_rate.sleep(); } return 0; } ``` 这个控制程序使用ROS的Twist消息类型发布机器人的线速度和角速度,以控制机器人的运动。在这个示例中,机器人线速度为0.1,角速度为0.5。 4. 启动仿真环境并加载机器人模型 使用以下命令启动Gazebo仿真环境,并加载机器人模型: ``` roslaunch my_robot my_robot.launch ``` 在my_robot包中创建一个名为my_robot.launch的启动文件,内容如下: ```xml <?xml version="1.0"?> <launch> <arg name="model" default="$(find my_robot)/urdf/my_robot.urdf"/> <param name="robot_description" textfile="$(arg model)" /> <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model my_robot -param robot_description -x 0 -y 0 -z 0"/> <node name="my_robot_control" type="my_robot_control" pkg="my_robot"/> <node name="gazebo_gui" pkg="gazebo" type="gazebo"/> </launch> ``` 这个启动文件首先将机器人模型文件加载到ROS参数服务器中,然后使用gazebo_ros包的spawn_model节点将机器人模型加载到Gazebo仿真环境中。同时运行my_robot_control程序节点控制机器人运动。最后启动Gazebo仿真环境的GUI界面。 5. 运行机器人控制程序,观察仿真结果 使用以下命令运行my_robot_control程序节点,控制机器人运动: ``` rosrun my_robot my_robot_control ``` 可以观察到仿真环境中的机器人开始运动,同时在控制程序的终端输出中可以看到机器人的线速度和角速度。 下图为搭建自己的机器人模型的结果截图: ![ROS机器人仿真结果截图](https://i.imgur.com/lv9v5a1.png)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值