ROS探索总结(三十一)——ros_control

62682
196
2017年3月23日 16时07分

ROS中提供了丰富的机器人应用:SLAM、导航、MoveIt……但是你可能一直有一个疑问,这些功能包到底应该怎么样用到我们的机器人上,也就是说在应用和实际机器人或者机器人仿真器之间,缺少一个连接两者的东西。

clip_image002

ros_control就是ROS为用户提供的应用与机器人之间的中间件,包含一系列控制器接口、传动装置接口、硬件接口、控制器工具箱等等,可以帮助机器人应用快速落地,提高开发效率。

 

一、总体框架

clip_image004

上图是ros_control的总体框架,可以看到正对不同类型的控制器(底盘、机械臂等),ros_control可以提供多种类型的控制器,但是这些控制器的接口各不相同,为了提高代码的复用率,ros_control还提供一个硬件的抽象层。

clip_image006

硬件抽象层负责机器人硬件资源的管理,而controller从抽象层请求资源即可,并不直接接触硬件。

clip_image008

上图是ros_control的数据流图,可以更加清晰的看到每个层次包含的功能:

  1. Controller Manager:每个机器人可能有多个controller,所以这里有一个控制器管理器的概念,提供一种通用的接口来管理不同的controllercontroller manager的输入就是ROS上层应用的输出。
  2. Controllercontroller可以完成每个joint的控制,请求下层的硬件资源,并且提供了PID控制器,读取硬件资源接口中的状态,在发布控制命令。
  3. Hardware Rescource:为上下两层提供硬件资源的接口。
  4. RobotHW:硬件抽象层和硬件直接打交道,通过writeread方法来完成硬件的操作,这一层也包含关节限位、力矩转换、状态转换等功能。
  5. Real Robot:实际的机器人上也需要有自己的嵌入式控制器,接收到命令后需要反映到执行器上,比如接收到位置1的命令后,那就需要让执行器快速、稳定的到达位置1

 

二、Controllers

ros_controllers这个功能包提供了已有的一些controllers

clip_image010

当然,我们也可以根据自己的需求,创建需要的controller,然后通过controller来管理自己创建的controller,可以参考https://github.com/ros-controls/ros_control/wiki/controller_interface

clip_image012

 

 

三、Hardware Interface

Hardware InterfacecontrollerRobotHw沟通的接口,基本上和controllers的种类是对应的,同样可以自己创建需要的接口,可以参考:https://github.com/ros-controls/ros_control/wiki/hardware_interface

clip_image014clip_image015

 

 

四、Transmissions

Transmissions就是机器人的传动系统,机器人每个需要运动的关节都需要配置相应的Transmission

可以通过代码完成https://github.com/ros-controls/ros_control/wiki/transmission_interface,但大部分情况下,都会在URDF文件中直接添加(http://ros.org/wiki/urdf/XML/Transmission):

<transmission name="simple_trans">
     <type>transmission_interface/SimpleTransmission</type>
     <joint name="foo_joint">
          <hardwareInterface>EffortJointInterface</hardwareInterface>
     </joint>
     <actuator name="foo_motor">
          <mechanicalReduction>50</mechanicalReduction>
          <hardwareInterface>EffortJointInterface</hardwareInterface>
     </actuator>
</transmission>

 

五、Joint Limits

Joint Limits是硬件抽象层中的一块,维护一个关节限位的数据结构,这些限位数据可以从机器人的URDF文件中加载,也可以ROS的参数服务器上加载(先用YAML配置文件导入ROS parameter server),这些限位数据不仅包含关节速度、位置、加速度、加加速度、力矩等方面的限位,还包含安全作用的位置软限位、速度边界(k_v位置边界(k_p等等。

我们来看一个URDF中设置Joint Limits的例子:

<joint name="$foo_joint" type="revolute">
  <!-- other joint description elements -->

  <!-- Joint limits -->
  <limit lower="0.0"
         upper="1.0"
         effort="10.0"
         velocity="5.0" />

  <!-- Soft limits -->
  <safety_controller k_position="100"
                     k_velocity="10"
                     soft_lower_limit="0.1"
                     soft_upper_limit="0.9" /> 
</joint>

还有一些参数需要通过YAML配置文件先加载到参数服务器中,YAML文件的格式如下:

joint_limits:
  foo_joint:
    has_position_limits: true
    min_position: 0.0
    max_position: 1.0
    has_velocity_limits: true
    max_velocity: 2.0
    has_acceleration_limits: true
    max_acceleration: 5.0
    has_jerk_limits: true
    max_jerk: 100.0
    has_effort_limits: true
    max_effort: 5.0
  bar_joint:
    has_position_limits: false # Continuous joint
    has_velocity_limits: true
    max_velocity: 4.0

另外,我们还可以在代码中使用joint_limits_interface来加载和设置关节的限位参数,可以参考:joint_limits_interface

 

六、controller manager

controller_manager提供了一种多controller控制的机制,可以加载、开始运行、停止运行、卸载不同的controller,并且提供了多种工具来完成这些操作。

 

clip_image017

 

1.命令行工具

命令行的格式为:

$ rosrun controller_manager controller_manager <command> <controller_name>

支持的<command>

  • load: load a controller (construct and initialize)
  • unload: unload a controller (destruct)
  • start: start a controller
  • stop: stop a controller
  • spawn: load and start a controller
  • kill: stop and unload a controller

如果想要查看某个controller的状态,可以使用下边的命令:

$ rosrun controller_manager controller_manager <command>

支持的<command>

  • list: list all the controllers in the order they are executed, and give the state of each controller
  • list-types: list all the controller types the controller manager knows about. If your controller is not in this list, you won’t be able to spawn it.
  • reload-libraries: Reloads all the controller libraries that are available as plugins. This is convenient when you are developing a controller and you want to test your new controller code, without restarting the robot every time. This does not restart controllers which were running before.
  • reload-libraries –restore: Reloads all the controller libraries that are available as plugins and restores all controllers to their original state.

但是很多时候我们需要控制的controller有很多,比如六轴机器人,至少有六个controller,这时也可以使用“spawner ”这个命令来一次控制多个controller

rosrun controller_manager spawner [--stopped] name1 name2 name3

上边的命令可以自动加载、启动controller,如果加上–stopped参数,那么contrller则只会被加载,但是并不会开始运行。如果想要停止一系列controller,但是不需要卸载,还需要运行的话,可以使用下边的命令:

 $ rosrun controller_manager unspawner name1 name2 name3

 

2.launch工具

launch文件中,同样可以通过运行controller_manager包的命令,来加载和启动一系列controller

 <launch>
   <node pkg="controller_manager"
         type="spawner"
         args="controller_name1 controller_name2" /> 
 </launch>

上边的launch文件会加载并启动controllers,如果只需要加载:

<launch>
  <node pkg="controller_manager"
    type="spawner"
    args="--stopped controller_name1 controller_name2" />
</launch>

 

3.可视化工具rqt_controller_manager

controller_manager还提供了可视化工具rqt_controller_manager,安装rosrun rqt_controller_manager rqt_controller_manager,直接使用下边的命令打开:

rosrun rqt_controller_manager rqt_controller_manager

不过目前我用的indigo ros版本里边,这个工具貌似有问题,找不到executable

 

七、案例分析

OK,前边学习了这么多新的概念,我们还是找一个实际的案例来分析一下。gazebotutorials里边提供了gazebo_ros_control的教程,用到一个两个关节的机械臂作为案例,我们就来分析一下这个案例中都是怎样落实上边这些概念的。源码可以在这里找到。

clip_image019

首先来看一张gazebo结合ros_control的架构图,其实和上边的数据流图差别不大。

 

1.Transmissions

rrbot有两个关节,每个关节都有一个传动装置,所以应该有两个Transmissions,在rrbotURDF文件rrbot.xacro文件中,我们可以找到这两个Transmissions

  <transmission name="tran1">
    <type>transmission_interface/SimpleTransmission</type>
    <joint name="joint1">
      <hardwareInterface>EffortJointInterface</hardwareInterface>
    </joint>
    <actuator name="motor1">
      <hardwareInterface>EffortJointInterface</hardwareInterface>
      <mechanicalReduction>1</mechanicalReduction>
    </actuator>
  </transmission>

  <transmission name="tran2">
    <type>transmission_interface/SimpleTransmission</type>
    <joint name="joint2">
      <hardwareInterface>EffortJointInterface</hardwareInterface>
    </joint>
    <actuator name="motor2">
      <hardwareInterface>EffortJointInterface</hardwareInterface>
      <mechanicalReduction>1</mechanicalReduction>
    </actuator>

  </transmission>

同时,为了让Gazebo可以识别<transmission>标签,还需要家在一个gazeboros_control插件:

<gazebo>
  <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
    <robotNamespace>/rrbot</robotNamespace>
  </plugin>
</gazebo>

2.controllercontroller_manager

首先通过一个YAML文件rrbot_control.yaml来声明我们所需要的controller,以及对应的参数:

rrbot:
  # Publish all joint states -----------------------------------
  joint_state_controller:
    type: joint_state_controller/JointStateController
    publish_rate: 50 

  # Position Controllers ---------------------------------------
  joint1_position_controller:
    type: effort_controllers/JointPositionController
    joint: joint1
    pid: {p: 100.0, i: 0.01, d: 10.0}
  joint2_position_controller:
    type: effort_controllers/JointPositionController
    joint: joint2

    pid: {p: 100.0, i: 0.01, d: 10.0}

其中还需要包含一个joint_state_controller,来控制发布每个关节的实时状态。

然后使用launch文件rrbot_control.launch,运行controller_manager中的spawner,加载并运行这些上边这些controller

<launch>

  <!-- Load joint controller configurations from YAML file to parameter server -->
  <rosparam file="$(find rrbot_control)/config/rrbot_control.yaml" command="load"/>

  <!-- load the controllers -->
  <node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
    output="screen" ns="/rrbot" args="joint1_position_controller joint2_position_controller joint_state_controller"/>

  <!-- convert joint states to TF transforms for rviz, etc -->
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
    respawn="false" output="screen">
    <remap from="/joint_states" to="/rrbot/joint_states" />
  </node>

</launch>

这个例程没有涉及到Joint Limits。通过下边命令就可以在gazebo中启动rrbot并且开始控制:

roslaunch rrbot_gazebo rrbot_world.launch
roslaunch rrbot_control rrbot_control.launch

clip_image021

也可以手动调用完成controller的加载:

rosservice call /rrbot/controller_manager/load_controller "name: 'joint1_position_controller'"
rosservice call /rrbot/controller_manager/load_controller "name: 'joint2_position_controller'"

启动controller

rosservice call /rrbot/controller_manager/switch_controller "{start_controllers: ['joint1_position_controller','joint2_position_controller'], stop_controllers: [], strictness: 2}"

停止controller

rosservice call /rrbot/controller_manager/switch_controller "{start_controllers: [], stop_controllers: ['joint1_position_controller','joint2_position_controller'], strictness: 2}"

使用下边的命令就可以让机器人动起来:

rostopic pub -1 /rrbot/joint1_position_controller/command std_msgs/Float64 "data: 1.5"
rostopic pub -1 /rrbot/joint2_position_controller/command std_msgs/Float64 "data: 1.0"

 

 

发表评论

后才能评论

评论列表(196条)

  • 安好 2020年5月18日 下午2:34

    古月老师您好,我的麦伦小车用libgazebo_ros_diff_drive.so插件控制运动的时候轮子是会转动的,改成libgazebo_ros_planar_move.so后小车会运动,但是轮子不动了,您知道是什么原因么?另外我对Transmissions和ros_control插件什么时候用搞不清出,文中您说每个关节都有一个传动装置且为了让Gazebo可以识别标签,还需要加一个gazebo的ros_control插件,但是我看您的mbot例子中只有标签没有ros_control插件,另外我还对比了turtlebot3小车,发现没有标签但是有ros_control插件,这两个难道不是必须的么

    • pipi田 回复 安好 2020年7月16日 上午11:37

      您好,请问您的麦轮小车的模型是自己搭建的吗?

  • 华韶 2020年4月29日 上午9:06

    老师您好,我再做PX4视觉SLAM仿真用launch文件启动Gazebo时遇到这个问题,能帮我看一下吗,Gazebo加载不出来环境
    [INFO] [1588122219.576544, 0.000000]: Waiting for service /gazebo/spawn_sdf_model
    INFO [dataman] Unknown restart, data manager file ‘./dataman’ size is 11798680 bytes
    INFO [simulator] Waiting for simulator to connect on TCP port 4560
    Warning [parser.cc:950] XML Element[gravity], child of element[physics] not defined in SDF. Ignoring[gravity]. You may have an incorrect SDF file, or an sdformat version that doesn’t support this element.
    Warning [parser.cc:950] XML Element[magnetic_field], child of element[physics] not defined in SDF. Ignoring[magnetic_field]. You may have an incorrect SDF file, or an sdformat version that doesn’t support this element.
    [INFO] [1588122220.782951, 0.000000]: Calling service /gazebo/spawn_sdf_model
    [INFO] [1588122220.794389, 0.000000]: Spawn status: SpawnModel: Entity pushed to spawn queue, but spawn service timed out waiting for entity to appear in simulation under the name iris
    [ INFO] [1588122220.814281404, 1814.819000000]: waitForService: Service [/gazebo/set_physics_properties] is now available.
    [ INFO] [1588122220.838510622, 1814.843000000]: Physics dynamic reconfigure ready.
    [vehicle_spawn_huashao_Inspiron_7560_17062_4702180110151250116-5] process has finished cleanly
    log file: /home/huashao/.ros/log/423b9e18-89b5-11ea-81b4-58fb84435f21/vehicle_spawn_huashao_Inspiron_7560_17062_4702180110151250116-5*.log
    [ INFO] [1588122221.301488135, 1814.879000000]: Camera Plugin: The ‘robotNamespace’ param did not exit
    [ INFO] [1588122221.301667382, 1814.879000000]: Camera Plugin: The ‘robotNamespace’ param did not exit
    [ INFO] [1588122221.305027448, 1814.879000000]: Camera Plugin (ns = ) , set to “”
    [ INFO] [1588122221.305419570, 1814.879000000]: Camera Plugin (ns = )
    , set to “”
    Aborted (core dumped)
    [gazebo-3] process has died [pid 17123, exit code 134, cmd /opt/ros/kinetic/lib/gazebo_ros/gzserver -e ode /home/huashao/PX4_Firmware/Tools/sitl_gazebo/worlds/indoor1.world __name:=gazebo __log:=/home/huashao/.ros/log/423b9e18-89b5-11ea-81b4-58fb84435f21/gazebo-3.log].
    log file: /home/huashao/.ros/log/423b9e18-89b5-11ea-81b4-58fb84435f21/gazebo-3*.log

    • 1u708_1853 回复 华韶 2020年5月6日 下午3:38

      您好,您的问题解决了么?我也遇到个类似问题。

  • RBT 2019年12月19日 上午11:56

    古老师,请问一下在创建标签时如果需要创建随动关节应该采用怎样的hardwareInterface?还有就是这种情况下需不需要添加标签?小白上手gazebo有点迷惑…

    • 古月 回复 RBT 2019年12月23日 下午3:31

      主动关节才需要创建transmission标签,随动的在joint中设置mimic属性

  • lencm 2019年9月19日 下午9:53

    老师,我想问一下,我以ur5为模板,建了sia0f的gazebo模型,并通过rviz控制gazebo的机械臂,但是sia0f是7自由度的机械臂,现在可以动,但不能得到第7个link的状态。controller用的FollowJointTrajectory,现在应该怎么修改呢?

    • 古月 回复 lencm 2019年10月28日 下午5:58

      可能是joint_state_controller没配置好

  • mr.guo 2019年9月17日 下午1:43

    想用control控制真实桌面3轴机械臂,使用串口进行通信。目前自建action server与moveit对接,已经可以很好的控制机械臂动作,现尝试使用ros controller进行控制,我想问的是使用ros controller只需重写读写接口就可以?具体的开发流程是怎么的?
    定义了 cmd,pos,vel,eff 数组,不明白cmd的数据是重哪里获取,moveit规划出来的关节轨迹数据输出到哪里去了。

  • 郑帅 2019年6月4日 下午7:52

    老师,您好。我在用launch文件加载一个物体到我的gazebo环境中时报错。您看是什么原因?
    [INFO] [1559648330.100203, 0.000000]: Loading model XML from ros parameter robot_description
    [INFO] [1559648330.104791, 0.000000]: Waiting for service /gazebo/spawn_urdf_model
    [INFO] [1559648330.108016, 0.000000]: Calling service /gazebo/spawn_urdf_model
    [ERROR] [1559648330.891578, 0.000000]: WORLD RESET
    [INFO] [1559648340.135581, 17.194000]: Spawn status: SpawnModel: Entity pushed to spawn queue, but spawn service timed out waiting for entity to appear in simulation under the name simple_sphere_1_start
    [ERROR] [1559648340.136862, 17.195000]: Spawn service failed. Exiting.
    [WARN] [1559648340.162095, 17.214000]: Start Init ControllersConnection
    [WARN] [1559648340.162954, 17.214000]: END Init ControllersConnection
    [ERROR] [1559648340.258315, 17.272000]: WORLD RESET

  • 小明 2019年5月30日 下午10:55

    古月君您好,我最近在做并联机器人,打算使用gazebo仿真,鉴于urdf本身不支持闭链结构,所以用sdf建模。但发现ros_control似乎不支持直接在sdf中调用,请问您有解决过类似的问题吗?

    • 古月 回复 小明 2019年5月31日 上午9:59

      没搞过并联

    • 小明 回复 古月 2019年5月31日 上午10:04

      好的谢谢~

    • 木子 回复 小明 2019年6月19日 下午5:38

      你好 !我最近也在研究用 ROS+Gazebo 进行并联机构的运动仿真。并联机构需要用 SDF 建模,需要一个插件将 SDF 文件转换为 ros_control 识别的 URDF 文件才行。请问你现在研究进展如何?方便的话,加个 QQ 交流一下吧,我 QQ:1905252329

    • 晓萧 回复 木子 2019年8月5日 下午5:00

      你好 ,我现在也在做一个并联机构的Gazebo并联仿真,可以一起交流一下吗

    • SongSama 回复 木子 2019年8月14日 下午6:40

      你好,我也在做并联机构的动力学仿真,已经用SDF完成了并联结构的建模,卡在了ros_control的地方,可以和您交流一下吗,我的qq834553222

  • 伍六七 2019年5月25日 下午10:40

    /home/user/catkin_ws/src/ros_control/combined_robot_hw/src/combined_robot_hw.cpp: At global scope:
    /home/user/catkin_ws/src/ros_control/combined_robot_hw/src/combined_robot_hw.cpp:210:66: error: ‘hardware_interface::RobotHWSharedPtr’ has not been declared
    hardware_interface::RobotHWSharedPtr robot_hw)
    ^
    /home/user/catkin_ws/src/ros_control/combined_robot_hw/src/combined_robot_hw.cpp: In member function ‘void combined_robot_hw::CombinedRobotHW::filterControllerList(const std::__cxx11::list&, std::__cxx11::list&, int)’:
    /home/user/catkin_ws/src/ros_control/combined_robot_hw/src/combined_robot_hw.cpp:228:56: error: base operand of ‘->’ is not a pointer
    std::vector r_hw_ifaces = robot_hw->getNames();
    ^
    /home/user/catkin_ws/src/ros_control/combined_robot_hw/src/combined_robot_hw.cpp:236:65: error: base operand of ‘->’ is not a pointer
    std::vector r_hw_iface_resources = robot_hw->getInterfaceResources(filtered_iface_resources.hardware_interface);
    ^
    ros_control/combined_robot_hw/CMakeFiles/combined_robot_hw.dir/build.make:62: recipe for target ‘ros_control/combined_robot_hw/CMakeFiles/combined_robot_hw.dir/src/combined_robot_hw.cpp.o’ failed
    make[2]: *** [ros_control/combined_robot_hw/CMakeFiles/combined_robot_hw.dir/src/combined_robot_hw.cpp.o] Error 1
    CMakeFiles/Makefile2:3102: recipe for target ‘ros_control/combined_robot_hw/CMakeFiles/combined_robot_hw.dir/all’ failed
    make[1]: *** [ros_control/combined_robot_hw/CMakeFiles/combined_robot_hw.dir/all] Error 2
    Makefile:138: recipe for target ‘all’ failed
    make: *** [all] Error 2
    Invoking “make -j1 -l1” failed

    古老师,我自己写了一个插件,一直报这个错误是什么问题呀?

  • 牛大 2019年5月8日 下午4:04

    古老师,我在跑开发实践10.11章节时,会出现报错 Controller Spawner couldn’t find the expected controller_manager ROS interface. 我在网上查的也都是说我没有安装ros control包,我已经使用sudo apt-get install ros-kinetic-ros-control安装了,也提示ros-kinetic-ros-control 已经是最新版 ,在opt里可以看到controller-manager的包,请问这大概是出现了什么问题

    • 古月 回复 牛大 2019年5月8日 下午4:24

      ros-controllers和gazebo-ros-contrl也要安装

    • 牛大 回复 古月 2019年5月8日 下午4:39

      sudo apt-get install ros-kinetic-ros-controllers 提示ros-kinetic-ros-controllers 已经是最新版
      sudo apt-get install ros-kinetic-gazebo-ros-control提示ros-kinetic-gazebo-ros-control 已经是最新版 (2.5.18-1xenial-20190320-175439-0800)。
      下列软件包是自动安装的并且现在不需要了:
      linux-headers-4.15.0-45 linux-headers-4.15.0-45-generic
      linux-image-4.15.0-45-generic linux-modules-4.15.0-45-generic
      linux-modules-extra-4.15.0-45-generic
      使用’sudo apt autoremove’来卸载它(它们)。
      升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 43 个软件包未被升级。
      应该是都安装了吧

    • 古月 回复 牛大 2019年5月11日 上午9:01

      那应该是都安装了

    • ICE 回复 牛大 2020年7月24日 下午5:12

      你好,我也遇到了同样问题,请问你是怎么解决的这个问题啊

  • zp 2019年5月6日 上午10:54

    古老师你好,我在加载hector_quadrotor无人机包的室外demo时(我把它的室外模型换成自己搭建的),由于模型较大,加载时gazebo会出现一分钟左右的卡死,但可以加载出来,就是控制器好像加载不出来,最后键盘也控制不了无人机(加载小模型没问题).我想知道时应为模型太大,导致控制器加载不出来吗.终端提示如下:

    [WARN] [1557110263.348257, 0.000000]: Controller Spawner couldn’t find the expected controller_manager ROS interface.
    [controller_spawner-6] process has finished cleanly
    log file: /home/zp/.ros/log/d7b4121e-6fa7-11e9-a691-1008b1da03ef/controller_spawner-6*.log
    [INFO] [1557110263.756533, 2860.919000]: Spawn status: SpawnModel: Entity pushed to spawn queue, but spawn service timed out waiting for entity to appear in simulation under the name quadrotor
    [ INFO] [1557110264.072482070, 2860.919000000]: waitForService: Service [/enable_motors] has not been advertised, waiting…
    [spawn_robot-11] process has finished cleanly
    log file: /home/zp/.ros/log/d7b4121e-6fa7-11e9-a691-1008b1da03ef/spawn_robot-11*.log
    [ INFO] [1557110264.120588149, 2860.919000000]: waitForService: Service [/enable_motors] has not been advertised, waiting…
    [ WARN] [1557110264.429126399, 2860.919000000]: No transform between frames /map and /base_link available after 2860.919000 seconds of waiting. This warning only prints once.
    [ INFO] [1557110264.517102112, 2860.919000000]: Camera Plugin: Using the ‘robotNamespace’ param: ‘/’
    [ INFO] [1557110264.542771361, 2860.919000000]: Camera Plugin (ns = /) , set to “”
    [ INFO] [1557110265.131601453, 2860.919000000]: Laser Plugin: Using the ‘robotNamespace’ param: ‘/’
    [ INFO] [1557110265.131987752, 2860.919000000]: Starting Laser Plugin (ns = /)
    [ INFO] [1557110265.188372224, 2860.919000000]: Laser Plugin (ns = /) , set to “”
    [ INFO] [1557110265.385690425, 2860.919000000]: imu plugin missing , defaults to 0s
    [ INFO] [1557110266.372225971, 2860.919000000]: Loading gazebo_ros_control plugin
    [ WARN] [1557110266.372502063, 2860.919000000]: Desired controller update period (0.010000000 s) is slower than the gazebo simulation period (0.001000000 s).

    • 古月 回复 zp 2019年5月8日 下午4:19

      看日志信息感觉不是模型太大导致的,像是控制器没配置好

  • 小白 2019年4月4日 下午5:10

    古月老师您好,我按照你的流程给我自己的机械臂配置好了ros_control,使用的是JointTrajectoryController控制器,按照资料,该控制可以输出完整轨迹,我在write()函数中监控获取数据时,每次都只能获取规划的第一个和最后一个数据,我想问一下为什么呢。

  • 高颜 2019年4月2日 下午9:14

    古老师,您好,最近在看ros_control的内容,现在对几个控制器的作用的理解比较迷糊,position controller ,volocity controller, trajectory controller 这三种控制器的作用是什么,它们之间的有什么关联?对于开发机械臂起到什么作用,其中每个都PID,这个PID起到什么作用(是否是跟踪作用),想请古老师能够解答,万分感谢!

    • 古月 回复 高颜 2019年4月4日 下午10:17

      作用就是字面的意思,控制目的不同,互相是独立的,根据需要选择,PID就是闭环控制的作用,比如速度闭环、位置闭环,车轮一般用速度控制器,机械臂单关节用位置控制器,多关节联动用轨迹控制器

  • 木东 2019年1月20日 上午11:08

    您好,古月老师,最近我在用rviz做多机器人仿真,用的机器人模型是您《ros机器人开发实践》提供的mrobot.urdf.xacro,我将机器人的base_link以及其他相对应的坐标改动完,将mrobot在rviz中的初始坐标从(0,0)转移到(1,0),其中我启动的launch文件也是roslaunch mrobot_bringup fake_mrobot_with_laser.launch 和roslaunch mrobot_navigation fake_nav_demo.launch,然后我用2D nav goal就不好用了,乱转圈,想请教古月老师应该如何解决呢?

    • 古月 回复 木东 2019年1月20日 下午10:24

      看不出来问题所在,从数据层面调试一下,看指令有没有发对

    • 木东 回复 古月 2019年1月25日 下午12:41

      嗯嗯,谢谢老师

  • 云隐 2018年12月7日 下午5:35

    古月老师,关于这个控制器有点疑问
    1.请问这个robot_controller是继承于位置控制器吗
    2.这个joint trajectory controller也算position_controllers里面的吗。
    3.joint_position_controller和joint_state_controller里面具体是做什么工作的
    joint_state_controller:
    type: joint_state_controller/JointStateController
    publish_rate: 50
    controller_list:
    – name: robot_controller
    action_ns: follow_joint_trajectory
    default: True
    type: FollowJointTrajectory
    joints:
    – joint_1
    – joint_2
    – joint_3
    – joint_eef

    • 古月 回复 云隐 2018年12月7日 下午10:23

      1. robot controller指的是什么?
      2. 不算
      3. 一个做PID位置控制,一个做状态反馈
      具体内容建议直接找代码看

    • 云隐 回复 古月 2018年12月8日 下午12:32

      1.robot controller是我下面配置的那个controller_list:里面配置的那个。这个控制器是做什么工作的
      2.比如我现在运行了位置控制器,是不是就运行了joint_position_controller这一个?还是有许多其他插件,对这里面的结构不是很清晰

    • 云隐 回复 古月 2018年12月10日 下午2:18

      可不可以理解为,position_controllers先获取joint trajectory controller插值计算后的数据,然后在位置控制器里面做PID控制,最后通过硬件资源接口传到robotHW。
      robot_arm_controller:
      type: position_controllers/JointTrajectoryController
      joints:
      – joint_1
      – joint_2
      – joint_3
      – joint_eef

    • 古月 回复 云隐 2018年12月14日 下午8:41

      可以这样理解

  • xiaoma 2018年11月30日 下午9:31

    古月,你好。我在运行roslaunch,准备运行加载了控制器的gazebo时,经常出现:出错提示为:[gazebo-2] process has died [pid 28418, exit code 134, cmd /opt/ros/kinetic/lib/gazebo_ros/gzserver -e ode worlds/empty.world __name:=gazebo __log:=/home/xiaoma/.ros/log/685b3318-f4a3-11e8-9920-6c4b900a969f/gazebo-2.log].
    log file: /home/xiaoma/.ros/log/685b3318-f4a3-11e8-9920-6c4b900a969f/gazebo-2*.log。
    请问怎么回事,系统ubuntu16.04.ros-kinetic。
    另外,当上述错误没有时,会出现 [ERROR] [1543584465.583372902, 0.296000000]: Could not load controller ‘abb_positiom_controller’ because the type was not specified. Did you load the controller configuration on the parameter server (namespace: ‘/abb_irb1200_7_70/abb_positiom_controller’)?
    [ERROR] [1543584466.584233, 1.273000]: Failed to load abb_positiom_controller。

    控制器.yaml
    abb_irb1200_7_70:
    abb_position_controller:
    type: effort_controllers/JointPositionController
    joints:
    – joint_1
    – joint_2
    – joint_3
    – joint_4
    – joint_5
    – joint_6
    gains:
    joint_1: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
    joint_2: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
    joint_3: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
    joint_4: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
    joint_5: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
    joint_6: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
    我想知道第一个错误的原因,因为经常会出现第一个错误。第二个错误是怎么回事.
    特别期待你的答复,谢谢!

    • 古月 回复 xiaoma 2018年12月1日 上午12:24

      第一个错误很抽象,信息太少,没办法确认原因,有可能是依赖包的问题
      第二个错误感觉是某个参数没设置或者配置有问题

  • qi 2018年10月19日 下午10:40

    请问一下如果有多个controller的话,怎么能够同时控制它们?比如说一个模型中有两个controller,有没有一种工具可以提供一个图形界面去同时控制它们?

    • 古月 回复 qi 2018年10月23日 下午4:52

      没有类似的工具,得自己在上层封装实现

  • Chen 2018年10月5日 上午11:49

    胡老师您好!我自己写了一个简单的机器人模型,模型如图所示:https://miao.su/image/u4QX7
    模型中共有四个轮子组合,每个组合上面的椭圆用于转向,下面的用于前进后退。请问我是否需要为每一个椭圆的joint写一个transmission,然后再写一个yaml文件将它们的controllers上传到参数服务器,再分别控制8个controllers?

  • Chen 2018年10月5日 上午11:46

    胡老师您好!我自己写了一个机器人的urdf模型,模型如图所示:https://miao.su/image/u4QX7
    模型一共包含了四个轮子组合,每个组合上面的椭圆是用于转向的,而下面的是用于前进后退的,请问我是否需要在urdf文件中为每一个椭圆的joint写一个transmission,然后再将它们的controllers发布到参数服务器上,再分别控制每一个controller。 ❓

    • 古月 回复 Chen 2018年10月9日 下午7:12

      需要动的关节都需要配置transmission

    • Chen 回复 古月 2018年10月15日 下午8:06

      那请问是否还需要用gazebo plugin呢?

    • 古月 回复 Chen 2018年10月19日 下午2:28

      需要的,每个transmission都需要配置

    • Chen 回复 古月 2018年10月15日 下午9:43

      如果像我说的那样子,一个joint用于转向,一个joint用于前进后退,分别为它们设置transmission,设置了之后,利用ros_control进行控制,什么机制可以协调多个transmission,使得它们像是一个整体,从而驱动机器人的运动呢?

    • 古月 回复 Chen 2018年10月19日 下午2:29

      你这个不是通用的结构,没办法找到直接可用协调控制功能,需要自己在上层封装控制算法

    • 李娟 回复 Chen 2019年4月16日 下午4:44

      老师你好,请问ros_control里面的PID控制,是运动学闭环控制吗?有没有考虑到Gazebo中设置的质量和摩擦系数?是Gazebo中的机器人运行到下一步然后反馈位置信息来进行下一步的运行控制吗?

    • 李娟 回复 Chen 2019年4月16日 下午4:49

      老师你好,请问ros_control中的PID控制算法有没有考虑到动力学?是Gazebo运动一布得到真实值然后做差,通过PID闭环控制得到下一步的运动吗?那么有没有考虑到Gazebo中的关节质量和摩擦系数呢?

    • 古月 回复 李娟 2019年4月21日 下午10:43

      可以参考ros_controller控制器的源码,没有考虑到动力学方面的参数

  • ros-I 2018年9月29日 下午9:10

    老师 我在学习ros-I的时候运行一个包但是JOINT_TRAJTORY_ACTION 这个节点总是死掉怎么解决啊,找了各种方法了
    /opt/ros/kinetic/lib/industrial_robot_client/joint_trajectory_action: symbol lookup error: /opt/ros/kinetic/lib/libindustrial_utils.so: undefined symbol: _ZlsRSoRKN6XmlRpc11XmlRpcValueE
    process[move_group-5]: started with pid [22688]
    process[rviz_mwl_Lenovo_G50_80m_22635_8155639917132999085-6]: started with pid [22705]
    process[fake_ar_publisher-7]: started with pid [22708]
    process[vision_node-8]: started with pid [22716]
    process[adv_descartes_node-9]: started with pid [22727]
    [joint_trajectory_action-3] process has died [pid 22679, exit code 127, cmd /opt/ros/kinetic/lib/industrial_robot_client/joint_trajectory_action __name:=joint_trajectory_action __log:=/home/mwl/.ros/log/78733ef4-c3e7-11e8-bf40-7077811ca8a3/joint_trajectory_action-3.log].
    log file: /home/mwl/.ros/log/78733ef4-c3e7-11e8-bf40-7077811ca8a3/joint_trajectory_action-3*.log
    这些大概是有错误的部分,您能帮忙看看吗?十分感谢

    • 古月 回复 ros-I 2018年10月3日 上午12:40

      这个错误不太能看出来具体原因,一般情况下是由于缺少某些以来的包造成的,但是具体是什么包看不出来,得慢慢找。也有可能是依赖的某些库版本不对应,同样需要慢慢找。

  • 雨滴 2018年9月12日 下午3:19

    古月老师您好,我拜读了您的书也浏览过您的博客。关于ros_control下的硬件抽象层还是有点没搞明白,hardware_interface那一块只罗列了一个外设的框架,但当我们实际要在其中添加设备(单双目、激光雷达)的时候,请教下您应该如何操作呢?( 即外设通过这一层来控制开关,数据传输,不是通过roslaunch)。或者有具体带代码的案例可供分析吗?非常感谢您!

    • 古月 回复 雨滴 2018年9月13日 下午2:20

      这个是用在控制方面的,和传感器没关系,如果你是用摄像头或者激光,直接使用ros里边的驱动就行了,在google里边根据硬件型号搜ros驱动

  • 刘金 2018年9月12日 上午10:26

    古月老师,您好,我在运行文中的例程是出现了/gazebo节点发送的/rrbot/joint_states话题没有数据,而且当我只运行gazebo和rviz时,rviz是可以接收到gazebo的相机数据的,但是我只要我运行ros_control控制的时候,相机数据gazebo节点依然在发,但是rviz接受不到了,最后也不能正常实现机械臂控制的功能,我怀疑是仿真时间的问题,但是实在不知道具体出现在那里

    • 古月 回复 刘金 2018年9月13日 下午2:18

      use_sim_time参数是设置是否使用仿真时间的

  • 2333 2018年7月6日 下午2:11

    古月老师你好,我的小车模型是属于前后轮的自行车模型,而教程资料大多都是差速驱动的例子,我的自己小车模型运动解算已经完成,要想把我自己的小车模型实现运动控制该怎么做呢?在哪里编写代码?又该如何编写和修改呢?望指点一下,或者资料可以借鉴呢?

    • 古月 回复 2333 2018年7月9日 下午5:14

      可以参考机械臂的控制,每个关节都由一个控制器来控制,你这样的机器人就可以用两个速度控制器来控制,可以看下ros_control

    • 2333 回复 古月 2018年7月10日 下午3:16

      用不用看gazebo中插件呢?自己仿照差速插件编写自己插件?可行么?

    • 古月 回复 2333 2018年7月11日 上午11:53

      不用自己写,会用就行了,有速度控制的插件的

    • 2333 回复 古月 2018年7月11日 下午4:35

      古月老师,我又遇到难题了,我原来用的indigo系统自带的gazebo2.2.3,而我今天想要升级为gazebo4版本,结果不好用,想要卸载了不用了,还是用原来的版本,结果卸也卸不完全,原来的版本也不能用了,怎么办啊?好急啊,到底什么问题呢?

    • 古月 回复 2333 2018年7月15日 下午7:18

      应该还是版本的问题,把路径弄乱了,需要重新设置一下原版的路径,找下相关的环境变量设置。

    • Chen 回复 古月 2018年10月4日 下午9:18

      请问您说的速度控制插件是gazebo插件吗?请问该速度控制插件是用于控制多个轮子的joints的controllers协同工作使得机器人移动的速度吗?

    • 古月 回复 Chen 2018年10月9日 下午7:10

      是的,这个插件是用来控制一个关节的运动速度的,如果需要控制多个关节,需要每个关节配置一个控制器

  • 烤鸡排 2018年7月4日 下午10:58

    古月老师,我请问一下。我有个程序在一台电脑上编译成功,然后把程序移植到另一台电脑上,编译失败,显示我程序里面的一个库文件没有读取,这改怎么办呢?

    • 古月 回复 烤鸡排 2018年7月6日 上午9:02

      应该是依赖的库在另外一台电脑没安装,看下错误提示,安装上就行了

  • kaojipai 2018年6月30日 下午3:41

    古月老师,打开rviz一般都给我们初始化好了机器人的位置(xyz轴坐标),我现在想修改这个初始化坐标,应该在哪里进行修改呢?

    • 古月 回复 kaojipai 2018年7月1日 下午5:27

      这个是和坐标系有关系的,修改rviz的fixed frame,界面中显示的是机器人在该坐标系下的位置。

  • 叮咚 2018年6月26日 上午11:12

    古月老师,我在gazebo仿真小车运动时,系统提示我这样:
    [ WARN] [1529982463.901720092, 0.164000000]: GazeboRosSkidSteerDrive Plugin (ns = //) missing , defaults to “odom”
    是怎么一回事呢?小车可以正常通过键盘控制运动,但是在rviz中看不到摄像头显示图像和激光数据

    • 古月 回复 叮咚 2018年6月26日 下午7:57

      这个是警告,不影响。没有图像和激光要检查摄像头和雷达的相关插件有没有配置并启动成功

  • bcahzlqs 2018年6月13日 下午4:33

    古月老师,请问多个机器人 gazebo下怎么和ros_control 包使用?

    • 古月 回复 bcahzlqs 2018年6月13日 下午9:17

      正常配置每个模型中的ros_control插件就行,注意命名空间不要冲突了。

  • 水清 2018年6月7日 下午7:12

    古月大神,你好!初学ros_control,遇到了莫名的问题,所以想向您请教一下。用我自己的机械臂仿真,只添加了两个关节的传动,编译无问题,launch gazebo world 没有问题,launch ros_control也没有问题。但是,向话题发布命令,机械臂无反应。部分代码如下。
    xacro文件:

    transmission_interface/SimpleTransmission

    hardware_interface/EffortJointInterface
    <!– hardware_interface/PositionJointInterface–>

    hardware_interface/EffortJointInterface
    1

    transmission_interface/SimpleTransmission

    hardware_interface/EffortJointInterface

    hardware_interface/EffortJointInterface
    1

    config/control.yalm
    testrobot:
    # Publish all joint states ———————————–
    joint_state_controller:
    type: joint_state_controller/JointStateController
    publish_rate: 50

    # Position Controllers —————————————
    joint1_position_controller:
    type: effort_controllers/JointPositionController
    joint: base_arm1_Joint
    pid: {p: 100.0, i: 0.01, d: 10.0}
    joint2_position_controller:
    type: effort_controllers/JointPositionController
    joint: arm1_arm2_Joint
    pid: {p: 100.0, i: 0.01, d: 10.0}

    control.launch:

    world.lauch

    launch gazabo world.lauch之后,
    [ INFO] [1528368686.710405677]: Finished loading Gazebo ROS API Plugin.
    [ INFO] [1528368686.711762737]: waitForService: Service [/gazebo/set_physics_properties] has not been advertised, waiting…
    [ INFO] [1528368686.729320721]: Finished loading Gazebo ROS API Plugin.
    [ INFO] [1528368686.729531710]: waitForService: Service [/gazebo/set_physics_properties] has not been advertised, waiting…
    SpawnModel script started
    [INFO] [1528368687.057146, 0.000000]: Loading model XML from ros parameter
    [INFO] [1528368687.059300, 0.000000]: Waiting for service /gazebo/spawn_urdf_model
    [ INFO] [1528368688.067746896, 0.022000000]: waitForService: Service [/gazebo/set_physics_properties] is now available.
    [ INFO] [1528368688.094271541, 0.045000000]: Physics dynamic reconfigure ready.
    [INFO] [1528368688.264447, 0.205000]: Calling service /gazebo/spawn_urdf_model
    [ INFO] [1528368688.282969685, 0.224000000]: waitForService: Service [/gazebo/set_physics_properties] is now available.
    [INFO] [1528368688.455227, 0.350000]: Spawn status: SpawnModel: Successfully spawned entity
    [ INFO] [1528368688.464370987, 0.350000000]: Physics dynamic reconfigure ready.
    [ INFO] [1528368688.596049337, 0.350000000]: Loading gazebo_ros_control plugin
    [ INFO] [1528368688.596242106, 0.350000000]: Starting gazebo_ros_control plugin in namespace: /testrobot
    [ INFO] [1528368688.596981285, 0.350000000]: gazebo_ros_control plugin is waiting for model URDF in parameter [/robot_description] on the ROS param server.

    launch control.lauch之后,
    [INFO] [1528368696.272598, 0.000000]: Controller Spawner: Waiting for service controller_manager/load_controller
    [INFO] [1528368696.274275, 0.000000]: Controller Spawner: Waiting for service controller_manager/switch_controller
    [INFO] [1528368696.276808, 0.000000]: Controller Spawner: Waiting for service controller_manager/unload_controller
    [INFO] [1528368696.278426, 7.860000]: Loading controller: joint_state_controller
    [INFO] [1528368696.290424, 7.872000]: Loading controller: joint1_position_controller
    [INFO] [1528368696.331757, 7.911000]: Loading controller: joint2_position_controller
    [INFO] [1528368696.364468, 7.941000]: Controller Spawner: Loaded controllers: joint_state_controller, joint1_position_controller, joint2_position_controller
    [INFO] [1528368696.370902, 7.942000]: Started controllers: joint_state_controller, joint1_position_controller, joint2_position_controller

    发布命令到topic,
    $ rostopic pub -1 /testrobot/joint2_position_controller/command std_msgs/Float64 “data: 1.5”
    publishing and latching message for 3.0 seconds

    最后,无反应。

    古月大神觉的有可能是哪出了问题?
    欢迎古月大神指教。

    • 古月 回复 水清 2018年6月9日 下午11:42

      这样也不好看出来,检查一下各种命名空间是不是统一的,发送端和接收端的接口是不是统一

    • 水清 回复 古月 2018年6月12日 上午11:17

      大神,我找到了原因,是我的urdf文件里limit标签的问题,但是又有一个新的问题想向您请教一下,urdf文件limit和rosparam load limit .yaml文件是什么关系,感觉好像加载到参数服务器的joint limit没有起作用啊。

    • 古月 回复 水清 2018年6月13日 下午8:31

      limit .yaml是在配置过程中根据urdf生成的,后边也可以自己修改

    • zero 回复 水清 2018年12月26日 上午11:46

      limit标签什么问题呢?我也出现了和你一样的问题,其他都正常但是机械臂没反应

    • zero 回复 水清 2018年12月26日 下午12:48

      已解决,谢谢

  • hkjast 2018年6月6日 上午11:51

    您好,古月老师,最近我在gazebo仿真小车模型,小车模型文件中物理属性都有,惯性属性也有,不知道为什么小车在gazebo仿真的时候总是上下抖动呢?导致没办法控制它运动,谢谢解答!

    • 古月 回复 hkjast 2018年6月7日 上午12:39

      应该是物理参数的问题,调整一下质量等参数

  • 燕清扬 2018年5月31日 下午3:21

    古月老师,您好:
    .yaml文件中 分别对joint1和joint2配置了关节位置控制器 : effort_controllers/JointPositionController,该控制器是ros_controllers功能包的,也就是对两个关节均采用位置控制模式,那么如果我想要对这两个关节采用力矩控制,有对应的控制器可用吗?还是必须自己编写相应的力矩控制器?
    我查到 ros_controllers/effort_controllers/src/joint_effort_controller.cpp中基本没有实现力矩控制的内容啊?如果要自己编写关节控制器,该如何做?有参考例程么?谢谢古月老师。

    • 古月 回复 燕清扬 2018年6月1日 上午1:01

      据我了解也是这样的,ROS里的力矩控制器没什么内容,应该要自己写了,或者google一下有没有别人写好的

    • 交换。 回复 燕清扬 2020年5月13日 下午2:19

      老哥是怎么做的

  • 小叮叮叮2333 2018年5月31日 下午3:06

    古月师兄,在在运行roslaunch rrbot_control rrbot_control.launch的时候出现以下错误
    ERROR: cannot launch node of type [controller_manager/spawner]: can’t locate node [spawner] in package [controller_manager]
    请问是怎么一回事呢?

    • 古月 回复 小叮叮叮2333 2018年6月1日 上午1:00

      确定是否安装了ros_control和ros_controllers包

    • 小叮叮叮2333 回复 古月 2018年6月1日 上午9:40

      是这个sudo apt-get install ros-indigo-ros-control ros-indigo-ros-controllers安装语句吧?我的是indigo的,ros运行显示已经是安装最新版本。

    • 小叮叮叮2333 回复 小叮叮叮2333 2018年6月1日 上午9:46

      我刚刚又运行了一下sudo apt-get install ros-indigo-ros-control ros-indigo-ros-controllers显示是最新版本,但是我rospack list了一下,并没有找到ros-control ros-controllers,这是怎么一回事?古月师兄

    • 小叮叮叮2333 回复 古月 2018年6月1日 下午4:02

      我在我的文件夹目录里也找到了ros-control和controller的包。运行前也source了,还是有错误,看到有一个博主跟我情况跟我相似,因为github上有个之前的包更新了,重新git clone后出现了一个问题,在git clone之后,其中的部分文件失去了执行权限,因此它没法生成可执行文件,启动文件就报错了,解决办法需要改一下权限,这样做对吗?我不太敢改,具体又是要怎么改呢?求古月大神指教一下,非常感谢了!!!

    • 古月 回复 小叮叮叮2333 2018年6月2日 下午9:51

      这两个包直接用apt-get安装就行了,不用放到自己的工作空间下编译安装。如果确定已经安装成功的话,就检查一下环境变量的设置,在opt的ros下找一下controller_manager这个包在不在。

    • 小叮叮叮2333 回复 古月 2018年6月4日 上午9:09

      看了一下目录,包都有的,都在,看到有一个博主跟我情况跟我相似,因为github上有个之前的包更新了,重新git clone后出现了一个问题,在git clone之后,其中的部分文件失去了执行权限,因此它没法生成可执行文件,启动文件就报错了,解决办法需要改一下权限,这样做对吗?我不太敢改,具体又是要怎么改呢?求古月大神指教一下,非常感谢了!!!

    • 古月 回复 小叮叮叮2333 2018年6月4日 上午9:33

      直接修改权限就行,终端下:sudo chomd +x XXXXX

    • 小叮叮叮2333 回复 古月 2018年6月5日 下午2:44

      古月师兄,修改了权限以后,还是一样的错误,这个问题已经困惑我好久了,真的不知道错在哪里了?古月师兄看能不能有好的意见?谢谢师兄了。

    • 古月 回复 小叮叮叮2333 2018年6月7日 上午12:38

      不清楚了。。。

    • kaojipai 回复 小叮叮叮2333 2018年6月30日 下午3:37

      古月老师,打开rviz一般都给我们初始化好了机器人的位置(xyz轴坐标),我现在想修改这个初始化坐标,应该在哪里进行修改呢?

    • 古月 回复 kaojipai 2018年7月1日 下午5:26

      这个是和坐标系有关系的,修改rviz的fixed frame,界面中显示的是机器人在该坐标系下的位置。

    • Dosh 回复 小叮叮叮2333 2018年6月28日 下午3:10

      请问你的问题解决没?我也出现了:ERROR: cannot launch node of type [controller_manager/spawner]: can’t locate node [spawner] in package [controller_manager]?

    • 小叮叮叮2333 回复 Dosh 2018年7月23日 下午2:04

      还没有解决,你呢?

    • 浩劫归来 回复 小叮叮叮2333 2020年1月13日 下午5:07

      求问 同样的问题 小车模型轮子没了 报错说找不到接口

    • 小惠 回复 小叮叮叮2333 2020年4月26日 下午5:10

      你好,请问你解决了这个spawner的问题吗?

  • 葛维 2018年5月30日 下午11:01

    古月老师,您好!
    我想请问一个有关于UR5机械臂在Gazebo中/joint_states话题的速度信息不对的问题。我先launch了ur5的gazebo仿真环境,然后打开moveit,用moveit控制gazebo中的ur5运动,ur5确实运动了,此时我订阅/joint_states话题,其中的速度信息几乎全部接近于0,最大也就0.01的样子。如果我对baxter在Gazebo中进行同样的操作,其中的速度信息看起来是正确的,因为有比如1.5rad/s这样的值。请问您知道问题出在哪部分么?
    我在GitHub上有对这个问题更详细的描述,具体见:https://github.com/ros-industrial/universal_robot/issues/354。
    谢谢古月老师~

    • 古月 回复 葛维 2018年6月7日 上午12:49

      之前我还没注意过这个问题,刚才试了一下,确实是这样的,估计是它关节控制器的问题

  • elosa 2018年5月25日 上午11:49

    古月老师您好,我想请问一下publisher发布给controller的消息中data的大小有什么含义吗? 是和YAML文件中controller的PID 有什么关系吗?~?
    我按照您的教程操作我自己建立的模型,
    但是不论data的数据如何修改,模型移动的位置都是一样的

    • 古月 回复 elosa 2018年5月28日 下午12:53

      那个data是指关节的目标位置,单位是弧度,和PID没关系

    • elosa 回复 古月 2018年5月29日 下午6:57

      感谢古月老师的回答!!那PID的大小设置有什么讲究吗?
      我看到很多地方设置的大小差异很大,参阅了网上的资料,也没有很理解怎样设置PID。
      如果我想在短时间内迅速移动的话,PID的参数会对这个有影响吗?

    • 古月 回复 elosa 2018年5月30日 上午10:55

      仿真环境中的PID影响很小,先用一个别人设置好的参数就行

    • elosa 回复 古月 2018年5月30日 下午11:31

      感谢老师的再一次回复!因为我打算实验一个下落过程的简单模型在空中运动的情况(为了增加在空中的时间,我将重力改为0.1),不大明白为什么关节在移动的过程中,晃动的十分厉害,不晓得要修改一些什么参数才能减小晃动?
      我使用的是发布器和订阅器去发布msg让它移动到相应的角度,但是它达到某一个角度以后,总是又弹回原来的位置;
      初学ROS不太清楚这到底是什么原因导致的?我需要去看一些什么方面的材料呢?

    • 古月 回复 elosa 2018年5月31日 上午11:54

      应该主要是模型的动力学参数,gazebo的参数调整还比较麻烦,需要慢慢尝试找感觉

    • elosa 回复 古月 2018年5月31日 下午12:54

      感谢老师回复 我去看看有关动力学参数的设定

    • elosa 回复 古月 2018年5月29日 下午7:17

      我在运行gazebo+ROSPY的时候 一直遇到[ERROR]ROS time moved backwards这样一个错误,在我的rospy内用到了gazebo/reset_simulation 不知道是不是这样的原因呢?

    • 古月 回复 elosa 2018年5月30日 上午10:56

      有可能是把仿真时间重置了

    • elosa 回复 古月 2018年5月30日 下午11:37

      感谢老师一直的回复~此外还有个问题,是否有方法可以获取整个mode/不是某一个link的orientation,我尝试使用 model = rospy.ServiceProxy(‘/gazebo/get_model_state’, GetModelState) 这个service去获取整个模型的状态,但是发现当我旋转整个模型的时候,实际ROS输出的orientation转换的欧拉角和我观察到的整个模型大致的角度不是很一致。

    • 古月 回复 elosa 2018年5月31日 上午11:55

      可以在rviz中显示模型,通过robotmodel和tf显示机器人的状态

    • elosa 回复 古月 2018年5月31日 下午12:55

      好的 我去看看相关的 再次感谢

    • elosa 回复 古月 2018年6月2日 下午12:12

      您好,我想问一下,我在创建URDF模型的时候,想要建立一个revolute2(在URDF中没有)可沿两个轴旋转的关节。 我尝试用两个正方形的方片成90度固定,然后分别在每一个方片上连接一个刚体,但是实际效果并不好,在刚体转动过程中,两块方片会卡住刚体使其不能继续移动。很疑惑怎么样能达成这种类似双轴旋转铰链的关节?
      此外,不知道为什么我的模型在gazebo初始化后,一接触地面就会被弹飞。。不知道是什么原因会导致这种情况发生?

    • 古月 回复 elosa 2018年6月2日 下午9:54

      不好意思,类似这样的模型我也不清楚怎样建立。另外gazebo中的问题,应该是物理参数导致的

    • elosa 回复 古月 2018年6月5日 下午8:25

      古月老师您好~我想问一下 有没有什么关节的组合 可以在URDF中代替universal关节(万向关节)?

    • 古月 回复 elosa 2018年6月7日 上午12:46

      ROS支持的关节类型如下:
      关节类型 描述
      continuous 旋转关节,可以围绕单轴无限旋转
      revolute 旋转关节,类似于continuous,但是有旋转的角度极限
      prismatic 滑动关节,沿某一轴线移动的关节,带有位置极限
      planar 平面关节,允许在平面正交方向上平移或者旋转
      floating 浮动关节,允许进行平移、旋转运动
      fixed 固定关节,不允许运动的特殊关节

    • elosa 回复 古月 2018年6月11日 上午12:03

      谢谢老师的回复!

    • elosa 回复 elosa 2018年6月11日 上午12:02

      感谢老师每次的回复~
      我使用publish对机器人的头部和躯干之间的controller发布了一个旋转的msg(data: 1)以后, 头部旋转了1弧度。
      我需要用哪一种方法,获取这个转过的角度呢?(我试着用了gazebo/link_states, 但是只能获取到此刻头部的位置,而不是转过的弧度值?)

    • 古月 回复 elosa 2018年6月12日 上午9:54

      用link_states或joint_states都是实时的状态值,没有单独转过的角度这个状态,需要的话得自己实现,用实时状态减去初始状态

    • elosa 回复 古月 2018年6月12日 下午3:04

      我尝试获取rostopic echo -n 1 /joint_states , 但是有时会报错说没有信息,有时又可以获得反馈,这是为什么呢? 我在程序里使用 rospy.Subscriber(‘/joint_states’, JointState, joint_state_callback) 订阅信息,得到的joint_states的position的信息都是0

    • 古月 回复 elosa 2018年6月13日 下午9:11

      启动joint_states_publisher时可以配置发布频率的,看下频率是不是太慢了。

  • 小明 2018年4月16日 下午5:05

    古月大神,我也运行的你给的教程,现在有几个问题请教一下,
    1./rrbot/joint1_position_controller/state/process_value与/rrbot/joint1_position_controller/command/data产生的曲线是什么意思,我的理解是给的期望的位置和实际的位置
    2.这里的PID是什么意思,和电机控制的那个PID有什么区别,我看到ros_cotrol框架图中有两个PID的控制,分别在controller和real robot的embed ded controller,这两个是什么意思,有什么作用
    3.这个教程中我们给与两个位置,使用了位置插补吗?还是只有添加了轨迹控制器才会对moveit计算出来的离散的轨迹点进行插补,这个插补出来的轨迹怎样像教程中rqt_plot进行表示呢(如/rrbot/joint1_position_controller/command/data的形成的轨迹)

  • 高颜 2018年4月16日 上午11:02

    古月老师,您好,我想问您几个关于ros_control的问题:
    (1)首先ros_contrl源码中的测试代码:joint_trajectory_control文件中的test中joint_trajectory.test文件,我运行命令roslaunch joint_trajectory_controller joint_trajectory_controller.test ,在rqt中看不到曲线的变化,位置速度都是一条直线,没有任何变化,是不是要给它传输数据,让rrbot运动,才会产生曲线变化,下面是我运行时的参数:
    [INFO] [WallTime: 1523847071.006477] Controller Spawner: Waiting for service controller_manager/load_controller
    [INFO] [WallTime: 1523847071.012247] Controller Spawner: Waiting for service controller_manager/switch_controller
    [INFO] [WallTime: 1523847071.026915] Controller Spawner: Waiting for service controller_manager/unload_controller
    [INFO] [WallTime: 1523847071.029408] Loading controller: rrbot_controller
    [INFO] [WallTime: 1523847071.150892] Controller Spawner: Loaded controllers: rrbot_controller
    [INFO] [WallTime: 1523847071.164634] Started controllers: rrbot_controller

    (2)我在moveit中产生出带有时间轨迹的位置、速度、加速度,怎样将这些数据传给ros_control,产生一条连续的轨迹(插补)。

    • 古月 回复 高颜 2018年4月16日 下午6:03

      1. 当然要动起来才有数据变化了,不动的话都是0
      2. 这个是通过action接口实现的,需要在moveit端配置一个controller,gazebo端也配置一个trajectorycontroller,参考《Mastering ROS for Robotics Programming》

  • 灰太狼 2018年4月5日 下午1:32

    古月大神,请教下,对机械臂硬件的读写用RobotHW的write和read就可以,直接操作这个接口就可以么?是否需要对更上层描述我所需要读写的机械臂进行限制?也就是说我读写不管是PR2还是UR的手臂,是否需要在我写的文件里有对PR2或者UR的描述?还是说根本不需要管是什么机械臂,ros_control已经提供了统一接口?

    • 古月 回复 灰太狼 2018年4月9日 上午10:05

      可以参考这款机器人的实现:https://github.com/hans-robot/cute_robot

  • JKira 2018年3月13日 下午4:04

    古月老师 你好。我之前用moveit顺利的控制了发那科机器人。现在想用moveit控制另外一台机械臂iARM。这个机械臂不是很主流,相关的ROS驱动并没有找到。请问要怎么通过moveit来控制一个没有驱动的机器手臂。我查了些资料 大概是通过ros_control包来写驱动,moveit通过ros_control写的驱动把规划好的路径发送给机械臂的电机。不知道我这么理解是不是正确的。还有要怎么写相关驱动程序。我找了很多都是gazebo下的模拟。真实的机器人要怎么写驱动呢。有没有相关的教程链接。谢谢。

    • 古月 回复 JKira 2018年3月14日 上午10:57

      1. moveit是做路径规划的,规划出来的路径是一些列路点,然后交给ros_control做进一步的机器人控制,主要是关节插补。是可以用ros_control来完成你需要的功能,需要了解ros_control硬件接口部分的使用方法,可以参考ros_control的wiki教程,可能比较麻烦。
      2. 另外你用的iARM应该有自己的开发接口和驱动吧,如果可以直接将规划得到的路点发给iARM的驱动做控制,就可以跳过ros_control了。

  • xyf 2018年3月8日 下午12:19

    您好,参照您的文章想用gazebo理解一下ros_control,编译什么的都没问题,运行第一句roslaunch,gazebo也可以正常打开并显示
    但是当运行第二句roslaunch rrbot_control rrbot_control.launch时就会报错:
    [WARN] [1520481780.758243, 0.589000]: Controller Spawner error while taking down controllers: unable to connect to service: [Errno 111] Connection refused
    [rrbot/controller_spawner-1] process has died [pid 14553, exit code 1, cmd /opt/ros/kinetic/lib/controller_manager/spawner joint_state_controller joint1_position_controller joint2_position_controller __name:=controller_spawner……

    之后我先运行第一句roslaunch打开gazebo,再按照后面的手动调用完成controller的加载,运行
    rosservice call /rrbot/controller_manager/load_controller “name: ‘joint1_position_controller'”,还是会报错:

    ERROR: transport error completing service call: unable to receive data from sender, check sender’s logs for details

    之后我开始安装了各种ros_control的包,可是还是不行,不知道这是什么情况,另外ros版本时kinetic

    • 古月 回复 xyf 2018年3月8日 下午11:30

      ros-kinetic-ros-controllers安装了么

    • xyf 回复 古月 2018年3月9日 下午7:32

      这个包是安装了的,试了半天,最后好像是urdf有关的包没安装,非常感谢!

    • 科技 回复 xyf 2018年7月25日 下午5:53

      我也遇到过 请问是urdf拿些包呢?

  • Y-liberal 2017年10月26日 下午9:56

    古月老师,我的gazebo模型按照上面的步骤运行之后,为什么总是出现Controller Spawner couldn’t find the expected controller_manager ROS interface.错误,我试了很多方法都不成功,请教这个错误是怎么发生的,应该怎么消除?

    • Y-liberal 回复 古月 2017年10月27日 上午11:23

      你推荐的这两个我都看过了,然后我也按照他们的方法做了,但还是会出现这个问题。我把官网上的rrbot也下载下来进行调试,发现官网的教程也出现这个问题,我不知道的为什么。我用的是ros-kinetic版本。

    • 古月 回复 Y-liberal 2017年10月27日 下午3:27

      就提示的错误来看,感觉是controller_manager 启动的有问题,我也用过kinetic版本,没出现过这种问题

    • Y-liberal 回复 古月 2017年10月28日 上午9:10

      昨天找了一会,我找到了问题,是因为我的电脑上没有安装ros_control这个包。感谢回复。

    • 古月 回复 Y-liberal 2017年10月28日 下午9:37

    • ros新手 回复 古月 2018年5月30日 下午4:56

      古月师兄,我的问题还没有解决,两个链接我也看了,你有什么建议吗?

    • 古月 回复 ros新手 2018年5月31日 上午11:49

      确定一下有没有安装ros_control、ros_controllers这两个包

    • ros新手 回复 Y-liberal 2018年5月30日 下午4:53

      你好,我的还没有解决这个问题,我同样也安装了ros—control,但还是出现和你一样的问题,如果看到的话,可以跟我交流与我联系吗?怎么解决的?邮箱可以交流一下吗?

    • dsl 回复 ros新手 2018年6月15日 上午11:28

      你好,我最近在学习这个,也遇到了这个问题,请问你解决了么?

    • 丁圣澜 回复 古月 2018年6月15日 下午2:50

      古月老师,我用的ros-indigo,也安装了controll和controllers,但是出现Warn:Controller Spawner couldn’t find the expected controller_manager ROS interface. 看来你给的两个参考网址,也没解决问题TAT,我用的官方提供的gazebo_ros_demos的包

    • 古月 回复 丁圣澜 2018年6月17日 下午5:52

      看下这个:https://github.com/ros-controls/ros_control/issues/243

  • Y-liberal 2017年10月24日 上午9:53

    古月老师,请问你文中提到的控制器和抽象层是什么关系?控制器属于硬件吗?

    • 古月 回复 Y-liberal 2017年10月24日 下午8:29

      抽象层是对多种多样的硬件做抽象管理的,控制器针对统一的硬件抽象层做控制,属于软件

  • 镇华 2017年10月16日 上午11:01

    您好,古月大神,请问我在运行时候出现了这个错误应该怎么解决
    [urdf_spawner-4] process has died [pid 3582, exit code 1, cmd /home/rzh/catkin_ws/src/gazebo_ros_pkgs/gazebo_ros/scripts/spawn_model -urdf -model rrbot -param robot_description __name:=urdf_spawner __log:=/home/rzh/.ros/log/27ce05ca-b21c-11e7-b98c-3497f62b4981/urdf_spawner-4.log].
    log file: /home/rzh/.ros/log/27ce05ca-b21c-11e7-b98c-3497f62b4981/urdf_spawner-4*.log

    • 古月 回复 镇华 2017年10月16日 下午6:45

      有没有设置系统的环境变量?

    • 衬衣 回复 古月 2018年2月26日 下午5:18

      请问一下这个环境变量怎么设置?我也出现了类似的问题
      是不是这样:source /usr/share/gazebo-7/setup.sh
      source /opt/ros/kinetic/setup.bash
      source $HOME/catkin_ws/devel/setup.bash
      export GAZEBO_PREFIX=$HOME/catkin_ws/install
      export GAZEBO_RESOURCE_PATH=${GAZEBO_PREFIX}/share/gazebo-7.0:${GAZEBO_RESOURCE_PATH}
      export GAZEBO_MODEL_PATH=${GAZEBO_PREFIX}/share/gazebo-7.0/models:${GAZEBO_MODEL_PATH}
      export GAZEBO_PLUGIN_PATH=${GAZEBO_PREFIX}/lib:${GAZEBO_PREFIX}/lib/x86_64-linux-gnu:${GAZEBO_PLUGIN_PATH}

    • 陈遥 回复 古月 2018年2月26日 下午5:18

      请问一下这个环境变量怎么设置?我也出现了类似的问题
      是不是这样:source /usr/share/gazebo-7/setup.sh
      source /opt/ros/kinetic/setup.bash
      source $HOME/catkin_ws/devel/setup.bash
      export GAZEBO_PREFIX=$HOME/catkin_ws/install
      export GAZEBO_RESOURCE_PATH=${GAZEBO_PREFIX}/share/gazebo-7.0:${GAZEBO_RESOURCE_PATH}
      export GAZEBO_MODEL_PATH=${GAZEBO_PREFIX}/share/gazebo-7.0/models:${GAZEBO_MODEL_PATH}
      export GAZEBO_PLUGIN_PATH=${GAZEBO_PREFIX}/lib:${GAZEBO_PREFIX}/lib/x86_64-linux-gnu:${GAZEBO_PLUGIN_PATH}

    • 古月 回复 陈遥 2018年2月26日 下午11:19

      这样环境变量应该是设置了,参考一下这个解决办法:https://answers.ros.org/question/188831/urdf-spawner-process-has-died/

  • 罗西 2017年9月13日 下午3:25

    您好,我自己的模型在gazebo中打开,好像事碰撞属性有点问题,没法调到正好轮子接触地面,一打开就是翻着的,请问应该怎么样解决?

    • 古月 回复 罗西 2017年9月14日 上午9:22

      如果模型是用三维软件设计的,一般可以在设计软件中计算得到惯性矩阵;如果是简单的URDF模型,可以参考Mastering ROS for Robotics Programming里边两轮小车的设置方法,给一个固定值;还有一种方法是通过公式计算惯性矩阵,可以上网找到规则物体的(长方体,圆柱,球)惯性矩阵计算公式。

    • 罗西 回复 古月 2017年9月14日 上午11:01

      我的时用三维软件设计的,在gazebo中打开后发现碰撞属性有问题,我直接在xacro文件中改了mass 和 inertia的值,再打开gazebo发现模型全散了 然后没了,不能直接在里面改是吗? 如果我需要改 应该怎么样做

    • 古月 回复 罗西 2017年9月14日 下午8:04

      gazebo是读取的xacro文件中的配置,可以直接在xacro文件中修改。参数设置可能还是有问题,建议先在rviz中看一下机器人的模型,可以控制每个关节运动,测试模型的关节配置是否有问题;如果没有问题的话,再修改物理参数。

    • 罗西 回复 古月 2017年9月19日 下午3:09

      您好,我在rviz中打开模型文件报错,报错信息为Fixed Frame
      Fixed Frame [map] does not exist 想请问一下是什么原因?

    • 古月 回复 罗西 2017年9月20日 上午8:57

      把rviz中的Fixed Frame改成“base_link”

    • 罗西 回复 古月 2017年9月20日 上午10:17

      谢谢,已经解决 但是现在我用 roslaunch xxx display。launch 运行时,模型加载不出来? 还有,我用roscontrol 已经实现单独给每个轮子速度,但是是以命令行的形式发布的,我想把它写成脚本文件来运行,应该参照什么教程呢?

    • 古月 回复 罗西 2017年9月21日 上午11:28

      加载的时候看下有没有报错信息;可以参考《Mastering ROS for Robotics Programming》这本书

    • 罗西 回复 古月 2017年9月21日 下午6:48

      加载的时候报错信息 [ERROR] [1505985603.016950115, 1.242000000]: Character [.] at element [19] is not valid in Graph Resource Name [joint_limits/joint1.1]. Valid characters are a-z, A-Z, 0-9, / and _.
      Error [World.cc:1666] Loading model from factory message failed 请问是什么原因导致的?

    • 古月 回复 罗西 2017年9月22日 上午11:49

      好好检查代码,有非法字符

    • 罗西 回复 罗西 2017年9月25日 上午9:24

      月哥,你好,因为现在在学习ros,现在学习速度太慢,学着学着不知道该怎么样进行下去,遇到很多问题,想问问最近哪里有没有针对ROS初阶和中阶的培训项目,最好是那种针对具体项目的培训,我想去参加培训,不知道月哥有没有一些好的建议?

    • 古月 回复 罗西 2017年9月26日 下午12:38

      你好,你可以关注一些ros星火计划,会有公开课和进阶课,主要针对ROS实践方面的培训。
      另外建议多看目前已有的英文书籍,先把书中的例程和源码看明白,然后再复用到自己的项目中。

    • 张桥 回复 古月 2018年12月10日 下午2:37

      月哥,请问如何查看有哪些ROS星火计划呢?

    • 古月 回复 张桥 2018年12月14日 下午8:48

      可关注星火计划的网站或者公众号:NXROBO

  • 罗西 2017年8月30日 上午10:15

    我想问一下,我把这个源文件包直接拷贝到我的 catkin_ws/src文件夹下面,直接运行,报错,我重新编译catkin_make 他也报错,想问一下可能是什么原因 ?

    • 古月 回复 罗西 2017年8月30日 上午11:06

      能否贴一下报错的具体信息

    • 罗西 回复 古月 2017年8月30日 下午4:06

      CMake Error at /opt/ros/indigo/share/catkin/cmake/catkinConfig.cmake:75 (find_package):
      Could not find a package configuration file provided by “ros_control” with
      any of the following names:

      ros_controlConfig.cmake
      ros_control-config.cmake

      Add the installation prefix of “ros_control” to CMAKE_PREFIX_PATH or set
      “ros_control_DIR” to a directory containing one of the above files. If
      “ros_control” provides a separate development package or SDK, be sure it
      has been installed.
      Call Stack (most recent call first):
      crobot/crobot_control/CMakeLists.txt:7 (find_package)

      — Configuring incomplete, errors occurred!
      See also “/home/exbot/catkin_ws/build/CMakeFiles/CMakeOutput.log”.
      See also “/home/exbot/catkin_ws/build/CMakeFiles/CMakeError.log”.
      make: *** [cmake_check_build_system] Error 1
      Invoking “make cmake_check_build_system” failed
      大概是这样

    • 罗西 回复 罗西 2017年8月30日 下午4:11

      大概意思是差东西或者有东西没有添加,因为不能放截图,所以就知粘贴了部分报错信息

    • 古月 回复 罗西 2017年8月30日 下午6:00

      ros_control功能包没有安装,使用以下命令安装:
      sudo apt-get install ros-indigo-ros-control

    • 罗西 回复 古月 2017年8月31日 上午9:51

      之前安装过的呀,我再安装是这样
      exbot@ubuntu:~$ sudo apt-get install ros-indigo-ros-control
      [sudo] password for exbot:
      正在读取软件包列表… 完成
      正在分析软件包的依赖关系树
      正在读取状态信息… 完成
      ros-indigo-ros-control is already the newest version.
      升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 1096 个软件包未被升级。
      N: Ignoring file ‘gazebo’ in directory ‘/etc/apt/sources.list.d/’ as it has no filename extension
      N: Ignoring file ‘gazebo’ in directory ‘/etc/apt/sources.list.d/’ as it has no filename extension

    • 古月 回复 罗西 2017年8月31日 下午2:39

      那可能就是环境变量的问题了,编译报错是找不到这个包

    • 罗西 回复 古月 2017年9月1日 上午10:36

      您好,我把文中rrbot文件下载后运行 rostopic pub -1 /rrbot/joint2_position_controller/command std_msgs/Float64 “data: 1.0” 该命令运行完后,机械臂没动 exbot@ubuntu:~$ rostopic pub -1 /rrbot/joint2_position_controller/command std_msgs/Float64 “data: 1.0”
      publishing and latching message for 3.0 seconds
      想问一下是什么原因。

    • 罗西 回复 罗西 2017年9月1日 上午11:36

      刚看了一下没有错误 是对的 我想问一下他那个最后一个参数1.0 是表示什么 想让他一直动应该怎么用?

    • 古月 回复 罗西 2017年9月1日 下午2:22

      -1代表只发送一次,如果要一直发送,需要加-r 10,10代表10hz,可以根据需要设置

    • 罗西 回复 罗西 2017年9月1日 下午8:06

      想让机械臂一直动,rostopic 应该怎么样加在上面,我试着改了一下,发现不对?

    • 王子博 回复 罗西 2017年11月11日 下午3:33

      你好,想问一下,你这个问题解决了吗?如果解决了是怎么解决的,方便说一下吗?谢谢

    • 王先生 回复 罗西 2017年11月11日 下午3:50

      你好,想问一下,你这个问题解决了吗?如果解决了是怎么解决的,方便说一下吗?谢谢

    • 罗西 回复 罗西 2017年9月1日 下午9:50

      rostopic pub -r 10 /rrbot/joint2_position_controller/command std_msgs/Float64 “data: 3.0”

      我发布这个rostopic 界面就停住了 也不知道啥情况,请问是什么原因?

    • 古月 回复 罗西 2017年9月4日 上午9:31

      这个topic是让机械臂的joint2运动到3的位置,运动到后就会停止

    • 罗西 回复 古月 2017年9月5日 上午10:05

      怎么样让机械臂一运动?

    • 古月 回复 罗西 2017年9月5日 上午11:38

      把joint2改成joint1

    • 罗西 回复 古月 2017年9月5日 下午3:29

      不好意思 我打错了,我是想问,想让机械臂不停的运动(一直运动),这个rostopic 应该怎么样发布?

    • 古月 回复 罗西 2017年9月5日 下午5:45

      这个命令没办法让机械臂一直运动,机械臂运动到设定的位置就停止了,要一直运动需要写个节点,到达设定目标后发送下一个目标位置

    • 罗西 回复 罗西 2017年9月6日 上午9:41

      非常感谢您的解答 如果采用速度控制模式的话,给关节速度,应该就可以一直动了吧

    • 古月 回复 罗西 2017年9月6日 下午3:17

      使用速度控制可以让机器人以指定速度运动,到达限位或者接到停止命令时才停止

  • 海漩涡 2017年7月17日 上午10:38

    请问下,能实现给关节发送速度吗,因为这个例子是发送位置的。

    • 古月 回复 海漩涡 2017年7月17日 下午7:38

      这个没试过,理论上应该是可以的

  • 云天 2017年6月6日 下午3:33

    有点疑问, 硬件的read, write 接口在哪实现呢? 谢谢解答

    • 古月 回复 云天 2017年6月7日 下午8:24

      接口定义在:https://github.com/ros-controls/ros_control/blob/kinetic-devel/hardware_interface/include/hardware_interface/robot_hw.h
      根据自己使用的机器人,需要继承这个类自己实现相应的write和read

    • 云天 回复 古月 2017年6月8日 下午4:50

      谢谢! 另外还有一个疑问, 假设机器上是有3个joint,但两个是主动节点, 另一个是被动结点, 也就是它的角度是由前面两个决定的(机械限制), 那么在joint_state_controller是发布三个结点的状态还是两个主动的结点? 还有就是被动结点和主动节点的关系在哪里体现呢?也就是C=A+B, 这个在哪里实现?

    • 古月 回复 云天 2017年6月10日 上午12:30

      这种结构我没试过,不是很清楚,应该是发布两个节点,主动和被动需要在URDF中设置

  • 海漩涡 2017年3月23日 下午11:08

    月哥又出新文章了
    而且正是我现在需要弄明白的,好好学习下
    thank