ros-naoqi / naoqi_dcm_driver

Hardware interface allowing control Nao, Romeo, and Pepper robots via ROS
4 stars 13 forks source link

Problems in controlling Pepper with ros-melodic #7

Open souljaboy764 opened 4 years ago

souljaboy764 commented 4 years ago

I had initially posted this issue under pepper_dcm_robot (ros-naoqi/pepper_dcm_robot#6) but found that the issue was due to the naoqi_dcm_driver package so I'm posting the problem and one workaround that worked for me here.

ISSUE

I am trying to control Pepper from ubuntu 18.04 with ros-melodic. Since all packages weren't available with sudo apt install, installed whatever was available sudo apt install ros-melodic-naoqi-bridge-msgs ros-melodic-naoqi-libqi ros-melodic-naoqi-driver ros-melodic-naoqi-libqicore sudo apt install ros-melodic-pepper-meshes

I have cloned the rest of the packages into my catkin_ws

neo@zion:~$ ls catkin_ws/src/pepper_*
catkin_ws/src/pepper_dcm_robot:
pepper_dcm_bringup  README.rst

catkin_ws/src/pepper_moveit_config:
CHANGELOG.rst  CMakeLists.txt  config  launch  package.xml  README.rst  test  tuto

catkin_ws/src/pepper_robot:
pepper_bringup  pepper_description  pepper_robot  pepper_sensors_py

catkin_ws/src/pepper_virtual:
pepper_control  pepper_gazebo_plugin  README.md

neo@zion:~$ ls catkin_ws/src/naoqi_*
catkin_ws/src/naoqi_bridge:
LICENSE.txt  naoqi_bridge     naoqi_navigation  naoqi_sensors_py  README.md
naoqi_apps   naoqi_driver_py  naoqi_pose        naoqi_tools       tracks.yaml

catkin_ws/src/naoqi_dcm_driver:
CHANGELOG.rst  CMakeLists.txt  include  package.xml  README.rst  src

and installed whatever dependencies using

neo@zion:~/catkin_ws$ rosdep install --from-paths src --ignore-src -r -y

After source catkin_ws/devel/setp.bash I run the following in different terminals one after the other

To start up the robot:

neo@zion:~$ roslaunch pepper_dcm_bringup pepper_bringup.launch robot_ip:=192.168.100.186 network_interface:=enp7s0 

The output of this can be seen here: https://pastebin.com/3VenKwum

Once the robot has started up, I run:

neo@zion:~$ roslaunch naoqi_driver naoqi_driver.launch nao_ip:=192.168.100.186 network_interface:=enp7s0

Using this, I am able to see the images and pointcloud from the robot and also visualize the robot's pose accurately in rviz when I passively move the hands. The output of this command can be seen here: https://pastebin.com/n9S5vN5t

And finally, I run moveit using:

neo@zion:~$ roslaunch pepper_moveit_config moveit_planner.launch 

The output of this can be seen here: https://pastebin.com/utPV5yZY

I use the moveit interface to generate a random valid goal configuration (shown in orange) from the MotionPlanning interface and then I first plan it (as seen in the trail). image

When I click on execute, nothing happens with the robot even though the following messages are displayed in the terminal

[ INFO] [1594216249.619841838]: Execution request received
[ INFO] [1594216253.127858948]: Controller pepper_dcm/RightArm_controller successfully finished
[ INFO] [1594216253.334119901]: Completed trajectory execution with status SUCCEEDED ...
[ INFO] [1594216253.334365776]: Execution completed: SUCCEEDED

There is nothing that gets printed in the terminal where pepper_dcm_bringup is running.

I try to publish the joint trajectories manually first using the topic /pepper_dcm/RightArm_controller/follow_joint_trajectory/goal which does not give any movement on the robot either. I then try to publish the joint trajectories on the topic /pepper_dcm/RightArm_controller/command which does not give any movement on the robot as well. There is nothing that gets printed in the terminal where pepper_dcm_bringup is running, even when manually publishing the trajectories on the topics.

I have tried this out with two different pepper robots and it does not work in either case.

The same commands when executed on a VM running ubuntu 16.04 with ros-kinetic seem to work with both robots moving to the specified location in the moveit interface.

WORKAROUND

While going through the motion.cpp file, I saw that only in the function writeJoints, the inputs were converted to qi::AnyValue before using it as an argument from motion_proxy_ as shown below. https://github.com/ros-naoqi/naoqi_dcm_driver/blob/087e9b04839fa0fa0e9083f13dc006d8bb21bfd2/src/motion.cpp#L200-L216

In all the other functions, the input is being sent as is. So when I modify this to send the input directly as a std::vector it works for me. My function now looks like this:

void Motion::writeJoints(const std::vector <double> &joint_commands)
{
  try
  {
    motion_proxy_.async<void>("setAngles", joints_names_, joint_commands, 0.2f);
  }
  catch(const std::exception& e)
  {
    ROS_ERROR("Motion: Failed to set joints nagles! \n\tTrace: %s", e.what());
  }
}

With this, the commands from moveit are being executed on pepper.